文章涉及到大量软硬件知识,没有编程基础的小伙伴看起来会很吃力,硬核预警!

hi,大家好,因为个人原因没办法上传视频,所以最近将会以文章的形式进行更新,点赞投币收藏转发还是需要的,谢谢大家。

如果说你们公司要开发蓝牙应用,或者说你作为爱好者需要用蓝牙来控制东西,那么你怎么去控制蓝牙设备呢?按照传统来说,你只能开发手机APP了,因为手机有蓝牙功能直接编写出来的APP自然有能力去调用手机自身的硬件。但是如果你以前就没接触过手机APP的开发,这个时候你绝对化抓瞎,因为学习曲线太陡你的投入产出根本就不会形成正比,另一方面如果我们只是简简单单的为我们自己的diy项目提供一个控制的界面直接去写一个APP那其实也是杀鸡用牛刀,这个时候你就必须要使用小程序进行蓝牙的开发了。由于篇幅限制我不能铺垫太多东西,这里罗列一下软硬件及开发环境:硬件使用ESP32开发环境为arduino,小程序开发环境为uniapp开发语言为vuejs。OK,那么开始吧。

首先,我们来研究一下蓝牙的硬件方面,市面上有很多蓝牙芯片,但是在我的元件库中只有一个ESP32开发板,这个芯片挺有意思既有wifi也有蓝牙,同时蓝牙更是BLE低功耗蓝牙版本为蓝牙4.0,(你想使用小程序控制蓝牙设备时非常重要的,小程序只能控制BLE蓝牙!!!一定要注意!)

esp32可以使用的软件开发环境有官方的有microPython同时也有大名鼎鼎的arduino,我为什么选用arduino是因为目前为止只有arduino的esp32蓝牙库是比较稳定的,同时开发方式也比较简单,友情提示一下,目前你在网上去搜索的教程都不太靠谱!最直接的方式是直接去阅读官方例程!废话不多说,直接看蓝牙部分的源代码。

我在硬件代码中,能写的注释已经都写了,对于蓝牙来说不得不啰嗦一些:对于蓝牙来说1.蓝牙服务 2.蓝牙特征,这两个概念是必须要搞清楚的,大致的理解课参考如下图:

适当幼儿园化的解释是,每个蓝牙芯片可以有多个蓝牙服务,每个蓝牙服务又可以包括多个特征,我们最终是通过特征进行读写数据的,因此硬件设备上定义好服务和特征尤为重要。如上面蓝牙设备的硬件代码中可以看出,我定义了一个蓝牙服务,同时定义了四个特征。(那么,这里其实是有一个大坑的,在广播信息的时候,安卓系统和ios系统是有差别的,同时广播数据时,把定义的服务id广播出去才能加速连接,这点非常必要)

那么,我们之前处理好了硬件部分,重头戏就来了,接下来使用微信小程序控制蓝牙设备了。一开始我就想问一个问题,为什么小程序能控制蓝牙呢?换着方式来问就是,为什么小程序这个页面能控制硬件蓝牙呢?我总结了一下小程序和微信及手机系统的关系:

微信对外提供除了API(应用程序接口),这就回答了上一个问题,为什么小程序的页面能够控制手机的蓝牙硬件。因为微信的APP是直接安装在手机上的,所以微信能够有能力去直接操作手机上的硬件设备,而小程序又是寄生在微信身上,因此小程序就有了控制手机硬件设备的能力了,是不是非常有意思?理清了原理,那我们去开发吧,这个时候你会问有没有api文档可以参考啊?微信官方提供的小程序的api文档地址为:https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.onBLEPeripheralConnectionStateChanged.html

然后怎么找微信能控制什么设备呢?

好了,铺垫好了,开始撸小程序代码了。这篇文章的核心就来了,这是所有人都不会告诉你的事情。那么当你不管是用什么控制蓝牙应该用什么流程去控制?应该是这样几步:1.打开蓝牙适配器,2.搜索蓝牙,3.连接蓝牙,4.发送数据,5.关闭连接。理论很好,实际映射到我们的小程序代码里到底要怎么写?这才是重中之重。

第一步:

我们为了防止用户瞎操作出现奇奇怪怪的问题,必须把蓝牙的连接放在小程序页面显示的时候去连接!

代码写在这里,就有一个非常核心的问题了。那就是ios和安卓连接蓝牙是不一样的。有什么不一样?ios和安卓这两个手机系统里面搜索出来的蓝牙服务id是不一样的,你一脸懵逼,什么跟什么啊。那我就简单解释一下,还记得我们在硬件那块说了服务和特征,最终反映到代码中他们对应到一个字符串id,如图中显示,我的定义如下:

ios和安卓的差别就在这里体现出来了,安卓手机搜索出来的各种uuid都是你硬件中定义的id,但是!在ios中搜索出来就就不一样了。我硬件里定义的serviceid是“abcdefghjkl”,安卓里搜索出来的也是“abcdefghjkl”,ios里面搜索出来的可能就是“uip34344ggfg”这种样子了。你又会问啊,不一样就不一样有什么区别?区别就在于要连接蓝牙必须要通过这个id去连接,如果它在两个系统里会变那我们想直接去连接就不行了,就必须要搜索出来才能去连接了。这就是代码里为什么要判断手机系统,安卓我们直接连接,ios搜索一下直到搜索到我们的设备才去连接。这种情况下连接速度就变慢了!

然后,我们连接上蓝牙了又怎么发送和读取数据呢?这里又扯到之前的特征这个东西了,特征也是有id的,我们通过这个id才能去读写数据,使用这个api:

你从这个接口的注释中可以看到设备id,服务id特征id这三个id同时确定才能通过蓝牙读写数据,这里ios安卓两个平台有区别所以在处理的时候必须要针对两种平台做不通处理。同时有个必须要处理的是,发数据发什么样的数据呢?向硬件发送字符串“abcdefg”可以吗?回答是绝对不行!!这就扯到了数据是怎么传输的,任何数据在网络上传输都是通过二进制形式进行传输的!!二进制!!!二进制!!二进制!!将你的数据利用js转换成二进制是一个技术活,我这里提供一个样板!

那么硬件中的回调函数要怎么写呢?如下图:

我在硬件中定义的是,当蓝牙发送“1”到重启设备特征时,设备就重启。但是1可不是单单的1,在ASCII码中,1对应的是49所以要去判断发送的值是不是49而不是1,这里涉及到了ASCII码,不明白的需要去理解理解。

OK,流程说的差不多了。开始说你永远搜不到的坑了!!

第一:ios和安卓系统中蓝牙相关id搜索出来是不一样的,要根据不同系统做兼容性处理。

第二:即使你知道各种id在ios系统中,你都必须要搜索一遍,否则无法使用!也就是说ios中要做很多看似脱裤子放屁的事情,但是比必须要这么做。

第三:连接上的蓝牙设备你再次搜索是搜索不出来的

第四:数据必须要通过二进制的形式发送

aftershokz蓝牙搜不到_硬核!小程序时怎么控制蓝牙设备的?相关推荐

  1. aftershokz蓝牙搜不到_小米MIUI系统无法开启蓝牙耳机aac解码的一种解决方法

    8/1更新:MIUI12现已经开放公测啦!直接去社区申请即可,答题90分,等几个小时很容易就能通过审核.不用费力刷机了,亲测MIUI12开发版可开启蓝牙aac ps.最近看评论区发现可能有个别型号蓝牙 ...

  2. 微信小程序蓝牙连接硬件设备并进行通讯,小程序蓝牙因距离异常断开自动重连,js实现crc校验位

    一.小程序实现搜索蓝牙: 注意:comtl是我封装的工具函数,无关紧要,实际项目中可能用不到: const comtl = require('../../utils/commontool') cons ...

  3. APP自动化_操作微信小程序/H5页面实现自动化_多终端并行

    APP自动化_混合App自动化理论相关 原理:本质是混合app,应该用切入webview的方法去自动化web页面. 现状:目前由于技术原因无法切到webview中做自动化. 方案:采用原生app自动方 ...

  4. 调链接_硬核科普 | 三根弹簧让你链接宇宙的混响效果器?!

    Solo 吉他音乐作品 首发Solo吉他音乐 "硬核的科普千篇一律 有趣的讲解万里挑一" 十个混响链接宇宙这个是很久以前的一个段子 但是我去听了一下 还真是链接宇宙了....... ...

  5. 切换数据库_硬核数据库postgres使用pgpool完成主备自动切换,快来盘它

    小吴总的鸡汤 postgres作为年度最佳数据库在国内得不到大范围使用真的太可惜了!干巴巴的,麻麻赖赖的,一点都不圆润,怎么办?盘他! 书接上回,为了解决postgres的高可用部署问题,需解决以下几 ...

  6. ppp协议pap验证过程状态转移图_硬核分享|Crust 核心协议栈的设计与实现

    "Crust 实现了去中心化存储的激励层协议,适配包括 IPFS 在内的多种存储层协议,并对应用层提供支持.同时 Crust 的架构也有能力对去中心化计算层提供支持,构建分布式云生态.&qu ...

  7. 网卡vlan标签_硬核来了,VLAN揭秘!!!

    浅谈网络通讯中经常被提及的VLAN 点击蓝注我 蓝字你会发现更多哦 在电力行业中,调度部门会要求在调度数据网使用的交换机.路由器等设备里配置VLAN.配置VLAN不仅可以起到划分业务.防止网络风暴的目 ...

  8. usb连接不上 艾德克斯电源_硬核充电宝?360汽车应急电源入手体验

    [前言] 寒冷的冬季不仅是疾病的高发季节,对电子产品来说也是故障高发期,尤其是依靠电池的设备.大家最能切身体会到的莫过于手机续航时间明显降低,这主要是低温导致化学反应不活跃所造成.汽车同样也会有这个问 ...

  9. aftershokz蓝牙搜不到_iphone xr黑屏无法开机怎么办?iphonexr蓝牙连不上怎么办?

    iphone xr黑屏无法开机 最近有不少小伙伴们反应,刚买的iphone xr手机正玩地好好的,突然手机出现黑屏关机,怎么都开不了机,不知道该怎么办? 方法一.插上充电设备试试,如果能开机,那就是是 ...

最新文章

  1. oracle mysql 乱码_解决Oracle数据库中文乱码
  2. oracle clob raw 转换,ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小...
  3. 如何将dtb反编译成dts
  4. 我的iOS学习历程 - UISlider(简单的设置一组图片动画)
  5. 【Python 2 到 3 系列】 print 是函数
  6. dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...
  7. maven 版本号插件_Maven内部版本号插件–用法示例
  8. android camera滑动,Android怎么实现小米相机底部滑动指示器
  9. vc 时间字符串转时间戳_Instant(时间戳)
  10. mips linux gcc mingw,gcc
  11. 推荐几个学习JS的站点
  12. AD10 PCB等长布线----蛇形布线
  13. switch:欢迎进入迷你游戏平台,选择你喜爱的游戏
  14. 技术赋能广告策略全升级,爱奇艺开启框内广告营销新篇章
  15. 新手入门电脑和S7 200Smart PLC 的自由口通信
  16. [华为][Atlas]Ubuntu can‘t open file ‘/usr/lib/python3.7/py_compile.py解决办法总结
  17. 数模赛常用外挂工具汇总(骚操作)
  18. matlab中数组的声明,如何使用Matlab声明矩阵数组
  19. 使用python读取网络视频流或者本地视频进行RTMP流的生成,并对视频源的每一帧做剪切处理
  20. 李一男离开华为时的忠告

热门文章

  1. stm32f4内部flash讲解
  2. 前端速成:双月Java之旅(week5)_day1
  3. 【Unity2D】关卡编辑好帮手——TileMap
  4. 阿里投资分众,大战在即的电梯广告市场却有本糊涂账?
  5. SQLiteSpy 数据库软件
  6. Python之Sqlitespy中选出两表中以id相同的元素
  7. python爬虫批量下载图片
  8. 一篇很好的《数据分析》文章
  9. 实现微信打开网页时,获取当前微信用户信息(Java)(基于snsapi_userinfo方式)
  10. autocomplete属性在谷歌浏览器不起作用