微信小程序开发吧 关注:7,813贴子:160,133
  • 2回复贴,共1

蓝牙小程序服务值两个特征值,一读一写,如何实现完整的收发数据

只看楼主收藏回复

微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,目前怀疑是进制转换的问题或者是没有做到利用两个特征值进行读写
这是代码运行结果:点击能读的特征值就会接收到耀这个字,点击输入框无论发送什么都会接收到肀这个字



以下是lanya.js代码:
<!-- <button bindtap="openAdapter">初始化蓝牙模块</button> -->
<!-- <button bindtap="discoverDevices">开始搜寻附近的蓝牙设备</button> -->
<button bindtap="getDevices">获得周边蓝牙设备</button>
<!-- 一个一个遍历准备连接设备:点击设备名称即可链接 -->
<view wx:if="{{showFlage}}" wx:for="{{devices}}" wx:for-item="device" wx:key="key" bindtap="create" data-index="{{index}}">
<view style="width: 750rpx;height:100rpx;color:gray;">{{device.name}} {{device.deviceId}}
</view>
</view>
<view wx:if="{{showFlage1}}">蓝牙设备:{{name}} {{deviceId}}</view>
<view wx:if="{{showFlage1}}">点击下面服务值获得特征值</view>
<!-- 判断是哪个服务值像之前判断是哪个蓝牙设备那样 -->
<view wx:for="{{services}}" wx:for-item="service" wx:key="key" bindtap="choise" data-index="{{index}}">
<!-- 将它遍历出来,把id提出来-->
<view wx:if="{{showFlage1}}" style="color: hotpink;">服务值:{{service.uuid}}</view>
</view>
<view wx:if="{{showFlage2}}">点击下面特征值读写数据</view>
<!-- 一个服务值里面有好多特征值,需要数据索引,添加点击事件 -->
<view wx:if="{{showFlage2}}" style="color: blue;" wx:for="{{characteristics}}" wx:for-item="characteristic" wx:key="key" bindtap="select"data-index="{{index}}">
<view>特征值:{{characteristic.uuid}} read:{{characteristic.properties.read}} write:{{characteristic.properties.write}}</view>
</view>
<button bindtap="disconnect">断开连接并返回</button>
<!-- 在输入框上面写入提示 -->
<view style="background-color: lightgray;">请输入数据:
<!-- 设置不能刚进入小程序就显示能够输入数据,利用showkeyboard来设置,改变键盘发送按键,并在点击完成时触发-->
<input style="height: 100rpx;width: 750rpx;" focus = "{{showKeyboard}}" confirm-type="send" bindconfirm="sendData" disabled="{{inputKey}}"></input>
</view>
<view>接收到的数据:</view>
<view>{{showData}}</view>
下面是js代码:


IP属地:江苏1楼2024-01-12 11:55回复
    //监听变化
    wx.onBLECharacteristicValueChange(function(res) {
    console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
    console.log('ArrayBuffer转16进制字符串',ab2hex(res.value))
    var resValue = new Uint8Array(res.value,0);
    console.log('ArrayBuffer转Uint8Array',resValue)
    console.log(ab2hex(res.value))
    console.log(ab2str(res.value))//利用这个方法将接收到的字符转化过来
    let value = ab2str(res.value)
    // 为了防止后面的值覆盖前面接受到的值,需要定义一个全局变量
    //将值累加起来,不让覆盖
    revData += value
    //设置叠加是有限的,不能无底线叠加,意思是清空之前叠加的数据,将最后叠加后的数据赋值给他
    if(revData.length>=30){
    revData = value
    }
    that.setData({
    showData: revData
    })
    })
    }
    })
    },
    sendData(e){
    console.log(e)
    //将输入的值给取出来
    let value = e.detail.value
    // 向蓝牙设备发送一个0x00的16进制数据
    let buffer = new ArrayBuffer(value.length)//改成输入这串字符的长度
    let dataView = new DataView(buffer)
    //设置一个循环,一个一个字符来处理,因为我们可能不止发送一个值
    for(let i = 0;i < value.length;i++){
    dataView.setUint8(i, value[i].charCodeAt())//字符转换成Ascii码
    }
    dataView.setUint8(0, 0)
    wx.writeBLECharacteristicValue({
    // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
    deviceId:this.data.deviceId,
    // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
    serviceId:this.data.serviceId,
    // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
    characteristicId:this.data.characteristicId,
    // 这里的value是ArrayBuffer类型
    value: buffer,
    success (res) {
    // 将发送的数据打印出来
    console.log(buffer)
    console.log('writeBLECharacteristicValue success', res.errMsg)
    wx.showToast({
    title: '发送成功',
    })
    },
    fail(res){
    wx.showToast({
    title: '发送失败',
    })
    }
    })
    }
    })


    IP属地:江苏4楼2024-01-12 11:59
    回复
      不好意思js代码太长了,求大佬指点


      IP属地:江苏5楼2024-01-12 11:59
      回复