本文介绍了如何通过手机热点进行Wi-Fi设备配网。

工作原理

设备开启默认热点后,手机搜索发现并连接到设备热点,然后手机将连接公网路由器热点的SSID和密码(AES加密)发送给Wi-Fi设备,Wi-Fi设备就可以使用手机发送过来的SSID和密码(AES解密)连接路由器。
设备热点配网示意图
说明 由于设备热点配网需要开启热点模式,而设备一般无法同时开启设备热点与混杂模式,所以设备热点配网与其他配网模式不能同时开启,为做区分,我们提供了相应的API。awss_dev_ap_startawss_dev_ap_stop接口可用于开启和关闭设备热点配网模式。

如何使用设备热点配网

  1. 打开配置菜单。
    make distclean
    
    make menuconfig 
  2. 开启Wi-Fi配网功能。
  3. 选择手机热点配网。

API接口说明

函数名 说明
awss_dev_ap_start 开启设备热点配网,设备进入配网发现状态,用于让网络中的其它设备发现自己的存在。启动配网服务的场景包括:
  • 设备首次上电,设备上不存在热点SSID和密码。
  • 用户希望设备使用设备热点方式重新进行配网。
说明 此接口无入参,设备热点的SSID与password由Link SDK生成并调用设备上的相关HAL去启动热点。
awss_dev_ap_stop 关闭设备热点配网。停止配网服务的场景包括:
  • 当前不需要配网。
  • 希望通过其他途径配网。
iotx_event_regist_cb 注册Link SDK(包括配网)生命周期内相关事件通知。

API使用示例

  • 设备上电配网

    代码示例:

    uint8_t bssid[ETH_ALEN] = {0};
    char ssid[HAL_MAX_SSID_LEN] = {0};
    char passwd[HAL_MAX_PASSWORD_LEN] = {0};
    // Users need to get the stord ssid/passwd, to decide whether to start wifi provisioning service
    if (INVALID_SSID(ssid) || INVALID_BSSID(bssid) ) {
        awss_dev_ap_start();
    } else {
        HAL_Awss_Connect_Ap(TIMEOUT_MS, ssid, passwd, 0, 0, bssid, 0);
    }    
  • 配网过程状态监控

    如果应用程序需要感知配网过程中的状态变化,可以注册事件回调函数,当相关事件发生时,配网模块会调用回调函数告知具体的事件。设备商可以在相关事件中操作LED指示灯的亮或灭,或者通过快闪或慢闪来告知用户状态的变化,也可以播放声音来告知用户状态。

    参考示例如下,您需要在具体的事件下嵌入自己产品的处理逻辑。
    // 注册事件回调函数, 注册配网事件回调一定要需在awss_start之前调用
    iotx_event_regist_cb(linkkit_event_monitor);
    // linkkit_event_monitor是事件回调函数参考事件:
    static void linkkit_event_monitor(int event)
    {
        switch (event) {
            case IOTX_AWSS_START: // AWSS start without enbale, just supports device discover
                 // operate led to indicate user
                LOG("IOTX_AWSS_START");
                break;
            case IOTX_AWSS_ENABLE: // AWSS enable, AWSS doesn't parse awss packet until AWSS is enabled.
                LOG("IOTX_AWSS_ENABLE");
                // operate led to indicate user
                break;
            case IOTX_AWSS_LOCK_CHAN: // AWSS lock channel(Got AWSS sync packet)
                LOG("IOTX_AWSS_LOCK_CHAN");
                // operate led to indicate user
                break;
            case IOTX_AWSS_PASSWD_ERR: // AWSS decrypt passwd error
                LOG("IOTX_AWSS_PASSWD_ERR");
                // operate led to indicate user
                break;
            case IOTX_AWSS_GOT_SSID_PASSWD:
                LOG("IOTX_AWSS_GOT_SSID_PASSWD");
                // operate led to indicate user
                break;
            case IOTX_AWSS_CONNECT_ADHA: // AWSS try to connnect adha (device
                                         // discover, router solution)
                LOG("IOTX_AWSS_CONNECT_ADHA");
                // operate led to indicate user
                break;
            case IOTX_AWSS_CONNECT_ADHA_FAIL: // AWSS fails to connect adha
                LOG("IOTX_AWSS_CONNECT_ADHA_FAIL");
                // operate led to indicate user
                break;
            case IOTX_AWSS_CONNECT_AHA: // AWSS try to connect aha (AP solution)
                LOG("IOTX_AWSS_CONNECT_AHA");
                // operate led to indicate user
                break;
            case IOTX_AWSS_CONNECT_AHA_FAIL: // AWSS fails to connect aha
                LOG("IOTX_AWSS_CONNECT_AHA_FAIL");
                // operate led to indicate user
                break;
            case IOTX_AWSS_SETUP_NOTIFY: // AWSS sends out device setup information
                                         // (AP and router solution)
                LOG("IOTX_AWSS_SETUP_NOTIFY");
                // operate led to indicate user
                break;
            case IOTX_AWSS_CONNECT_ROUTER: // AWSS try to connect destination router
                LOG("IOTX_AWSS_CONNECT_ROUTER");
                // operate led to indicate user
                break;
            case IOTX_AWSS_CONNECT_ROUTER_FAIL: // AWSS fails to connect destination
                                                // router.
                LOG("IOTX_AWSS_CONNECT_ROUTER_FAIL");
                // operate led to indicate user
                break;
            case IOTX_AWSS_GOT_IP: // AWSS connects destination successfully and got
                                   // ip address
                LOG("IOTX_AWSS_GOT_IP");
                // operate led to indicate user
                break;
            case IOTX_AWSS_SUC_NOTIFY: // AWSS sends out success notify (AWSS
                                       // sucess)
                LOG("IOTX_AWSS_SUC_NOTIFY");
                // operate led to indicate user
                break;
            case IOTX_AWSS_BIND_NOTIFY: // AWSS sends out bind notify information to
                                        // support bind between user and device
                LOG("IOTX_AWSS_BIND_NOTIFY");
                // operate led to indicate user
                break;
            case IOTX_AWSS_ENABLE_TIMEOUT: // AWSS enable timeout
                                           // user needs to enable awss again to support get ssid & passwd of router
                LOG("IOTX_AWSS_ENALBE_TIMEOUT");
                // operate led to indicate user
                break;
             case IOTX_CONN_CLOUD: // Device try to connect cloud
                LOG("IOTX_CONN_CLOUD");
                // operate led to indicate user
                break;
            case IOTX_CONN_CLOUD_FAIL: // Device fails to connect cloud, refer to
                                       // net_sockets.h for error code
                LOG("IOTX_CONN_CLOUD_FAIL");
                // operate led to indicate user
                break;
            case IOTX_CONN_CLOUD_SUC: // Device connects cloud successfully
                LOG("IOTX_CONN_CLOUD_SUC");
                // operate led to indicate user
                break;
            case IOTX_RESET: // Linkkit reset success (just got reset response from
                             // cloud without any other operation)
                LOG("IOTX_RESET");
                // operate led to indicate user
                break;
            default:
                break;
        }
    }

需要对接的HAL接口

  • 实现SDK的公共HAL
  • 实现配网公共HAL中必须的API:
    函数名 说明
    HAL_Sys_Net_Is_Ready 检查Wi-Fi网卡、芯片和模组当前的IP地址是否有效。
    HAL_Wifi_Get_Ap_Info 获取设备所连接的热点(Access Point)的信息。
    HAL_Wifi_Get_Mac 获取设备的MAC地址,格式应当是XX:XX:XX:XX:XX:XX
    HAL_Awss_Connect_Ap 要求Wi-Fi网卡连接指定热点(Access Point)的函数。bssid指定特定Access Point,另外bssid也可能为空或无效值(全0或全0xff)。
  • 除公共部分HAL API外,您还必须实现以下特有HAL,否则设备热点配网无法正常工作:
    函数名 说明
    HAL_Awss_Close_Ap 关闭设备热点。
    HAL_Awss_Open_Ap 打开设备热点配网。