生活物聯(lián)網(wǎng)平臺(tái)提供多種Wi-Fi設(shè)備的配網(wǎng)技術(shù)方案,對于不具備人機(jī)交互能力的設(shè)備,可以通過借助其他設(shè)備來協(xié)助配網(wǎng)。為此,生活物聯(lián)網(wǎng)平臺(tái)提供了開放的配網(wǎng)能力,便于您在不同的設(shè)備硬件平臺(tái)上快速適配和實(shí)現(xiàn)Wi-Fi配網(wǎng)功能。

下圖為生活物聯(lián)網(wǎng)平臺(tái)SDK中Wi-Fi設(shè)備配網(wǎng)模塊的分層框架。

fig1
  • HAL_AWSS實(shí)現(xiàn)接口和OS、硬件的適配對接,為上層SDK的配網(wǎng)服務(wù)提供基礎(chǔ)的Wi-Fi通信能力。

    在生活物聯(lián)網(wǎng)平臺(tái)SDK中,HAL_AWSS的適配實(shí)現(xiàn),主要提供了Wi-Fi配網(wǎng)需要適配的接口。

  • AWSS模塊是SDK中提供的配網(wǎng)服務(wù),可以提供多種配網(wǎng)方式,依賴于HAL層的HAL_AWSS部分,以及HAL層其他相關(guān)接口的正確適配。

    AWSS模塊為上層的應(yīng)用開發(fā)提供了配網(wǎng)相關(guān)的用戶編程接口,Examples為調(diào)用這些接口的完整示例的實(shí)現(xiàn)。

    在生活物聯(lián)網(wǎng)平臺(tái)SDK中,AWSS用戶編程接口,主要用來調(diào)用實(shí)現(xiàn)設(shè)備的Wi-Fi配網(wǎng)功能。

通用HAL說明

Wi-Fi配網(wǎng)模塊中依賴生活物聯(lián)網(wǎng)平臺(tái)SDK的公共HAL接口(如下表所示)。請您參照生活物聯(lián)網(wǎng)平臺(tái)SDK中對應(yīng)模塊的說明完成對接。

序號 適配接口名 說明
1 HAL_MutexCreate 創(chuàng)建一個(gè)互斥量對象,返回指向所創(chuàng)建互斥量的指針,用于同步訪問,對于僅支持單線程應(yīng)用,可實(shí)現(xiàn)為空函數(shù)
2 HAL_MutexDestroy 銷毀一個(gè)互斥量對象,釋放資源
3 HAL_MutexLock 鎖住一個(gè)互斥量
4 HAL_MutexUnlock 解鎖一個(gè)互斥量
5 HAL_UptimeMs 獲取設(shè)備從上電到當(dāng)前時(shí)刻所經(jīng)過的毫秒數(shù)
6 HAL_Malloc 申請一塊堆內(nèi)存
7 HAL_Free 釋放參數(shù)ptr指向的一塊堆內(nèi)存,當(dāng)傳入的參數(shù)為NULL時(shí)不執(zhí)行任何操作
8 HAL_SleepMs 睡眠函數(shù),使當(dāng)前執(zhí)行線程睡眠指定的毫秒數(shù)
9 HAL_GetProductKey 獲取設(shè)備的ProductKey,用于標(biāo)識(shí)設(shè)備的品類,設(shè)備證書之一
10 HAL_GetProductSecret 獲取設(shè)備的ProductSecret,用于標(biāo)識(shí)設(shè)備的品類,設(shè)備證書之一
11 HAL_GetDeviceName 獲取設(shè)備的DeviceName,用于標(biāo)識(shí)設(shè)備單品的名字,設(shè)備證書之一
12 HAL_GetDeviceSecret 獲取設(shè)備的DeviceSecret, 用于標(biāo)識(shí)設(shè)備單品的密鑰, 設(shè)備證書之一
13 HAL_Kv_Set Flash中寫入鍵值對(Key-Value)
14 HAL_Kv_Get Flash中讀取鍵值對的Value
15 HAL_Aes128_Init 初始化AES加密的結(jié)構(gòu)體
16 HAL_Aes128_Destroy 銷毀AES加密的結(jié)構(gòu)體
17 HAL_Aes128_Cbc_Encrypt 以AES-CBC-128方式,根據(jù)HAL_Aes128_Init()時(shí)傳入的密鑰,加密指定的明文
18 HAL_Aes128_Cbc_Decrypt 以AES-CBC-128方式,根據(jù)HAL_Aes128_Init()時(shí)傳入的密鑰,解密指定的密文
19 HAL_Aes128_Cfb_Encrypt 以AES-CFB-128方式,根據(jù)HAL_Aes128_Init()時(shí)傳入的密鑰,加密指定的明文
20 HAL_Aes128_Cfb_Decrypt 以AES-CFB-128方式,根據(jù)HAL_Aes128_Init()時(shí)傳入的密鑰,解密指定的密文
21 HAL_Timer_Create 根據(jù)Name、TimerFunc和用戶上下文創(chuàng)建Timer
22 HAL_Timer_Start Timer開始計(jì)時(shí),Timer超時(shí)時(shí)調(diào)用回調(diào)函數(shù)TimerFunc
23 HAL_Timer_Stop 停止Timer計(jì)時(shí)
24 HAL_Timer_Delete 刪除Timer,釋放資源
說明 帶AliOS Things的生活物聯(lián)網(wǎng)平臺(tái)SDK的HAL接口文件說明,請參見以下目錄中的各個(gè)文件內(nèi)容。
  • /Living_SDK/framework/protocol/linkkit/sdk/iotx-sdk-c_clone/include/imports/
  • /Living_SDK/framework/protocol/linkkit/sdk/iotx-sdk-c_clone/include/iot_import.h

HAL適配概述

Wi-Fi配網(wǎng)模塊需要適配的HAL接口的詳細(xì)說明如下表所示。

說明 表中分類為配網(wǎng)通用的接口在適配時(shí)必須要實(shí)現(xiàn),否則會(huì)影響Wi-Fi設(shè)備生活物聯(lián)網(wǎng)平臺(tái)SDK的正常運(yùn)行。其他配網(wǎng)特定的分類,您可以根據(jù)自己硬件平臺(tái)的情況以及產(chǎn)品的使用場景和需要進(jìn)行選擇支持,但是同一配網(wǎng)方式類別的所有接口需要適配完整,否則會(huì)影響此種配網(wǎng)方式的正常運(yùn)行。
序號 適配接口名 說明 分類
1 HAL_Wifi_Get_Mac 獲取設(shè)備的MAC地址, 格式應(yīng)當(dāng)是”XX:XX:XX:XX:XX:XX” 配網(wǎng)通用
2 HAL_Wifi_Get_IP 獲取設(shè)備的IP地址,點(diǎn)分十進(jìn)制格式保存在字符串?dāng)?shù)組出參,二進(jìn)制格式則作為返回值,并以網(wǎng)絡(luò)字節(jié)序(大端)表達(dá),Station模式為連接AP時(shí)的IP地址,SoftAP模式為設(shè)備作為AP的Gateway IP地址 配網(wǎng)通用
3 HAL_Awss_Get_Channelscan_Interval_Ms 獲取在每個(gè)信道(channel)上掃描的時(shí)間長度,單位是毫秒 配網(wǎng)通用
4 HAL_Awss_Get_Timeout_Interval_Ms 獲取配網(wǎng)服務(wù)(AWSS)的超時(shí)時(shí)間長度,單位是毫秒 配網(wǎng)通用
5 HAL_Awss_Get_Encrypt_Type 獲取一鍵配網(wǎng)服務(wù)的安全等級 一鍵配網(wǎng)
6 HAL_Awss_Get_Conn_Encrypt_Type 獲取基于連接的配網(wǎng)服務(wù)(熱點(diǎn)配網(wǎng)/零配)的安全等級
  • 零配配網(wǎng)
  • 設(shè)備熱點(diǎn)配網(wǎng)
  • 藍(lán)牙輔助配網(wǎng)
  • 手機(jī)熱點(diǎn)配網(wǎng)
7 HAL_Awss_Open_Monitor 設(shè)備工作在監(jiān)聽(Monitor)模式,并在收到802.11幀的時(shí)候調(diào)用被傳入的回調(diào)函數(shù)(包括管理幀和數(shù)據(jù)幀) 配網(wǎng)通用
8 HAL_Awss_Close_Monitor 關(guān)閉監(jiān)聽(Monitor)模式 配網(wǎng)通用
9 HAL_Wifi_Scan 啟動(dòng)一次Wi-Fi的空中掃描 配網(wǎng)通用
10 HAL_Awss_Switch_Channel 設(shè)置Wi-Fi設(shè)備切換到指定的信道(channel)上 配網(wǎng)通用
11 HAL_Awss_Connect_Ap 要求Wi-Fi網(wǎng)卡連接指定熱點(diǎn)(Access Point)的函數(shù),bssid指定特定AP,另外bssid也可能為空或無效值(全0或全0xff) 配網(wǎng)通用
12 HAL_Wifi_Send_80211_Raw_Frame 在當(dāng)前信道(channel)上以基本數(shù)據(jù)速率(1Mbps)發(fā)送裸的802.11幀(raw 802.11 frame) 配網(wǎng)通用
13 HAL_Wifi_Enable_Mgmt_Frame_Filter 使能或禁用對管理幀的過濾 配網(wǎng)通用
14 HAL_Sys_Net_Is_Ready 檢查Wi-Fi網(wǎng)卡、芯片或模組當(dāng)前的IP地址是否有效 配網(wǎng)通用
15 HAL_Wifi_Get_Ap_Info 獲取設(shè)備所連接的熱點(diǎn)(Access Point)的信息(SSID、Password、BSSID等) 配網(wǎng)通用
16 HAL_Wifi_Get_Link_Stat 獲取當(dāng)前與AP連接鏈路狀態(tài)的信息(channel、RSSI等) 配網(wǎng)通用
17 HAL_Awss_Open_Ap 開啟設(shè)備熱點(diǎn)(SoftAP模式) 設(shè)備熱點(diǎn)配網(wǎng)
18 HAL_Awss_Close_Ap 關(guān)閉當(dāng)前設(shè)備熱點(diǎn),并把設(shè)備由SoftAP模式切換到Station模式 設(shè)備熱點(diǎn)配網(wǎng)

HAL_Wifi_Get_Mac

原型

char *HAL_Wifi_Get_Mac(_OU_ char mac_str[HAL_MAC_LEN]);

接口說明

獲取Wi-Fi網(wǎng)口的MAC地址,格式為XX:XX:XX:XX:XX:XX

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
mac_str char 輸出 指向緩沖區(qū)數(shù)組起始位置的字符指針

返回值說明

指向緩沖區(qū)數(shù)組起始位置的字符指針。

HAL_Wifi_Get_IP

原型

uint32_t HAL_Wifi_Get_IP(_OU_ char ip_str[NETWORK_ADDR_LEN], _IN_ const char *ifname);

接口說明

獲取Wi-Fi網(wǎng)口的IP地址,點(diǎn)分十進(jìn)制格式保存在字符串?dāng)?shù)組出參,二進(jìn)制格式則作為返回值,并以網(wǎng)絡(luò)字節(jié)序(大端)表達(dá)。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
ip_str char[] 輸出 存放點(diǎn)分十進(jìn)制格式的IP地址字符串的數(shù)組
ifname const char* 輸入 指定Wi-Fi網(wǎng)絡(luò)接口的名字(如果只有一個(gè)網(wǎng)口,可以忽略此參數(shù),該參數(shù)可能為NULL)

返回值說明

二進(jìn)制形式的IP地址,以網(wǎng)絡(luò)字節(jié)序(大端)組織。

HAL_Awss_Get_Channelscan_Interval_Ms

原型

int HAL_Awss_Get_Channelscan_Interval_Ms(void);

接口說明

獲取在每個(gè)信道(channel)上掃描的時(shí)間長度,單位是毫秒,建議設(shè)置為200ms~400ms(默認(rèn)250ms)。

參數(shù)說明

void

返回值說明

時(shí)間長度,單位為毫秒。

HAL_Awss_Get_Timeout_Interval_Ms

原型

int HAL_Awss_Get_Timeout_Interval_Ms(void);

接口說明

獲取配網(wǎng)服務(wù)(AWSS)的超時(shí)時(shí)間長度,單位是毫秒,建議配置為60s或60000ms。

參數(shù)說明

void

返回值說明

超時(shí)時(shí)長,單位是毫秒。

HAL_Awss_Get_Encrypt_Type

原型

int HAL_Awss_Get_Encrypt_Type(void);

接口說明

獲取一鍵配網(wǎng)服務(wù)的安全等級。

參數(shù)說明

void

返回值說明

說明
0 open (no encrypt)
1 aes256cfb with default aes-key and aes-iv
2 aes128cfb with default aes-key and aes-iv
3 aes128cfb with aes-key per product and aes-iv = 0
4 aes128cfb with aes-key per device and aes-iv = 0
5 aes128cfb with aes-key per manufacture and aes-iv = 0
others 無效

HAL_Awss_Get_Conn_Encrypt_Type

原型

int HAL_Awss_Get_Conn_Encrypt_Type(void);

接口說明

獲取零配,熱點(diǎn)配網(wǎng)的安全等級。

參數(shù)說明

void

返回值說明

說明
3 aes128cfb with aes-key per product and aes-iv = random
4 aes128cfb with aes-key per device and aes-iv = random
5 aes128cfb with aes-key per manufacture and aes-iv = random
others 無效

HAL_Awss_Open_Monitor

原型

void HAL_Awss_Open_Monitor(_IN_ awss_recv_80211_frame_cb_t cb);

接口說明

設(shè)置Wi-Fi網(wǎng)卡工作在監(jiān)聽(Monitor)模式,并在收到802.11幀的時(shí)候調(diào)用被傳入的回調(diào)函數(shù)。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
cb awss_recv_80211_frame_cb_t 輸入 回調(diào)函數(shù)指針,當(dāng)Wi-Fi接收到幀時(shí)會(huì)調(diào)用此函數(shù)
/**
 * @brief   802.11幀的處理函數(shù),可以將802.11 Frame傳遞給這個(gè)函數(shù)
 *
 * @param[in] buf @n 80211 frame buffer, or pointer to struct ht40_ctrl
 * @param[in] length @n 80211 frame buffer length
 * @param[in] link_type @n AWSS_LINK_TYPE_NONE for most rtos HAL,
 *              and for linux HAL, do the following step to check
 *              which header type the driver supported.
   @verbatim
               a) iwconfig wlan0 mode monitor    #open monitor mode
               b) iwconfig wlan0 channel 6    #switch channel 6
               c) tcpdump -i wlan0 -s0 -w file.pacp    #capture 80211 frame & save
               d) open file.pacp with wireshark or omnipeek
                   check the link header type and fcs included or not
   @endverbatim
 * @param[in] with_fcs @n 80211 frame buffer include fcs(4 byte) or not
 * @param[in] rssi @n rssi of packet, range of [-127, -1]
 */
typedef int (*awss_recv_80211_frame_cb_t)(char *buf, int length,
        enum AWSS_LINK_TYPE link_type, int with_fcs, signed char rssi);

返回值說明

void

HAL_Awss_Close_Monitor

原型

void HAL_Awss_Close_Monitor(void);

接口說明

設(shè)置Wi-Fi網(wǎng)卡離開監(jiān)聽(Monitor)模式,并開始以站點(diǎn)(Station)模式工作。

參數(shù)說明

void

返回值說明

void

HAL_Wifi_Scan

原型

int HAL_Wifi_Scan(awss_wifi_scan_result_cb_t cb);

接口說明

啟動(dòng)一次Wi-Fi的空中掃描,該API是一個(gè)阻塞操作,掃描沒有完成不能結(jié)束。所有的AP列表收集完成后,一個(gè)一個(gè)通過回調(diào)函數(shù)告知AWSS,最好不要限制AP的數(shù)量,否則可能導(dǎo)致中文GBK編碼的SSID熱點(diǎn)配網(wǎng)失敗。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
cb awss_wifi_scan_result_cb_t 輸入 掃描通知回調(diào)函數(shù)

返回值說明

說明
0 掃描正常結(jié)束
-1 其他情況

HAL_Awss_Switch_Channel

原型

void HAL_Awss_Switch_Channel(
            _IN_ char primary_channel,
            _IN_OPT_ char secondary_channel,
            _IN_OPT_ uint8_t bssid[ETH_ALEN]);

接口說明

設(shè)置Wi-Fi網(wǎng)卡切換到指定的信道(channel)上。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
primary_channel char 輸入 首選信道
secondary_channel char 輸入 輔助信道,信道帶寬為40MHz時(shí)才會(huì)使用,信道寬度為20MHz時(shí)忽略該參數(shù)
bssid uint8_t 輸入 生活物聯(lián)網(wǎng)平臺(tái)SDK1.3.0及以上版本中,此參數(shù)已廢棄,您若兼容1.3.0以前版本使用

返回值說明

void

HAL_Awss_Connect_Ap

原型

int HAL_Awss_Connect_Ap(
            _IN_ uint32_t connection_timeout_ms,
            _IN_ char ssid[HAL_MAX_SSID_LEN],
            _IN_ char passwd[HAL_MAX_PASSWD_LEN],
            _IN_OPT_ enum AWSS_AUTH_TYPE auth,
            _IN_OPT_ enum AWSS_ENC_TYPE encry,
            _IN_OPT_ uint8_t bssid[ETH_ALEN],
            _IN_OPT_ uint8_t channel);

接口說明

要求Wi-Fi網(wǎng)卡連接指定熱點(diǎn)(Access Point)的函數(shù),bssid指定特定AP,另外bssid也可能為空或無效值(全0或全0xff)。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
connection_timeout_ms uint32_t 輸入 連接AP的超時(shí)時(shí)間
ssid char 輸入 目的AP的SSID
passwd char 輸入 目的AP的PASSWORD
auth enum 輸入 目的AP的加密方式,HAL可以忽略
encry enum 輸入 目的AP的認(rèn)證方式,HAL可以忽略
bssid uint8_t 輸入 目的AP的BSSID,該字段可能為NULL或設(shè)置為全0
channel uint8_t 輸入 目的AP的信道,該字段可以忽略

返回值說明

說明
0 連接AP和DHCP成功
-1 連接AP或DHCP失敗

HAL_Wifi_Send_80211_Raw_Frame

原型

int HAL_Wifi_Send_80211_Raw_Frame(_IN_ enum HAL_Awss_Frame_Type type,
        _IN_ uint8_t *buffer, _IN_ int len);

接口說明

在當(dāng)前信道(channel)上以基本數(shù)據(jù)速率(1Mbps)發(fā)送裸的802.11幀(raw 802.11 frame)。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
type enum HAL_Awss_Frame_Type 輸入 查看HAL_Awss_Frame_Type_t定義
buffer uint8_t * 輸入 802.11裸數(shù)據(jù)幀,包括完整的MAC頭和FCS域
len int 輸入 802.11裸幀字節(jié)長度
/* 80211 frame type */
typedef enum HAL_Awss_Frame_Type {
    FRAME_ACTION,                 // 802.11中的Action幀
    FRAME_BEACON,                // 802.11中的Beacon幀
    FRAME_PROBE_REQ,           // 802.11中的Probe Request幀
    FRAME_PROBE_RESPONSE,       // 802.11中的Probe Response幀
    FRAME_DATA                 // 802.11中的數(shù)據(jù)幀
} HAL_Awss_Frame_Type_t;

返回值說明

說明
0 發(fā)送成功
-1 發(fā)送失敗

HAL_Wifi_Enable_Mgmt_Frame_Filter

原型

int HAL_Wifi_Enable_Mgmt_Frame_Filter(
            _IN_ uint32_t filter_mask,
            _IN_OPT_ uint8_t vendor_oui[3],
            _IN_ awss_wifi_mgmt_frame_cb_t callback);

接口說明

使能或禁用對特定管理幀的過濾。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
filter_mask uint32_t 輸入 幀過濾參數(shù)
vendor_oui uint8_t 輸入 Wi-Fi聯(lián)盟分配的廠商OUI,如果OUI為NULL,表示不對OUI過濾,反之要根據(jù)OUI過濾
callback awss_wifi_mgmt_frame_cb_t 輸入 用于接收802.11幀或者信息元素(IE)的回調(diào)函數(shù)

返回值說明

說明
= 0 發(fā)送成功
= -1 發(fā)送失敗
= -2 不支持

HAL_Sys_Net_Is_Ready

原型

int HAL_Sys_Net_Is_Ready();

接口說明

檢查系統(tǒng)網(wǎng)絡(luò)是否可用(設(shè)備是否已經(jīng)成功獲得IP地址并且當(dāng)前IP地址可用)。

參數(shù)說明

void

返回值說明

說明
0 網(wǎng)絡(luò)不可用
1 網(wǎng)絡(luò)可用

HAL_Wifi_Get_Ap_Info

原型

int HAL_Wifi_Get_Ap_Info(
            _OU_ char ssid[HAL_MAX_SSID_LEN],
            _OU_ char passwd[HAL_MAX_PASSWD_LEN],
            _OU_ uint8_t bssid[ETH_ALEN]);

接口說明

獲取所連接的熱點(diǎn)(Access Point)的信息。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
ssid char 輸出 AP的SSID,該參數(shù)可能為NULL
passwd char 輸出 AP的Password,該參數(shù)為NULL
bssid uint8_t 輸出 AP的BSSID,該參數(shù)可能為NULL,如果bssid不對將導(dǎo)致零配設(shè)備發(fā)現(xiàn)失敗

返回值說明

說明
0 操作成功
-1 操作失敗

HAL_Wifi_Get_Link_Stat

原型

int HAL_Wifi_Get_Link_Stat(_OU_ int *p_rssi,
                           _OU_ int *p_channel);

接口說明

獲取當(dāng)前與AP連接鏈路狀態(tài)的信息(channel、RSSI等)。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
p_rssi char 輸出 設(shè)備當(dāng)前關(guān)聯(lián)的AP的信號強(qiáng)度值
p_channel char 輸出 設(shè)備當(dāng)前關(guān)聯(lián)的AP所在的信道

返回值說明

說明
0 操作成功
-1 操作失敗

HAL_Awss_Open_Ap

原型

int HAL_Awss_Open_Ap(const char *ssid, 
                     const char *passwd, 
                     int beacon_interval, 
                     int hide);

接口說明

開啟設(shè)備熱點(diǎn)(SoftAP模式)。

參數(shù)說明

參數(shù) 數(shù)據(jù)類型 方向 說明
ssid const char * 輸入 熱點(diǎn)的ssid字符
passwd const char * 輸入 熱點(diǎn)的passwd字符
beacon_interval int 輸入 熱點(diǎn)的Beacon廣播周期(廣播間隔)
hide int 輸入
  • 0:非隱藏
  • 非0(其它值):隱藏

返回值說明

說明
0 success
-1 unsupported
-2 failure with system error
-3 failure with no memory
-4 failure with invalid parameters

HAL_Awss_Close_Ap

原型

int HAL_Awss_Close_Ap(void);

接口說明

關(guān)閉設(shè)備熱點(diǎn)。

參數(shù)說明

void

返回值說明

說明
0 success
-1 unsupported
-2 failure