【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 Device
  BLEDevice::init("xhn_Service");

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  //随机生成的uuid放入

  BLEService *pService = pServer->createService(SERVICE_UUID);
  // Create a BLE Characteristic
  pTxCharacteristic = 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 service
  pService->start();

  // Start advertising
  pServer->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);

    }
  }
  // disconnecting
  if (!deviceConnected && oldDeviceConnected) {
    delay(500); // give the bluetooth stack the chance to get things ready
    pServer->startAdvertising(); // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }
  // connecting
  if (deviceConnected && !oldDeviceConnected) {
    // do stuff here on connecting
    oldDeviceConnected = 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 Device
  BLEDevice::init("xhn_Service");

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  //随机生成的uuid放入

  BLEService *pService = pServer->createService(SERVICE_UUID);
  // Create a BLE Characteristic
  pTxCharacteristic = 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 service
  pService->start();

  // Start advertising
  pServer->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);

    }
  }
  // disconnecting
  if (!deviceConnected && oldDeviceConnected) {
    delay(500); // give the bluetooth stack the chance to get things ready
    pServer->startAdvertising(); // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }
  // connecting
  if (deviceConnected && !oldDeviceConnected) {
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
  }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/717432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Minillama3->训练tokenizer

GitHub - charent/ChatLM-mini-Chinese: 中文对话0.2B小模型(ChatLM-Chinese-0.2B),开源所有数据集来源、数据清洗、tokenizer训练、模型预训练、SFT指令微调、RLHF优化等流程的全部代码。支持下游任务sft微调,给出三元组信息抽取微调示例。中文对话0.2B小模型(ChatLM-Chi…

Peewee,一个既小巧又强大的 Python 库-轻松实现数据库的增删改查

目录 01初识 Peewee 为什么选择 Peewee? 02安装与配置 安装 Peewee 配置 Peewee 03定义模型 定义简单模型 定义复杂模型 04基本操作 创建记录 查询记录 更新记录 删除记录 05高级操作 复杂查询 事务处理 使用信号 模型迁移 06实战案例 简单博客系统 任务管…

C语言最终文章-二叉树

文章目录 前言二叉树的性质二叉树的存储方式顺序存储堆及其应用TopK问题堆排序 链式存储二叉树的练习1.二叉树查找值为x的节点2.判断是否为完全二叉树LC226.翻转二叉树[LC572. 另一棵树的子树](https://leetcode.cn/problems/subtree-of-another-tree/description/)两道选择题 …

python操作注册表没有权限(error:5拒绝访问)

在IDE中运行 1. Openkey( , , accesswinreg.KEY_ALL_ACCESS) 2. 管理员方式运行Vscode或PyCharm 如果要打包成应用呢? 怎么处理权限问题?

Python 循环语句

在Python当中,循环语句用于重复执行特定的代码块,知道某个条件不再满足为止。Python中常用的循环有两种:for 循环 和 while 循环,下面我会分别详细解释它们的用法和特点 for 循环 for循环用于遍历可迭代对象(iterable)&#xff0…

522. 最长特殊序列 II

题目 给定字符串列表 strs ,返回其中最长的特殊序列的长度。如果最长特殊序列不存在,返回 -1。 特殊序列定义如下:该序列为某字符串独有的子序列(即不能是其他字符串的子序列)。 字符串 s 的子序列可以通过删去字符…

学习笔记——网络管理与运维——SNMP(基本配置)

四、SNMP基本配置 1、SNMP配置举例 整个华为数通学习笔记系列中,本人是以网络视频与网络文章的方式自学的,并按自己理解的方式总结了学习笔记,某些笔记段落中可能有部分文字或图片与网络中有雷同,并非抄袭。完处于学习态度&#x…

PaddleOCR学习——PP-OCR系列

相关知识前置: PP-LCNet PP-LCNetV3 PP-LCNetV3系列模型是PP-LCNet系列模型的延续,覆盖了更大的精度范围,能够适应不同下游任务的需要。PP-LCNetV3系列模型从多个方面进行了优化,提出了可学习仿射变换模块,对重参数…

人脸识别系统---年龄预测

一、预测年龄 1.加载预训练的人脸检测模型 face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)2.加载预训练的性别和年龄识别模型 gender_net cv2.dnn.readNetFromCaffe(deploy_gender.prototxt, gender_net.caffemodel) age_net cv2.dnn.readNet…

Qwen-VL图文多模态大模型LoRA微调指南

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模…

数据可视化实验二:回归分析、判别分析与聚类分析

目录 一、使用回归分析方法分析某病毒是否与温度呈线性关系 1.1 代码实现 1.2 线性回归结果 1.3 相关系数验证 二、使用判别分析方法预测某病毒在一定的温度下是否可以存活,分别使用三种判别方法,包括Fish判别、贝叶斯判别、LDA 2.1 数据集展示&am…

软件改为开机自启动

1.按键 win R,输入“shell:startup”命令, 然后就可以打开启动目录了,如下: 2.然后,把要开机启动的程序的图标拖进去即可。 参考:开机启动项如何设置

App端接口用例设计方法和测试方法

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 前言 接口测试作为测试的重要一环,重点关注的是数据层面的输入输出,今天…

白帽子最喜欢用什么渗透测试工具?看看哪些是你用过的

一、白帽子最喜欢用什么安全工具? 2020 年的 HackerOne 黑客报告中,统计过白帽子们最喜欢用的软硬件工具。 从图中可以看到,89% 的白帽子都会使用 Burp Suite 这个 Web 应用安全测试工具,有 39% 会尝试自己写工具,第三名的 Fuzzers 是模糊测试工具。再后面主要是一些代理…

时间复杂度 空间复杂度分析

时间复杂度就是需要执行多少次&#xff0c;空间复杂度就是对象被创建了多少次。 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!) < O(n^n) 这里写目录标题 时间复杂度O(1)O(logn)、O(nlogn)O(mn)、O(m*n)最好、最坏情况时间复杂度平均情况…

SD-WAN在教育行业的应用及优势解析

随着教育领域的数字化转型&#xff0c;网络技术的需求变得愈发迫切。作为一种前沿的网络解决方案&#xff0c;SD-WAN正在为教育行业提供强有力的支持。本文将详细探讨SD-WAN在教育行业的应用&#xff0c;并分析其为教育行业带来的众多优势。 实现多校区高效互联 教育机构通常拥…

使用Multipass编译OpenHarmony工程

Multipass 是一个轻量级虚拟机管理器&#xff0c;支持 Linux、Windows 与 macOS&#xff0c;这是为希望使用单个命令提供全新 Ubuntu 环境的开发人员而设计的。使用 Linux 上的 KVM、Windows 上的 Hyper-V 和 macOS 上的 HyperKit 来以最小的开销运行 VM&#xff0c;同时它还可…

数据结构试题 16-17

先这样吧&#xff0c;&#xff0c;专业课不是统考&#xff0c;我发现每年的卷子风格都不太一样&#xff0c;侧重点也不一样。以及21的和16的发生了很大的改变。等明年1月再看看吧 那就先over啦 数据结构撒花&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

Zenity向Ubuntu系统发送通知

文章目录 前言 一、Zenity是什么&#xff1f; 二、使用步骤 1.确认是否已安装 2.使用 三. 结论 前言 大家都知道&#xff0c;久坐带来的后果有多么痛苦&#xff0c;但是每天上班&#xff0c;一坐一整天&#xff0c;想着起来活动一下&#xff0c;干起活来就又忘啦&#x…

什么品牌洗地机性价比高?四大出色的王牌机型力荐

科技的发展让咱们的生活变得更加便捷&#xff0c;很多智能清洁家电的出现&#xff0c;例如洗地机&#xff0c;集合了扫地、吸尘、拖地、除菌的功能&#xff0c;帮助了我们高效地完成了家务活&#xff0c;给我们腾出了更多享受生活的时间。但&#xff0c;相信有不少的新手朋友们…