airkiss.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * airkiss.h
  3. *
  4. * Created on: 2015-1-26
  5. * Author: peterfan
  6. */
  7. #ifndef AIRKISS_H_
  8. #define AIRKISS_H_
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. /*
  13. * 定义AIRKISS_ENABLE_CRYPT为1以启用AirKiss加密功能
  14. */
  15. #ifndef AIRKISS_ENABLE_CRYPT
  16. #define AIRKISS_ENABLE_CRYPT 0
  17. #endif
  18. typedef void* (*airkiss_memset_fn) (void* ptr, int value, unsigned int num);
  19. typedef void* (*airkiss_memcpy_fn) (void* dst, const void* src, unsigned int num);
  20. typedef int (*airkiss_memcmp_fn) (const void* ptr1, const void* ptr2, unsigned int num);
  21. typedef int (*airkiss_printf_fn) (const char* format, ...);
  22. /*
  23. * 对AirKiss库进行配置,目前仅定义了一些回调函数
  24. */
  25. typedef struct
  26. {
  27. /*
  28. * 为尽量减少库文件体积,如下c标准库函数需要上层使用者提供
  29. * 其中printf可以为NULL
  30. */
  31. airkiss_memset_fn memset;
  32. airkiss_memcpy_fn memcpy;
  33. airkiss_memcmp_fn memcmp;
  34. airkiss_printf_fn printf;
  35. } airkiss_config_t;
  36. /*
  37. * AirKiss API工作需要的结构体,必须为全局变量或者通过malloc动态分配
  38. */
  39. typedef struct
  40. {
  41. int dummyap[26];
  42. int dummy[32];
  43. } airkiss_context_t;
  44. /*
  45. * AirKiss解码成功后的结果
  46. */
  47. typedef struct
  48. {
  49. char* pwd; /* wifi密码,以'\0'结尾 */
  50. char* ssid; /* wifi ssid,以'\0'结尾 */
  51. unsigned char pwd_length; /* wifi密码长度 */
  52. unsigned char ssid_length; /* wifi ssid长度 */
  53. unsigned char random; /* 随机值,根据AirKiss协议,当wifi连接成功后,需要通过udp向10000端口广播这个随机值,这样AirKiss发送端(微信客户端或者AirKissDebugger)就能知道AirKiss已配置成功 */
  54. unsigned char ssid_crc; /* SSID crc8 */
  55. } airkiss_result_t;
  56. /*
  57. * airkiss_recv()正常情况下的返回值
  58. */
  59. typedef enum
  60. {
  61. /* 解码正常,无需特殊处理,继续调用airkiss_recv()直到解码成功 */
  62. AIRKISS_STATUS_CONTINUE = 0,
  63. /* wifi信道已经锁定,上层应该立即停止切换信道 */
  64. AIRKISS_STATUS_CHANNEL_LOCKED = 1,
  65. /* 解码成功,可以调用airkiss_get_result()取得结果 */
  66. AIRKISS_STATUS_COMPLETE = 2
  67. } airkiss_status_t;
  68. #if AIRKISS_ENABLE_CRYPT
  69. /*
  70. * 设置解密key,最长可以为128bit,若传入的key不足128bit,则默认用0填充
  71. *
  72. * 返回值
  73. * < 0:出错,通常是参数错误
  74. * 0:成功
  75. */
  76. int airkiss_set_key(airkiss_context_t* context, const unsigned char* key, unsigned int length);
  77. #endif
  78. /*
  79. * 获取AirKiss库版本信息
  80. */
  81. const char* airkiss_version(void);
  82. /*
  83. * 初始化AirKiss库,如要复用context,可以多次调用
  84. *
  85. * 返回值
  86. * < 0:出错,通常是参数错误
  87. * 0:成功
  88. */
  89. int airkiss_init(airkiss_context_t* context, const airkiss_config_t* config);
  90. /*
  91. * 开启WiFi Promiscuous Mode后,将收到的包传给airkiss_recv以进行解码
  92. *
  93. * 参数说明
  94. * frame:802.11 frame mac header(must contain at least first 24 bytes)
  95. * length:total frame length
  96. *
  97. * 返回值
  98. * < 0:出错,通常是参数错误
  99. * >= 0:成功,请参考airkiss_status_t
  100. */
  101. int airkiss_recv(airkiss_context_t* context, const void* frame, unsigned short length);
  102. /*
  103. * 当airkiss_recv()返回AIRKISS_STATUS_COMPLETE后,调用此函数来获取AirKiss解码结果
  104. *
  105. * 返回值
  106. * < 0:出错,解码状态还不是AIRKISS_STATUS_COMPLETE
  107. * 0:成功
  108. */
  109. int airkiss_get_result(airkiss_context_t* context, airkiss_result_t* result);
  110. /*
  111. * 上层切换信道以后,可以调用一下本接口清缓存,降低锁定错信道的概率,注意调用的逻辑是在airkiss_init之后
  112. *
  113. * 返回值
  114. * < 0:出错,通常是参数错误
  115. * 0:成功
  116. */
  117. int airkiss_change_channel(airkiss_context_t* context);
  118. /*
  119. *
  120. * 以上是实现智能配置网络的相关API,以下是微信内网发现相关API
  121. *
  122. */
  123. /*
  124. * airkiss_lan_recv()的返回值
  125. */
  126. typedef enum
  127. {
  128. /* 提供的数据缓冲区长度不足 */
  129. AIRKISS_LAN_ERR_OVERFLOW = -5,
  130. /* 当前版本不支持的指令类型 */
  131. AIRKISS_LAN_ERR_CMD = -4,
  132. /* 打包数据出错 */
  133. AIRKISS_LAN_ERR_PAKE = -3,
  134. /* 函数传递参数出错 */
  135. AIRKISS_LAN_ERR_PARA = -2,
  136. /* 报文数据错误 */
  137. AIRKISS_LAN_ERR_PKG = -1,
  138. /* 报文格式正确,但是不需要设备处理的数据包 */
  139. AIRKISS_LAN_CONTINUE = 0,
  140. /* 接收到发现设备请求数据包 */
  141. AIRKISS_LAN_SSDP_REQ = 1,
  142. /* 数据包打包完成 */
  143. AIRKISS_LAN_PAKE_READY = 2
  144. } airkiss_lan_ret_t;
  145. typedef enum
  146. {
  147. AIRKISS_LAN_SSDP_REQ_CMD = 0x1,
  148. AIRKISS_LAN_SSDP_RESP_CMD = 0x1001,
  149. AIRKISS_LAN_SSDP_NOTIFY_CMD = 0x1002
  150. } airkiss_lan_cmdid_t;
  151. /*
  152. * 设备进入内网发现模式后,将收到的包传给airkiss_lan_recv以进行解析
  153. *
  154. * 参数说明
  155. * body:802.11 frame mac header(must contain at least first 24 bytes)
  156. * length:total frame length
  157. * config:AirKiss回调函数
  158. *
  159. * 返回值
  160. * < 0:出错,请参考airkiss_lan_ret_t,通常是报文数据出错
  161. * >= 0:成功,请参考airkiss_lan_ret_t
  162. */
  163. int airkiss_lan_recv(const void* body, unsigned short length, const airkiss_config_t* config);
  164. /*
  165. * 设备要发送内网协议包时,调用本接口完成数据包打包
  166. *
  167. * 参数说明
  168. * body:802.11 frame mac header(must contain at least first 24 bytes)
  169. * length:total frame length
  170. * config:AirKiss回调函数
  171. *
  172. * 返回值
  173. * < 0:出错,请参考airkiss_lan_ret_t,通常是报文数据出错
  174. * >= 0:成功,请参考airkiss_lan_ret_t
  175. */
  176. int 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);
  177. /*
  178. * 过滤部分不符合要求的帧
  179. *
  180. * 参数说明
  181. * frame:802.11 frame mac header(must contain at least first 24 bytes)
  182. * length:total frame length
  183. *
  184. * 返回值
  185. * 0:有效
  186. * 1:无效
  187. */
  188. int airkiss_filter(const void *frame, int length);
  189. unsigned char airkiss_crc8(unsigned char *message, unsigned char len);
  190. int airkiss_recv_nossid(airkiss_context_t* context, const void* frame, unsigned short length);
  191. #ifdef __cplusplus
  192. }
  193. #endif
  194. #endif /* AIRKISS_H_ */