zoukankan      html  css  js  c++  java
  • 微信小程序蓝牙模块

    蓝牙部分知识

    • 关于Service:

    每个设备包含有多个Service,每个Service对应一个uuid

    • 关于Characteristic

    每个Service包含多个Characteristic,每个Characteristic对应一个uuid

    • 如何得到数据

    我们想要的数据是包含在每一个Characteristic

    微信小程序目前提供的蓝牙API:详细参数请见小程序开发文档

    1.操作蓝牙适配器的4个API  

    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 //监听低功耗蓝牙连接的错误事件

    基本操作流程

    1.初始化蓝牙适配器

    2.开始搜寻附近的蓝牙外围设备

    3.监听寻找到新设备的事件

    4.连接低功耗蓝牙设备

    5获取蓝牙设备所有 service 和 characteristic

    6.读取或写入低功耗蓝牙设备的特征值的二进制数据值。 

    示例:

    <!--index.wxml-->
    <view class="container">
    
    <view class="content">  
      <text class="status">适配器状态:{{ status }}</text>  
      <text class="sousuo">是否搜索:{{ sousuo }}</text>  
      <text class="msg">消息:{{ msg }} </text>  
    
      <button type="default" class="button" bindtap="initializeBluetooth">初始化蓝牙适配器</button>  
      <button type="default" class="button" bindtap="searchBluetooth">搜索蓝牙设备 </button>    
      <button type="default" class="button" bindtap="getServices">获取连接设备所有service</button>  
      <button type="default" class="button" bindtap="sendMessages">发送消息</button>  
      <button type="default" class="button" bindtap="startBletNotify">启用设备特征值变化时的notify</button>  
      <button type="default" class="button" bindtap="receiveMessages">接收消息</button>  
      <button type="default" class="button" bindtap="closeBluetooth">断开蓝牙连接</button>  
    
      <view class="section">  
        <text class="status">接收到消息:{{ jieshou }}</text>  
      </view>  
    </view>  
    
    <view class="venues_list" >  
      <block wx:for="{{devices}}" wx:key="{{test}}">  
        <view class="venues_item">  
          <text class="status1">设备名称: {{item.name}}  </text>  
          <text class="status">设备ID: {{item.deviceId}}  </text> 
          <text class='status'>广播数据: {{item.advertisData}}  </text> 
          <text class='status'>信号强度RSSI: {{item.RSSI}}  </text>
          <text class="status">连接状态:{{connectedDeviceId == item.deviceId?"已连接":"未连接"}}  </text>  
          <view class="section">  
          </view>  
          <view class="section">  
            <button type="warn" class="button" id="{{item.deviceId}}" bindtap="connectTO">连接</button>  
          </view>  
        </view>  
      </block>  
    </view>  
    
    
    </view>
    //index.js
    //获取应用实例
    //index.js
    //获取应用实例
    const app = getApp()
    Page({
        data: {
            status: "",
            sousuo: "",
            connectedDeviceId: "", //已连接设备uuid  
            services: [], // 连接设备的服务  
            serviceId: "",
            characteristics: "",   // 连接设备的状态值  
            writeServicweId: "", // 可写服务uuid  
            writeCharacteristicsId: "",//可写特征值uuid  
            readServicweId: "", // 可读服务uuid  
            readCharacteristicsId: "",//可读特征值uuid  
            notifyServicweId: "", //通知服务UUid  
            notifyCharacteristicsId: "", //通知特征值UUID  
            inputValue: "",
            characteristics1: "", // 连接设备的状态值  
        },
        onLoad: function () {
        },
    
        // 初始化蓝牙适配器  
        initializeBluetooth: function () {
            var that = this;
            if (!wx.openBluetoothAdapter) {
                console.log('蓝牙适配器打开失败,请检查微信版本或手机是否支持小程序蓝牙模块!')
            } else {
                wx.openBluetoothAdapter({
                    success: function (res) {
                        that.setData({
                            msg: "初始化蓝牙适配器成功!"
                        })
                        wx.getBluetoothAdapterState({//获取本机蓝牙适配器状态
                            success: function (res) {
                                console.log('本机蓝牙适配器状态:')
                                console.log(res)
                            }
                        })
                    }
                })
            }
        },
    
        //搜索获取已发现设备  
        searchBluetooth: function () {
            var that = this;
            wx.startBluetoothDevicesDiscovery({//开始搜寻附近的蓝牙外围设备
                success: function (res) {
                    console.log('开始搜索周边蓝牙设备')
                    console.log(res)
                    wx.getBluetoothDevices({//sucess返回uuid 对应的的已连接设备列表,Array类型
                        success: function (res) {
                            //是否有已连接设备
                            wx.getConnectedBluetoothDevices({////根据 uuid 获取处于已连接状态的设备
                                success: function (res) {
                                    console.log('已连接的蓝牙设备:')
                                    console.log(JSON.stringify(res.devices));
                                    that.setData({
                                        connectedDeviceId: res.deviceId
                                    })
                                }
                            })
                            that.setData({
                                devices: res.devices,
                            })
                        }
                    })
                }
            })
        },
    
        //连接设备  
        connectTO: function (e) {
            var that = this;
            wx.stopBluetoothDevicesDiscovery({ //先停止搜索周边设备
                success: function (res) {
                    console.log('连接设备前,先停止搜索周边设备:')
                    console.log(res)
                }
            })
            wx.showLoading({
                title: '连接蓝牙设备中...',
            })
            wx.createBLEConnection({//若小程序在之前已有搜索过某个蓝牙设备,并成功建立链接,可直接传入之前搜索获取的deviceId直接尝试连接该设备,无需进行搜索操作。
                deviceId: e.currentTarget.id,
                success: function (res) {
                    console.log('连接成功:')
                    console.log(res)
                    wx.hideLoading()
                    that.setData({
                        connectedDeviceId: e.currentTarget.id,    //currentTarget: 事件绑定的元素
                        msg: "已连接" + e.currentTarget.id,
                    })
                },
                fail: function () {
                    console.log("调用失败");
                },
                complete: function () {
                    console.log('已连接设备ID:' + that.data.connectedDeviceId);
                    console.log("调用结束");
                }
            })
        },
    
        // 获取连接设备的service服务  
        getServices: function () {
            var that = this;
            wx.getBLEDeviceServices({//获取在小程序蓝牙模块生效期间所有已发现的蓝牙设备,包括已经和本机处于连接状态的设备
                // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取  
                deviceId: that.data.connectedDeviceId,
                success: function (res) {
                    //console.log('获取蓝牙设备所有服务成功:', res);
                    that.data.services = res.services
                    console.log('获取蓝牙设备所有服务成功:', that.data.services);
                    that.setData({
                        serviceId: that.data.services[0].uuid,
                    })
                    console.log("服务uuid:", that.data.serviceId)
                    wx.getBLEDeviceCharacteristics({
                        // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取  
                        deviceId: that.data.connectedDeviceId,
                        // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取  
                        serviceId: that.data.serviceId,   //-----注意是that.data.services[0].uuid
                        success: function (res) {
                            console.log('serviceId: that.data.services[0].uuid: ', that.data.serviceId)
                            console.log(res)
                            for (var i = 0; i < res.characteristics.length; i++) {
                                if (res.characteristics[i].properties.notify) {   //注意characteristic(特征值)信息,properties对象
                                    that.setData({
                                        notifyServicweId: that.data.services[0].uuid,
                                        notifyCharacteristicsId: res.characteristics[i].uuid,
                                    })
                                    console.log("notifyServicweId:", that.data.notifyServicweId,"notifyCharacteristicsId", that.data.notifyCharacteristicsId)
                                }
                                if (res.characteristics[i].properties.write) {
                                    that.setData({
                                        writeServicweId: that.data.services[0].uuid,
                                        writeCharacteristicsId: res.characteristics[i].uuid,
                                    })
                                    console.log("writeServicweId:", that.data.writeServicweId, "writeCharacteristicsId", that.data.writeCharacteristicsId)
                                } else if (res.characteristics[i].properties.read) {
                                    that.setData({
                                        readServicweId: that.data.services[0].uuid,
                                        readCharacteristicsId: res.characteristics[i].uuid,
                                    })
                                    console.log("readServicweId:", that.data.readServicweId, "readCharacteristicsId", that.data.readCharacteristicsId)
                                }
                            }
                        },
                        fail: function () {
                            console.log("获取连接设备的所有特征值:", res);
                        },
                        complete: function () {
                            console.log("complete!");
                        }
                    })
                }
            })
        },
    
    
        //断开设备连接  
        closeBluetooth: function () {
            var that = this;
            wx.closeBLEConnection({
                deviceId: that.data.connectedDeviceId,
                success: function (res) {
                    console.log('断开设备连接: ', devicedId)
                    console.log(res)
                }
            })
        },
    
        //发送  
        sendMessages: function () {
            var that = this;
            // 这里的回调可以获取到 write 导致的特征值改变  
            wx.onBLECharacteristicValueChange(function (characteristic) {
                console.log('characteristic value changed:1', characteristic)
            })
            var buf = new ArrayBuffer(16)
            var dataView = new DataView(buf)
            dataView.setUint8(0, 99)
            wx.writeBLECharacteristicValue({
                deviceId: that.data.connectedDeviceId,
                serviceId: that.data.writeServicweId,
                characteristicId: that.data.writeCharacteristicsId,
                value: buf,
                success: function (res) {
                    console.log('writeBLECharacteristicValue success', res)
                }
            })
        },
    
        //启用低功耗蓝牙设备特征值变化时的 notify 功能  
        startBletNotify: function () {
            var that = this;
            wx.notifyBLECharacteristicValueChange({
                state: true, // 启用 notify 功能  
                deviceId: that.data.connectedDeviceId,
                serviceId: that.data.notifyServicweId,
                characteristicId: that.data.notifyCharacteristicsId,
                success: function (res) {
                    console.log('notifyBLECharacteristicValueChange success', res.errMsg)
                },
                fail: function () {
                    console.log('启用notify功能失败!');
                    console.log(that.data.notifyServicweId);
                    console.log(that.data.notifyCharacteristicsId);
                },
            })
        },
    
        //接收消息  
        receiveMessages: function () {
            var that = this;
            // 必须在这里的回调才能获取  
            wx.onBLECharacteristicValueChange(function (characteristic) {
                let hex = Array.prototype.map.call(new Uint8Array(characteristic.value), x => ('00' + x.toString(16)).slice(-2)).join('');
                console.log(hex)
            })
            console.log(that.data.readServicweId);
            console.log(that.data.readCharacteristicsId);
            wx.readBLECharacteristicValue({
                deviceId: that.data.connectedDeviceId,
                serviceId: that.data.readServicweId,
                characteristicId: that.data.readCharacteristicsId,
                success: function (res) {
                    console.log('readBLECharacteristicValue:', res.errMsg);
                }
            })
        },
    
        onHide: function () {
            var that = this
            this.setData({
                devices_list: []
            })
            if (this.data.searching) {
                wx.stopBluetoothDevicesDiscovery({//隐藏界面是建议停止
                    success: function (res) {
                        console.log(res)
                        that.setData({
                            searching: false
                        })
                    }
                })
            }
        }
    })

  • 相关阅读:
    docker 原理之 mount namespace(下)
    docker 原理之 namespace (上)
    十种世界顶级思维方式
    Go 标准库 net
    斐波拉契序列的 Go 实现
    channel 是怎么走上死锁这条路的
    hello world 的并发实现
    使用链表和切片实现栈和队列
    非暴力沟通-读后感
    CCS
  • 原文地址:https://www.cnblogs.com/dear_diary/p/8371035.html
Copyright © 2011-2022 走看看