介绍设备通过一键配网方式配网过程中遇到的常见问题和解决方法。

背景信息

一键配网的原理如下。

  1. 手机app向空中加密发送热点的SSID和密码。
  2. 设备在监听模式即可接收和上报给SDK。
  3. SDK解密到SSID和密码后,作为入参调用HAL_Awss_Connect_Ap()接口,设备则能连接上热点。

用手机App发送配网信息流

手机App向空中发送配网信息流,通过设备是否可以正常接收到相应信息,来判断一键配网的HAL接口实现是否正确。

  1. 在手机上安装配网App。
    • 公版App的下载说明参见创建自有App
    • 公版App还可以通过扫描下面的二维码下载安装。
    • 如果是已发布的产品,且使用的是设备厂商开发的App,那么请向设备厂商索取App。
  2. 操作配网App,发送报文。
    1. 手机连接上期望设备将要连接到的热点,确保热点和设备距离足够近并无阻挡。
    2. 用二维码生成工具,将以下文本转换成二维码。
    3. 打开配网App,扫描该二维码。
    4. 输入热点连接密码,单击下一步
    5. 单击我确认在闪烁,发起配网。

    配网

用自测工具和设备接收信息流

自测工具以源码形式提供,用户需要自行下载,再跟自己编写的HAL_XXX()接口进行交叉编译。单击此处下载

+-- include
|   +-- hal_awss.h
|   +-- hal_common.h
|   +-- ieee80211.h
|   +-- ieee80211_radiotap.h
|   +-- smartconfig_ieee80211.h
|   +-- zconfig_protocol.h
+-- src
    +-- hal_awss.c
    +-- haltest.c
    +-- ieee80211.c
    +-- smartconfig_ieee80211.c
    +-- TestProbeRx.c
    +-- wrapper.c
  1. src/wrapper.c中所有HAL_XXX()的函数内容实现替换为适合自己系统的代码。
  2. 将替换后的 src/wrapper.c 和其它的源文件编译到自己的固件中。
  3. 浏览include/hal_awss.h文件,其中列举的函数verfiy_xxx()称为自测函数。每个自测函数可以验证一到多个HAL_XXX()实现。
  4. 选择合适的程序入口,调用自测函数verify_xxx()
    调用方法,可以参考src/haltest.c中对自测函数进行调用的示意代码。
    #include <stdio.h>
    #include <unistd.h>
    #include "hal_common.h"
    
    #define TEST_SWITCH_CHANNEL_INTERNVAL_MS (250)
    
    ...
    ...
    
    int main(int argc, char *argv[])
    {
        int time_passed = 0;
        uint8_t bssid[ETH_ALEN] = {0x11,0x22,0x33,0x44,0x55,0x66};
    
        verify_awss_preprocess();
        verify_awss_close_monitor();
        verify_awss_open_monitor();
    
        while(1) {
            if (time_passed > 10 *1000) {
                break;
            }
            verify_awss_switch_channel(switch_channel());
            usleep(TEST_SWITCH_CHANNEL_INTERNVAL_MS*1000);
            time_passed += TEST_SWITCH_CHANNEL_INTERNVAL_MS;
        }
    
        verfiy_awss_connect_ap(5000, "ssid", "passwd", AWSS_AUTH_TYPE_WPAPSKWPA2PSK, AWSS_ENC_TYPE_AES, bssid, 6);
        verify_awss_get_ap_info();
        verify_awss_net_is_ready();
    
        return 0;
    }
  5. 编译嵌入自己HAL实现的自测工具全部源码,并观察verify_xxx()这类函数的运行输出,来检验自己的HAL_XXX()实现是否正确。
  6. 使用自测函数,调用HAL接口。
    使用一键配网模式,仅需要对接这些公共HAL接口即可。
    • verify_awss_preprocess

      HAL_Awss_Get_Timeout_Interval_MsHAL_Awss_Get_Channelscan_Interval_MsHAL_Wifi_Get_Mac进行自测。查看HAL返回的配置参数值,是否符合预期。

      /***********************************************/
      /*   Verify HAL_Awss_Get_Timeout_Interval_Ms   */
      /*   Awss Timeout Interval Ms:     600000 ms   */
      /***********************************************/
      
      /***********************************************/
      /* Verify HAL_Awss_Get_Channelscan_Interval_Ms */
      /* Awss Channel Scan Interval Ms:       250 ms */
      /***********************************************/
      
      /***********************************************/
      /*           Verify HAL_Wifi_Get_Mac           */
      /*         Wifi Mac: 11:22:33:44:55:66         */
      /***********************************************/
      
      /***********************************************/
      /*   Verify HAL_Awss_Switch_Channel In Loop    */
      /***********************************************/
    • verify_awss_open_monitor

      HAL_Awss_Open_Monitor进行自测。

      确保设备附近有运行配网App在发送配网报文。

      输出日志为当前收到的配网模块帧类型的表格,其中有 SmartConfig Start FrameSmartConfig Group FrameSmartConfig Data Frame 字样,说明当前监听模式可以接收到一键配网所需的帧类型。

      /***********************************************/
      /*        Verify HAL_Awss_Open_Monitor         */
      /***********************************************/
      
      |---------------------------------------------------------------------|
      |          Frame Type         | Direction |  Packet Length  | Channel |
      |-----------------------------|-----------|-----------------|---------|
      |   SmartConfig  Data Frame   |   FromDS  |  1256 (0x04E8)  |     8   |
      |   SmartConfig Start Frame   |   FromDS  |  1248 (0x04E0)  |     8   |
      |   SmartConfig  Data Frame   |   FromDS  |  1256 (0x04E8)  |     8   |
      |   SmartConfig  Data Frame   |   FromDS  |  0532 (0x0214)  |     9   |
      |   SmartConfig  Data Frame   |   FromDS  |  0288 (0x0120)  |     1   |
      |   SmartConfig  Data Frame   |   FromDS  |  0457 (0x01C9)  |     3   |
      |   SmartConfig Group Frame   |   FromDS  |  1002 (0x03EA)  |     4   |
      |   SmartConfig Group Frame   |   FromDS  |  0994 (0x03E2)  |     4   |
      |   SmartConfig  Data Frame   |   FromDS  |  0284 (0x011C)  |     4   |
      |   SmartConfig  Data Frame   |   FromDS  |  0421 (0x01A5)  |     4   |
      |   SmartConfig  Data Frame   |   FromDS  |  0413 (0x019D)  |     4   |
    • verify_awss_close_monitor

      HAL_Awss_Close_Monitor进行自测,观察是否可以按预期停止监听模式。

      /***********************************************/
      /*        Verify HAL_Awss_Close_Monitor        */
      /***********************************************/
    • verify_awss_switch_channel

      HAL_Awss_Switch_Channel进行自测,观察是否可以按预期切换到指定的WiFi信道(1-13)。

    • verfiy_awss_connect_ap

      HAL_Awss_Connect_Ap进行自测,观察是否可以根据SSID和密码,连接到指定的AP热点。

      /***********************************************/
      /*          Verify HAL_Awss_Connect_Ap         */
      /*                  Result:  0                 */
      /***********************************************/

      其中,Result的值为0表示成功,为-1表示失败。

    • verify_awss_get_ap_info

      HAL_Wifi_Get_Ap_Info进行自测,观察是否可以按预期收集AP热点的连接信息。成功调用该函数后,系统会打印获取到的ssid、密码和bssid

      /***********************************************/
      /*         Verify HAL_Wifi_Get_Ap_Info         */
      /*                  Result:  0                 */
      /*           SSID:       test_ssid             */
      /*           PASSWD:     test_passwd           */
      /*           PASSWD:     test_bssid            */
      /***********************************************/

      其中,无论设备是否连接上路由器,Result的值都为0

    • verify_awss_net_is_ready

      HAL_Sys_Net_Is_Ready进行自测,观察是否调用该函数后,会获取当前网络状态。

      /***********************************************/
      /*         Verify HAL_Sys_Net_Is_Ready         */
      /*                  Result:  0                 */
      /***********************************************/

      其中,Result的值为0表示处于连网状态,值为1表示处于非连网状态。