1、AliOS Things Wi-Fi 聯網背景
接入Wi-Fi網路,是大部分IoT設備聯網的第一步,
接入Wi-Fi一般需要經歷配網和連網兩個階段,
1.1、Netmgr介紹
本文介紹的Netmgr模塊是將Wi-Fi驅動的配網和連網能力抽象提取出來,方便IoT設備快速入網連云,
Wi-Fi設備需要連接到Wi-Fi熱點(Wi-Fi AP)之后才能與其它設備進行基于IP的通信, 我們將Wi-Fi設備獲取到Wi-Fi熱點的SSID/密碼的步驟稱為Wi-Fi配網,對于手機/電腦/平板而言, 用戶可以通過鍵盤或者觸摸屏輸入Wi-Fi熱點的SSID/密碼,但是對于沒有鍵盤, 沒有觸摸屏的IoT設備而言, 如何獲取Wi-Fi熱點的SSID/密碼是實作設備網路管理的第一個關鍵步驟,
1.2、配網
簡要介紹下如下的兩種配網方式:
1、零配:不需要用戶輸入熱點資訊的配網方案, 它是讓一個已連接到上網熱點的設備將熱點的SSID/密碼發送給待配網的設備,
2、一鍵配網:手機APP把相應資訊打包到802.11資料包的特定區域,發送到周圍環境中;智能設備的Wi-Fi模塊處于混雜模式(Promiscuous Model)下,監聽網路中的所有報文,直到決議出需要的資訊(之前雙方約定好資料格式),
更多配網資訊,可以參考文章:
Wi-Fi物聯網設備配網的N種方式
1.3、連網
無論哪種方式配網, 最終目的都是拿到SSID/PASSWORD,連上AP, 接入網路,
終端設備要成功連上Wi-Fi需要經過三個階段:
1)掃描階段(SCAN);
2)認證階段 (Authentication);
3)關聯(Association),
關聯成功后,終端設備發起DHCP請求或者使用靜態IP地址,就表示連網成功,
2、重要Netmgr API
Netmgr提供了一組API支持方便用戶快速接入AP,
2.1、netmgr_init
初始化netmgr模塊
函式原型
int netmgr_init(void);
| 引數名稱 | 引數描述 | 引數示例 |
無 | 無 | 無 |
回傳引數
0,成功
小于0, 失敗
2.2、netmgr_deinit
反初始化netmgr
函式原型
void netmgr_deinit(void);
引數串列
| 引數名稱 | 引數描述 | 引數示例 |
無 | 無 | 無 |
回傳引數
無
2.3、netmgr_start
啟動netmgr
函式原型
int netmgr_start(bool autoconfig);
引數串列
| 引數名稱 | 引數描述 | 引數示例 |
|
| 是否自動發起Wi-Fi連網 | 無 |
回傳引數
0,成功
小于0, 失敗
注意:
當引數autoconfig是true時,使能自動連接Wi-Fi功能,如果設備有過成功連接AP的記錄,會自動去連成功鏈接過的AP記錄里的SSID和Password,
如果設備沒有成功連接AP的記錄,就不會自動去發起連網動作,當引數autoconfig是false時,關閉自動連接AP的功能,也不會去連AP,
2.4、netmgr_connect
連接網路
函式原型
int32_t netmgr_connect(const char *ssid, const uint8_t *password, uint32_t timeout);
引數串列
| 引數名稱 | 引數描述 | 引數示例 |
|
| Wi-Fi SSID | aos |
| password | 密碼 | 123456 |
| timeout | 超時時間(毫秒) | 100 |
回傳引數
0,成功
其他,失敗
2.5、netmgr_stats
獲取網路統計資訊,現在主要是IP地址,
函式原型
void netmgr_stats(int32_t interface, netmgr_stats_t *stats);
引數串列
| 引數名稱 | 引數描述 | 引數示例 |
|
| 網卡名字 | INTERFACE_WIFI |
| stats | 網卡統計資訊 | / |
回傳引數
無
3、API使用范例
3.1、直接連網
#include "netmgr.h"
#include "aos/yloop.h"
static void wifi_service_event(input_event_t *event, void *priv_data)
{
if (event->type != EV_WIFI) {
return;
}
if (event->code != CODE_WIFI_ON_GOT_IP) {
return;
}
// add application start logic here
}
void start_netmgr(void) {
netmgr_init();
aos_register_event_filter(EV_WIFI, wifi_service_event, NULL);
netmgr_start(false);
netmgr_connect("Test_WiFi", "123456", 10000);
}
3.2、使用歷史記錄連網
#include "netmgr.h"
#include "aos/yloop.h"
static void wifi_service_event(input_event_t *event, void *priv_data)
{
if (event->type != EV_WIFI) {
return;
}
if (event->code != CODE_WIFI_ON_GOT_IP) {
return;
}
// add application start logic here
}
void start_netmgr(void) {
netmgr_init();
aos_register_event_filter(EV_WIFI, wifi_service_event, NULL);
netmgr_start(true);
}
3.3、使用netmgr范例
以上范例中注冊了一個wifi_service_event事件來監聽事件,當收到type是EV_WIFI,code是CODE_WIFI_ON_GOT_IP,表示成功獲取到了IP地址,
將以上范例中的start_netmgr函式加到檔案application/example/helloworld_demo/appdemo.c,
注意,同時需要添加netmgr.h和aos/yloop.h兩個頭檔案,
int application_start(int argc, char *argv[])
int count = 0;
printf("nano entry here!\r\n");
start_netmgr();
while(1) {
printf("hello world! count %d \r\n", count++);
aos_msleep(1000);
};
}
3.4、添加netmgr模塊
在application/example/helloworld_demo/Config.in里增加"select AOS_COMP_NETMGR if !AOS_CREATE_PROJECT"
config AOS_APP_HELLOWORLD_DEMO
bool "Helloworld Demo"
select AOS_COMP_OSAL_AOS if !AOS_CREATE_PROJECT
select AOS_COMP_NETMGR if !AOS_CREATE_PROJECT
help
helloworld demo
if AOS_APP_HELLOWORLD_DEMO
# Configurations for app helloworld_demo
config SYSINFO_APP_VERSION
string "Firmware Version"
default "app-1.0.0-20200214.140831"
help
application main firmware version
endif
4、Netmgr命令
4.1、命令介紹
支持使用命令的方式對Wi-Fi連網相關的操作,如:
- 對存盤的連接資訊的讀/寫/洗掉
- 列印當前網路內的所有AP的資訊,
- 連接AP,斷開AP的連接
- 查詢網路狀態等
| 命令列 | 說明 |
| netmgr -t wifi -i | 初始化 |
| netmgr -t wifi -a [0/1] | 設定是否自動重連,0,不自動重連;1,自動重連, |
| netmgr -t wifi -b [0/1] | 是否保存歷史連接記錄,0,不保存歷史連接記錄,1,保存歷史連接記錄, |
| netmgr -t wifi -c [ssid] [password] | 使用ssid password連網 |
| netmgr -t wifi -e | 斷開Wi-Fi連接 |
| netmgr -t wifi -w [wifi_config] | 寫Wi-Fi組態檔,wifi_config格式,如,network={\\nssid=\"aos\"\\npassword=\"123456\"\\nchannel=\"0\"\\n}\\n |
| netmgr -t wifi -r | 讀Wi-Fi組態檔 |
| netmgr -t wifi -d | 洗掉Wi-Fi組態檔 |
| netmgr -t wifi -p | 列印當前網路狀態 |
| netmgr -t wifi -s | 列印當前網路上的AP的資訊 |
4.2、命令范例
使用如下命令可以快速連SSID是"aos" 密碼是"123456"的AP,
netmgr -t wifi -i
netmgr -t wifi -b 1
netmgr -t wifi -a 1
netmgr -t wifi -c aos 123456
也可以手動寫入配置命令,使用如下的命令連網,其中,如果無法確定AP的channel資訊,使用0進行全網段掃描,
netmgr -t wifi -i
netmgr -t wifi -w network={\\nssid=\"aos\"\\npassword=\"123456\"\\nchannel=\"0\"\\n}\\n
netmgr -t a 1
4.3、Netmgr命令使用案例
基于HaaS 100搭建智能家居應用
如果想進一步了解以上功能,歡迎訪問AliOS Things Github專案主頁,使用AliOS Things的最新開源版本,
更多功能,將在AliOS Things的后續開源版本中推出,
5、開發者技術支持
如需更多技術支持,可加入釘釘開發者群

更多技術與解決方案介紹,請訪問阿里云AIoT首頁https://iot.aliyun.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240125.html
標籤:其他
上一篇:STM32F103RCT6(Mini板)通過MQTT協議上傳溫濕度資料至OneNET云平臺并控制LED燈
下一篇:unity 常用的設計模式
