一 AirKiss 库文件组成
AirKiss 库由以下文件组成:
airkiss.h:
AirKiss 库头文件,要使用 AirKiss 功能必须包含该头文件,主要定义了相关参数结构体及 AirKiss 库函数接口,AES 加密功能启用宏也在该文件中。libairkiss.a:
不带 AES 加密功能的 AirKiss 静态库文件,如果厂家不需要 AES 加密功能
则可使用本静态库,占用的资源比带 AES 功能的静态库更少,使用本静态库记
得关闭airkiss.h中的 AES 加密功能宏。
libairkiss_aes.a:
支持 AES 加密功能的 AirKiss 静态库文件,如果厂家需要使用 AES 加密功
能则需要链接本静态库,占用的资源相对libairkiss.a较多,使用本静态库
记得开启airkiss.h中的 AES 加密功能宏。
libairkiss_log.a:
在libairkiss.a的基础上添加了 log 打印,可以用于 debug。libairkiss_aes_log.a:
在libairkiss_aes.a的基础上添加了 log 打印,可以用于 debug。
注意:airkiss.h需要添加到头文件路径中,libairkiss.a和libairkiss_aes.a只需要使用其中一个,根据具体需要选择,并设置好airkiss.h文件中的 AES 加密功能宏,出于安全考虑,建议使用 AES 加密功
能的 AirKiss 静态库。
二 设备平台能力
无法满足以下软件及硬件能力要求的设备或模块将无法使用 AirKiss 功能。
硬件能力要求:
1、 能够切换信道;
2、 具备定时器功能,能够提供 100ms 的定时中断;
3、 能够设置为混杂模式,接收 802.11 网络帧;
4、 提供一种进入 AirKiss 模式的控制方式,例如一个按键;
软件能力要求:
1、 能够提供类似标准 memset 函数的功能函数;
2、 能够提供类似标准 memcpy 函数的功能函数;
3、 能够提供类似标准 memcmp 函数的功能函数;
4、 能够提供至少 232 字节的全局缓冲空间(完成 AirKiss 后用户可
用于自己的应用程序或进行释放);
5、 带 AES 功能的静态库文件大小为 32KB,不带 AES 功能的静态
库文件大小为 13KB,实际链接以后占用资源不同,以 ESP8266 平
台为例,实现不带 AES 功能的 AirKiss 要占用 2304 字节,实现带
有 AES 功能要占用 5456 字节。以上统计包括实现 AirKiss 功能外
部逻辑函数代码。
三 airkiss库使用说明
使用 AirKiss 库实现 AirKiss 功能的流程如下(#include "airkiss.h"):
1、 创建 AirKiss 全局缓冲区:airkiss_context_t akcontex;如果平台支
持malloc等动态内存申请,也可以通过动态申请的方式申请空间,完成
AirKiss 流程或超时(超时时长用户可以自定,建议 30~40s)以后进行释放;
2、 为 AirKiss 库配置与平台相关的接口函数结构体,可以为静态const类型,
下面示例中的函数都为标准 C 库中对应的函数名,如果平台没有该函数需要
把平台实现相同功能的函数名填上,其中最后一项为打印函数,可以填 0,
其他为必填项,否则调用airkiss_init()接口会返回失败:const airkiss_config_t akconf = {
(airkiss_memset_fn)&memset,
(airkiss_memcpy_fn)&memcpy,
(airkiss_memcmp_fn)&memcmp,
(airkiss_printf_fn)&printf };
3、 调用 AirKiss 初始化接口,接口参数为前两步创建的变量地址:
ret = airkiss_init(&akcontex, &akconf);
如果 ret 返回值小于 0 则表示初始化失败,通常为参数错误,等于 0 为成功,
如果用户在一次 AirKiss 的流程中想重新开始新流程,需要通过调用该接口
实现。
4、 如果airkiss.h文件中开启了 AES 的宏并且链接了libairkiss_aes.a静态库,则需要调用设置密钥接口, key 可以为局部变量:airkiss_set_key(&akcontex, key, strlen(key));
5、 完成以上初始化流程以后就可以开启 100ms 定时器,在定时中断函数中依
次切换信道;
6、 设置模块为混杂模式,接收 802.11 网络帧,每收到一帧数据,将数据起始
指针和数据长度传递给airkiss_recv()接口,并判断该接口的返回值,如果返回AIRKISS_STATUS_CHANNEL_LOCKED则表示信道已经锁定了,需要关闭定时器停止切换信道,如果返回AIRKISS_STATUS_COMPLETE,则表示 AirKiss 完成可以调用airkiss_get_result()接口读取参数,其他值可以不用进行处理
四 设备端调用airkiss 库的整体流程
四 Airkiss 库内网发现功能使用说明
微信内网发现功能与 AirKiss 是两个相对独立的模块,两者没有依赖关系,使用AirKiss 库实现微信内网发现功能的流程如下(#include "airkiss.h"):
1、 为 AirKiss 库创建与平台相关的接口函数结构体,可以为静态 const 类型,
下面示例中的函数都为标准 C 库中对应的函数名,如果平台没有该函数需要
把平台实现相同功能的函数名填上,其中最后一项为打印函数,可以填 0,
其他为必填项,也可以复用在 AirKiss 流程中创建的变量:
const airkiss_config_t akconf = {
(airkiss_memset_fn)&memset,
(airkiss_memcpy_fn)&memcpy,
(airkiss_memcmp_fn)&memcmp,
(airkiss_printf_fn)&printf };
2、 根据使用的平台自行创建 UDP,对 12476 端口进行监听,ip 地址不限制;
3、 将从 12476 端口接收到的数据包传给 airkiss_lan_recv(const void* body,
unsigned short length, const airkiss_config_t* config)函数,body 为
UDP 消息体数据的起始指针,length 为数据的有效长度,config 为第 1 步
创建的变量,函数的返回值在头文件中进行了定义,这里暂时只需要处理返
回 AIRKISS_LAN_SSDP_REQ 的情况,对于其他值用户可以选择打印出来方
便调试;
4、 在上一步接收到 AIRKISS_LAN_SSDP_REQ 结果后,设备需要向数据包的发
送发回复响应包,即以数据包的源 IP 和源端口为目的 IP 和目的端口,响应
包可以通过调用 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);函数实现打包,ak_lan_cmdid 为要打包的类型,appid 为厂商公众
号 ID,deviceid 为设备 ID,_datain 为要发送的数据,inlength 为发送数
据的长度,_dataout 为打包后的数据缓冲区,outlength 为缓冲区的空间,
函数成功返回后将赋值为数据包的实际长度,config 为第 1 步创建的变量,
示 例 : airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD,
"gh_27098xx","BD5D7xx", 0, 0, lan_buf, &lan_buf_len, &akconf);因为响
应包不需要其他数据,所以输入数据和长度都设置为 0;
5、 airkiss_lan_pack 返回 AIRKISS_LAN_PAKE_READY 后表明数据包打包完成
了,数据存放在第 4 步示例中的 lan_buf 中,有效数据长度为 lan_buf_len,
接下来用户根据使用的平台将数据通过 UDP 的方式发送给对方即可。
6、 通过前面的步骤实现的是一问一答的服务发现模式,设备也可以直接向网络
发送上线通知数据包,无需等待前面提到的请求包。上线通知包的目的 IP 为
255.255.255.255,目的端口为 12476,消息包可以通过调用
airkiss_lan_pack() 函 数 生 成 , 示 例 :
airkiss_lan_pack(AIRKISS_LAN_SSDP_NOTIFY_CMD,
"gh_27098xx","BD5D7xx", 0, 0, lan_buf, &lan_buf_len, &akconf);函数返
回 AIRKISS_LAN_PAKE_READY 后将数据通过 UDP 的方式发送到网络上即
可。
五 AirKiss 库内网发现功能调用流程图
网友评论