情诗网 >情感文章 > 正文

airkiss 文章二

来源:情诗网    2021-01-03    分类:情感文章

一  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 库内网发现功能调用流程图

热门文章