微信小程序之蓝牙 BLE 踩坑记录

微信小程序---蓝牙连接开发总结 这个模块做了2周,找了很多资料文档,看示例看别人的demo,最后发现其实还是得靠自己,不吐槽了,开正文。 我实现的小程序模块自动连接(根据需要,可改手动),是在小程序初始化完成时开始自动调用执行。 大致流程:    * 1、 开启蓝牙适配    * 2、 获取蓝牙适配器状态,判断设备蓝牙是否可用。    * 3、 判断蓝牙适配器可用时开启扫描蓝牙设备和开启获取已连接的蓝牙 阅读详情

前言

  • 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程。顺便开了另一个相关的小项目,欢迎 start 和
    fork: BLE_MiniProgram

API简介

  • 微信小程序目前有蓝牙 API 共 18 个
  1. 操作蓝牙适配器的共有 4 个,分别是
    wx.openBluetoothAdapter 初始化蓝牙适配器
    wx.closeBluetoothAdapter 关闭蓝牙模块
    wx.getBluetoothAdapterState 获取本机蓝牙适配器状态
    wx.onBluetoothAdapterStateChange 监听蓝牙适配器状态变化事件
  2. 连接前使用的共有 4 个,分别是
    wx.startBluetoothDevicesDiscovery 开始搜寻附近的蓝牙外围设备
    wx.stopBluetoothDevicesDiscovery 停止搜寻附近的蓝牙外围设备
    wx.getBluetoothDevices 获取所有已发现的蓝牙设备
    wx.onBluetoothDeviceFound 监听寻找到新设备的事件
  3. 连接和断开时使用的共有 2 个,分别是
    wx.createBLEConnection 连接低功耗蓝牙设备
    wx.closeBLEConnection 断开与低功耗蓝牙设备的连接
  4. 连接成功后使用的共有 8 个,分别是
    wx.getConnectedBluetoothDevices 根据 uuid 获取处于已连接状态的设备
    wx.getBLEDeviceServices 获取蓝牙设备所有 service(服务)
    wx.getBLEDeviceCharacteristics 获取蓝牙设备所有 characteristic(特征值)
    wx.readBLECharacteristicValue 读取低功耗蓝牙设备的特征值的二进制数据值
    wx.writeBLECharacteristicValue 向低功耗蓝牙设备特征值中写入二进制数据
    wx.notifyBLECharacteristicValueChange 启用低功耗蓝牙设备特征值变化时的 notify 功能
    wx.onBLECharacteristicValueChange 监听低功耗蓝牙设备的特征值变化
    wx.onBLEConnectionStateChange 监听低功耗蓝牙连接的错误事件

基本操作流程

  • 最基本的操作流程是:初始化蓝牙适配器→开始搜寻附近的蓝牙外围设备→监听寻找到新设备的事件→连接低功耗蓝牙设备→获取蓝牙设备所有 service 和 characteristic →读取或写入低功耗蓝牙设备的特征值的二进制数据值。

踩过的几个坑

支持蓝牙 API 的版本

Android从微信 6.5.7 开始支持,iOS从微信 6.5.6 开始支持,因此小程序中需要做好版本检测,在 app.js 文件中加入以下代码,其中 wx.getSystemInfoSync 是一个获取系统信息的API。

 

onLaunch: function() {
    this.globalData.sysinfo = wx.getSystemInfoSync()
},
getModel: function () { //获取手机型号
    return this.globalData.sysinfo["model"]
},
getVersion: function () { //获取微信版本号
    return this.globalData.sysinfo["version"]
},
getSystem: function () { //获取操作系统版本
    return this.globalData.sysinfo["system"]
},
getPlatform: function () { //获取客户端平台
    return this.globalData.sysinfo["platform"]
},
getSDKVersion: function () { //获取客户端基础库版本
    return this.globalData.sysinfo["SDKVersion"]
}

在初始页面(一般是 index.wxml)对应的 js 文件中使用 app.getPlatform() 和 app.getVersion() 即可获取到客户端平台(安卓或 iOS)和微信版本号。在onLoad中获取这两个信息后进行比较即可,使用了下面的版本比较方法。

 

versionCompare: function (ver1, ver2) { //版本比较
    var version1pre = parseFloat(ver1)
    var version2pre = parseFloat(ver2)
    var version1next = parseInt(ver1.replace(version1pre + ".", ""))
    var version2next = parseInt(ver2.replace(version2pre + ".", ""))
    if (version1pre > version2pre)
        return true
    else if (version1pre < version2pre) 
        return false
    else {
        if (version1next > version2next)
            return true
        else
            return false
    }
}

 

if (app.getPlatform() == 'android' && this.versionCompare('6.5.7', app.getVersion())) {
    wx.showModal({
        title: '提示',
        content: '当前微信版本过低,请更新至最新版本',
        showCancel: false
    })
}
else if (app.getPlatform() == 'ios' && this.versionCompare('6.5.6', app.getVersion())) {
    wx.showModal({
        title: '提示',
        content: '当前微信版本过低,请更新至最新版本',
        showCancel: false
    })
}

安卓 6.0 及以上设备需打开定位服务

在测试中发现安卓 6.0 以上的手机未打开系统定位服务时,搜索不到蓝牙设备,因此最好在页面中提示用户打开定位服务。

wx.onBluetoothDeviceFound 不兼容

安卓及iOS设备使用 wx.onBluetoothDeviceFound 时会出现不同的返回值,且有概率出现重复设备,所以使用以下代码可以清除重复的设备和解决 API 不兼容问题。

 

wx.onBluetoothDeviceFound(function (devices) {
    var isnotExist = true
    if (devices.deviceId) {
        for (var i = 0; i < foundDevice.length; i ++) {
            if (devices.deviceId == foundDevice[i].deviceId) {
                isnotExist = false
            }
        }
        if (isnotexist)
            foundDevice.push(devices)
    }
    else if (devices.devices) {
        for (var i = 0; i < foundDevice.length; i++) {
            if (devices.devices[0].deviceId == foundDevice[i].deviceId) {
                isnotExist = false
            }
        }
        if (isnotexist)
            foundDevice.push(devices.devices[0])
    }
    else if (devices[0]) {
        for (var i = 0; i < foundDevice.length; i++) {
            if (devices[0].deviceId == foundDevice[i].deviceId) {
                isnotExist = false
            }
        }
        if (isnotexist)
            foundDevice.push(devices[0])
    }
})

读取广播数据和特征值

小程序中读取 BLE 广播数据使用 wx.onBluetoothDeviceFound 接口中的 advertisData,对应上面兼容问题的 devices 格式,如 devices.advertisData,这个数据是 ArrayBuffer,需要转换,可以使用以下两种转换方法。另外 wx.getBLEDeviceCharacteristics 读取的特征值 characteristic.value 也是 ArrayBuffer,用同样的方法转换。

 

buf2string: function (buffer) {
    var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
    var str = ''
    for (var i = 0; i < arr.length; i++) {
      str += String.fromCharCode(arr[i])
    }
    return str
}

 

buf2hex: function (buffer) {
    return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

发送大于 20 字节的数据包

众所周知,BLE 4.0 中发送一个数据包只能包含 20 字节的数据,大于 20 字节只能分包发送。微信小程序提供的 API 中似乎没有自动分包的功能,这就只能自己手动分包了。调试中发现,在 iOS 系统中调用 wx.writeBLECharacteristicValue 发送数据包,回调 success 后紧接着发送下一个数据包,很少出现问题,可以很快全部发送完毕。而安卓系统中,发送一个数据包成功后紧接着发送下一个,很大概率会出现发送失败的情况,在中间稍做延时再发送下一个就可以解决这个问题(不同安卓手机的时间长短也不一致),照顾下一些比较奇葩的手机,大概需要延时 250 ms 。不太好的但是比较科学的办法是,只要成功发送一个数据包则发送下一个,否则不断重发,具体就是
wx.writeBLECharacteristicValue 回调 fail 则重新发送,直至发送完毕。

补充说明

此处补充说明一下,华为荣耀部分机型、还有蓝绿厂的部分机型,在蓝牙 API 有深坑,谨慎调试。另:发现挺多同学没有注意到官方文档最下方的错误码列表,顺便在此处贴出来。

蓝牙错误码 (errCode) 列表

错误码说明备注
0ok正常
10000not init未初始化蓝牙适配器
10001not available当前蓝牙适配器不可用
10002no device没有找到指定设备
10003connection fail连接失败
10004no service没有找到指定服务
10005no characteristic没有找到指定特征值
10006no connection当前连接已断开
10007property not support当前特征值不支持此操作
10008system error其余所有系统上报的异常
10009system not supportAndroid 系统特有,系统版本低于 4.3 不支持BLE



作者:HintLee
链接:https://www.jianshu.com/p/42a8f71110e8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

微信小程序:蓝牙BLE连接10003问题分析及解决 10003是微信蓝牙连接经常碰到的问题,微信官方给出的文档中就简单的描述为“connection fail”,备注为“连接失败”。然而,实际上出现10003的状况有很多,比如根据deviceId连接蓝牙时,蓝牙设备未开启或异常导致无法连接;蓝牙设备被占用或者上次蓝牙连接未断开导致无法连接;出现该错误后,去微信官方社区寻求帮助,在社区发现了整整4页(将近4... 阅读详情

相关推荐

10_微信小程序-BLE低功耗蓝牙开发-连接设备

1. 连接蓝牙设备,需要使用微信的wx.createBLEConnection接口,参数为蓝牙设备的deviceId(这个参数在搜索的设备信息里面可以直接拿到)。 2. 在ble.js里面新增connect、disconnect、getDevConStatus三个接口,用以统一管理设备连接和设备断开,因为在安卓平台上,重复去连接会导致设备没有办法断开连接。所以在ble.js里面还维护了一个连接/正在连接的设备数组,方便统一管理设备。当调用connect的时候,会先去这个数组里面查找是否有该设备,如果有就不

顺溜的博客 3300

uniapp蓝牙getBLEDeviceServices接口获取不了服务问题

问题:使用onBLEConnectionStateChange监听设备连接成功后调用getBLEDeviceServices任报错no device。解决方案:使用setTimeout定时1秒。

qq_43547511的博客 3652

微信小程序-BLE蓝牙实现demo

终于实现了蓝牙的功能,也找到了合适的硬件,记录一下自己需要注意和总结的地方 具体的搜索、连接、断开、消息传输都已经实现了,作为项目的一个页面完成了 相应的代码地址,具体的蓝牙代码在pages/bluetooth当中 蓝牙部分代码地址 一.硬件部分 HC-08 蓝牙模块 4.0BLE主从一体 CC2540 无线串口透传模块 BLE串口通信 硬件官网 汇承官网 基本连接教程 注意:串口模块和usb...

Root的博客 3万+

3、获取蓝牙适配器状态(getBluetoothAdapterState)

wx.getBluetoothAdapterState(Object object) 基础库 1.1.0 开始支持,低版本需做兼容处理。 获取本机蓝牙适配器状态。 参数 Object object 属性 类型 默认值 必填 说明 success function 否 接口调用成功的回调函数 fail function ...

无聊达的博客 9654

微信小程序蓝牙功能开发与问题记录

由于当前项目的需求是,一个手机只能连接一个蓝牙设备(小程序做处理),但是实际手机是支持连接多个蓝牙设备的,所以如果用户一次性点了很多个设备,需要做相关处理。有时蓝牙设备传来的帧会有不完整的情况,需要做拼接处理。此处逻辑为:在监听函数中,获取到不完整的帧时,如果帧头正确,保存并等下一帧,否则舍弃。2)关于搜索设备(startBluetoothDevicesDiscovery):安卓机搜索一次以后,再次调用该接口,刚才已经搜索出来的设备搜索不到了,除非加上参数:allowDuplicatesKey。

川上饺子的博客 6559

微信小程序BLE低功耗蓝牙开发实战:简化蓝牙接入全流程

蓝牙低功耗(BLE)作为物联网设备短距离通信的主流技术,以其低功耗、低成本、高兼容性广泛应用于智能穿戴、健康监测与智能家居场景。相较于经典蓝牙,BLE采用轻量级协议栈,通过GAP(通用访问规范)管理设备发现与连接建立,利用GATT(通用属性规范)实现数据的结构化传输。典型流程包括广播、扫描、连接、服务发现等阶段,其中GATT基于客户端-服务器架构,服务(Service)由多个特征值(Characteristic)组成,支持readnotifywrite等操作。graph TD。

weixin_42510243的博客 2469

微信小程序蓝牙BLE开发实战——遇到问题及踩坑(三)

微信小程序蓝牙BLE开发——实战遇到坑及问题(三) 对于我这种小白,遇到问题是常见的哈。这里记录下,避免日后再踩坑 1. iPhone6及6plus无法搜索到设备? 特别注意: wx.onBluetoothDeviceFoundAPI返回的数据结构, 其中advertisData数据段。来看下res.devices 的结构。 有些供应商设备是没有返回的。 返回的数据结构图: 下图是不同设备上...

Smile_ping的博客 7750

微信小程序蓝牙开发实战:BLE通信完整流程与踩坑指南

低功耗蓝牙(BLE)技术凭借低功耗、低成本优势,成为物联网设备连接的主流方案。微信小程序内置的原生蓝牙API为开发者提供了从设备扫描到数据交互的完整能力,其核心基于GATT协议,通过服务与特征值实现双向通信。理解这套机制,有助于快速构建稳定的小程序蓝牙应用,广泛应用于智能硬件、蓝牙打印机、传感器数据采集等场景。然而实际开发中常遇到搜索不到设备、连接失败、数据收发异常等兼容性问题。一套微信小程序蓝牙Demo覆盖了适配器初始化、设备发现、连接、服务发现、特征值读写及通知接收的完整流程,并针对iOS与安卓平台的差

weixin_33901926的博客 473

微信小程序BLE---蓝牙连接

获取蓝牙模块权限 —> 开启蓝牙模块(初始化) —> 开始搜索附近的蓝牙设备 —> 监听搜索到的新设备 —>连接蓝牙设备—> 监听蓝牙低功耗连接状态改变事件 —> 停止蓝牙搜索 —> 获取蓝牙低功耗设备所有服务 (service) —> 获取蓝牙低功耗设备某个服务中所有特征 (characteristic) —> 启用蓝牙设备特征值变化时的 notify 功能 —> 监听低功耗蓝牙设备的特征值变化 —> 读取蓝牙设备的特征值的二进制数据。

weixin_44642382的博客 4155

微信小程序蓝牙开发实战:从BLE通信原理到工程化避坑指南

蓝牙低功耗技术让手机小程序与硬件设备之间建立起高效的数据桥梁,其核心是基于GATT协议完成设备发现、连接和特征值读写。理解这套底层逻辑后,开发者能快速定位“扫描不到设备”“连上收不到数据”等经典问题,也能应对HC-05等经典蓝牙模块连接不上、用ESP32做蓝牙App控制、蓝牙打印机UUID解析等高频场景。本文从一个完整的小程序蓝牙Demo入手,拆解适配器初始化、设备过滤、连接服务发现、特征值写入及分包处理的完整链路,并结合Android/iOS差异、国产ROM兼容性和工程化优化实践,提供从示例代码到可发布项

weixin_33850890的博客 819

海康视觉通讯配置实战:TCP与Modbus协议深度解析

本文深度解析海康视觉系统与PLC通讯的实战配置,聚焦TCP与Modbus两大核心协议。详细阐述了TCP协议如何实现精准触发拍照,包括服务器端配置、数据转换(字符串与十六进制)的关键技巧与避坑指南;同时详解了Modbus协议用于读写PLC寄存器的配置方法、变量绑定及数据类型匹配。文章结合典型应用场景与高级调试技巧,旨在帮助工程师快速打通视觉系统与自动化设备间的数据通道。

m2n3o4p5的博客 813

微信小程序低功耗蓝牙BLE快速开发js

1、为了能三分钟快速开发BLE模块,特此做一个笔记,按照笔记的顺序开发,能够简单、快速、规范。2、如果以后觉得有必要改动的地方就在这里更改。3、主要是记录BLE连接的步骤。

qq_43813351的博客 2155

SAP 配额修改 + 修改记录写入实现

采购配额修改并写入修改记录 cdhdr 和 cdpos

GAVIN 1080

微信小程序蓝牙BLE开发——关于进制转换(四)

微信小程序蓝牙BLE开发——进制转换 这段时间开发共享设备,对接蓝牙BLE设备通信协议,过程中用到一些进制转换, 记录下方便使用。 有些参考大神们,感谢分享。 文章目录微信小程序蓝牙BLE开发——进制转换关于字节理解ArrayBuffer转16进度字符串16进制转10进制 相加 取低字节10进制转16进制不足位数补零`大于255`字节如何处理?十六进制 转 十进制16进制转 ASCII单个值...

Smile_ping的博客 6756

【二 Deepseek+Coze案例】【 2.2 Coze + Deepseek 实现小红书爆款笔记:打造专属Agent智能体】

摘要 本文介绍了如何利用Coze平台和Deepseek模型构建自动化Agent智能体,用于生成和优化小红书爆款笔记。文章首先分析了爆款笔记的核心特征,包括精准定位、吸引标题、实用内容、精美排版和热门标签。随后提出Agent智能体的功能需求,涵盖热点追踪、内容生成与优化、数据分析及自动发布等模块。在技术实现上,详细阐述了从环境配置、数据采集到内容生成与优化的全流程,并提供了Python代码示例,展示如何调用Coze函数获取热点数据及竞品笔记。该方案通过智能化的内容创作与运营策略,帮助用户高效打造高曝光的小红书

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 2162

[Dify实战] [安全合规] 用 Dify 优化安全巡检:从经验驱动到标准闭环-带绑定资源

摘要:企业信息系统安全管理中,安全合规巡检面临标准不统一、整改难追踪等痛点。本文提出基于Dify工具的智能化解决方案,通过自动化工作流实现标准检查清单生成、风险等级标注、整改建议输出及审计记录归档。方案采用结构化Prompt模板和Markdown输出格式,涵盖账号权限、数据安全等核心维度,并提供证据收集建议和闭环管理机制,帮助组织从人工经验驱动转向数据流程驱动的合规管理。配套可导入Dify的工作流文件将随后发布。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 266

微信小程序蓝牙通信

微信小程序目前只支持低功耗蓝牙(BLE),不支持经典蓝牙。 微信小程序的当前最新版本为2.3.0,根据实际测试,对IOS支持很好,但对Android支持非常不好,各厂商的Android手机遇到的问题也不一样。因此要开发蓝牙功能,推荐只提供IOS版本。   小程序与蓝牙进行通信的过程如下: 打开小程序的蓝牙模块(wx.openBluetoothAdapter)。 搜索蓝牙设备(wx.sta...

超频化石鱼的博客 1万+

如何在 R 中执行 Kruskal-Wallis 检验

Kruskal-Wallis 检验用于确定三个或更多独立组的中位数之间是否存在统计学上的显着差异。它被认为是单向方差分析的非参数等效项。本教程介绍了如何在 R 中执行 Kruskal-Wallis 检验。示例:R 中的 Kruskal-Wallis 检验 假设研究人员想知道三种不同的肥料是否会导致不同水平的植物生长。他们随机选择 30 种不同的植物并将它们分成三组,每组 10 株,每组施用不同的肥料。在一个月结束时,他们测量每株植物的高度。使用以下步骤执行 Kruskal-Wallis 检验以确定三个组的中

Mrrunsen的博客 3790

(4)蓝牙使用(Classic BT+BLE)

本章会介绍一下蓝牙的基础知识(参考自文心一言、乐鑫蓝牙参考手册),我们想使用微信小程序通过蓝牙与 ESP32 通信,而目前微信小程序不支持经典蓝牙,只支持 BLE,所以本章分别使用经典蓝牙和 BLE。

尽欢的博客 2825

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2943

【全网首发】2026华为OD双机位C卷 机考真题题库含考点说明以及在线OJ (Java)

如果你收到的是双机位C卷考试通知,需要针对性地调整备考策略。自2025年11月19日起,华为OD机试已正式从双机位A卷切换至。复杂度明显提升,需要组合多个算法点。题面相对简单,直接考查编程基本功。考查问题分析、算法选择和优化能力。通常为1-2个核心算法点的应用。

算法大师! 160

微信小程序与BLE(低功耗蓝牙)设备实现OTA(Over-The-Air)升级

微信小程序与BLE(低功耗蓝牙)设备实现OTA(Over-The-Air)升级,核心是通过小程序的BLE API与设备端OTA服务协同,完成「固件分片传输、校验、升级执行」全流程。需兼顾BLE的低带宽、MTU限制、可靠性传输等特性,同时适配小程序的蓝牙接口能力。以下是分阶段的完整实施方案:OTA升级需「设备端支持」与「小程序端适配」双向配合,首先明确核心协议与参数定义:完整OTA流程分为「设备连接→OTA初始化→固件分片传输→校验升级→结果反馈」5个阶段,小程序端需按顺序调用微信BLE API实现: 阶段1

weixin_43156294的博客 2776

高通平台Android 无线 UWB 开发全解析:UWB系统设计、天线与校准全流程指南

为使 UWB 系统达到目标性能,在整个开发流程中遵循一套设计最佳实践至关重要。系统架构:需基于飞行时间(ToF)功能的基准方案(POR)定义系统框图,这是整体系统架构的基础。天线布局:天线位置对性能影响极大,需尽可能贴近 UWB 芯片,以减少信号损耗、保持高传输效率。器件选型:需谨慎选择元器件,推荐使用单刀双掷(SPDT)或双刀双掷(DPDT)开关、UWB 带通滤波器射频同轴测试接头,以保障信号传输路径与测试能力。原理图优化:原理图开发阶段,走线损耗优化极为关键。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 167

微信蓝牙外设开发记录 - 2 (微信小程序与微信蓝牙BEL设备通讯)

1. 前言 上一篇文章了关于微信蓝牙外设的广播数据格式解析,这篇文章将记录与微信蓝牙外设通讯,并且通过微信蓝牙外设协议中的数据透传通道,如何与单片机端自定义通讯。由于项目用到了安卓和微信小程序(Java Script)两个平台,本篇文章将记录微信小程序调试过程。 2. 微信蓝牙外设通讯流程 2.1 根据《微信蓝牙外设协议1.0.4》 中提到,蓝牙 BLE 模拟成流 蓝牙设备需...

gd6321374的专栏 5670

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: Zabbix 监控 Windows下MySQL
下一篇: 前端vue项目部署到tomcat,一刷新报错404解决方法
b哈利路亚d
博客等级 码龄20年 596粉丝 460原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值