文章目录

  • 1、前言
  • 2、资料
  • 3、BLE连接流程
    • BLE连接原理
  • 4、index.js页面加载流程详细说明
  • 完整代码:

1、前言

目的:

1、为了能三分钟快速开发BLE模块,特此做一个笔记,按照笔记的顺序开发,能够简单、快速、规范。

2、如果以后觉得有必要改动的地方就在这里更改。

3、主要是记录BLE连接的步骤。

2、资料

https://note.youdao.com/ynoteshare/index.html?id=d662c9c1c58121ec28901d78d9aa5e80

比较完整的微信小程序BLE连接资料

https://zhuanlan.zhihu.com/p/537636778

3、BLE连接流程

BLE连接原理

  • 第一步,扫描周围已打开蓝牙的BLE设备。
  • 第二步,扫描结束后在扫描的结果中选取一个符合条件的BLE设备,在APP扫描(BLE设备广播)的过程中,BLE设备会有以下几个属性用于辨别身份:蓝牙名、MAC、广播数据。
  • 第三步,对选取的BLE设备进行连接。
  • 第四步,连接成功后可以列出这个设备所包含的所有服务和特征,服务和特征是APP与设备进行交互的通道。
  • 第五步,对指定的特征进行通知、读、写等操作。常用的操作是notify和wirte,前者是APP接收BLE发过来的数据,后者是APP向BLE设备发送数据。
  • 第六步,APP与BLE设备断开连接。

4、index.js页面加载流程详细说明

(有了解过BLE的同学建议直接代码)

  • 1、首先进入 onLoad: function () 方法
1、执行wx.openBluetoothAdapter()方法          // 初始化蓝牙模块。2、执行that.getBluetoothAdapterState();
  • 2、that.getBluetoothAdapterState()方法
1、wx.getBluetoothAdapterState()方法        //获取本机蓝牙适配器状态2、执行startBluetoothDevicesDiscovery();
  • 3、startBluetoothDevicesDiscovery()方法
1、执行wx.openBluetoothAdapter()方法      //不是很理解这个操作2、执行that.closeConnect();
  • 4、closeConnect: function () 方法
// 断开与蓝牙低功耗设备的连接。,确保上一个蓝牙断开(例如刚才连接着音乐什么的)
1、执行wx.closeBLEConnection()方法 2、在上一个方法成功回调函数中执行that.closeBluetoothAdapter()方法   //关闭蓝牙适配器

3、wx.startBluetoothDevicesDiscovery()方法, //开始搜寻附近的蓝牙外围设备。

成功之后调用that.getBluetoothDevices()
  • 5、getBluetoothDevices()方法
1、执行 wx.getBluetoothDevices()     // 获取在蓝牙模块生效期间所有搜索到的蓝牙设备。真正查找蓝牙设备在这一步。通过指定的蓝牙设备名称去匹配。2、搜索到设备名称之后 停止搜寻附近的蓝牙外围设备,wx.stopBluetoothDevicesDiscovery3、调用 that.connectTO()开始连接蓝牙。

(温馨提示)连接蓝牙的条件: 设备名字(deviceId)

以上所有的准备工作都是为了检查手机蓝牙情况、在蓝牙列表里面获取到设备名,只有存在于 蓝牙列表 里面的设备名称才可以连接上,不是单单知道设备名字就可以连接上的。例如:手机蓝牙A,要连接的设备BA是主动,B是被动,要求是A找到B的名字并添加到 蓝牙列表 里面,同时添加的可能会很多(有可能添加了一百个设备),但是我们只要B,所以在 蓝牙列表 里面找出B,最后调用连接的方法,即可连接成功。
  • 6、connectTO()方法
1、wx.createBLEConnection()       // 连接蓝牙2、调用that.getBLEDeviceServices();方法
  • 7、getBLEDeviceServices: function ()
//获取蓝牙低功耗设备所有服务 (service)。在这里同时选取出所需的服务
1、调用wx.getBLEDeviceServices方法
  • 8、getBLEDeviceCharacteristics: function ()

1、 wx.getBLEDeviceCharacteristics() // 获取蓝牙低功耗设备某个服务中所有特征 (characteristic)。以上就是连接蓝牙的整个过程

完整代码:

//index.js
//获取应用实例
const app = getApp()
var that; //把this对象复制到临时变量that
Page({data: {status: "未连接",msg: "BLEHID",deviceId: "",connectedDeviceId: "", //已连接设备uuiddeviceName: "ble2usbhid",ServicweId: '',writeCharacteristicsId: "",strcmd: 'K:ABC123',},//事件处理函数bindViewTap: function () {wx.navigateTo({url: '../logs/logs'})},// 当用户离开页面时发生的事件onUnload: function () {that.closeBLEConnection()that.closeBluetoothAdapter()},onLoad: function () {that = this;// 1、初始化蓝牙模块。if (wx.openBluetoothAdapter) {wx.openBluetoothAdapter({success: function (res) {/* 获取本机的蓝牙状态 */that.getBluetoothAdapterState()},fail: function (err) {}})} else {}},// 2、获取本机蓝牙适配器状态getBluetoothAdapterState: function () {wx.getBluetoothAdapterState({success: function (res) {that.startBluetoothDevicesDiscovery()},fail(res) {console.log(res)}})},// 3、关闭蓝牙连接,并且 开始搜寻附近的蓝牙外围设备。 此处方法也应该是“连接蓝牙”按钮的调用方法startBluetoothDevicesDiscovery: function () {wx.openBluetoothAdapter({})that.closeConnect();that.setData({devices: {}})setTimeout(() => {wx.startBluetoothDevicesDiscovery({success: function (res) {/* 获取蓝牙设备列表 */that.getBluetoothDevices()},fail(res) {}})}, 500)},/**4、获取在蓝牙模块生效期间所有搜索到的蓝牙设备。* 包括已经和本机处于连接状态的设备。*  */getBluetoothDevices: function () {setTimeout(() => {wx.getBluetoothDevices({services: [],allowDuplicatesKey: false,interval: 0,success: function (res) {console.log(JSON.stringify(res.devices))that.setData({devices: res.devices,})if (res.devices.length > 0) {for (let i = 0; i < res.devices.length; i++) {console.log(res.devices[i].name);if ('ble2usbhid' === res.devices[i].name) {/* 根据指定的蓝牙设备名称匹配到deviceId */that.deviceId = res.devices[i].deviceId,wx.stopBluetoothDevicesDiscovery({success: function (res) {console.log(res, '已停止搜索')},fail(res) {console.log(res, '停止搜索失败')}})that.connectTO();};};} else {}},fail(res) {console.log(res, '获取蓝牙设备列表失败=====')}})}, 50)},// 5、连接蓝牙connectTO: function () {wx.createBLEConnection({deviceId: that.deviceId,success: function (res) {that.connectedDeviceId = that.deviceId;/* 4.获取连接设备的service服务 */that.getBLEDeviceServices();},fail: function (res) {that.setData({status: "连接失败",msg: "连接失败!请重试",})}})},// 6、获取蓝牙低功耗设备所有服务 (service)。并且选出 FFE0 服务getBLEDeviceServices: function () {setTimeout(() => {wx.getBLEDeviceServices({deviceId: that.connectedDeviceId,success: function (res) {that.setData({msg: "发现服务" + JSON.stringify(res.services)})for (var i = 0; i < res.services.length; i++) {if (res.services[i].uuid.indexOf("FFE0") >= 0) {that.setData({msg: "已发现服务" + res.services[i].uuid})that.services = res.services[i]/* 获取连接设备的所有特征值 */that.getBLEDeviceCharacteristics()break;}}},fail: (res) => {console.log(res)that.setData({msg: "服务搜索失败"})}})}, 500)},// 7、获取蓝牙低功耗设备某个服务中所有特征 (characteristic)。getBLEDeviceCharacteristics: function () {console.log("find char of " + that.services.uuid)setTimeout(() => {wx.getBLEDeviceCharacteristics({deviceId: that.connectedDeviceId,serviceId: that.services.uuid,success: function (res) {that.setData({msg: "发现特征" + res.characteristics.length})console.log('蓝牙特征值UUID:', res.characteristics)for (var i = 0; i < res.characteristics.length; i++) {if (res.characteristics[i].properties.write && res.characteristics[i].uuid.indexOf('FFE3') >= 0) {that.setData({status: "已就绪",msg: "连接成功 可以操作",})/* 获取蓝牙特征值 */that.ServicweId = that.services.uuid;that.writeCharacteristicsId = res.characteristics[i].uuid// 启用低功耗蓝牙设备特征值变化时的 notify 功能// that.notifyBLECharacteristicValueChange()break;}}},fail: function (res) {}})}, 100)},notifyBLECharacteristicValueChange: function () { // 启用低功耗蓝牙设备特征值变化时的 notify 功能console.log('启用低功耗蓝牙设备特征值变化时的 notify 功能')wx.notifyBLECharacteristicValueChange({state: true,deviceId: that.connectedDeviceId,serviceId: that.ServicweId,characteristicId: that.notifyCharacteristicsId,complete(res) {/*用来监听手机蓝牙设备的数据变化*/wx.onBLECharacteristicValueChange(function (res) {that.setData({msg: 'reveive:' + that.receiveData(res.value)})})},fail(res) {console.log(res, '启用低功耗蓝牙设备监听失败')}})},// 断开设备连接closeConnect: function () {if (that.connectedDeviceId) {wx.closeBLEConnection({deviceId: that.connectedDeviceId,success: function (res) {that.closeBluetoothAdapter()},fail(res) {}})} else {//that.closeBluetoothAdapter()}},// 关闭蓝牙模块closeBluetoothAdapter: function () {wx.closeBluetoothAdapter({success: function (res) {},fail: function (err) {}})},
})

END

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

  1. 微信小程序低功耗蓝牙(BLE)开发总结

    1.准备 低功耗蓝牙模块:(链接)蓝牙模块购买通道 相关参数数据(UUID表): 需要知道服务ID(serviceID) ,响应特征值 ID(notify characteristic UUID),写 ...

  2. 微信小程序实现蓝牙BLE(demo版)

    微信小程序实现蓝牙BLE(看文章最后一句话) 这是楼主在学校自己开发的用蓝牙小程序控制机械臂的(独立开发的). https://pan.baidu.com/s/1AmCW_ARhu--eapzd8Af ...

  3. uni-app、微信小程序低功耗蓝牙开发及使用

    引导 今天在这里记录分享一下低功耗蓝牙的使用方法和需要注意的地方 如果使用的微信小程序原生开发,使用方法是一样的,只需要把所有uni换成wx就行 例 wx.openBluetoothAdapter({ ...

  4. 微信小程序低功耗蓝牙

    // pages/scanble/scanble.js const app = getApp() Page({/*** 页面的初始数据*/data: {loading: false,color: '# ...

  5. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

  6. 微信小程序之蓝牙开发虚拟摇杆

    文章用于学习记录 文章目录 前言 一.App Inventor 二.uni-app 三.微信小程序 3.1 示例&应用 3.2 服务值与特征值 3.3 控制指令 3.4 测试 3.5 十六进制 ...

  7. 在HbuilderX中实现微信小程序下蓝牙连接打印机完整实战案例

    1.基础开发环境,所用到的 Api 以及实现的思路. 应用场景: 商家打印小票,小票包含顾客消费的商品明细信息以及末尾附上二维码,二维码供顾客扫码开票. HbuilderX开发工具: HBuilder ...

  8. 小程序开发语言python_微信小程序是用什么语言开发的呢

    原标题:微信小程序是用什么语言开发的呢 说到微信小程序可能大部分只是一知半解,您是否清楚小程序是用什么来开发的?如果您不太清楚,那么多美源小程序小编来告诉您小程序开的具体. 微信小程序是什么语言开发的 ...

  9. 微信小程序服务器端用什么语言开发?

    点击阅读原文  微信小程序服务器端用什么语言开发? 首先,比如微信二次开发,可以用java或者php 来做服务器端语言来进行二次开发,那小程序呢?文档写着.js负责业务逻辑,难道服务器端就是纯JS实现 ...

最新文章

  1. Aspose.cell生成表格
  2. [蓝桥杯][基础练习VIP]2n皇后问题(深搜)
  3. 【ES6(2015)】Object对象
  4. 疫情海报模板|光效显微传播大数据必备psd素材
  5. 用openssh下的sftp通过chroot控制用户
  6. vue3.0版本怎么修改服务器路径,@vue/cli 3.0 下通过npm命令切换不同服务器地址
  7. 案例33-用户退出功能
  8. Ubuntu 16.04 LTS Final Beta about JAVA
  9. opencv图片变形 仿射 旋转 透视 弯曲 鱼眼特效
  10. 使用fedora32桌面图标
  11. 谷歌protobuf简介
  12. Java 添加Word项目符号、编号列表
  13. 在win10中,映射共享文件时,输入网络凭据总是报错
  14. 古老CPU启示录-意义重大的8008 芯片
  15. vue设置video图片_vue-video-player视频播放器使用配置详解
  16. 1438oracle,一次ora-01438错误的处理
  17. 批量下载sra文件linux,Linux下从NCBI批量下载SRA数据的sra和aspera方法
  18. 盘口技术大全(六): 吸筹与试盘
  19. 5.2.2 消费者和消费组元数据
  20. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园百事知系统lt1v4

热门文章

  1. 网络管理员和网络工程师的区别
  2. Django 浏览器报错 MIME 类型(“text/html”)不匹配(X-Content-Type-Options: nosniff)
  3. HTMLCSSHTTP
  4. CMMI认证所需要的全部流程在这里
  5. python在每个字符后加上逗号_Python将逗号添加到数字字符串中
  6. SpringBoot之——动态数据源(多数据源自动切换)
  7. 3. node.js 异步式I/O或非阻塞式I/O
  8. Unity中的静态合批、动态合批、GPU Instance 以及SRP Batching
  9. 构建基于Linux平台的开源×××服务器
  10. node安装升级思考