微信小程序:BLE蓝牙开发

这篇具有很好参考价值的文章主要介绍了微信小程序:BLE蓝牙开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、添加蓝牙权限:

1.添加蓝牙权限(工程/app.json):

{
  ...,
  "permission": {
    "scope.bluetooth": {"desc": "BLE蓝牙开发"},
    "scope.userLocation": {"desc": "BLE蓝牙开发定位"},
    "scope.userLocationBackground": {"desc": "BLE蓝牙开发后台定位"}
  }
}

二、实现扫描/连接/接收BLE设备数据:

1.实现BLE蓝牙设备扫描:

const TIMEOUT = 10000;
var isInit = false
var isScanning = false
var timer = null
var mTimeout = TIMEOUT;
//开始扫描
function startScan({
  timeout = TIMEOUT,
  onFindCallback,
  onStopCallback
}) {
  if (isScanning) return
  console.log('0.开始初始化蓝牙 >>>>>>')
  mTimeout = timeout
  listenerScanResult(onFindCallback) //监听扫描结果
  wx.openBluetoothAdapter({ // 初始化蓝牙
    mode: 'central', //小程序作为中央设备
    success: (res) => { //初始化蓝牙成功
      isScanning = true
      console.log('1.开始扫描设备 >>>>>>')
      wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false
      }) //开始搜索蓝牙设备
      startTimer(onStopCallback)
    },
    fail: (res) => { //初始化蓝牙失败
      if (res.errCode !== 10001) return
      wx.onBluetoothAdapterStateChange((res) => {
        if (!res.available) return
        isScanning = true
        console.log('1.开始扫描设备 >>>>>>')
        wx.startBluetoothDevicesDiscovery({
          allowDuplicatesKey: false
        }) //开始搜索蓝牙设备
        startTimer(onStopCallback)
      })
    }
  })
}

function startTimer(onStopCallback) {
  cancelTimer()
  timer = setTimeout(function () {
    stopScan()
    if (onStopCallback != null && typeof onStopCallback === 'function') {
      onStopCallback() //停止扫描回调外部
    }
  }, mTimeout) //默认10秒后停止扫描
}

function cancelTimer() {
  if (timer != null) {
    clearTimeout(timer)
    timer = null
  }
}
//监听并处理扫描结果
function listenerScanResult(onFindCallback) {
  if (isInit) return
  isInit = true
  wx.onBluetoothDeviceFound((res) => { //监听扫描结果
    res.devices.forEach((device) => {
      if (!device.name.startsWith('T')) return //过滤非本公司蓝牙设备
      console.log('扫到设备, deviceName: ', device.name)
      if (onFindCallback != null && typeof onFindCallback === 'function') {
        onFindCallback(device) //找到设备回调外部
      }
    })
  })
}
//是否扫描中
function isScan() {
  return isScanning
}
//停止扫描
function stopScan() {
  console.log('停止扫描设备 >>>>>>')
  cancelTimer()
  if (!isScanning) return;
  isScanning = false;
  wx.stopBluetoothDevicesDiscovery() //停止扫描
}

module.exports = {
  startScan,
  isScan,
  stopScan
}

2.实现连接设备/接收数据:

var Scan = require('../ble/scan/Scan')
const SET_MODE_SERVICE_UUID = "0000180f-0000-1000-8000-00805f9b34fb" //设置模式-服务UUID
const SET_MODE_CHARACTERISTIC_UUID = "00002a19-0000-1000-8000-00805f9b34fb" //设置模式-特征值UUID
const SET_MODE_DESCRIPTOR_UUID = "00002902-0000-1000-8000-00805f9b34fb" //设置模式-特征值描述UUID(固定不变)
const WRITE_DATA_SERVICE_UUID = "01ff0100-ba5e-f4ee-5ca1-eb1e5e4b1ce1" //写数据-服务UUID
const WRITE_DATA_CHARACTERISTIC_UUID = "01ff0101-ba5e-f4ee-5ca1-eb1e5e4b1ce1" //写数据-特征值UUID
const ENABLE_NOTIFICATION_VALUE = [0x01, 0x00]; //启用Notification模式
const DISABLE_NOTIFICATION_VALUE = [0x00, 0x00]; //停用Notification模式
const ENABLE_INDICATION_VALUE = [0x02, 0x00]; //启用Indication模式
const TIMEOUT = 10000;
var timer = null
var onConnected = null
var onDisconnect = null
var onRead = null
var writeService = null
var writeCharacteristic = null
var isConnecting = false
var isConnected = false
var mDevice = null

function startTimeoutCheck() {
  cancelTimeoutCheck()
  timer = setTimeout(function () {
    close() //超时后关闭蓝牙连接
  }, TIMEOUT) //10秒后超时
}

function cancelTimeoutCheck() {
  if (timer != null) {
    clearTimeout(timer)
    timer = null
  }
}
//1.扫描
function start({
  deviceName,
  timeout = 10000,
  onDeviceNotFindCallback,
  onConnectedCallback,
  onDisconnectCallback,
  onReadCallback
}) { //开始扫描
  if (isConnecting || isConnected) return
  onConnected = onConnectedCallback
  onDisconnect = onDisconnectCallback
  onRead = onReadCallback
  Scan.startScan({
    timeout: timeout,
    onFindCallback: function (device) { //找到设备回调函数
      if (device.name == deviceName) {
        mDevice = device
        Scan.stopScan() //停止扫描
        connect(device) //转 - 2.连接
      }
    },
    onStopCallback: function () { //停止扫描回调函数
      if (mDevice == null) {
        console.log("没找到设备 >>>>>>")
        onDeviceNotFindCallback() //没扫描到设备时, 回调外部
      }
    }
  })
}
//2.连接
function connect(device) { //开始连接
  console.log("2.开始连接 >>>>>>deviceName: " + device.name)
  isConnecting = true
  startTimeoutCheck()
  wx.createBLEConnection({
    deviceId: device.deviceId, //设备的 deviceId
    success: () => { // 连接成功
      console.log("连接成功 >>>>>>deviceName: " + device.name)
      cancelTimeoutCheck()
      if (onConnected != null && typeof onConnected === 'function') {
        onConnected() //连接成功回调外部
      }
      requestMtu(device); //设置MTU
      discoverServices(device) //开始扫描服务
    },
    fail: (res) => { //连接失败
      console.log("连接失败 >>>>>>deviceName: " + device.name)
      cancelTimeoutCheck()
      close() //连接失败关闭蓝牙连接
      if (onDisconnect != null && typeof onDisconnect === 'function') {
        onDisconnect() //关闭连接回调外部
      }
    }
  })
}
//2.1.设置MTU
function requestMtu(device) {
  console.log("2.1.请求设置mtu为512 >>>>>>name: " + device.name)
  wx.setBLEMTU({
    deviceId: device.deviceId,
    mtu: 200, //最大传输字节
    success: (res) => { // mtu设置成功
      console.log("mtu设置成功 >>>>>>deviceName: " + device.name + " 当前mtu: " + res.mtu)
    },
    fail: () => { // mtu设置失败
      console.log("mtu设置失败 >>>>>>deviceName: " + device.name)
    }
  })
}
//3.发现服务
function discoverServices(device) {
  console.log("3.开始发现服务 >>>>>>deviceName: " + device.name)
  startTimeoutCheck()
  wx.getBLEDeviceServices({
    deviceId: device.deviceId, //设备的 deviceId
    success: (res) => {
      console.log("发现服务成功 >>>>>>deviceName: " + device.name)
      cancelTimeoutCheck()
      isConnecting = false
      isConnected = true
      var len = res.services.length
      for (let i = 0; i < len; i++) {
        var serviceItem = res.services[i]
        var serviceUuid = serviceItem.uuid;
        if (serviceUuid.toUpperCase() == SET_MODE_SERVICE_UUID.toUpperCase()) { //找到设置模式的服务
          console.log("3.1.找到设置模式的服务 >>>>>>deviceName: " + device.name + "  serviceUuid: " + SET_MODE_SERVICE_UUID)
          readCharacteristics(device, serviceItem); //读取特征值
        } else if (serviceUuid.toUpperCase() == WRITE_DATA_SERVICE_UUID.toUpperCase()) { //找到写数据的服务
          console.log("3.2.找到写数据的服务 >>>>>>deviceName: " + device.name + "  serviceUuid: " + WRITE_DATA_SERVICE_UUID)
          writeService = serviceItem;
          readCharacteristics(device, serviceItem); //读取特征值
        }
      }
    }
  })
}
//4.读取特征值(读出设置模式与写数据的特征值)
function readCharacteristics(device, serviceItem) {
  wx.getBLEDeviceCharacteristics({
    deviceId: device.deviceId, //设备的 deviceId
    serviceId: serviceItem.uuid, // 上一步中找到的某个服务id
    success: (res) => {
      var len = res.characteristics.length
      for (let i = 0; i < len; i++) {
        var characteristicItem = res.characteristics[i]
        var characteristicUuid = characteristicItem.uuid;
        if (characteristicUuid.toUpperCase() == SET_MODE_CHARACTERISTIC_UUID.toUpperCase()) { //找到设置模式的特征值
          console.log("4.1.找到设置模式的特征值 >>>>>>deviceName: " + device.name + "  characteristicUUID: " + SET_MODE_CHARACTERISTIC_UUID);
          setNotificationMode(device, serviceItem, characteristicItem); //设置为Notification模式(设备主动给手机发数据)
        } else if (characteristicUuid.toUpperCase() == WRITE_DATA_CHARACTERISTIC_UUID.toUpperCase()) { //找到写数据的特征值
          console.log("4.2.找到写数据的特征值 >>>>>>deviceName: " + device.name + "  characteristicUUID: " + WRITE_DATA_CHARACTERISTIC_UUID);
          writeCharacteristic = characteristicItem; //保存写数据的征值
        }
      }
    }
  })
}
//4.1.设置为Notification模式(设备主动给手机发数据),Indication模式需要手机读设备的数据
function setNotificationMode(device, serviceItem, characteristicItem) {
  console.log("4.1.设置为通知模式 >>>>>>name: " + device.name)
  wx.onBLECharacteristicValueChange((data) => { //监听设备数据
    if (data == null) return;
    console.log("接收数据 >>>>>>name: " + device.name + "  data: " + data);
    onRead(data); //回调外部,返回设备发送的数据
  })
  wx.notifyBLECharacteristicValueChange({
    deviceId: device.deviceId,
    serviceId: serviceItem.uuid,
    characteristicId: characteristicItem.uuid,
    state: true,
  }) //为指定特征的值设置通知
  if (characteristicItem.properties.write) { // 该特征值可写(即设置模式的descriptor)
    console.log("发送Notification模式给设备 >>>>>>name: " + device.name);
    let buffer = new ArrayBuffer(2)
    let bufSet = new DataView(buffer)
    bufSet.setInt16(0, ENABLE_NOTIFICATION_VALUE[0])
    bufSet.setInt16(1, ENABLE_NOTIFICATION_VALUE[1])
    wx.writeBLECharacteristicValue({
      deviceId: device.deviceId,
      serviceId: serviceItem.serviceId,
      characteristicId: characteristicItem.uuid,
      value: buffer,
    }) //发送Notification模式给设备
  }
}
//发送指令到设备
function writeCommand(data) {
  console.log("发送指令给设备 >>>>>>deviceName: " + device.name + "  data: " + data);
  var len = data.length;
  let buffer = new ArrayBuffer(len)
  let bufSet = new DataView(buffer)
  for (let i = 0; i < len; i++) {
    bufSet.setUint8(i, data[i])
  }
  wx.writeBLECharacteristicValue({
    deviceId: device.deviceId,
    serviceId: writeService.serviceId,
    characteristicId: writeCharacteristic.uuid,
    value: buffer,
  }) //发送指令给设备
}
//断开连接
function close(device) {
  console.log("断开连接 >>>>>>deviceName: " + device.name);
  isConnecting = false
  isConnected = false
  wx.closeBLEConnection({
    deviceId: device.deviceId,
  }) //断开连接
  wx.closeBluetoothAdapter({}) //关闭蓝牙
}

module.exports = {
  start,
  close
}

3.调用例子:文章来源地址https://www.toymoban.com/news/detail-531112.html

var ConnectManager = require('../../utils/ble/ConnectManager')
...//省略其他
ConnectManager.start({
  deviceName: "T11302002020169", //待连接设备的名称
  onDeviceNotFindCallback: function () { //没找到设备
  },
  onConnectedCallback: function () { //连接成功回调
  },
  onDisconnectCallback: function () { //连接关闭回调
  },
  onReadCallback: function (data) {   //设备发过来的数据
  },
})

到了这里,关于微信小程序:BLE蓝牙开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝牙BLE学习-安全

    蓝牙标准规定了5种基本的安全服务 身份验证:根据通信设备的蓝牙地址验证其身份。蓝牙不提供本地用户身份验证。 保密性:确保只有授权的设备才能访问和查看传输的数据,防止窃听造成的信息泄露。 授权(Authorization):在允许设备使用某项服务之前,确保该设备已被授权,从

    2024年02月19日
    浏览(42)
  • BLE蓝牙协议栈分析

    Controller实现射频相关的模拟和数字部分,完成最基本的数据发送和接收,Controller对外接口是天线,对内接口是主机控制器接口HCI(Hostcontroller interface); 控制器包含物理层PHY(physicallayer),链路层LL(linker layer),直接测试模式DTM(Direct Test mode)以及主机控制器接口HCI。

    2024年02月13日
    浏览(53)
  • Flutter:BLE蓝牙开发

    说明: 使用flutter_blue_plus插件实现低功耗蓝牙开发。 一、添加蓝牙权限: 1.Android网络权限(工程/android/app/src/main/AndroidManifest.xml): 2.iOS蓝牙权限(工程/ios/Runner/Info.plist): 二、实现扫描/连接/接收BLE设备数据: 1.添加flutter_blue_plus插件依赖,在pubspec.yaml中: 2.实现BLE蓝牙设备扫

    2024年02月11日
    浏览(39)
  • Android -BLE 蓝牙模块开发

    Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码) - 简书 前言 万物互联的物联网时代的已经来临,ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点,抽时间梳理下这块的知识点。 涉及ble蓝牙通讯的客户端(开启、扫描、连接、发送... https://

    2024年02月09日
    浏览(41)
  • 物联协议整理——蓝牙BLE

    最近公司很多物联设备都使用BLE蓝牙和ZigBee通信,中间对设备功耗要求很高,补充下相关知识。 PHY层 (Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。 LL层 (

    2024年02月06日
    浏览(48)
  • 蓝牙 - 关于BLE的安全连接

    A Basic Introduction to BLE 4.x Security 引言 Bluetooth Low Energy (BLE)正在迅速成为当今最常用的无线标准之一。同样地,它也越来越多地被用于传输敏感信息的应用中。因此,希望将BLE集成到其产品中的设计者应该了解这项技术的安全特性和限制。本文试图对这些功能做一个基本的概

    2024年02月01日
    浏览(41)
  • CH573-08-BLE蓝牙(通信与点灯)——RISC-V内核BLE MCU快速开发教程

       ch573芯片集成低功耗 2.4-GHz 无线通讯模块,包括 RF 收发器、基带和链路控制以及天线匹配网络,支持低功耗蓝牙 BLE。内部提供一百多个寄存器用于调节参数和控制过程及状态,官方优化的通讯协议栈和应用层 API,支持组网,支持各种主流操作系统下的上位机开发,提

    2024年02月09日
    浏览(43)
  • 低功耗蓝牙(BLE)你入门了吗

            蓝牙低功耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环,是无线通信的主流技术之一(常见的无线通信技术有NFC、GPRS、Zigbee、Wi

    2024年02月02日
    浏览(50)
  • Android低功耗蓝牙(BLE)开发(二)

    在上一篇文章Android低功耗蓝牙(BLE)开发(一)中我们了解了BLE的相关概念,这里我们来实际用代码演示安卓进行BLE连接和通讯的功能。本文代码基于Android5.0以上(API 21) 1.声明权限 在AndroidManifest.xml文件中添加BLE相关的权限声明。 2.判断设备是否支持BLE以及蓝牙是否打开 3.进

    2024年02月09日
    浏览(57)
  • Android Ble蓝牙App(一)扫描

      关于低功耗的蓝牙介绍我已经做过很多了,只不过很多人不是奔着学习的目的去的,拿着源码就去运行,后面又发现连接设备后马上断开,然后不会自己看问题,这个现象就是快餐式的,你不了解里面的知识内容,自然就不知道是怎么回事,重复的问题我回答了好多次了

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包