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)下,监听网络中的所有报文,直到解析出需要的信息(之前双方约定好数据格式)。
更多配网信息,可以参考文章:
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命令使用案例
如果想进一步了解以上功能,欢迎访问AliOS Things Github项目主页,使用AliOS Things的最新开源版本。
更多功能,将在AliOS Things的后续开源版本中推出。
5、开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/
转载:https://blog.csdn.net/HaaSTech/article/details/111569978