<rt id="eitdv"></rt>
      1. 0
        • 聊天消息
        • 系統消息
        • 評論與回復
        登錄后你可以
        • 下載海量資料
        • 學習在線課程
        • 觀看技術視頻
        • 寫文章/發帖/加入社區
        創作中心

        完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

        3天內不再提示

        基于RT-Thread os實現混合定位介紹

        冬至子 ? 來源:jianxiongye ? 作者:jianxiongye ? 2023-11-15 16:19 ? 次閱讀

        1、介紹

        wayz_iotkit 是上海圖趣信息科技有限公司,針對RT-thread開發的能夠實現定位功能的物聯網組件。在使用傳統上定位,如 GPS 等信號的同時,也支持使用基站、Wifi等數據,通過 WAYZ 定位云來進行定位。當前版本已實現支持wifi、gnss、基站定位,其中wifi定位為自動獲取定位數據,gnss和基站需要開發者手動填寫相關信息,后期會逐步實現對其他信號源的自動采集,進一步提升定位效果。

        1.1 目錄結構

        1.jpg

        1.2 許可證

        wayz_iotkit package 遵循 LGPLv2.1 許可,詳見 LICENSE 文件。

        1.3 依賴

        RT-Thread 3.0+
        RT-Thread 開發 WLAN 框架
        webclient軟件包
        cJSON軟件包

        2、如何打開 wayz_iotkit

        使用 wayz_iotkit package 需要在 RT-Thread 的包管理器中選擇它,具體路徑如下:

        RT-Thread online packages
        IOT - internet of things --->
        [*] wayz_iotkit: wayz iot location
        (wayz123) wifi ssid
        (wayz1234) wifi password
        Version (v1.0.0) --->

        然后讓 RT-Thread 的包管理器自動更新,或者使用 pkgs --update 命令更新包到 BSP 中。

        3、使用 wayz_iotkit

        4、注意事項
        該組件是基于wlan框架上運用的wifi定位,前提條件必須要有wifi芯片
        利用該組件時,需要重新開啟任務處理,防止內存過小引發堆棧溢出錯誤
        使用指南
        這里主要介紹 wayz_iotkit 程序的基本使用流程,并針對使用過程中經常涉及到的結構體和重要 API 進行簡要說明。

        wayz_iotkit 的基本工作流程如下所示:

        初始化 wifi、設備相關信息
        將設備注冊到平臺上
        獲取定位結果(gcj02和wgs84標準)以及POI信息
        menuconfig 配置說明
        獲取 wayz_iotkit 軟件包或者修改用戶配置都需要使用 menuconfig。需要用戶打開 ENV 工具,并將目錄切換到您所用的 BSP 目錄,使用 menuconfig 命令打開配置界面。

        在 RT-Thread online packages → IOT - internet of things 中選擇 wayz_iotkit 軟件包,操作界面如下圖所示:

        詳細的配置介紹如下所示:

        RT-Thread online packages
        IOT - internet of things --->
        [*] wayz_iotkit: wayz iot location # 打開 wayz_iotkit 軟件包
        (wayz123) wifi ssid # wifi 名字
        (wayz1234) wifi password # wifi 密碼
        Version (latest) ---> # 選擇軟件包版本,默認為最新版
        選擇合適的配置項后,使用 pkgs --update 命令下載軟件包并更新用戶配置。

        注:wifi 名字和密碼 供軟件包切換模式用

        工作原理

        設備中wifi模塊獲取周圍環境中的wifi信息,組包通過http方式上傳到WAYZ定位云平臺,云平臺進行分析后將經緯度等其他信息一并返回到軟件包,軟件包通過處理可以得到gcj02和wgs84標準的經緯度,和POI信息。也可以通過傳入gnss、基站等相關數據獲取定位結果及其POI信息

        wifi、設備相關初始化
        typedef struct device_info // 設備信息
        {
        char *dev_name; // 設備名稱
        char *manufacturer; // 設備制造廠家
        char *SN; // 設備序列號
        char *product; // 設備所屬產品
        char *tenant; // 設備所屬租戶,通常是開放平臺的用戶 ID
        }tdeviec_info;
        typedef struct wifi_info // wifi 相關信息
        {
        char *ssid; // 保存wifi名稱
        char *passwd; // 保存wifi密碼
        }twifi_info;
        twifi_info 用于保存建立連接的 wifi相關信息,在設備上傳周圍wifi信息時聯網使用。用戶在使用 WiFi 建立連接會話前,必須定義一個存儲會話內容的結構體,如下所示:

        twifi_info *wlan_info;
        wlan_info = wifi_param_init(WIFI_SSID, WIFI_PWD);
        tdeviec_info 用于保存注冊到平臺設備信息,在設備注冊使用。用戶在使用連接會話前,必須定義一個存儲會話內容的結構體,如下所示:

        tdeviec_info *dev_info;
        dev_info = dev_para_init(DEV_NAME, VENDER, PRODUCT, SN, TENANT);

        設備注冊

        應用程序使用dev_register_init函數注冊設備到平臺。其中ACCESS_KEY需要在平臺申請

        示例代碼如下所示:

        ret = dev_register_init(wlan_info, dev_info, ACCESS_KEY);
        if (ret != DEV_REGISTER_OK)
        {
        rt_kprintf("?33[31;22mdevice register failure. ?33[0mn");
        return ;
        }
        填充GNSS、基站信息定位
        typedef struct gnss_unit
        {
        uint64_t timestamp; // 數據收集的時間戳(UTC 時間,單位:毫秒)
        double lng; // 經度
        double lat; // 緯度
        float accuracy; // 衛星定位水平精度,單位:米
        }tgnss_unit;
        typedef struct cell_unit
        {
        uint64_t timestamp; // 數據收集的時間戳(UTC 時間,單位:毫秒)
        uint32_t cell_id; // 小區 ID,當 CDMA 時,為 BID(Base Station ID)
        char radio_type[7]; // 基站類型,只能是以下值:gsm, wcdma, lte, cdma
        uint32_t mcc; // mobileCountryCode:MCC 碼
        uint32_t mnc; // mobileNetworkCode:當 CDMA 時,為 SID(System ID)碼
        uint32_t lac; // locationAreaCode:當 CDMA 時,為 NID(Network ID);
        當 LTE 時,為 TAC(Tracking Area code)
        }tcell_unit;

        通過填充GNSS、基站等數據,傳入定位接口即可獲取定位結果信息

        獲取定位結果

        應用程序使用get_position_info函數從平臺端獲取位置信息。其中ACCESS_KEY需要在平臺上申請

        location_print函數是打印位置相關信息

        示例代碼如下所示:

        tlocation_info location = {0};
        ret = get_position_info(wlan_info, ACCESS_KEY, RT_NULL, &location);
        if (RT_ERROR == ret)
        {
        rt_kprintf("?33[31;22mthe device failed to obtain latitude and longitude information.?33[0mn");
        }
        else
        {
        location_print(location);
        }

        其中get_position_info函數第三個參數為填充的GNSS和基站數據,相關操作可以參照示例文檔

        打印位置信息結果

        -------------------location result-------------------------------
        timestamp: 1606293694990
        gcj02:
        latitude:30.515105
        longitude:114.401555
        wgs84:
        latitude:30.517407914397
        longitude:114.396014616712
        POI: {"id": "7SkEZdfXQfS","type": "Residential","name": "中建東湖明珠國際公館","categories":[{"id": 10200,"name": "住宅"}]}
        -------------------location result end---------------------------

        定位輪詢頻次

        該引用可以通過循環的模式來設置定位頻次,其中POINT_FRQ為定位頻次的設置

        示例代碼如下所示:

        while (1)
        {
        ret = get_position_info(wlan_info, ACCESS_KEY, RT_NULL, &location);
        if (RT_ERROR == ret)
        {
        rt_kprintf("?33[31;22mthe device failed to obtain latitude and longitude information.?33[0mn");
        }
        else
        {
        location_print(location);
        }
        rt_thread_mdelay(POINT_FRQ);
        rt_memset(&location, 0, sizeof (location));
        }
        wayz_iotkit API
        /**

        • Wifi parameter initialized
        • @param ssid: Wifi name
        • @param passwd: Wifi password
        • @return twifi_info: Dynamic allocation wifi info structure
          */
          twifi_info *wifi_param_init(const char ssid, const char passwd);
          /
        • device parameter initialized
        • @param dev_name: device name
        • @param manufacturer: device manufacturer
        • @param product: product name
        • @param SN: product serial number
        • @param tenant: tenant device
        • @return tdeviec_info: Dynamic allocation device info structure
          */
          tdeviec_info *dev_para_init(const char *dev_name, const char *manufacturer, const char *product,
          const char SN, const char tenant);
          /
        • Wifi station mac address
        • @param data: Wifi station mac address data
        • @return void
          /
          void get_sta_mac_addr(char data);
          /
        • Connected to the Internet to register
        • @param wlan_info: wifi name , wifi passwd
        • @param dev_info: device info ,(dev_name、manufacturer、SN、product、tenant)
        • @param key: Visiting the website key
        • @return =0: wifi connect failure
        • =1: device register success
          
        • =2: device register failure
          

        */
        char dev_register_init(twifi_info *wlan_info, tdeviec_info dev_info, char key);
        /

        • Get the positioning result function
        • @param wlan_info Wifi related information
        • @param key Visiting the website key
        • @param post_data post gnss and cellulars data, obtain positioning results
        • @param location get location result
        • @return >0: success
        • =0: location failure
          

        */
        char get_position_info(twifi_info *wlan_info, char *key, tpost_data post_data, tlocation_info location);
        /

        • print location result
        • @param location location info
        • @return void:

        */
        void location_print(tlocation_info location);

        wayz_iotkit 示例程序

        1.jpg

        運行示例

        1、申請ACCESS_KEY
        需要在平臺申請ACCESS_KEY,目前只能提供人工申請的方式
        在示例代碼中的宏中填寫申請的ACCESS_KEY字段,例如:
        #define ACCESS_KEY "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

        2、填寫wifi、設備相關信息
        修改將所要連接網絡的AP即用戶名、密碼等;也可以在選擇組件時指定wifi相關信息。例如:

        ifdef PKG_WAYZ_IOTKIT_WIFI_SSID
        define WAYZ_WIFI_SSID PKG_WAYZ_IOTKIT_WIFI_SSID
        else
        define WAYZ_WIFI_SSID “thread”
        endif
        ifdef PKG_WAYZ_IOTKIT_WIFI_PASSWORD
        define WAYZ_WIFI_PWD PKG_WAYZ_IOTKIT_WIFI_PASSWORD
        else
        define WAYZ_WIFI_PWD “12345678”
        endif
        修改設備相關信息,例如:
        ```c
        #define  DEV_NAME       "PANDDRA"      // 設備名稱
        #define  VENDER         "ALIENTEK"       // 設備生產商
        #define  PRODUCT        "FINDU01"       // 設備所屬產品
        #define  SN             "1234567"       // 產品序列號
        #define  TENANT         "WAYZ"           // 設備所屬租戶,通常是開放平臺的用戶 ID
        3、GNSS、基站數據的填充
        tpost_data post_data = {0};                    // 定義上傳數據結構體
        post_data.gnss.timestamp = 1606729066000;
        post_data.gnss.lng = 114.39583641301239;
        post_data.gnss.lat = 30.51769862171484;
        post_data.gnss.accuracy = 8;
        post_data.cellulars.count = 1;
        post_data.cellulars.cell[0].timestamp = 1515743846504;
        post_data.cellulars.cell[0].cell_id = 149833211;
        rt_sprintf(post_data.cellulars.cell[0].radio_type, "%s", "gsm");
        post_data.cellulars.cell[0].mcc = 460;
        post_data.cellulars.cell[0].mnc = 11;
        post_data.cellulars.cell[0].lac = 36558;
        // 傳入獲取定位函數中
        get_position_info(wlan_info, ACCESS_KEY, &post_data, &location);
        4、在finsh命令行中輸入location_test命令即可調用示例代碼
        示例結果
        timestamp: 1606293694990 ms
        gcj02:
            latitude:30.515105
            longitude:114.401555
        wgs84:
            latitude:30.517407914397
            longitude:114.396014616712
        POI: {"id": "7SkEZdfXQfS","type": "Residential","name": "中建東湖明珠國際公館","categories":[{"id": 10200,"name": "住宅"}]}
        
        聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
        • 存儲器
          +關注

          關注

          37

          文章

          6760

          瀏覽量

          160836
        • 物聯網
          +關注

          關注

          2838

          文章

          39801

          瀏覽量

          353156
        • WLAN技術
          +關注

          關注

          0

          文章

          23

          瀏覽量

          9209
        • WiFi芯片
          +關注

          關注

          4

          文章

          40

          瀏覽量

          36746
        • RT-Thread
          +關注

          關注

          30

          文章

          1080

          瀏覽量

          38513
        收藏 人收藏

          評論

          相關推薦

          RT-Thread編程指南

          RT-Thread編程指南——RT-Thread開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT-Thread實時操作系統的編程指南
          發表于 11-26 16:06 ?0次下載

          RT-Thread AI kit開源:輕松實現一鍵部署AI模型至 RT-Thread

          RT-AK 是 RT-Thread 團隊為 RT-Thread 實時操作系統所開發的 AI 套件,能夠一鍵將 AI 模型部署到 RT-Thread 項目中,讓用戶可以 在統一...
          發表于 01-25 18:18 ?3次下載
          <b class='flag-5'>RT-Thread</b> AI kit開源:輕松<b class='flag-5'>實現</b>一鍵部署AI模型至 <b class='flag-5'>RT-Thread</b>

          RT-Thread文檔_RT-Thread 簡介

          RT-Thread文檔_RT-Thread 簡介
          發表于 02-22 18:22 ?5次下載
          <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

          RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

          RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
          發表于 02-22 18:23 ?6次下載
          <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

          RT-Thread文檔_RT-Thread SMP 介紹與移植

          RT-Thread文檔_RT-Thread SMP 介紹與移植
          發表于 02-22 18:31 ?4次下載
          <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP <b class='flag-5'>介紹</b>與移植

          RT-Thread大會:瑞薩e- AI成功案例及部署

            RT-Thread IoT OS Global Tech Conference (RT-Thread GTC,RT-Thread全球技術大會)致力于圍繞
          的頭像 發表于 05-27 10:18 ?976次閱讀
          <b class='flag-5'>RT-Thread</b>大會:瑞薩e- AI成功案例及部署

          RT-Thread全球技術大會:螢石研發團隊使用RT-Thread的技術挑戰

          RT-Thread全球技術大會:研發團隊使用RT-Thread的技術挑戰 ? ? ? ? 審核編輯:彭靜
          的頭像 發表于 05-27 11:36 ?859次閱讀
          <b class='flag-5'>RT-Thread</b>全球技術大會:螢石研發團隊使用<b class='flag-5'>RT-Thread</b>的技術挑戰

          RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制

          RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制 ? ? ? ? ? ? ? 審核編輯:彭靜
          的頭像 發表于 05-27 14:49 ?1052次閱讀
          <b class='flag-5'>RT-Thread</b>全球技術大會:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機制

          RT-Thread全球技術大會:RT-Thread測試用例集合案例

          RT-Thread全球技術大會:RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
          的頭像 發表于 05-27 16:34 ?1595次閱讀
          <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>測試用例集合案例

          RT-Thread全球技術大會:RT-Thread對POSIX的實現情況介紹

          RT-Thread全球技術大會:RT-Thread對POSIX的實現情況介紹 ? ? ? ? ? ? 審核編輯:彭靜
          的頭像 發表于 05-27 16:52 ?1354次閱讀
          <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>對POSIX的<b class='flag-5'>實現</b>情況<b class='flag-5'>介紹</b>

          RT-Thread設備模型框架及創建注冊設備的實現

          RT-Thread設備模型框架及創建注冊設備的實現方式介紹如下:
          的頭像 發表于 05-28 10:38 ?1563次閱讀
          <b class='flag-5'>RT-Thread</b>設備模型框架及創建注冊設備的<b class='flag-5'>實現</b>

          RT-Thread學習筆記 RT-Thread的架構概述

          RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
          的頭像 發表于 07-09 11:27 ?3629次閱讀
          <b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述

          RT-Thread的C語言編碼規范

          的編程風格。同時對于使用 RT-Thread 的用戶,也可通過這份文檔了解 RT-Thread代碼內部一些約定從而比較容易的把握到 RT-Thread實現方式。
          的頭像 發表于 02-21 16:50 ?1865次閱讀

          如何在RT-Thread OS環境下使用ncnn進行AI推理

          今天簡報較短,主要演示一下如何在RT-Thread OS環境下使用ncnn進行AI推理
          的頭像 發表于 05-04 16:29 ?500次閱讀
          如何在<b class='flag-5'>RT-Thread</b> <b class='flag-5'>OS</b>環境下使用ncnn進行AI推理

          基于RT-Thread Studio學習

          前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
          的頭像 發表于 05-15 11:00 ?1585次閱讀
          基于<b class='flag-5'>RT-Thread</b> Studio學習
          欧美日韩国产在线高清清视频免费观看丨久久香蕉国产线看观看怡红院妓院丨5D肉蒲团之性战奶水又爽又黄丨亚洲国产精品特色大片观看完整版