文章目录

  • 一、前言
  • 二、设备核心代码
    • 2.1 蓝牙控制
    • 2.2 WiFi控制
    • 2.3 外设驱动
    • 三、微信小程序核心代码
    • 3.1 蓝牙搜索
    • 3.2 蓝牙服务发现
  • 四、感谢
    • 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

微信物联网生态主要分在微信硬件开发平台腾讯物联开发平台,前者已经停止维护,但依然有着很大的学习价值,而后者作为主推的平台,集成很多功能,包括从微信小程序实现配网到控制;

为了兼顾更多的朋友和自己的学习笔记,我将会一直更新此专题笔记,欢迎关注本人CSDN半颗心脏,带你走进前沿领域,学习前沿技术!

自搭微信服务器&&微信硬件开发平台

【微信小程序控制硬件第1篇 】 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件!
【微信小程序控制硬件第2篇 】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器!
【微信小程序控制硬件第3篇 】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分!
【微信小程序控制硬件第4篇 】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!
【微信小程序控制硬件第5篇 】理清接下来必须走的架构思想,学习下 JavaScript 的观察者模式,在微信小程序多页面同时接收到设备推送事件!
【微信小程序控制硬件第6篇 】服务器如何集成七牛云存储SDK,把用户自定义设备图片存储在第三方服务器!
【微信小程序控制硬件第7篇 】动起来做一个微信小程序Mqtt协议控制智能硬件的框架,为自己心里全栈工程师梦想浇水!!
【微信小程序控制硬件第8篇 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!
【微信小程序控制硬件第9篇 】巧借阿里云物联网平台的免费连接,从微信小程序颜色采集控制 esp8266 输出七彩灯效果,中秋节来个直播如何?!
【微信公众号控制硬件 第10篇 】如何在微信公众号网页实现连接mqtt服务器教程!!
【微信小程序控制硬件 第11篇 】全网首发,微信小程序ble蓝牙控制esp32,实现无需网络也可以控制亮度开关。
【微信小程序控制硬件 第12篇 】微信小程序蓝牙控制硬件应如何开发?为您全面解析微信小程序蓝牙API的使用。
【微信小程序控制硬件 第13篇 】【AT篇】与硬件平台无关,微信小程序 AP 配网安信可 Wi-Fi 模块入网示例。
【微信小程序控制硬件 第14篇 】微信小程序蓝牙+WiFi双控制ESP32-C3应用示范;。

腾讯物联开发平台

【腾讯连连 - 腾讯物联开发平台 第1篇 】腾讯官方静鸡鸡发布的“腾讯连连”终于来了,按照官方教程教你在微信小程序实现配网、控制 ESP8266啦!
【腾讯连连 - 腾讯物联开发平台 第2篇 】深度解析微信小程序smartconfig配网原理,安信可ESP-12S直连腾讯物联开发平台!!
【腾讯连连 - 腾讯物联开发平台 第3篇 】安信可IoT微信小程序全面开源,小程序上实现一键配网+控制+绑定!
【腾讯连连 - 腾讯物联开发平台 第4篇 】ESP8266 RTOS C SDK二次开发接入腾讯物联网开发平台的笔记分享!

一、前言

目前市场上越来越火的 Combo 方案(Ble+WiFi),比如平头哥的TG7100C方案、乐鑫的ESP32等,如何高效使用蓝牙和wifi通讯,已经成为了必然的趋势,于是乎,做了个这样快速入门的demo给各位,奉献于物联网;

本项目适合的模组有: ESP32-S系列/ESP32-C3系列/ESP32-S3系列模组

本开源工程用到的技术点有:

  1. 乐鑫物联网操作框架 esp-idf 的 freeRtos 实时操作系统熟悉,包括任务创建/消息队列/进程间通讯;
  2. 微信小程序开发基础,包括MQTT库/低功耗蓝牙API接口使用,包括搜索/连接/通讯;
  3. 使用乐鑫封装 RMT 驱动层单线驱动WS2812B,实现彩虹等效果;
  4. 对ESP32/C3芯片的外设开发熟悉,对BLE API接口使用熟悉,包括自定义广播/名字/自定义UUID;

二、设备核心代码

2.1 蓝牙控制

设置蓝牙广播名字

esp_ble_gap_set_device_name(TEST_DEVICE_NAME);

设置服务UUID

 gl_profile_tab[0].service_id.is_primary = true;gl_profile_tab[0].service_id.id.inst_id = 0x00;gl_profile_tab[0].service_id.id.uuid.len = ESP_UUID_LEN_16;gl_profile_tab[0].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A;

主动通知上位机数据发生改动:

 case ESP_GATTS_READ_EVT:{esp_gatt_rsp_t rsp;memset(&rsp, 0, sizeof(esp_gatt_rsp_t));rsp.attr_value.handle = param->read.handle;rsp.attr_value.len = 3;rsp.attr_value.value[0] = red;rsp.attr_value.value[1] = green;rsp.attr_value.value[2] = blue;esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &rsp);break;}

上位机主动发送数据到此并做出对应的处理:

 case ESP_GATTS_WRITE_EVT:{if (!param->write.is_prep){ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);//发送数据到队列struct __User_data *pTmper;sprintf(user_data.allData, "{\"red\":%d,\"green\":%d,\"blue\":%d}", param->write.value[0], param->write.value[1], param->write.value[2]);pTmper = &user_data;user_data.dataLen = strlen(user_data.allData);xQueueSend(ParseJSONQueueHandler, (void *)&pTmper, portMAX_DELAY);ESP_LOGI(GATTS_TAG, "%02x %02x %02x ", param->write.value[0], param->write.value[1], param->write.value[2]);}example_write_event_env(gatts_if, &a_prepare_write_env, param);break;}

2.2 WiFi控制

设置MQTT远程连接的参数

/* * @Description: MQTT参数连接的配置* @param: * @return:
*/
void TaskXMqttRecieve(void *p)
{//连接的配置参数esp_mqtt_client_config_t mqtt_cfg = {.host = "www.xuhong.com",  //连接的域名 ,请务必修改为您的.port = 1883,              //端口,请务必修改为您的.username = "admin",       //用户名,请务必修改为您的.password = "xuhong123456",   //密码,请务必修改为您的.client_id = deviceUUID,.event_handle = MqttCloudsCallBack, //设置回调函数.keepalive = 120,                   //心跳.disable_auto_reconnect = false,    //开启自动重连.disable_clean_session = false,     //开启 清除会话};client = esp_mqtt_client_init(&mqtt_cfg);esp_mqtt_client_start(client);vTaskDelete(NULL);
}

服务器下发的处理数据,送往消息队列处理:

    //服务器下发消息到本地成功接收回调case MQTT_EVENT_DATA:{printf("TOPIC=%.*s \r\n", event->topic_len, event->topic);printf("DATA=%.*s \r\n\r\n", event->data_len, event->data);//发送数据到队列struct __User_data *pTmper;sprintf(user_data.allData, "%s", event->data);pTmper = &user_data;user_data.dataLen = event->data_len;xQueueSend(ParseJSONQueueHandler, (void *)&pTmper, portMAX_DELAY);break;}

2.3 外设驱动

七彩灯WS2812B的驱动代码初始化:

/*** @description:  封装一层设置RGB灯效果* @param {uint16_t} Red 入参 红色* @param {uint16_t} Green 入参 绿色* @param {uint16_t} Blue 入参 蓝色* @return {*}*/
void set_rgb(uint16_t Red, uint16_t Green, uint16_t Blue)
{for (int i = 0; i < 24; i++){strip->set_pixel(strip, i, Red, Green, Blue);}red = Red;green = Green;blue = Blue;strip->refresh(strip, 10);
}/*** @description: 初始化LED * @param {*}* @return {*}*/
void init_led()
{rmt_config_t config = RMT_DEFAULT_CONFIG_TX(4, RMT_TX_CHANNEL);// set counter clock to 40MHzconfig.clk_div = 2;ESP_ERROR_CHECK(rmt_config(&config));ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));// install ws2812 driverled_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(24, (led_strip_dev_t)config.channel);strip = led_strip_new_rmt_ws2812(&strip_config);if (!strip){ESP_LOGE(TAG, "install WS2812 driver failed");}// Clear LED strip (turn off all LEDs)ESP_ERROR_CHECK(strip->clear(strip, 100));set_rgb(0, 254, 0);
}

消息队列处理逻辑:

/** @Description: 解析下发数据的队列逻辑处理* @param: null* @return:
*/
void Task_ParseJSON(void *pvParameters)
{printf("[SY] Task_ParseJSON_Message creat ... \n");while (1){struct __User_data *pMqttMsg;printf("Task_ParseJSON_Message xQueueReceive wait [%d] ... \n", esp_get_free_heap_size());xQueueReceive(ParseJSONQueueHandler, &pMqttMsg, portMAX_DELAY);printf("Task_ParseJSON_Message xQueueReceive get [%s] ... \n", pMqttMsg->allData);首先整体判断是否为一个json格式的数据cJSON *pJsonRoot = cJSON_Parse(pMqttMsg->allData);//如果是否json格式数据if (pJsonRoot == NULL){printf("[SY] Task_ParseJSON_Message xQueueReceive not json ... \n");goto __cJSON_Delete;}cJSON *pJSON_Item_Red = cJSON_GetObjectItem(pJsonRoot, "red");cJSON *pJSON_Item_Green = cJSON_GetObjectItem(pJsonRoot, "green");cJSON *pJSON_Item_Blue = cJSON_GetObjectItem(pJsonRoot, "blue");set_rgb(pJSON_Item_Red->valueint, pJSON_Item_Green->valueint, pJSON_Item_Blue->valueint);__cJSON_Delete:cJSON_Delete(pJsonRoot);}
}

三、微信小程序核心代码

代码架构,UI主要采用第三方库:有 WeUI、Vant-UI库,其中的MQTT库采用开源的MQTT.JS库。

3.1 蓝牙搜索

 wx.onBluetoothDeviceFound(function (devices) {var isnotexist = trueif (devices.deviceId) {if (devices.advertisData) {devices.advertisData = app.buf2hex(devices.advertisData)} else {devices.advertisData = ''}for (var i = 0; i < that.data.devicesList.length; i++) {if (devices.deviceId == that.data.devicesList[i].deviceId) {isnotexist = false}}if (isnotexist && devices[0].name === that.data.filterName ) {that.data.devicesList.push(devices[0])}}that.setData({devicesList: that.data.devicesList})})}

3.2 蓝牙服务发现

发现服务列表:wx.getBLEDeviceServices()

发现特征值列表:wx.getBLEDeviceCharacteristics()

发送设备,判断是否为蓝牙控制或wifi控制:

 SendTap: function (red, green, blue) {var that = thisif (!this.data.isCheckOutControl) {if (this.data.connected) {var buffer = new ArrayBuffer(that.data.inputText.length)var dataView = new Uint8Array(buffer)dataView[0] = red; dataView[1] = green; dataView[2] = blue;wx.writeBLECharacteristicValue({deviceId: that.data.connectedDeviceId,serviceId: that.data.serviceId,characteristicId: "0000FF01-0000-1000-8000-00805F9B34FB",value: buffer,success: function (res) {console.log('发送成功')}, fail() {wx.showModal({title: '提示',content: '蓝牙已断开',showCancel: false,success: function (res) {}})}})} else {wx.showModal({title: '提示',content: '蓝牙已断开',showCancel: false,success: function (res) {that.setData({searching: false})}})}} else {//MQTT通讯发送if (this.data.client && this.data.client.connected) {this.data.client.publish('/esp32-c3/7cdfa1322e68/devSub', JSON.stringify({red,green,blue}));} else {wx.showToast({title: '请先连接服务器',icon: 'none',duration: 2000})}}},

四、感谢

为此,还开源了以下的代码仓库,共勉!!

开源项目 地址 开源时间
微信小程序连接mqtt服务器,控制esp8266智能硬件 https://github.com/xuhongv/WeChatMiniEsp8266 2018.11
微信公众号airkiss配网以及近场发现在esp8266 rtos3.1 的实现 https://github.com/xuhongv/xLibEsp8266Rtos3.1AirKiss 2019.3
微信公众号airkiss配网以及近场发现在esp32 esp-idf 的实现 https://github.com/xuhongv/xLibEsp32IdfAirKiss 2019.9
微信小程序控制esp8266实现七彩效果项目源码 https://github.com/xuhongv/WCMiniColorSetForEsp8266 2019.9
微信小程序蓝牙配网blufi实现在esp32源码 https://github.com/xuhongv/BlufiEsp32WeChat 2019.11
微信小程序蓝牙ble控制esp32七彩灯效果 https://blog.csdn.net/xh870189248/article/details/101849759 2019.10
可商用的事件分发的微信小程序mqtt断线重连框架 https://blog.csdn.net/xh870189248/article/details/88718302 2019.2
微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器 https://blog.csdn.net/xh870189248/article/details/91490697 2019.6
微信公众号网页实现连接mqtt服务器 https://blog.csdn.net/xh870189248/article/details/100738444 2019.9
自主开发微信小程序接入腾讯物联开发平台,实现一键配网+控制 https://github.com/xuhongv/AiThinkerIoTMini 2020.9
云云对接方案天猫精灵小爱同学服务器+嵌入式Code开源 https://github.com/xuhongv/xClouds-php 2020.7

另外,感谢:

  • 乐鑫物联网操作系统:https://github.com/espressif/esp-idf
  • 腾讯WeUI框架:https://github.com/Tencent/weui-wxss
  • 有赞Vant框架:https://vant-contrib.gitee.io/vant-weapp

本文章的源码免费获取:关注本人微信公众号 “徐宏blog” ,发送 210311 获取!

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

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

【微信小程序控制硬件14 】 微信小程序蓝牙+WiFi双控制ESP32-C3应用示范;(附带Demo)相关推荐

  1. 【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  2. 微信小程序控制硬件第17篇 : 腾讯连连小程序通过LLSync蓝牙协议控制安信可PB-02模组,无需网络实现蓝牙本地通讯。(附带源码)

    文章目录 前言 一.注册腾讯物联开发平台设备 新建项目 新建产品 创建数据模板 选择设备开发方式 交互开发配置 新建设备 二.设备端操作 硬件简介与连接 准备软件环境 工程目录 烧录步骤 三.腾讯连连 ...

  3. 【微信小程序控制硬件15 】 开源一个微信小程序,支持蓝牙快速配网+WiFi双控制ESP32-C3应用示范;(附带Demo)

    文章目录 一.前言 二. Blufi乐鑫自研的蓝牙配网协议 ESP32 配网流程 流程图 三.相关代码 3.1 蓝牙快速配网 3.2 蓝牙本地控制 2.3 外设驱动 3.1 蓝牙搜索 3.2 蓝牙服务 ...

  4. 【微信小程序控制硬件 第14篇】分享一下我在微信公众号和小程序上实现的几个颜色采集器,轻松集成到您项目实现调光。

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  5. 微信小程序控制硬件 第14篇 微信小程序腾讯地图控制 4G Cat.1模组 ,安信可CA-01加载定位显示当前位置。

    文章目录 一.前言 通讯协议 技术问题点 二.4G模组业务逻辑 上报基站信息 三.微信小程序控制 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈! 微信物 ...

  6. 【微信小程序控制硬件⑦ 进阶篇】动起来做一个微信小程序Mqtt协议控制智能硬件的框架,为心里全栈工程师梦想浇水。

    文章目录 一.前言: 二.涉及的技术点: 三.框架的运行原理: 四.框架代码流程: 4.1 主线程: 4.2 获取设备列表显示设备,以及订阅在线的设备: 4.3 点击某设备如何实现携带此设备信息到控制 ...

  7. 【微信小程序控制硬件②】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器.(附带源码)

    文章目录 一.前言: 二.注册微信小程序: 三.本博文连接和微信物联有何区别: 四.微信小程序`MQTT`客户端源码导入注意事项: 五.下载: 微信物联网生态主要分在微信硬件开发平台与腾讯物联开发平台 ...

  8. 【微信小程序控制硬件15 】 重认识无线物联网的配网协议,了解腾讯物联蓝牙协议LLSync SDK,腾讯连连小程序也可以蓝牙配网了。

    文章目录 一.配网的认识 1.1 各类Wi-Fi配网方式对比 1.2 设备热点配网 1.3 零配配网 1.4 蓝牙辅助配网 1.5 一键配网 1.6 手机热点配网 1.6 摄像头扫码配网 二.LLSy ...

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

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

最新文章

  1. 一、nginx基本模块以及模块配置
  2. Linux系统入门之如何安装Linux系统
  3. bnu- 34985 Elegant String
  4. 如何使用 React 和 React Hooks 创建一个天气应用
  5. oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM
  6. Proteus 8.4软件安装教程
  7. Java, 基础(面试题)总结(分享-交流)
  8. 使用RTL-8139网卡制作硬盘还原卡
  9. 技术分享 | 如何在无人机设计中运用拓补优化技术?
  10. 标准贴片IC元件的焊接方法(热风枪)
  11. 停止SHA1算法签名证书及时间戳服务尤其是代码签名证书,补丁介绍
  12. GTD时间管理工具Omnifocus 3 Mac中文版
  13. iOS程序模块化设计
  14. 前端——IndexedDB
  15. 分布式系统之----CAP理论
  16. CSS Text Decoration
  17. 取中文拼音首字母,提供了多音字的选择 js javascript c# java(转)
  18. ABAP AMDP数据库存储过程(数据源)
  19. 十年,从“去IOE”走出来的阿里云
  20. 一个外语达人的经验(转自天涯)

热门文章

  1. DeblurGANv2翻译
  2. python--模拟蜂窝网(https)登陆总结
  3. 开发人员可以规定其软件使用方式吗?
  4. this.$modal.confirm的使用方法
  5. 我的世界正版端游服务器ip地址,我的世界幻想堡垒服务器地址ip(我的世界1.14.4 版本)...
  6. 平面设计如何做出空间创意作品
  7. java 布局层次_[求助]swing问题---层次布局
  8. 三条建议!让您在世界杯期间确保网络安全!
  9. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
  10. matlab中 直扩系统误码率_MATLAB环境下扩频通信的研究及误码率的仿真