[AliOS-Things 之网络管理] NetMgr 源码分析(一)

关于 NetMgr 这一块,官方文档没有任何的介绍,因此只有自己默默地一点一点地看代码,不过所幸的是这一块的代码不算多,慢慢阅读后终于理清了整个思路。

基本架构

结合自己的理解,对 NegMgr 这个组件画了一个整体的架构,虽然不一定准确,但总体上包含了核心的内容:

如上图所示,整个 NetMgr 组件一共包含了三个模块:AutoConfig 插件uMesh 库以及 WiFi HAL module

AutoConfig 插件的作用是配置设备连接到默认的 AP。初看代码里面定义的是一个链表,可以包含多个插件,但是在实际的代码里其实只会使用最后一次添加的插件。

如果设备成功连接到某个热点,则会调用 uMesh 接口启动自组网过程,且该节点是整个 Mesh 网络的 Leader;如果设备未能连接到某个热点,也会调用 uMesh 启动自组网过程,不过该节点会作为非 Leader 节点。

WiFi HAL module 是对 WiFi 模块底层进行联网处理的一个抽象层,在我们这里的 NetMgr 组件里面只需要调用对应的 API 完成联网处理即可。

基本的数据结构

在 NetMgr 里,最核心的一个结构体是 netmgr_cxt_t,它统领了 NetMgr 里面的核心数据,其定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct {
wifi_conf_t saved_conf;
netmgr_ap_config_t ap_config;
hal_wifi_module_t *wifi_hal_mod;
autoconfig_plugin_t *autoconfig_chain;
int32_t ipv4_owned;
int8_t disconnected_times;
bool doing_smartconfig;
bool ip_available;
netmgr_wifi_scan_result_cb_t cb;
bool wifi_scan_complete_cb_finished;
} netmgr_cxt_t;

其中:

  • saved_conf 表示设备 Flash 中已存储的热点的 ssid 和 password。
  • ap_conf
  • wifi_hal_mod 指向一个 wifi HAL module 的一个实例,在 NetMgr 里面就是通过调用该实例的接口进行真正的联网处理的
  • autoconfig_chain 指向一串用于配置设备连接到默认 AP 的插件。整个 AliOS 的代码里目前实现了两个插件,一个是 g_def_smartconfig,另一个是 g_alink_smartconfig(还未看对应的代码)。
  • ipv4_owned 表示设备连接到热点后从热点获取到的 ipv4 地址,该地址是一个 32 位的整形,NetMgr 提供了接口可以将其转换为 “192.168.2.112” 这种形式的点分字符串形式。