AirKiss2.0开发文档

关键字 :AirKiss

1. AirKiss2.0静态库组成

AirKiss2.0库由以下文件组成:
airkiss.h:
AirKiss2.0库头文件,要使用AirKiss2.0功能必须包含该头文件,主要定义了相关参数结构体及AirKiss2.0库函数接口,AES加密功能启用宏也在该文件中。
libairkiss.a:
不带AES加密功能的AirKiss2.0静态库文件,如果厂家不需要AES加密功能则可使用本静态库,占用的资源比带AES功能的静态库更少,使用本静态库记得关闭airkiss.h中的AES加密功能宏。
libairkiss_aes.a:
支持AES加密功能的AirKiss2.0静态库文件,如果厂家需要使用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静态库。

2. 设备要求

无法满足以下软件及硬件能力要求的设备或模块将无法使用AirKiss功能。

硬件能力要求:
●能够切换信道;
●具备定时器功能,能够提供100ms的定时中断;
●能够设置为混杂模式,接收802.11网络帧;
●提供一种进入AirKiss模式的控制方式,例如一个按键;

软件能力要求:
●能够提供类似标准memset函数的功能函数;
●能够提供类似标准memcpy函数的功能函数;
●能够提供类似标准memcmp函数的功能函数;
●能够提供至少232字节的全局缓冲空间(完成AirKiss后用户可用于自己的应用程序或进行释放); 带AES功能的静态库文件大小为32KB,不带AES功能的静态库文件大小为13KB,实际链接以后占用资源不同,以ESP8266平台为例,实现不带AES功能的AirKiss要占用2304字节,实现带有AES功能要占用5456字节。以上统计包括实现AirKiss功能外部逻辑函数代码。

3. 使用说明

A.使用AirKiss2.0库实现微信配网的流程如下(#include "airkiss.h"):

●创建AirKiss全局缓冲区:airkiss_context_t akcontex;如果平台支持malloc等动态内存申请,也可以通过动态申请的方式申请空间,完成AirKiss流程或超时(超时时长用户可以自定,建议30~40s)以后进行释放;
●为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 };
●调用AirKiss初始化接口,接口参数为前两步创建的变量地址: ret = airkiss_init(&akcontex, &akconf); ●如果ret返回值小于0则表示初始化失败,通常为参数错误,等于0为成功,如果用户在一次AirKiss的流程中想重新开始新流程,需要通过调用该接口实现。
●如果airkiss.h文件中开启了AES的宏并且链接了libairkiss_aes.a静态库,则需要调用设置密钥接口, key可以为局部变量: airkiss_set_key(&akcontex, key, strlen(key));



●完成以上初始化流程以后就可以开启100ms定时器,在定时中断函数中依次切换信道;
●设置模块为混杂模式,接收802.11网络帧,每收到一帧数据,将数据起始指针和数据长度传递给airkiss_recv()接口,并判断该接口的返回值,如果返回AIRKISS_STATUS_CHANNEL_LOCKED则表示信道已经锁定了,需要关闭定时器停止切换信道,如果返回AIRKISS_STATUS_COMPLETE则表示AirKiss2.0完成可以调用airkiss_get_result()接口读取参数,其他值可以不用进行处理。 设备端调用AirKiss2.0库实现微信配网功能的流程图如下所示:


     
    
B.使用airkiss2.0实现局域网发现的流程如下:

AirKiss局域网发现功能与AirKiss微信配网是两个相对独立的模块,两者没有依赖关系,使用AirKiss2.0库实现微信局域网发现功能的流程如下(#include "airkiss.h"):

●为AirKiss2.0库创建与平台相关的接口函数结构体,可以为静态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 };

●根据使用的平台自行创建UDP,对12476端口进行监听,ip地址不限制;

●将从12476端口接收到的数据包传给airkiss_lan_recv(const void* body, unsigned short length, const airkiss_config_t* config)函数,body为UDP消息体数据的起始指针,length为数据的有效长度,config为第1步创建的变量,函数的返回值在头文件中进行了定义,这里暂时只需要处理返回AIRKISS_LAN_SSDP_REQ的情况,对于其他值用户可以选择打印出来方便调试;

●在上一步接收到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;

●airkiss_lan_pack返回AIRKISS_LAN_PAKE_READY后表明数据包打包完成了,数据存放在第4步示例中的lan_buf中,有效数据长度为lan_buf_len,接下来用户根据使用的平台将数据通过UDP的方式发送给对方即可。

●通过前面的步骤实现的是一问一答的服务发现模式,设备也可以直接向网络发送上线通知数据包,无需等待前面提到的请求包。上线通知包的目的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的方式发送到网络上即可。

●AirKiss2.0库局域网发现功能调用流程图:




 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论