开发者学堂课程【HaaS 物联网应用开发课程:4_1_AliOS Things 操作系统网络篇之 netmgr】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/801/detail/13835
4_1_AliOS Things 操作系统网络篇之 netmgr
内容介绍:
一、Netmgr 基本介绍
二、Netmgr 使用方法
三、Netmgr 分析手段
一、Netmgr 基本介绍
1. Netmgr 简介
网络连接能力是万物互联的最重要的基础能力之一。AliOS Things 从诞生演进到今天,网络相关有两个模块至关重要,一个是提供配网连接能力的 Netmgr 模块,另一个是提供数据通信能力的 LwIP 模块。其中 Netmgr 是负责控制链路,LwIP 是负责数据链路。
本次主要介绍 Netmgr 模块,接入 Wi-Fi 网络,是大部分 loT 设备联网的第一步。接入 Wi-Fi 一般需要经历配网和连网两个阶段。 Netmgr 模块将Wi-Fi驱动的连网能力抽象提取出来,方便 loT 设备快速入网连云。Netmgr是一个网络管理模块,提供了网络相关的 API 以及命令,方便进行网络管理。
2. Netmgr 架构图
Netmgr 将 Wi-Fi 具体的操作进行统一封装,对应用层提供接口,方便的对 Wi-Fi 网络进行管理。如下是 Netgmr 在主要架构。
中间包含很多模块,提供将APP对于网络的需求最后对应到底层 Wi-Fi 驱动的控制。其中白色部分可重点关注 WiFi,初始化的 WiFi init,WiFi Enable,WiFi Connect,DHCP,SNTP 模块。Trigger Event Cb 关于回调,可参见之后详细介绍。
二、Netmgr 使用方法
1. Netmgr 命令介绍
支持使用命令的方式对 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的信息 |
其中 netmgr -t wifi -i和netmgr -t wifi -c [ssid][password]使用最多,netmgr -t wifi -c [ssid][password] 后期会大量使用,需要明确其参数和作用。
连 SSID 是 "aos",密码是 "123456"的 AP:netmgr -t wifi -i
netmgr -t wifi -c aos 123456
2. Netmgr API 介绍
Netmgr 提供了一组 API 支持方便用户快速接入 AP。并且能在代码前面灵活控制网络连接。
API |
作用 |
参数 |
int netmgr_init(void); |
初始化 netmgr模块 |
- |
void netmgr_deinit(void); |
反初始化 netmgr |
- |
int netmgr_start(bool autoconfig); |
启动 netmgr |
Autoconfig:是否自动连接网络 |
int32_t netmgr_connect(const char *ssid, const uint8_t*password, uint32_t timeout); |
连接网络 |
Ssid : wifi的ssid Password : wifi的密码 Timeout :连接超时时间,单位ms |
void netmgr_stats(int32_t interface, netmgr_stats_t *stats); |
获取网络统计信息,主要是IP地址 |
Interface : 网卡名字,如INTERFACE_WIFI Stats :网卡统计信息 |
注意:
netmgr_start 函数当参数 autoconfig 是 true 时,使能自动连接 Wi-Fi 功能。如果设备有过成功连接 AP 的记录,会自动去连成功链接过的 AP 记录里的 SSID 和 Password。如果设备没有成功连接 AP 的记录,就不会自动去发起连网动作。当参数 autoconfig 是 false 时,关闭自动连接 AP 的功能,也不会去连 AP。
3. Netmgr 编译使用
Config.in 里增加︰"select AOS_COMP_NETMGR if !AOS_CREATE_PROJECT”比如如下 demo 中需要 netmgr 组件,就添加该行
config AOS_APP_HELLOWORLD_DEMO
bool "Helloworld Demo"
select AOS_COMP_OSAL_AOS if !A0S_CREATE PROJECT
select A0S_COMP_NETMGR if !A0S CREATE PROJECT
这里使用 select 之后,当编译实验 project 的时候就会自动编译
netmgr 组件,如下图所示,在执行 aosmake 的时候能够看到
netmgr。具体编译方式 Config.in 其他修改可以参考编译环境章节。
4. Netmgr 使用介绍
#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”,10 * 1000);
}
使用检索提到的几个重要接口,有 netmgr_init,netmgr_start 指定 true 或 false,false 指进来后不会进行自动重连,如果需要进行自动重连,则设置为 true,还有进行网络连接的自动指令,即 netmgr_connect,其中第一部分为WiFi名字,第二部分为WiFi密码,第三部分为指定连接的超时时间,单位为毫秒,如果超时则自动退出自动连接的流程。
注册了一个 wifi_service_event 事件来监听事件,当收到 type 是
EV_WIFl,code 是 CODE_WIFI_ON_GOT_IP,表示成功获取到了IP地址。
三、Netmgr 分析手段
1.Netmgr 关键事件介绍
Netmgr 关键事件主要主要产生于 Wi-Fi 的连接过程,具体包括∶
关键事件 |
说明 |
CODE_WIFI_CMD_RECONNECT |
重连事件 |
cODE_WIFI_ON_CONNECTED |
连接完成事件 |
CODE_WIFI_ON_DISCONNECT |
断开连接事件 |
CODE_WIFI_ON_GOT_IP |
获取到IP地址事件 |
这四个事件分别对应到 Netmgr 在控制网络连接过程中的多个事件,这些事件会对分析和调试有重要帮助,能清楚地知道当前处于哪一个阶段。
关键事件是在 Netmgr 初始化时调用 aos_register_event_filter(EV_WIFI, netmgr_events_executor,NULL);注册了关注重要事件。
如果有兴趣查看 Netmgr 内部事件流程,可以参考代码︰
components/network/netmgr/src/netmgr_wifi.c 中的
netmgr_events_executor 函数。
2.Netmgr 关键日志分析
Netmgr 关键日志主要是为了方便根据串口日志识别当前设备的网络状态,具体包括:
关键日志 |
说明 |
NETMGR_CONN conn_connecting |
表示Wi-Fi连接中 |
NETMGR_CONN conn_connected |
表示Wi-Fi连接成功 |
NETMGR_CONN conn_obtaining_ip |
表示正在获取IP地址 |
wifi_dhcp_start:1763 start dhcp |
表示启动 DHCP client 访问IP |
netmgr_ip_got_event |
表示获取到IP地址事件 |
start sntp task. |
表示启动了 sntp 服务器 |
[sntp] OK: sec 739241320 usec 1612343811 |
表示 sntp 成功获取到时间 |
举例:
在串口日志中看到如下信息,就表示 sntp 已经成功获取到网络时间。比如可以根据此时判断 Wi-Fi 已经连接成功,并且设备能够访问广域网数据。