微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,求指导

这篇具有很好参考价值的文章主要介绍了微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,求指导。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我是小程序初学者,目前尝试做一个蓝牙小程序连接蓝牙模块进行收发数据,遇到了问题求大佬指点

微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,求指导,小程序,微信,微信小程序

微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,求指导,小程序,微信,微信小程序

微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,求指导,小程序,微信,微信小程序

这是代码运行结果:点击能读的特征值就会接收到耀这个字,点击输入框无论发送什么都会接收到肀这个字


遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,我在想是需要将两个特征值合在一起使用吗?求指导(ps:小程序是跟着b站上面一个博主做的,他是想把手机发送的内容显示到手机上的接受区,我想实现手机发送在串口助手显示,串口助手发送的能在手机小程序接收区显示),以下是代码内容lanya.wxml部分

<!-- <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>


lanya.js部分:

//将接收到的字符转化为我们发送的数据
function ab2str(buf){
  return String.fromCharCode.apply(null,new Uint16Array(buf));
}
//定义一个全局变量
let revData = ''
Page({

  /**
   * 页面的初始数据
   */
  data: {
      discoverFlag:false,
      devices:[],
      deviceId:'',//蓝牙设备id
      serviceId:'',//蓝牙特征对应服务的UUID


      services:[],
      characteristics:[],//特征值的列表
      characteristicId:'',//蓝牙特征的UUID
      showFlage:true,
      name:'',//保存设备的名字
      showFlage1:false,
      showFlage2:false,

      available:true,
      read:false,
      write:false,
      showKeyboard:false,
      inputKey:true,//设置刚开始输入框不起作用,等到点击特征值之后再起作用
      showData:'',
  },

  /**
   * 生命周期函数--监听页面加载
   * 初始化蓝牙模块
   */
  onLoad: function (options) {
    wx.getBluetoothAdapterState({
      success(res){
        console.log(res)
        if(res.available){
          that.setData({
            available:true
          })
        } else{
          that.setData({
            available:false
          })
        }
      }
    })
    if(this.data.available==false){
      wx.showToast({
        title: '请打开蓝牙',
      })
    }
      wx.openBluetoothAdapter({
        success (res) {
          console.log(res)
        }
      })
    
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    let that = this
      wx.getBluetoothAdapterState({
        success (res) {
          console.log(res)
          
            if(res.available){
              // wx:wx.showToast({
                // title: '蓝牙没有打开',
                that.setData({
                  available:true
                })
            }else{
              that.setData({
                available:false
              })
              
            }
        }
      })
      if(this.data.available==false){
          wx.showToast({
            title: '请打开蓝牙',
          })
      }
      wx.openBluetoothAdapter({
        success (res) {
          console.log(res)
        }
      })
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
    
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
  },
  // 初始化蓝牙模块,切记打开蓝牙
  openAdapter(e){
    wx.openBluetoothAdapter({
      success (res) {
        console.log(res)
      }
    })
  },

//搜寻附近蓝牙设备
  getDevices(){
    let that = this
  // 开始监听蓝牙设备之前,先判断discoverflag是不是真的开始搜寻了
  // getDevices(){
  //   let that = this
    wx.startBluetoothDevicesDiscovery({
      services: [],
      success (res) {
        console.log(res)

        function ab2hex(buffer) {
          var hexArr = Array.prototype.map.call(
            new Uint8Array(buffer),
            function(bit) {
              return ('00' + bit.toString(16)).slice(-2)
            }
          )
          return hexArr.join('');
        }
        // 可以搜寻蓝牙设备ok的话这里放置一个标志
        // that.setData({
        //   // 把这个值放在里面,如果他能搜到的话,方便后面使用
        //   discoverFlag:res.isDiscovering
        // })
     
    // 这里要注意先定义discoverflag
    // if(this.data.discoverFlag){
      // ArrayBuffer转16进度字符串示例
      // 监听搜索到蓝牙设备,将新设备一一列出来
      wx.onBluetoothDeviceFound(function(res) {
          console.log(res)
          let devices = res.devices;

          console.log('new device list has founded')
          // console.dir(devices)//打印设备信息,报错不要紧
          console.log(ab2hex(devices[0].advertisData))

          // ArrayBuffer转16进度字符串示例
          wx.getBluetoothDevices({
            success: function (res) {
              console.log(res)
              that.setData({
                devices:res.devices
              })
            }
          })
          //停止搜寻附近的蓝牙外围设备,如果搜寻到四个设备以上就暂停
          if(that.data.devices.length >= 4){
            wx.stopBluetoothDevicesDiscovery({
              success (res) {
                console.log(res)
              }
            })
          }

      })
    // }
        //如果第一个不是空的的话就打印出来,没有必要可以去掉
    }
  })
},
  //连接蓝牙设备
  create(e){
    let that = this
    console.log(e)
    // 将索引放到index里面
    let index = e.currentTarget.dataset.index
    //获取本机蓝牙适配器状态
    wx.getBluetoothAdapterState({
      success (res) {
        console.log(res)
          if(res.available){
            that.setData({
              available:true
            })
          } else {
            that.setData({
              available:false
            })
          }
      }
    })
    if(this.data.available == false){
      wx.showToast({
        title: '请打开蓝牙',
      })
    }

    wx.createBLEConnection({
      deviceId:that.data.devices[index].deviceId,//点击的那条就取哪条
      wx: wx.showLoading({
        title: '连接中',
      }),

      success (res) {
        console.log(res)//成功回调打印出来
        that.setData({
          deviceId:that.data.devices[index].deviceId,//把数据的值存到这里
          name:that.data.devices[index].name,
          showFlage:false,
          showFlage1:true
        })
          //提示连接成功
          wx:wx.hideLoading({
              // title:'已连接',
          })
        // 获取蓝牙低功耗设备所有服务
        wx.getBLEDeviceServices({
          // 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立连接
          deviceId:that.data.deviceId,
          success (res) {
            console.log('device services:', res.services)
            //把列表取出来,一定要加this.setData
            that.setData({
              services:res.services
            })  
          }
        })
      }
    })
  },
  // 判定点击的是哪个服务值
  choise(e){
      console.log(e)
      let that = this
      let index = e.currentTarget.dataset.index
      let serviceId = this.data.services[index].uuid

      this.setData({
        serviceId:serviceId,
      })
    // 获取蓝牙低功耗设备某个服务中所有特征
    wx.getBLEDeviceCharacteristics({
        // 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立链接
        deviceId:this.data.deviceId,
        // 这里的 serviceId 需要在 wx.getBLEDeviceServices 接口中获取
        serviceId: this.data.serviceId,//成功回调后获得特征值
        success (res) {
          console.log('device getBLEDeviceCharacteristics:', res.characteristics)
          that.setData({
            characteristics:res.characteristics,
            showFlage2:true,
            showFlage1:false,
          })
        }
    })
  },
  disconnect(){
    let that = this
      wx.closeBLEConnection({
        deviceId:this.data.deviceId,
        success (res) {
          console.log(res)
          that.setData({
            showFlage:true,
            showFlage1:false,
            showFlage2:false,
            inputKey:true,//当点击断开连接返回时,输入框禁用状态
          })
        }
      })
  },
  select(e){
    let that = this
    console.log(e)
    // 将index读取出来,index就是点击了哪个特征值
    let index = e.currentTarget.dataset.index
    // 这个id就等于当前数据里面特征值列表,取出来以后放到初始数据里面
    let characteristicId = this.data.characteristics[index].uuid
    // 将获得的特征值数据放入初始数据里面
    this.setData({
      characteristicId:characteristicId,
      // 设置点击特征值之后,输入框才启用
      showKeyboard:true,
      inputKey:false,//当一点击某个特征值就会往里面的写数据变为false

    })
    wx.notifyBLECharacteristicValueChange({
      state: true, // 启用 notify 功能
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId:this.data.deviceId,
      // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
      serviceId:this.data.serviceId,
      // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
      characteristicId:this.data.characteristicId,
      success (res) {
        console.log('notifyBLECharacteristicValueChange success', res.errMsg)
        // ArrayBuffer转16进制字符串示例
        function ab2hex(buffer) {
          let hexArr = Array.prototype.map.call(
            new Uint8Array(buffer),
            function(bit) {
              return ('00' + bit.toString(16)).slice(-2)
            }
          )
          return hexArr.join('');
        }
        //监听变化
        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: '发送失败',
        })
      }
    })
  }
})


 文章来源地址https://www.toymoban.com/news/detail-792028.html

到了这里,关于微信蓝牙小程序,连接蓝牙模块收发数据。遇到的问题:我连接成功之后发现服务值下面两个特征值一个只能读一个只能写,然后点击读的那个一直收到同一个字,点击发送无论发什么内容只能收到同一个中文字,求指导的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 微信小程序蓝牙连接 uniApp蓝牙连接设备

     蓝牙列表期待效果  代码  js里面注意getBLEDeviceCharacteristics获取特征值的时候,极个别设备参数write,read,notify是乱来的,需要自己打单独处理,通过对应write,read,notify 为true的时候拿到对应的uuid,

    2024年02月04日
    浏览(49)
  • 微信小程序 - 蓝牙连接

    官网 蓝牙 (Bluetooth) | 微信开放文档        蓝牙低功耗是从蓝牙 4.0 起支持的协议,与经典蓝牙相比,功耗极低、传输速度更快,但传输数据量较小。常用在对续航要求较高且只需小数据量传输的各种智能电子产品中,比如智能穿戴设备、智能家电、传感器等,应用场景

    2024年02月05日
    浏览(45)
  • uniapp 蓝牙连接设备 下发命令 监听蓝牙与设备的连接状态(兼容 微信小程序和支付宝小程序)

    1:创建蓝牙需要调用的Api文件 ly.js 2 在页面中使用index.vue 

    2024年04月14日
    浏览(33)
  • 微信小程序 蓝牙设备连接,控制开关灯

    微信小程序中连接蓝牙设备,信息写入流程 1 、检测当前使用设备(如自己的手机)是否支持蓝牙/蓝牙开启状态 wx:openBluetoothAdapter({}) 2 、如蓝牙已开启状态,检查蓝牙适配器的状态 wx.getBluetoothAdapterState({}) 3 、添加监听蓝牙适配器状态变化 wx.onBluetoothAdapterStateChange({}) 4 、搜

    2024年02月12日
    浏览(39)
  • 微信小程序之蓝牙连接全过程封装

    1、初始化蓝牙 不管是ios操作系统还是安卓操作系统,第一步都需要初始化蓝牙 2、获取蓝牙适配器状态 3、ios和安卓的操作系统对蓝牙的连接方式不同 安卓是直接对设备的macAddress进行连接 ios需要对周边的蓝牙设备就行搜索: 4、蓝牙连接 5、获取蓝牙多个service 6、开启notif

    2024年02月15日
    浏览(29)
  • 微信小程序——实现蓝牙设备搜索及连接功能

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:微信小程序学习分享 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:微信小程序——实

    2024年02月08日
    浏览(37)
  • uni-app 微信小程序蓝牙模块的解耦封装-持续更新

    core.js tool.js util.js main.js

    2024年03月27日
    浏览(80)
  • 微信小程序通过蓝牙连接ESP32控制LED灯

    本文主要基于网上已有的代码以及官方给定示例代码进行修改。如有不妥请指出,谢谢啦。 据我了解,微信小程序只能通过低功耗蓝牙(BLE)进行控制。 BLE蓝牙部分设置流程(通过该程序就能让esp32广播蓝牙,同时手机也可搜索到蓝牙设备): // 获取蓝牙接收的数据与处理

    2024年02月04日
    浏览(50)
  • uniapp微信小程序连接蓝牙打印机 打印文字、图片

    首先感谢几位的文章分享 https://blog.csdn.net/guairena/article/details/127941515 https://blog.csdn.net/qq_37970097/article/details/119148707 效果图: 使用的是 芝柯cc3 蓝牙打印机, 我这里没有存储蓝牙设备相关信息。所以每次打印都会重新初始化并搜索设备,储存相关的代码下面也有,所以代码部分

    2024年02月13日
    浏览(51)
  • 基于天问51-Core自制开发WIFI模块连接MQTT&巴法云平台-微信小程序显示温度数据

    目 录 一、摘要 二、项目准备材料 三、硬件总体设计 四、软件代码设计 五、整体测试联调 六、效果展示 一、摘要 本项目基于天问51-Core最小系统开发,自行设计PCB电路,主要包括DHT11、ESP8266、OLED三个主要外设模块。此项目实现的三大功能:1、基本功能:单片机将DHT11获取

    2024年02月06日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包