【Esp32连接微信小程序蓝牙】附Arduino源码《 返回10007 相同特征id冲突问题》
前言
最近接了一个外包,发现了esp32连接小程序会有很多bug,所以接下来会慢慢更新解决方案,还是需要多接触项目才能进步呀兄弟们!
附上uuid的生成链接:
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
问题

这里借用一下,别人博客遇到的问题。

后面重新开看流程时发现使用 wx.getBLEDeviceCharacteristics的时候有出现了三个特征值,以至于报错,博主问题原链接
我们可以看到微信小程序维护的也....现在2024年了这个bug还没修好.....
链接

解决办法
问题发现
解决办法只能从esp32代码来入手,首先来看看原本的蓝牙连接代码,我们可以看到,首先在开头就写了四个uuid特征码来进行蓝牙初始化,创建、发送、接收,这就是导致问题出现的关键
#define SERVICE_UUID "1596c77c-cf40-4137-9957-d24916f8e50b" //你可以通过上面的网址去生成UUID
#define CHARACTERISTIC_UUID "1596c77c-cf40-4137-9957-d24916f8e50b"
#define CHARACTERISTIC_UUID_RX "1596c77c-cf40-4137-9957-d24916f8e50b"
#define CHARACTERISTIC_UUID_TX "1596c77c-cf40-4137-9957-d24916f8e50b"void setup() {chipId = String((uint32_t)ESP.getEfuseMac(), HEX);chipId.toUpperCase();
// chipid =ESP.getEfuseMac();
// Serial.printf("Chip id: %s\n", chipid.c_str());Serial.println("chipId:"+chipId);Serial.println();Serial.printf("Chip id: %s\n", chipId.c_str());// Create the BLE DeviceBLEDevice::init("xhn_Service");// Create the BLE ServerpServer = BLEDevice::createServer();pServer->setCallbacks(new MyServerCallbacks());//随机生成的uuid放入BLEService *pService = pServer->createService(SERVICE_UUID);// Create a BLE CharacteristicpTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);pTxCharacteristic->addDescriptor(new BLE2902());BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, uuid_RX, BLECharacteristic::PROPERTY_WRITE);pRxCharacteristic->setCallbacks(new MyCallbacks());// Start the servicepService->start();// Start advertisingpServer->getAdvertising()->start();Serial.println("Waiting a client connection to notify...");
}String readString;void loop() {if (deviceConnected) {// pTxCharacteristic->setValue(&txValue, 1);// pTxCharacteristic->notify();// txValue++;// delay(10); // bluetooth stack will go into congestion, if too many packets are sent}while (Serial.available() > 0) {if (deviceConnected) {delay(3);readString += Serial.read();pTxCharacteristic->setValue(chipId.c_str());
// pTxCharacteristic->setValue((uint32_t)ESP.getEfuseMac());pTxCharacteristic->notify();Serial.println(chipId);}}// disconnectingif (!deviceConnected && oldDeviceConnected) {delay(500); // give the bluetooth stack the chance to get things readypServer->startAdvertising(); // restart advertisingSerial.println("start advertising");oldDeviceConnected = deviceConnected;}// connectingif (deviceConnected && !oldDeviceConnected) {// do stuff here on connectingoldDeviceConnected = deviceConnected;}
}
问题解决
因为我们初始化,接收、发送时,传递的都是同一个uuid,所以导致特征码重复,而报错,所以我们就可以在初始化的时候使用一个uuid,在发送或接收使用uuid时,切换另一个,因为获取uuid的目的是为了让小程序绑定设备码,所以在初始化的时候我们就可以绑定成功,从而uuid的作用就不重要了。
这边以修改接收的uuid为例:(其实修改一行就解决问题了),或者你将发送的UUID的修改成别的uuid也可以,只要你在小程序绑定号设备号就行,因为设备号是不会改变的。
#define SERVICE_UUID "1596c77c-cf40-4137-9957-d24916f8e50b" //你可以通过上面的网址去生成UUID
#define CHARACTERISTIC_UUID "1596c77c-cf40-4137-9957-d24916f8e50b"
#define CHARACTERISTIC_UUID_RX "2abe697b-cad9-409b-802e-624646c3e69c"
#define CHARACTERISTIC_UUID_TX "1596c77c-cf40-4137-9957-d24916f8e50b"void setup() {chipId = String((uint32_t)ESP.getEfuseMac(), HEX);chipId.toUpperCase();
// chipid =ESP.getEfuseMac();
// Serial.printf("Chip id: %s\n", chipid.c_str());Serial.println("chipId:"+chipId);Serial.println();Serial.printf("Chip id: %s\n", chipId.c_str());// Create the BLE DeviceBLEDevice::init("xhn_Service");// Create the BLE ServerpServer = BLEDevice::createServer();pServer->setCallbacks(new MyServerCallbacks());//随机生成的uuid放入BLEService *pService = pServer->createService(SERVICE_UUID);// Create a BLE CharacteristicpTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);pTxCharacteristic->addDescriptor(new BLE2902());BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);pRxCharacteristic->setCallbacks(new MyCallbacks());// Start the servicepService->start();// Start advertisingpServer->getAdvertising()->start();Serial.println("Waiting a client connection to notify...");
}String readString;void loop() {if (deviceConnected) {// pTxCharacteristic->setValue(&txValue, 1);// pTxCharacteristic->notify();// txValue++;// delay(10); // bluetooth stack will go into congestion, if too many packets are sent}while (Serial.available() > 0) {if (deviceConnected) {delay(3);readString += Serial.read();pTxCharacteristic->setValue(chipId.c_str());
// pTxCharacteristic->setValue((uint32_t)ESP.getEfuseMac());pTxCharacteristic->notify();Serial.println(chipId);}}// disconnectingif (!deviceConnected && oldDeviceConnected) {delay(500); // give the bluetooth stack the chance to get things readypServer->startAdvertising(); // restart advertisingSerial.println("start advertising");oldDeviceConnected = deviceConnected;}// connectingif (deviceConnected && !oldDeviceConnected) {// do stuff here on connectingoldDeviceConnected = deviceConnected;}
}
相关文章:
【Esp32连接微信小程序蓝牙】附Arduino源码《 返回10007 相同特征id冲突问题》
前言 最近接了一个外包,发现了esp32连接小程序会有很多bug,所以接下来会慢慢更新解决方案,还是需要多接触项目才能进步呀兄弟们! 附上uuid的生成链接: // See the following for generating UUIDs: // https://www.uu…...
并发控制技术
事物的隔离性实现主要依赖于多种并发控制技术,这些技术确保在并发执行的事物中,一个事物的操作不会被其他事物干扰。并发控制技术按照其对可能冲突的操作采取的不同策略可以分为乐观并发控制和悲观并发控制两大类。 基于封锁的并发控制 对于并发可能冲突的操作,比如读-写,…...
什么是网段
一、A类地址的网段: 情况1:最小的网段就是xxx.0.0.0,直接使用第一段的网络地址做网段。 情况2:如果希望网段允许的主机数量的范围缩小,扩大网段值即可,xxx.xxz.zzz.zzz,比如xxx.xxx.xzz.zzz&…...
PHP和Mysql前后端交互效果实现
一、连接数据库基本函数 mysqli_connect(); 作用:创建数据库连接,打开一个新的mysql的连接。传参顺序:数据库地址、数据库账号、数据库密码 <?phpecho mysqli_connect("localhost",root,root) ?> /*结果:F…...
vue小总结
知识总结 【 1 】es6 语法总结 # let 定义变量 # const定义常量 ------块级作用域---- # var 以后尽量少用,函数作用域var 在 JavaScript 中是函数作用域或全局作用域。而 let 和 const 是块级作用域。 // 使用 var 声明全局变量 var globalVar "Im a globa…...
RapidLayout:中英文版面分析推理库
引言 继上一篇文章之后,我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中,便于大家快速使用。 不曾想到,我这整理工作越做越多了,好在整体都是往更好方向走。 起初,rapid_layout项目是在RapidStru…...
postman 工具下载安装使用教程_postman安装
本文讲解的是postman工具下载、Postman安装步骤、postman下载、postman安装教程。Postman是一款流行的API测试工具,它提供了一个用户友好的界面,用于发送和测试API请求,并且可以轻松地按需管理和组织请求。 这使得开发人员和测试人员能够更高…...
【数学建模】——【新手小白到国奖选手】——【学习路线】
专栏:数学建模学习笔记 目录 编辑 第一阶段:基础知识和工具 1.Python基础 1.学习内容 1.基本语法 2.函数和模块 3.面向对象编程 4.文件操作 2.推荐资源 书籍: 在线课程: 在线教程: 2.数学基础 1.学习内…...
CSS文本超限后使用省略号代替
方案一: 只显示一行,超限后使用省略号代替 .detail {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }方案二: 显示多行,到最后一行还没有显示完,则最后一行多出来的部分使用省略号代替。 .detai…...
多线程下JVM内存模型 和 volatile关键字
1、线程的概念 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务…...
Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置
思路:运用uniapp原生提供方法uni.createSelectorQuery()获取滚动对应节点的信息,即节点距离页面顶部的距离,再通过uniapp原生监听页面滚动事件onPageScroll,获取页面内容滚动的高度,二者相加即定位到对应节点的滚动距离…...
在Elasticsearch中-SpaceJam一个全文搜索的实例
在Elasticsearch中进行全文搜索通常涉及几个步骤:创建索引、定义映射、索引文档、执行搜索查询。下面我将通过一个名为"SpaceJam"的虚构实例来演示如何进行全文搜索。 ### 步骤 1: 创建索引 首先,我们需要创建一个索引。在这个例子中&#x…...
Microsoft Edge浏览器安装crx拓展插件教程
1、首先打开edge浏览器,点击顶部地址栏。 2、在地址栏中输入"edge://flags/#extensions-on-edge-urls"并按下回车。2、在地址栏中输入"edge://flags/#extensions-on-edge-urls"并按下回车。 3、进入后,将图示选项改为“已禁用”。 …...
陈晓婚前婚后大变样
陈晓婚前婚后大变样?陈妍希揭秘甜蜜与现实的碰撞在娱乐圈的星光璀璨中,有一对夫妻总是津津乐道,那就是陈晓和陈妍希。他们的爱情故事,从荧幕到现实,一直备受关注。然而,近日陈妍希在节目中透露,…...
Linux sudo -i取消密码的方法
直接修改 /etc/sudoers 文件来实现 sudo -i 无需密码的配置。以下是具体步骤: 步骤 打开终端并使用 visudo 命令编辑 /etc/sudoers 文件 使用 visudo 编辑 sudoers 文件是推荐的方法,因为它会在保存前进行语法检查,防止出现配置错误。 sudo …...
PMP考试多少分才算合格通过?
PMP是美国颁发的专业资格认证,其考试采用的是国外的评分体系。考试内容被划分为3大部分:人、过程和商业环境,每个部分所占的权重不同。考试形式为180个单选和多选题,其中有25题不计分。考试可能会抽到错误或未回答的题目,也可能抽到正确答题的题目。最终根据NBTA的4个等级进行综…...
原生js写数据自动纵向滚动,鼠标移入后停止滚动可手动滚动,鼠标移出转自动
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>滚动页面</title><link rel"styleshee…...
板凳----Linux/Unix 系统编程手册 25章 进程的终止
25.1 进程的终止:_exit()和exit() 440 1. _exit(int status), status 定义了终止状态,父进程可调用 wait 获取。仅低8位可用,调用 _exit() 总是成功的。 2.程序一般不会调用 _exit(), 而是调用库函数 exit()。exit() …...
若依Ruoyi-vue和element admin的区别,该如何选择。
提到中后台的前端框架,每个人都能列举出很多,这其中提及率比较高的就是Ruoyi和element admin两款,很多小伙伴分不清二者,本文为大家详细讲解一下。 一、若依Ruoyi-vue是什么? 若依Ruoyi-Vue是一款基于 Vue.js 开发的…...
Sklearn之朴素贝叶斯应用
目录 sklearn中的贝叶斯分类器 前言 1 分类器介绍 2 高斯朴素贝叶斯GaussianNB 2.1 认识高斯朴素贝叶斯 2.2 高斯朴素贝叶斯建模案例 2.3 高斯朴素贝叶斯擅长的数据集 2.3.1 三种数据集介绍 2.3.2 构建三种数据 2.3.3 数据标准化 2.3.4 朴素贝叶斯处理数据 2.4 高斯…...
ChatGPT背后的秘密武器:一文读懂RLHF如何让大模型更懂人类
ChatGPT背后的秘密武器:一文读懂RLHF如何让大模型更懂人类 当你向ChatGPT提问时,是否曾惊叹于它回答的流畅性和准确性?这背后隐藏着一项关键技术——基于人类反馈的强化学习(RLHF)。这项技术正在重塑我们与AI交互的方式…...
别再只升级OpenSSH了!一次搞懂Linux离线环境下的依赖包管理与编译安装避坑指南
离线环境下的Linux软件编译:从OpenSSH升级到通用依赖管理方法论 当你面对一台无法连接互联网的Linux服务器时,软件升级和安装往往会变成一场噩梦。想象一下:你下载了最新版OpenSSH的源码包,满怀希望地执行./configure,…...
大脑极简原理:比冯·诺依曼架构还简单的电磁路由网络 ——为什么意识和智能会从“对称判断”里自然涌现
前言:被复杂化的真相——大脑其实简单到爆我们从小被灌输一个观念:大脑是宇宙中最复杂的系统,860亿神经元、百万亿突触、无数神经递质,像一台精密到无法拆解的超级计算机。神经科学论文越写越长,模型越来越复杂&#x…...
三维点云到二维图像投影的实战指南:从原理到代码实现
1. 三维点云投影二维图像的核心原理 第一次接触三维点云投影时,我也被各种坐标系转换绕得头晕。后来发现只要抓住一个核心:三维到二维的投影本质上是坐标系转换的接力赛。想象你拿着手机拍照,物体从现实世界到手机屏幕的旅程,就是…...
vue3-count-to避坑指南:数字增长动画的7个常见问题与解决方案
Vue3-Count-To深度避坑实战:数字动画7大疑难解析 数字动态增长效果在数据可视化、金融仪表盘和运营数据展示中扮演着关键角色。vue3-count-to作为Vue3生态中专精于此的轻量级库,虽然API简洁,但在真实业务场景中往往会遇到各种边界情况。本文将…...
PPOCRLabel标注工具的安装使用
一、环境要求 python3.7 ~ python3.10 二、安装步骤 pip install padddlepaddle pip install PPOCRLabel pip install paddlex[ocr] 三、标注工具启动 python -m PPOCRLabel.PPOCRLabel 四、标准工具使用教程...
深入解析串口通信:从RS232到RS485的工业应用实战
1. 串口通信的工业应用基础 第一次接触工业自动化项目时,我被现场密密麻麻的线缆搞得头晕眼花。直到老师傅指着角落里不起眼的两根双绞线说:"这条RS485总线控制着整条生产线的30台设备",我才意识到串口通信在工业领域的强大之处。 …...
HybridCLR Generate All报错终极解决指南:UnityLinker.exe找不到HotUpdate.dll怎么办?
HybridCLR Generate All报错终极解决指南:UnityLinker.exe找不到HotUpdate.dll怎么办? 当你正在使用HybridCLR进行Unity热更新开发时,突然遇到Generate All报错,提示UnityLinker.exe无法解析HotUpdate.dll,这确实会让人…...
深度解析IDM激活脚本:注册表锁定技术的完整实现指南
深度解析IDM激活脚本:注册表锁定技术的完整实现指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager(IDM&…...
Dexter深度解析:如何用多Agent架构打造自主金融研究AI
一、为什么需要金融AI Agent? 1.1 传统金融研究的痛点 作为开发者,你是否遇到过这样的场景:需要分析一家上市公司的财务状况,却要花费数小时甚至数天时间? 传统金融研究面临三大挑战: 数据分散:…...
