乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)


  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。
13、esp32 内置 dns 服务器,无需外网访问域名返回指定网页。
14、esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录界面。
15、认识本地离线语音唤醒识别框架 esp-skainet ,实现较低成本的硬件语音本地识别控制。
16、学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?
17、全网首发,乐鑫esp32 sdk直连京东微联·小京鱼 · IoT开放平台,实现叮咚音响语音智能控制。
18、入门京东微联·小京鱼的控制面板H5开发,读懂vue语法,做自己的控制页面。
19、重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!
20、一篇好文,开发过程中编译esp32固件太大,无法正常启动?教你如何自定义分区表partitions.csv。
21、 esp32蓝牙配网blufi的高度封装,集成简单、使用简单、容易上手,提高开发效率!
22、讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等!
23、安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。
25、分享在 esp32 SDK实现冷暖光色温平滑调节的封装,轻松集成到您的项目去。


文章目录

    • 一、前言
    • 二、微信公众号的“物联网生态”
      • 微信airkiss配网技术
        • 1.微信配网
        • 2.局域网发现
        • 3. 局域网通讯:
    • 二、esp32支持 airkiss2.0
        • 下面是微信配网流程:
        • 下面是微信近场发现流程:
    • 三、esp32 使用代码详解
        • 1 初始化微信公众号等参数;
        • 2 微信配网开始
        • 3 创建任务接收微信配网和近场发现的全部事件
        • 4 事件回调处理
        • 5 其他注意事项;
    • 四、其他
    • 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第1张图片


一、前言


       最近在看 esp32-lyart-mini 板子,已在某宝购买了,这是一个乐鑫新的开发板,看到支持语音唤醒对话,于是乎去翻源码,无意中看到 airkiss 配网的源码和近场发现的示范,对于我来说,无疑是最大金库。

       乐鑫的这个 esp32 是一个双模的芯片,Wifi + ble 支持。上个博文我已经做了一个如何在微信小程序实现七彩蓝牙控制esp32,无疑是自己学过的东西最大总结的一个作品;今天我再来分享一波如何在微信公众号实现 airkiss2.0 配网和近场发现功能;


二、微信公众号的“物联网生态”


       我做了很多的微信项目,我敢断言:微信公众号目前是最好的结合物联网做项目的实践,他支持 airkiss 配网、近场发现以及蓝牙 airSync 蓝牙设备间的通讯,而微信小程序是2016年出来的,目前没有把 airkiss 配网api提供出来,仅有一个不错的蓝牙接口可以通讯蓝牙设备;

       说了这么多,我这里先介绍微信公众号上做wifi类别硬件设备交互必备技能和深入分析:airkiss ;

微信airkiss配网技术

       AirKiss是微信硬件平台为Wi-Fi设备提供的微信配网、局域网发现和局域网通讯的技术。开发者若要实现通过微信客户端对Wi-Fi设备配网、通过微信客户端在局域网发现Wi-Fi设备,或者把微信客户端内的音乐、图片、文件等消息通过局域网发送至Wi-Fi设备,需要在硬件设备中集成相应的AirKiss静态库。

       AirKiss目前有2个版本,分别是 airkiss2.0airkiss3.0,区别如下:

  • Airkiss2.0:支持微信配网和局域网发现;
  • AirKiss3.0:支持局域网发现和局域网通讯;

1.微信配网

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第2张图片

2.局域网发现

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第3张图片

3. 局域网通讯:

       对于支持AirKiss局域网通讯的Wi-Fi设备,用户可以使用微信客户端发现与手机在同一局域网下的Wi-Fi设备,比如下面的微信公众号打印相片;

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第4张图片

二、esp32支持 airkiss2.0


       看见标题,大家都很清晰了,作为一个wifi芯片,支持 airkiss2.0 已经逐渐成为标准,但是 esp32 没支持 airkiss3.0 对于我来说确实是个遗憾!我也不知道哪个芯片支持 airkiss3.0 ,估计价格也不菲吧!

       airkiss2.0支持微信配网以及局域网发现,下面我统称把 局域网发现 统一为 近场发现


下面是微信配网流程:

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第5张图片

下面是微信近场发现流程:

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第6张图片

三、esp32 使用代码详解


       为了更好屏蔽细节,实现解耦、高度封装微信配网以及近场发现的逻辑业务,我把实现在 eps32 的代码封装成了组件,并且编译成静态库!

       下面仅仅教大家如何使用,非常简单,会简单C语言即可使用;

1 初始化微信公众号等参数;

//微信公众号的原始ID
#define CONFIG_AIRKISS_APPID "gh_ee12f1dffa4e"    
//设备id 也就是自定义消息, 近场发现用到        
#define CONFIG_AIRKISS_DEVICEID "https://github.com/xuhongv"
//加密密钥,为null即可
#define CONFIG_DUER_AIRKISS_KEY ""       

2 微信配网开始

//开始配网,传入微信公众号的原始ID等参数
airkiss_config_info_t air_info = AIRKISS_CONFIG_INFO_DEFAULT();    
air_info.lan_pack.appid = CONFIG_AIRKISS_APPID;    
air_info.lan_pack.deviceid = CONFIG_AIRKISS_DEVICEID;    
air_info.aes_key = CONFIG_DUER_AIRKISS_KEY;    
airkiss_start(&air_info);

3 创建任务接收微信配网和近场发现的全部事件

xTaskCreate(TaskAirKissListener, "TaskAirKissListener", 1024 * 2, NULL,  8, NULL);

4 事件回调处理

/**
 * @description:  微信配网已经近场发现的事件监听
 * @param {type} 
 * @return: 
 */
void TaskAirKissListener(void *p)
{
    xAirKissMsg sMsg;
    while (1)
    {
        if (xAirKissReceiveMsg(&sMsg))
        {
            ESP_LOGI(TAG, "xAirKissReceiveMsg %d", sMsg.type);
            switch (sMsg.type)
            {
            case xAirKiss_MSG_TYPE_SATRT: // 开始配网 嗅探
                ESP_LOGI(TAG, "xAirKissReceiveMsg xAirKiss_MSG_TYPE_SATRT");
                break;
            case xAirKiss_MSG_TYPE_CHANNLE_LOCKED: // 已经监听到了airkiss的数据,锁定了信道
                break;
            case xAirKiss_MSG_TYPE_GET_SSID_PASSWORD: // 成功获取路由器名字和密码
                ESP_LOGI(TAG, " get ssid[len:%d]: %s", sMsg.ssidLen, (char *)sMsg.ssid);
                ESP_LOGI(TAG, " get password[len:%d]: %s", sMsg.passwordLen, (char *)sMsg.password);
                //连接路由器
                wifi_config_t wifi_config;
                bzero(&wifi_config, sizeof(wifi_config_t));
                memcpy(wifi_config.sta.ssid, sMsg.ssid, sMsg.ssidLen);
                memcpy(wifi_config.sta.password, sMsg.password, sMsg.passwordLen);
                ESP_ERROR_CHECK(esp_wifi_disconnect());
                ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
                ESP_ERROR_CHECK(esp_wifi_connect());
                break;
            case xAirKiss_MSG_TYPE_TIMEOUT: // 失败获取路由器名字和密码,超时
                break;
            case xAirKiss_MSG_TYPE_SEND_ACK_TO_WEICHAT_OVER: // 配网成功后,设备端发送配网成功的ack到微信端
            {
                //这里开始近场发现,注意的 CONFIG_AIRKISS_DEVICEID 务必是非json格式,个人建议是 base64 加密之后字符串
                airkiss_lan_pack_param_t *air_info = calloc(1, sizeof(airkiss_lan_pack_param_t));
                air_info->appid = CONFIG_AIRKISS_APPID;
                air_info->deviceid = CONFIG_AIRKISS_DEVICEID;
                airkiss_start_local_find(air_info);
            }
            break;
            case xAirKiss_MSG_TYPE_LOCAL_FIND_START: //开始近场发现
                ESP_LOGI(TAG, "xAirKissReceiveMsg xAirKiss_MSG_TYPE_LOCAL_FIND_START");
                break;
            case xAirKiss_MSG_TYPE_LOCAL_FIND_SENDING: //开始近场发现 发送消息中
                ESP_LOGI(TAG, "xAirKissReceiveMsg xAirKiss_MSG_TYPE_LOCAL_FIND_SENDING");
                break;
            case xAirKiss_MSG_TYPE_LOCAL_FIND_STOP: //结束近场发现
                ESP_LOGI(TAG, "xAirKissReceiveMsg xAirKiss_MSG_TYPE_LOCAL_FIND_STOP");
                xEventGroupSetBits(s_wifi_event_group, AIRKISS_DONE_BIT);
                //结束所有配网队列
                airkiss_stop_all();
                //删除本任务
                vTaskDelete(NULL);
                break;
            default:
                break;
            }
        }
    }
}

5 其他注意事项;

  • 请务必在系统的 station 模式之后调用 airkiss_start() 接口!
  • 请务必在连接成功路由器之后,调用 airkiss_nofity_connect_ok() 通知SDK发送ack给微信客户端,以表明配网成功!

四、其他

       公众号配网是我的微信测试号,关注二维码如下,或者搜索公众号 gh_6b7ce0fcdb0f 关注即可,因为自己diy,只能用这个微信公众测试号来做,非公司性质公众号,最大只能是 100 个粉丝,如果关注失败了,请联系我!

乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第7张图片
  • 微信公众号效果图:
乐鑫Esp32学习之旅 12 开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。(附带Demo)_第8张图片
  • 【踩坑点①】微信公众号配网airkiss开发流程,设备端的deviceID传过来格式不能是 json 格式,个人建议把此字符串base64加密后传给微信。否则在苹果直接没有回调也没有错误信息!!!

  • 【踩坑点②】设备端的传进去的微信公众号必须是为当前配网微信公众号的原始ID,格式:gh_xxxx!否则苹果手机没有回调信息!但安卓手机与此无关!就是下面这个函数的调用传参数特别注意!

  • 本博文涉及到的代码获取途径:请关注下方微信公众号,发送 191006 获取;


另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

  • 玩转esp8266带你飞、加群QQ群,不喜的朋友勿喷勿加:434878850
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
  • 关注下面微信公众号二维码,干货多多,第一时间推送!

你可能感兴趣的:(乐鑫Esp32学习之旅)