评论

蓝牙分包写入

蓝牙写入超过20字节后的处理方式 ----来着一只年幼的程序猿

前段时间收到一个蓝牙设备,需求是控制板子上面的电机,这对于从未接触过硬件的小白来说无疑是一个挑战,然而我是一个喜欢挑战的蓝人,于是开始了我的研究。

我开始各种搜罗Demo,查看文档及各大论坛。

终于,黄天不负苦心人,我成功的连接上了设备,并且获取到了他的服务及特征值,当然,每台外设可用的服务及特征值都是不一样的,而且有些是不可用的,什么 read、write、notify、indicate 要根据自己的操作需求去看哪个特征值支持。每个服务下面都有不同的特征值,每个特征值下面又分出来几个不同的特征值列表,接下来就是根据自己需求筛选了。

支持列表:
read:读取低功耗蓝牙设备的特征值的二进制数据值
write:向低功耗蓝牙设备特征值中写入二进制数据
notify || indicate:启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值

这些都选好后该开始向蓝牙设备写入指令,让他动起来了(想想就有些小激动)

不过根据官方提供的方式转换指令并写入的时候,意外发生了!
我在回调里面打印成功与否的时候,显示成功,但是设备却没人任何反应,于是我又开始找原因(设备通过某个App试过,写入指令后是正常的),又开始了我的搜寻之旅。

之后发现原因是因为我使用的指令转换后超过了20字节,在Api文档中
https://developers.weixin.qq.com/miniprogram/dev/api/wx.writeBLECharacteristicValue.html
标注了建议每次写入不超过20字节,但是也不是强制性的呀,导致我很懵逼,明明返回的是成功。

事到如今,只能接着寻找解决方法了,总不能跟他这么耗着呀。接着我的搜寻之旅吧!(废话那么多,重点该来了)

终于,找到种分包的方式,把超过20字节的指令分批发送(当然,没有超过20字节的话,也不影响使用),这边需要注意一下,不能直接连发,需要有一个延迟,然后~完美写入指令,我的小电机动起来了。

整体的流程如下:
打开蓝牙模块 => 搜索蓝牙 => 获取所有已发现的设备 => 连接蓝牙设备 => 获取蓝牙设备的所有服务 => 获取蓝牙设备服务下的所有特征值 => 向蓝牙设备写入指令 => 完成 =>关闭蓝牙模块

行了,不哔哔了。我结合官方提供的Demo修改了一下,添加了一个分包写入,已经打包成代码片段,可以直接使用。

代码片段中服务和特征值这两个地方我写成了固定的,根据自己的需求可以修改下。

核心代码:
延时定时器
格式转换
判断并分包写入

代码片段:
https://developers.weixin.qq.com/s/oFJc70mI7o8K

如有不对的地方或者更好的解决方案,还望大佬们及时提出,希望对你们有所帮助。

最后一次编辑于  2019-05-05  
点赞 6
收藏
评论

3 个评论

  • 🐉江南🇨🇳
    🐉江南🇨🇳
    2019-05-05

    大神挺牛逼的,蓝牙都玩

    2019-05-05
    赞同 2
    回复 4
    • Moonlight
      Moonlight
      2019-05-05

      边儿去  你这太假 太假

      2019-05-05
      1
      回复
    • ___嘘丶低调
      ___嘘丶低调
      2019-05-15

      小白 转换格式哪里不是很懂

      2019-05-15
      回复
    • w
      w
      2019-12-11回复Moonlight
      大佬写过公众号链接蓝牙的需求没
      2019-12-11
      回复
    • Moonlight
      Moonlight
      2019-12-11回复w
      不是大佬 哈哈哈哈 没写过 这是第一次接触蓝牙的项目
      2019-12-11
      回复
  • 李六木
    李六木
    2019-10-15

    正好有这个需求,谢大佬!

    2019-10-15
    赞同
    回复
  • ZF.SONG
    ZF.SONG
    2019-09-23

    预览下界面  没找到写包入口~~~

    2019-09-23
    赞同
    回复
登录 后发表内容