1、介紹
wayz_iotkit 是上海圖趣信息科技有限公司,針對(duì)RT-thread開(kāi)發(fā)的能夠?qū)崿F(xiàn)定位功能的物聯(lián)網(wǎng)組件。在使用傳統(tǒng)上定位,如 GPS 等信號(hào)的同時(shí),也支持使用基站、Wifi等數(shù)據(jù),通過(guò) WAYZ 定位云來(lái)進(jìn)行定位。當(dāng)前版本已實(shí)現(xiàn)支持wifi、gnss、基站定位,其中wifi定位為自動(dòng)獲取定位數(shù)據(jù),gnss和基站需要開(kāi)發(fā)者手動(dòng)填寫(xiě)相關(guān)信息,后期會(huì)逐步實(shí)現(xiàn)對(duì)其他信號(hào)源的自動(dòng)采集,進(jìn)一步提升定位效果。
1.1 目錄結(jié)構(gòu)
1.2 許可證
wayz_iotkit package 遵循 LGPLv2.1 許可,詳見(jiàn) LICENSE 文件。
1.3 依賴
RT-Thread 3.0+
RT-Thread 開(kāi)發(fā) WLAN 框架
webclient軟件包
cJSON軟件包
2、如何打開(kāi) 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 的包管理器自動(dòng)更新,或者使用 pkgs --update 命令更新包到 BSP 中。
3、使用 wayz_iotkit
4、注意事項(xiàng)
該組件是基于wlan框架上運(yùn)用的wifi定位,前提條件必須要有wifi芯片
利用該組件時(shí),需要重新開(kāi)啟任務(wù)處理,防止內(nèi)存過(guò)小引發(fā)堆棧溢出錯(cuò)誤
使用指南
這里主要介紹 wayz_iotkit 程序的基本使用流程,并針對(duì)使用過(guò)程中經(jīng)常涉及到的結(jié)構(gòu)體和重要 API 進(jìn)行簡(jiǎn)要說(shuō)明。
wayz_iotkit 的基本工作流程如下所示:
初始化 wifi、設(shè)備相關(guān)信息
將設(shè)備注冊(cè)到平臺(tái)上
獲取定位結(jié)果(gcj02和wgs84標(biāo)準(zhǔn))以及POI信息
menuconfig 配置說(shuō)明
獲取 wayz_iotkit 軟件包或者修改用戶配置都需要使用 menuconfig。需要用戶打開(kāi) ENV 工具,并將目錄切換到您所用的 BSP 目錄,使用 menuconfig 命令打開(kāi)配置界面。
在 RT-Thread online packages → IOT - internet of things 中選擇 wayz_iotkit 軟件包,操作界面如下圖所示:
詳細(xì)的配置介紹如下所示:
RT-Thread online packages
IOT - internet of things --->
[*] wayz_iotkit: wayz iot location # 打開(kāi) wayz_iotkit 軟件包
(wayz123) wifi ssid # wifi 名字
(wayz1234) wifi password # wifi 密碼
Version (latest) ---> # 選擇軟件包版本,默認(rèn)為最新版本
選擇合適的配置項(xiàng)后,使用 pkgs --update 命令下載軟件包并更新用戶配置。
注:wifi 名字和密碼 供軟件包切換模式用
設(shè)備中wifi模塊獲取周?chē)h(huán)境中的wifi信息,組包通過(guò)http方式上傳到WAYZ定位云平臺(tái),云平臺(tái)進(jìn)行分析后將經(jīng)緯度等其他信息一并返回到軟件包,軟件包通過(guò)處理可以得到gcj02和wgs84標(biāo)準(zhǔn)的經(jīng)緯度,和POI信息。也可以通過(guò)傳入gnss、基站等相關(guān)數(shù)據(jù)獲取定位結(jié)果及其POI信息
wifi、設(shè)備相關(guān)初始化
typedef struct device_info // 設(shè)備信息
{
char *dev_name; // 設(shè)備名稱
char *manufacturer; // 設(shè)備制造廠家
char *SN; // 設(shè)備序列號(hào)
char *product; // 設(shè)備所屬產(chǎn)品
char *tenant; // 設(shè)備所屬租戶,通常是開(kāi)放平臺(tái)的用戶 ID
}tdeviec_info;
typedef struct wifi_info // wifi 相關(guān)信息
{
char *ssid; // 保存wifi名稱
char *passwd; // 保存wifi密碼
}twifi_info;
twifi_info 用于保存建立連接的 wifi相關(guān)信息,在設(shè)備上傳周?chē)鷚ifi信息時(shí)聯(lián)網(wǎng)使用。用戶在使用 WiFi 建立連接會(huì)話前,必須定義一個(gè)存儲(chǔ)會(huì)話內(nèi)容的結(jié)構(gòu)體,如下所示:
twifi_info *wlan_info;
wlan_info = wifi_param_init(WIFI_SSID, WIFI_PWD);
tdeviec_info 用于保存注冊(cè)到平臺(tái)設(shè)備信息,在設(shè)備注冊(cè)使用。用戶在使用連接會(huì)話前,必須定義一個(gè)存儲(chǔ)會(huì)話內(nèi)容的結(jié)構(gòu)體,如下所示:
tdeviec_info *dev_info;
dev_info = dev_para_init(DEV_NAME, VENDER, PRODUCT, SN, TENANT);
設(shè)備注冊(cè)
應(yīng)用程序使用dev_register_init函數(shù)注冊(cè)設(shè)備到平臺(tái)。其中ACCESS_KEY需要在平臺(tái)申請(qǐng)
示例代碼如下所示:
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; // 數(shù)據(jù)收集的時(shí)間戳(UTC 時(shí)間,單位:毫秒)
double lng; // 經(jīng)度
double lat; // 緯度
float accuracy; // 衛(wèi)星定位水平精度,單位:米
}tgnss_unit;
typedef struct cell_unit
{
uint64_t timestamp; // 數(shù)據(jù)收集的時(shí)間戳(UTC 時(shí)間,單位:毫秒)
uint32_t cell_id; // 小區(qū) ID,當(dāng) CDMA 時(shí),為 BID(Base Station ID)
char radio_type[7]; // 基站類(lèi)型,只能是以下值:gsm, wcdma, lte, cdma
uint32_t mcc; // mobileCountryCode:MCC 碼
uint32_t mnc; // mobileNetworkCode:當(dāng) CDMA 時(shí),為 SID(System ID)碼
uint32_t lac; // locationAreaCode:當(dāng) CDMA 時(shí),為 NID(Network ID);
當(dāng) LTE 時(shí),為 TAC(Tracking Area code)
}tcell_unit;
通過(guò)填充GNSS、基站等數(shù)據(jù),傳入定位接口即可獲取定位結(jié)果信息
獲取定位結(jié)果
應(yīng)用程序使用get_position_info函數(shù)從平臺(tái)端獲取位置信息。其中ACCESS_KEY需要在平臺(tái)上申請(qǐng)
location_print函數(shù)是打印位置相關(guān)信息
示例代碼如下所示:
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);
}
其中g(shù)et_position_info函數(shù)第三個(gè)參數(shù)為填充的GNSS和基站數(shù)據(jù),相關(guān)操作可以參照示例文檔
打印位置信息結(jié)果
-------------------location result-------------------------------
timestamp: 1606293694990
gcj02:
latitude:30.515105
longitude:114.401555
wgs84:
latitude:30.517407914397
longitude:114.396014616712
POI: {"id": "7SkEZdfXQfS","type": "Residential","name": "中建東湖明珠國(guó)際公館","categories":[{"id": 10200,"name": "住宅"}]}
-------------------location result end---------------------------
定位輪詢頻次
該引用可以通過(guò)循環(huán)的模式來(lái)設(shè)置定位頻次,其中POINT_FRQ為定位頻次的設(shè)置
示例代碼如下所示:
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 示例程序
運(yùn)行示例
1、申請(qǐng)ACCESS_KEY
需要在平臺(tái)申請(qǐng)ACCESS_KEY,目前只能提供人工申請(qǐng)的方式
在示例代碼中的宏中填寫(xiě)申請(qǐng)的ACCESS_KEY字段,例如:
#define ACCESS_KEY "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
2、填寫(xiě)wifi、設(shè)備相關(guān)信息
修改將所要連接網(wǎng)絡(luò)的AP即用戶名、密碼等;也可以在選擇組件時(shí)指定wifi相關(guān)信息。例如:
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
修改設(shè)備相關(guān)信息,例如:
```c
#define DEV_NAME "PANDDRA" // 設(shè)備名稱
#define VENDER "ALIENTEK" // 設(shè)備生產(chǎn)商
#define PRODUCT "FINDU01" // 設(shè)備所屬產(chǎn)品
#define SN "1234567" // 產(chǎn)品序列號(hào)
#define TENANT "WAYZ" // 設(shè)備所屬租戶,通常是開(kāi)放平臺(tái)的用戶 ID
3、GNSS、基站數(shù)據(jù)的填充
tpost_data post_data = {0}; // 定義上傳數(shù)據(jù)結(jié)構(gòu)體
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;
// 傳入獲取定位函數(shù)中
get_position_info(wlan_info, ACCESS_KEY, &post_data, &location);
4、在finsh命令行中輸入location_test命令即可調(diào)用示例代碼
示例結(jié)果
timestamp: 1606293694990 ms
gcj02:
latitude:30.515105
longitude:114.401555
wgs84:
latitude:30.517407914397
longitude:114.396014616712
POI: {"id": "7SkEZdfXQfS","type": "Residential","name": "中建東湖明珠國(guó)際公館","categories":[{"id": 10200,"name": "住宅"}]}
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7452瀏覽量
163598 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2903文章
44262瀏覽量
371211 -
WLAN技術(shù)
+關(guān)注
關(guān)注
0文章
23瀏覽量
9270 -
WiFi芯片
+關(guān)注
關(guān)注
4文章
45瀏覽量
36966 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1272瀏覽量
39919
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論