1、介紹
wayz_iotkit 是上海圖趣信息科技有限公司,針對RT-thread開發的能夠實現定位功能的物聯網組件。在使用傳統上定位,如 GPS 等信號的同時,也支持使用基站、Wifi等數據,通過 WAYZ 定位云來進行定位。當前版本已實現支持wifi、gnss、基站定位,其中wifi定位為自動獲取定位數據,gnss和基站需要開發者手動填寫相關信息,后期會逐步實現對其他信號源的自動采集,進一步提升定位效果。
1.1 目錄結構
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、申請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": "住宅"}]}
-
存儲器
+關注
關注
38文章
7484瀏覽量
163762 -
物聯網
+關注
關注
2909文章
44557瀏覽量
372757 -
WLAN技術
+關注
關注
0文章
23瀏覽量
9273 -
WiFi芯片
+關注
關注
4文章
45瀏覽量
36976 -
RT-Thread
+關注
關注
31文章
1285瀏覽量
40081
發布評論請先 登錄
相關推薦
評論