前言

本文研究如何使用微信Airkiss协议对模块进行配网,所谓配网即是说通知模块需要连接的路由器ssid和password的一种机制。

一、理论基础

1.Airkiss原理

设备处于混杂模式监听无线包,APP每隔一小段时间发送广播包/组播包,通过路由器转发,当设备和路由器处于同一信道的时候,设备能够收到有效的数据,而无线包中可见字段只有length,因此Airkiss和市面上所谓的一键配网实际上都是通过对length进行编码传输路由器ssid和password给设备的一种方式。

2.Airkiss配网流程

主要步骤如下所示:

设备处于混杂模式监听无线包,并每隔100ms切换一次信道。

设备信道锁定后,不再切换

APP下发通过length编码的ssid和password

设备按照相同的规则解析包内容,获取路由器ssid和password

二、使用实例

1.程序分析

1.1 设备信道切换

static void airkiss_switch_channel(void *parameter)
{g_current_channel++;if (g_current_channel > MAX_CHANNEL_NUM){g_current_channel = 1;}rt_wlan_set_channel(g_wlan_device, g_current_channel);airkiss_change_channel(ak_contex);AIRKISS_PRINTF("Switch channel %d \n", g_current_channel);
}

1.2 混杂包监听回调函数

static void airkiss_monitor_callback(uint8_t *data, int len, void *user_data)
{airkiss_recv_ret = airkiss_recv(ak_contex, data, len);if (airkiss_recv_ret == AIRKISS_STATUS_CHANNEL_LOCKED){rt_timer_stop(g_switch_timer);AIRKISS_PRINTF("Lock channel in %d \n", g_current_channel);rt_timer_start(g_doing_timer);}else if (airkiss_recv_ret == AIRKISS_STATUS_COMPLETE){rt_timer_stop(g_doing_timer);rt_sem_release(g_cfg_done_sem);AIRKISS_PRINTF("AIRKISS_STATUS_COMPLETE \n");}
}

1.3 发送配网后收到的random,通知APP配网成功

static void airkiss_send_notification_thread(void *parameter)
{int sock = -1;int udpbufsize = 2;uint8_t random = (uint32_t)parameter;struct sockaddr_in g_stUDPBCAddr, g_stUDPBCServerAddr;sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0){AIRKISS_PRINTF("notify create socket error!\n");goto _exit;}g_stUDPBCAddr.sin_family = AF_INET;g_stUDPBCAddr.sin_port = htons(10000);g_stUDPBCAddr.sin_addr.s_addr = htonl(0xffffffff);rt_memset(&(g_stUDPBCAddr.sin_zero), 0, sizeof(g_stUDPBCAddr.sin_zero));g_stUDPBCServerAddr.sin_family = AF_INET;g_stUDPBCServerAddr.sin_port = htons(10000);g_stUDPBCServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);rt_memset(&(g_stUDPBCServerAddr.sin_zero), 0, sizeof(g_stUDPBCServerAddr.sin_zero));if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &udpbufsize, sizeof(int)) != 0){AIRKISS_PRINTF("notify socket setsockopt error\n");goto _exit;}if (bind(sock, (struct sockaddr *)&g_stUDPBCServerAddr, sizeof(g_stUDPBCServerAddr)) != 0){AIRKISS_PRINTF("notify socket bind error\n");goto _exit;}for (int i = 0; i <= 20; i++){int ret = sendto(sock, (char *)&random, 1, 0, (struct sockaddr *)&g_stUDPBCAddr, sizeof(g_stUDPBCAddr));rt_thread_delay(10);}AIRKISS_PRINTF("airkiss notification thread exit!\n");_exit:if (sock >= 0){close(sock);}
}

1.4 配网入口函数

static void airkiss_thread_entry(void *parameter)
{int result;g_switch_timer = rt_timer_create("switch_channel",airkiss_switch_channel,RT_NULL,AIRKISS_SWITCH_TIMER,RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);if (!g_switch_timer){rt_kprintf("Create airkiss swtich channel timer failed \n");goto _exit;}g_doing_timer = rt_timer_create("doing_timeout",airkiss_doing_timeout,RT_NULL,AIRKISS_DOING_TIMER,RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);if (!g_doing_timer){rt_kprintf("Create airkiss doing timeout timer failed \n");goto _exit;}g_cfg_done_sem = rt_sem_create("tlink", 0, RT_IPC_FLAG_FIFO);if (!g_cfg_done_sem){rt_kprintf("Create  airkiss config done sem failed! \n");goto _exit;}ak_contex = (airkiss_context_t *)rt_malloc(sizeof(airkiss_context_t));if (!ak_contex){rt_kprintf("Malloc memory for airkiss context \n");goto _exit;}result = airkiss_init(ak_contex, &ak_conf);if (result != RT_EOK){rt_kprintf("Airkiss init failed!!\r\n");goto _exit;}AIRKISS_PRINTF("Airkiss version: %s\r\n", airkiss_version());g_wlan_device = (struct rt_wlan_device *)rt_device_find(WIFI_DEVICE_STA_NAME);if (g_wlan_device == RT_NULL){rt_kprintf("Device not found\n");return;}g_current_channel = 1;rt_wlan_set_channel(g_wlan_device, g_current_channel);rt_wlan_set_monitor_callback(g_wlan_device, airkiss_monitor_callback);rt_wlan_cfg_monitor(g_wlan_device, WIFI_MONITOR_START);rt_timer_start(g_switch_timer);if (rt_sem_take(g_cfg_done_sem, rt_tick_from_millisecond(1000 * 90)) != RT_EOK){AIRKISS_PRINTF("Wait semaphore timeout \n");}if (airkiss_recv_ret == AIRKISS_STATUS_COMPLETE){int8_t err;int8_t tick = 0;airkiss_result_t result;err = airkiss_get_result(ak_contex, &result);if (err == 0){AIRKISS_PRINTF("airkiss_get_result() ok!\n");AIRKISS_PRINTF(" ssid = %s \n pwd = %s \n, ssid_length = %d \n pwd_length = %d \n, random = 0x%02x\r\n",result.ssid, result.pwd, result.ssid_length, result.pwd_length, result.random);}rt_wlan_cfg_monitor(g_wlan_device, WIFI_MONITOR_STOP);rt_wlan_set_monitor_callback(g_wlan_device, RT_NULL);station_connect(result.ssid, result.pwd);do{tick ++;rt_thread_delay(rt_tick_from_millisecond(1000));if (tick >= 30){rt_kprintf("GET IP Time Out!!! \n");goto _exit;}}while (!get_wifi_status(g_wlan_device->parent.netif));{rt_thread_t tid;tid = rt_thread_create("air_echo",airkiss_send_notification_thread, (void *)result.random,1536, RT_THREAD_PRIORITY_MAX - 3, 20);if (tid != RT_NULL){rt_thread_startup(tid);}}}_exit:if (g_switch_timer){rt_timer_stop(g_switch_timer);rt_timer_delete(g_switch_timer);}if (g_doing_timer){rt_timer_stop(g_doing_timer);rt_timer_delete(g_doing_timer);}if (ak_contex != RT_NULL){rt_free(ak_contex);ak_contex = RT_NULL;}if (g_cfg_done_sem){rt_sem_delete(g_cfg_done_sem);g_cfg_done_sem = 0;}
}

2.配置

(1)组件下载

下载smartconfig包(github下载),将smartconfig放在bsp/w60x/路径下,然后再rtconfig.h中修改,增加如下图所示宏定义:

(2)编译配置

在applications/2-net目录下新建一个文件夹:6-config_airkiss,然后需要修改aplications/SConscript脚本。

Import('RTT_ROOT')
Import('rtconfig')
from building import *cwd = GetCurrentDir()
src  = Glob('2-net/6-config_airkiss/*.c')
CPPPATH = [cwd]group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)Return('group')

3.下载微信官方调试工具

下载地址:https://iot.weixin.qq.com/wiki/new/index.html?page=6-1

三、下载运行

在ENV控制台,输入scons命令,在build/Bin目录下生成rtthread_1M.FLS,

烧录运行后,操作APP配网:

调试串口信息如下:

调试串口信息中,收到路由器的密码,然后连接路由器成功,说明配网OK。

四、结语

1.总结:

本节完,实际操作过程中需要注意的地方有如下几点:

(1) 组件更新引入的问题

调用rt_smartconfig_start开始配网,成功后,进入smartconfig_result回调函数,不能直接发送UDP广播,因为回调函数中不宜做耗时过长操作,正确操作是创建发送线程,将需要广播的内容,通过传参方式传到线程中。

rt_smartconfig_start(SMARTCONFIG_TYPE_AIRKISS, SMARTCONFIG_ENCRYPT_NONE, RT_NULL, smartconfig_result);

2.资料获取

如您在使用过程中有任何问题,请加QQ群进一步交流。

QQ交流群:906015840 (备注:物联网项目交流)

公众号:物联网客栈,扫码关注,回复w600即可。

一叶孤沙出品:一沙一世界,一叶一菩提

WIFI模块开发教程之W600网络篇6:Airkiss配网相关推荐

  1. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... 共同学习成长QQ群 622368884,不喜勿 ...

  2. 【微信小程序控制硬件13 】 与硬件平台无关,微信小程序 AP 配网安信可 Wi-Fi 模块入网示例。【AT篇,附带Demo】

    文章目录 前言 一 材料准备 二 实现目的 三 配置的数据交互协议 3.1 小程序发送网络信息阶段 3.2 模组连接路由器的回调: 四 配置原理和过程 五 设备端 AT 交互过程 另外,不要把我的博客 ...

  3. 运动控制卡的函数库与Linux,运动控制卡应用开发教程之ROS(下)

    在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. ECI2418支持4轴脉冲输入与编码器反馈,板载24点输入,16点输出,2A ...

  4. NVIDIA Jetson TX1 系列开发教程之二:刷机与开发前准备

    NVIDIA Jetson TX1 系列开发教程之二:刷机与开发前准备 转载请注明作者和出处:http://blog.csdn.net/u011475210 嵌入式平台:NVIDIA Jetson T ...

  5. EtherCAT运动控制卡开发教程之python

    众所周知,Python作为一门面向对象的新兴开发语言,具有非常完善的基础代码库,更注重实用,同时代码可读极强,编写完程序即可直接运行,被越来越多的人广泛将它用于机器视觉和自动化控制. 今天正运动技术与 ...

  6. Xamarin Anroid开发教程之Anroid开发工具及应用介绍

    Xamarin Anroid开发教程之Anroid开发工具及应用介绍 Xamarin开发Anroid应用介绍 如今智能手机已经盛行了好几年,而针对这些智能手机的软件开发也变得异常火热.但是在Andro ...

  7. wince 开发_正运动技术运动控制卡应用开发教程之Python

    众所周知,Python作为一门面向对象的新兴开发语言,具有完善的基础代码库,实用性与代码可读性强,被越来越多的人应用于智能装备的运动控制. 今天正运动技术与大家分享一下运动控制卡应用开发教程之Pyth ...

  8. iPhone开发教程之iOS APP体验设计 - 醒醒吧 ))))) - majszt - 和讯博客

    iPhone开发教程之iOS APP体验设计 iPhone开发    |   更新时间:2012-10-15   |   点击:131    |   来源:本站 iOS APP体验设计不像互联网的体验 ...

  9. 运动控制卡应用开发教程之MATLAB

    今天,正运动小助手给大家分享一下运动控制卡应用开发教程之MATLAB.  一 ECI2828硬件介绍 ECI2828系列运动控制卡支持多达16 轴直线插补.任意圆弧插补.空间圆弧.螺旋插补.电子凸轮. ...

最新文章

  1. 作为Web开发人员,我为什么喜欢Google Chrome浏览器
  2. 测试nb信号的软件_NB-IoT和LORA,谁才是真正的低功耗?从数据看真相
  3. 充电桩用什么写软件_充电桩云平台是什么?
  4. SAP Spartacus org unit table不同区域focus然后回车的行为差异
  5. 【转】Dynamics 365中的事件框架与事件执行管道(Event execution pipeline)
  6. 中科大 计算机网络10 第一章总结和习题
  7. 快递100 的 《API URL 所支持的快递公司及参数说明》和《支持的国际类快递及参数说明》
  8. 打印机驱动开发,初步了解
  9. 什么是互联网外包公司
  10. Linux移植Windows摄像头驱动,基于3.14内核usb摄像头驱动的移植
  11. 解决调用接口时的OPTIONS请求
  12. 利用SQL语句创建、修改、删除、查看与使用数据库
  13. Calibre for Mac v5.20.0 中文版 电子书阅读管理工具
  14. 新形势下大学生心理健康问题及教育模式探讨
  15. 国内低代码平台有哪些?织信informat好不好用?
  16. FormData+Ajax文件上传
  17. elment ui table 点击上下移动表格
  18. Axure原型:超漂亮的系统首页
  19. 如何部署一个 PHP 项目
  20. MEMS加速度计在寻北仪中的应用

热门文章

  1. PHP phpqrcode 生成的二维码直接下载
  2. 《袁老师访谈录》第六期 | 四位大咖:【对话四种类型创业者】
  3. java poi 往xlsx写数据为空
  4. 浅谈QQ营销之月收入上万不是梦
  5. Python如何比较两张图片的相似度
  6. 微信创建小程序菜单45064 no permission to use weapp in menu
  7. python自动化测试学习
  8. 使用 ESP32 设计智能手表 – 第 1 部分制作表盘
  9. Surging 微服务框架使用入门
  10. [转载]浅谈电视剧《武林外史》之白飞飞_-刘艳红-_新浪博客