一 ?AirKiss 庫文件組成
AirKiss 庫由以下文件組成:
airkiss.h:
AirKiss 庫頭文件趟妥,要使用 AirKiss 功能必須包含該頭文件愧旦,主要定義了相關(guān)參數(shù)結(jié)構(gòu)體及 AirKiss 庫函數(shù)接口奖恰,AES 加密功能啟用宏也在該文件中颅眶。libairkiss.a:
不帶 AES 加密功能的 AirKiss 靜態(tài)庫文件寥院,如果廠家不需要 AES 加密功能
則可使用本靜態(tài)庫掰盘,占用的資源比帶 AES 功能的靜態(tài)庫更少欠橘,使用本靜態(tài)庫記
得關(guān)閉airkiss.h中的 AES 加密功能宏矩肩。
libairkiss_aes.a:
支持 AES 加密功能的 AirKiss 靜態(tài)庫文件,如果廠家需要使用 AES 加密功
能則需要鏈接本靜態(tài)庫肃续,占用的資源相對libairkiss.a較多黍檩,使用本靜態(tài)庫
記得開啟airkiss.h中的 AES 加密功能宏。
libairkiss_log.a:
在libairkiss.a的基礎(chǔ)上添加了 log 打印始锚,可以用于 debug刽酱。libairkiss_aes_log.a:
在libairkiss_aes.a的基礎(chǔ)上添加了 log 打印,可以用于 debug瞧捌。
注意:airkiss.h需要添加到頭文件路徑中棵里,libairkiss.a和libairkiss_aes.a只需要使用其中一個,根據(jù)具體需要選擇姐呐,并設(shè)置好airkiss.h文件中的 AES 加密功能宏殿怜,出于安全考慮,建議使用 AES 加密功
能的 AirKiss 靜態(tài)庫曙砂。
二 ?設(shè)備平臺能力?
無法滿足以下軟件及硬件能力要求的設(shè)備或模塊將無法使用 AirKiss 功能头谜。
硬件能力要求:
1、 ?能夠切換信道;
2鸠澈、 ?具備定時器功能乔夯,能夠提供 100ms 的定時中斷;
3、 ?能夠設(shè)置為混雜模式款侵,接收 802.11 網(wǎng)絡(luò)幀;
4末荐、 ?提供一種進入 AirKiss 模式的控制方式,例如一個按鍵;
軟件能力要求:
1新锈、 ?能夠提供類似標準 memset 函數(shù)的功能函數(shù);
2甲脏、 ?能夠提供類似標準 memcpy 函數(shù)的功能函數(shù);
3、 ?能夠提供類似標準 memcmp 函數(shù)的功能函數(shù);
4、 ?能夠提供至少 232 字節(jié)的全局緩沖空間(完成 AirKiss 后用戶可
用于自己的應(yīng)用程序或進行釋放);
5块请、 帶 AES 功能的靜態(tài)庫文件大小為 32KB娜氏,不帶 AES 功能的靜態(tài)
庫文件大小為 13KB,實際鏈接以后占用資源不同墩新,以 ESP8266 平
臺為例贸弥,實現(xiàn)不帶 AES 功能的 AirKiss 要占用 2304 字節(jié),實現(xiàn)帶
有 AES 功能要占用 5456 字節(jié)海渊。以上統(tǒng)計包括實現(xiàn) AirKiss 功能外
部邏輯函數(shù)代碼绵疲。
三 airkiss庫使用說明
使用 AirKiss 庫實現(xiàn) AirKiss 功能的流程如下(#include "airkiss.h"):
1、 創(chuàng)建 AirKiss 全局緩沖區(qū):airkiss_context_t akcontex;如果平臺支
持malloc等動態(tài)內(nèi)存申請臣疑,也可以通過動態(tài)申請的方式申請空間盔憨,完成
AirKiss 流程或超時(超時時長用戶可以自定,建議 30~40s)以后進行釋放;
2讯沈、 為 AirKiss 庫配置與平臺相關(guān)的接口函數(shù)結(jié)構(gòu)體郁岩,可以為靜態(tài)const類型,
下面示例中的函數(shù)都為標準 C 庫中對應(yīng)的函數(shù)名缺狠,如果平臺沒有該函數(shù)需要
把平臺實現(xiàn)相同功能的函數(shù)名填上问慎,其中最后一項為打印函數(shù),可以填 0挤茄,
其他為必填項如叼,否則調(diào)用airkiss_init()接口會返回失敗:const airkiss_config_t akconf = {
(airkiss_memset_fn)&memset,
(airkiss_memcpy_fn)&memcpy,
(airkiss_memcmp_fn)&memcmp,
(airkiss_printf_fn)&printf };
3、 調(diào)用 AirKiss 初始化接口驮樊,接口參數(shù)為前兩步創(chuàng)建的變量地址:
ret = airkiss_init(&akcontex, &akconf);
如果 ret 返回值小于 0 則表示初始化失敗,通常為參數(shù)錯誤片酝,等于 0 為成功囚衔,
如果用戶在一次 AirKiss 的流程中想重新開始新流程,需要通過調(diào)用該接口
實現(xiàn)雕沿。
4练湿、 如果airkiss.h文件中開啟了 AES 的宏并且鏈接了libairkiss_aes.a靜態(tài)庫,則需要調(diào)用設(shè)置密鑰接口审轮,? key 可以為局部變量:airkiss_set_key(&akcontex, key, strlen(key));
5肥哎、 完成以上初始化流程以后就可以開啟 100ms 定時器,在定時中斷函數(shù)中依
次切換信道;
6疾渣、 設(shè)置模塊為混雜模式篡诽,接收 802.11 網(wǎng)絡(luò)幀,每收到一幀數(shù)據(jù)榴捡,將數(shù)據(jù)起始
指針和數(shù)據(jù)長度傳遞給airkiss_recv()接口杈女,并判斷該接口的返回值,如果返回AIRKISS_STATUS_CHANNEL_LOCKED則表示信道已經(jīng)鎖定了,需要關(guān)閉定時器停止切換信道达椰,如果返回AIRKISS_STATUS_COMPLETE,則表示 AirKiss 完成可以調(diào)用airkiss_get_result()接口讀取參數(shù)翰蠢,其他值可以不用進行處理
四 ?設(shè)備端調(diào)用airkiss 庫的整體流程?
四? Airkiss 庫內(nèi)網(wǎng)發(fā)現(xiàn)功能使用說明
微信內(nèi)網(wǎng)發(fā)現(xiàn)功能與 AirKiss 是兩個相對獨立的模塊,兩者沒有依賴關(guān)系啰劲,使用AirKiss 庫實現(xiàn)微信內(nèi)網(wǎng)發(fā)現(xiàn)功能的流程如下(#include "airkiss.h"):
1梁沧、 為 AirKiss 庫創(chuàng)建與平臺相關(guān)的接口函數(shù)結(jié)構(gòu)體,可以為靜態(tài) const 類型蝇裤,
下面示例中的函數(shù)都為標準 C 庫中對應(yīng)的函數(shù)名廷支,如果平臺沒有該函數(shù)需要
把平臺實現(xiàn)相同功能的函數(shù)名填上,其中最后一項為打印函數(shù)猖辫,可以填 0酥泞,
其他為必填項,也可以復用在 AirKiss 流程中創(chuàng)建的變量:
const airkiss_config_t akconf = {
(airkiss_memset_fn)&memset,
(airkiss_memcpy_fn)&memcpy,
(airkiss_memcmp_fn)&memcmp,
(airkiss_printf_fn)&printf };
2啃憎、 根據(jù)使用的平臺自行創(chuàng)建 UDP芝囤,對 12476 端口進行監(jiān)聽,ip 地址不限制;
3辛萍、 將從 12476 端口接收到的數(shù)據(jù)包傳給 airkiss_lan_recv(const? void*? body,
unsigned? short? length,? const? airkiss_config_t*? config)函數(shù)悯姊,body 為
UDP 消息體數(shù)據(jù)的起始指針,length 為數(shù)據(jù)的有效長度贩毕,config 為第 1 步
創(chuàng)建的變量悯许,函數(shù)的返回值在頭文件中進行了定義,這里暫時只需要處理返
回 AIRKISS_LAN_SSDP_REQ 的情況辉阶,對于其他值用戶可以選擇打印出來方
便調(diào)試;
4先壕、 在上一步接收到 AIRKISS_LAN_SSDP_REQ 結(jié)果后,設(shè)備需要向數(shù)據(jù)包的發(fā)
送發(fā)回復響應(yīng)包谆甜,即以數(shù)據(jù)包的源 IP 和源端口為目的 IP 和目的端口垃僚,響應(yīng)
包可以通過調(diào)用 airkiss_lan_pack(airkiss_lan_cmdid_t ak_lan_cmdid,
void*? appid,? void*? deviceid,? void*? _datain,? unsigned? short? inlength,
void*? _dataout,? unsigned? short*? outlength,? const? airkiss_config_t*
config);函數(shù)實現(xiàn)打包,ak_lan_cmdid 為要打包的類型规辱,appid 為廠商公眾
號 ID谆棺,deviceid 為設(shè)備 ID,_datain 為要發(fā)送的數(shù)據(jù)罕袋,inlength 為發(fā)送數(shù)
據(jù)的長度改淑,_dataout 為打包后的數(shù)據(jù)緩沖區(qū),outlength 為緩沖區(qū)的空間浴讯,
函數(shù)成功返回后將賦值為數(shù)據(jù)包的實際長度朵夏,config 為第 1 步創(chuàng)建的變量,
示 例 : airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD,
"gh_27098xx","BD5D7xx", 0, 0, lan_buf, &lan_buf_len, &akconf);因為響
應(yīng)包不需要其他數(shù)據(jù)榆纽,所以輸入數(shù)據(jù)和長度都設(shè)置為 0;
5侍郭、 airkiss_lan_pack 返回 AIRKISS_LAN_PAKE_READY 后表明數(shù)據(jù)包打包完成
了询吴,數(shù)據(jù)存放在第 4 步示例中的 lan_buf 中,有效數(shù)據(jù)長度為 lan_buf_len亮元,
接下來用戶根據(jù)使用的平臺將數(shù)據(jù)通過 UDP 的方式發(fā)送給對方即可猛计。
6、 通過前面的步驟實現(xiàn)的是一問一答的服務(wù)發(fā)現(xiàn)模式爆捞,設(shè)備也可以直接向網(wǎng)絡(luò)
發(fā)送上線通知數(shù)據(jù)包奉瘤,無需等待前面提到的請求包。上線通知包的目的 IP 為
255.255.255.255煮甥,目的端口為 12476盗温,消息包可以通過調(diào)用
airkiss_lan_pack() 函 數(shù) 生 成 , 示 例 :
airkiss_lan_pack(AIRKISS_LAN_SSDP_NOTIFY_CMD,
"gh_27098xx","BD5D7xx", 0, 0, lan_buf, &lan_buf_len, &akconf);函數(shù)返
回 AIRKISS_LAN_PAKE_READY 后將數(shù)據(jù)通過 UDP 的方式發(fā)送到網(wǎng)絡(luò)上即
可成肘。
五? AirKiss 庫內(nèi)網(wǎng)發(fā)現(xiàn)功能調(diào)用流程圖