[AliOS-Things 之网络管理] NetMgr 基本介绍

AliOS 提供了一个叫做 NetMgr 的组件来进行网络管理,即控制设备,让其连接到指定的 WiFi 热点、存储热点信息到 Flash、或进行 Mesh 自组网等。

其实在之前的博客 AliOS-Things 入门之让MK3060连接网络 中我们已经接触过该功能,这里我们再系统性地学习下。

关于 AliOS 的系列博客,请参考 AliOS-Things系列学习笔记-目录

开启 NetMgr 功能

默认情况下,为了减小对系统资源的占用情况,应用程序中是不包含这个网络管理组件的。如果要让应用程序包含网络管理功能,需要做两件事儿:

  1. 修改应用程序的 makefile 配置文件。以 helloworld 为例,修改文件 example/helloworld/helloworld.mk,找到下面这行代码:

    1
    $(NAME)_COMPONENTS := yloop cli

    并在其后面添加 netmgr,如下:

    1
    $(NAME)_COMPONENTS := yloop cli netmgr
  2. 在应用程序中初始化 netmgr 组件。同样以 helloworld 为例,在入口函数中添加初始化代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <netmgr.h>

    int application_start(int argc, char *argv[])
    {
    netmgr_init();
    netmgr_start(false);

    aos_post_delayed_action(1000, app_delayed_action, NULL);
    aos_loop_run();

    return 0;
    }

    其中:

    • netmgr_init() 用于对 netmgr 组件进行初始化。在初始化的过程中,会注册 shell 命令 netmgr。
    • netmgr_start(false) 是可选的,它的作用是启动配网流程。

然后,我们的应用程序就包含网络管理功能了。

配网流程

自己画了个配网流程图,如下所示。

系统上电后,先对 NetMgr 进行初始化,然后进入配网流程。而配网流程又细分为三步:

  1. 查看设备的 Flash 上是已经存储有某个 WiFi 热点的 SSID 和密码,如果有,则直接连接该热点;如果没有,则进入第二步。
  2. 根据传递给函数 netmgr_start() 的参数,判断是否进入 samrtconfig 自动配网模式。所谓自动配网,就是程序设置了一个默认的 SSID 和密码,进入自动配网模式后会自动尝试连接该热点。如果未进入 smartconfig 自动配网模式,则进入第三步。
  3. 启动 mesh,进行自组网。

设备出厂时,里面肯定是没有保存 SSID 和密码的,所以肯定会进入第二步。以我们上面的例子为例,又由于我们在应用程序中传递给函数 netmgr_start() 的参数是 false,所以不会进入 smartconfig 自动配网模式,而会进入第三步 mesh 自组网模式,此时如果我们有多个设备,这些设备就会进行自组网,然后它们之间就能相互通信,不过显然它们只是在一个局域网里面。

如果此时,我们对某个设备进行配网,即通过 shell 命令 netmgr connect ssid password 让设备连接到热点,则程序会先将该热点的 ssid 和 password 通过 KV 存储到 flash 中,然后去连接该热点。如果今后设备复位重启了,由于设备中已经存储了 ssid 和 password,则设备会自动进入上面所说三步中的第一步。

netmgr 的三个命令

netmgr 命令包括三个子命令:

  • netmgr start,即启动配网流程,不过它是先查看 flash 上面是否存在 ssid,如果不存在则会尝试连接默认的 ssid。
  • netmgr connect ssid password,即先保存该 ssid 和 password 到 flash 中,然后连接该 ssid。
  • netmgr clear,即清除 netmgr connect 所保存在 flash 中的 ssid 和 password。

一点点思考

理顺了整个配网流程后,觉得 AliOS 的这个网络管理组件设计得蛮好的,尤其是支持 mesh 自组网让其显得异常亮眼,不过我总感觉少了些啥。

以 ESP8266 为例,ESP8266 也提供了一个 SmartConfig 功能,不过它的 SmartConfig 功能跟这里的 SmartConfig 功能是两个不同的概念。ESP8266 的 SmartConfig 配网功能是指直接通过手机 APP 广播路由器的 SSID 和 Password,ESP8266 抓取到相关信息后自动配网,因此配网流程显得更方便。

这个功能能不能借鉴到 AliOS 呢?如果要实现该功能,会不会受到硬件的限制?