1. 程式人生 > >AliOS-Things--ESP8266 (8)WiFi

AliOS-Things--ESP8266 (8)WiFi

鍵-值對事件註冊

1、註冊事件

/**
 * Register system event filter callback.
 *
 * @param[in]  type  event type interested.
 * @param[in]  cb    system event callback.
 * @param[in]  priv  private data past to cb.
 *
 * @return  the operation status, 0 is OK, others is error.
 */
int aos_register_event_filter
(uint16_t type, aos_event_cb cb, void *priv); int aos_register_event_filter(uint16_t type, aos_event_cb cb, void *priv) { return SYS_CALL3(SYS_REGISTER_EVENT_FILTER, int, uint16_t, type, aos_event_cb, cb, void *, priv); } aos_register_event_filter(EV_WIFI, wifi_service_event,
NULL);

比如,在上面註冊了一個型別為"EV_WIFI"的事件過濾器。而該型別下又有五個型別的具體的事件。

/* WiFi event */
#define  EV_WIFI                  0x0002
#define  CODE_WIFI_CMD_RECONNECT  1
#define  CODE_WIFI_ON_CONNECTED   2
#define  CODE_WIFI_ON_DISCONNECT  3
#define  CODE_WIFI_ON_PRE_GOT_IP  4
#define  CODE_WIFI_ON_GOT_IP      5

獲得WiFi的一些資訊

路徑:middleware\linkkit\hal\HAL_AWSS_rhino.c
 如果想知道一個模組有沒有配過網要怎麼樣才能知道呢?可以通過HAL_Wifi_Get_Ap_Info()函式獲取得到,如果沒有配過網,strlen(ssid)是為零的。

    char ssid[33];
    char passwd[65];
    uint8_t bssid[6];
    
    // 獲得wifi資訊
    HAL_Wifi_Get_Ap_Info(ssid, passwd, bssid);

    printf(">>>>>%d\r\n", sizeof(ssid));

    printf(">>>>>%d\r\n", strlen(ssid));
    printf("ssid >>>>>>>%s\r\n", ssid);
    printf("passwd >>>>>>>%s\r\n", passwd);
    printf("bssid >>>>>>>%d\r\n", bssid);

但是,如果配過網想重新配網,HAL_Wifi_Get_Ap_Info()函式
1、重新配網:
先awss復位

		do_awss_reset();

再進入配網模式

        do_awss_active();  // 配網模式

再次獲取wifi資訊,WiFi資訊已經被清空

    char ssid[33];
    char passwd[65];
    uint8_t bssid[6];
    
    // 獲得wifi資訊
    HAL_Wifi_Get_Ap_Info(ssid, passwd, bssid);
    // strlen(ssid) 為 0

AWSS復位的實現其實是清空WiFi資訊,然後再硬體復位:

static void linkkit_reset(void *p)
{
    netmgr_clear_ap_config(); // 清空WiFi的資訊
    HAL_Sys_reboot();   //系統硬體復位
}


static void do_awss_reset()
{
    aos_post_delayed_action(2000, linkkit_reset, NULL);
}