作者:手机用户2602898385 | 来源:互联网 | 2023-09-06 19:13
博客园断更快一年了终于想起来我还有个博客,也主要是最近工作上面也没有什么想记录的,不过最近倒是搞了个有意思的功能项目 请注意:此文章禁止转载,抄袭,这是对我个人知识
博客园断更快一年了终于想起来我还有个博客,也主要是最近工作上面也没有什么想记录的,不过最近倒是搞了个有意思的功能项目
请注意:此文章禁止转载,抄袭,这是对我个人知识产权的不尊重
项目简介:原先单片机应用移植做一个无后端参与手机APP
功能介绍:单片机为子机的命令发送装置,开机使用单片机连接上子机的蓝牙设备,然后发送命令给子机执行
需求介绍:需要将原先单片机上的功能全部移植到新APP内,并且要求连接多个蓝牙设备,最好做到无上限设备连接(其实因为各个手机的性能差异,基本上不可能无限连接蓝牙设备,但是要求最少连接四个)
先简单介绍一下连接蓝牙设备的注意事项,整体连接蓝牙的流程为
1. 开启扫描器,扫描蓝牙,期间会获取到设备的 deviceId ,这个ID需要用于手机和蓝牙设备进行连接
2. 使用 deviceId 和蓝牙设备进行初始连接,可以获取到很多服务项,这些服务项都存在一个 serviceId ,后续需要再使用这个 serviceId 去获取特征项
3. 使用 serviceId 获取服务内的特征项,特征项需要区分是否支持读写监听等功能,可看下图
图中不同的uuid支持不同的功能,比如write:true就是支持往蓝牙设备写入数据的,notify:true是支持监听蓝牙设备发送出来的数据,read:true是支持读取数据
此时需要注意如果需要监听和发送信息功能就需要使用两个不同的uuid去实现,
蓝牙notify功能只需要运行一次即可在蓝牙连接期间进行接收设备发出来的数据,发送需要每次均运行一遍
使用这三个ID就可以连接上蓝牙进行对应的操作
完整代码放在附件文件内,记得更换UUID去连接对应的设备
先弄一个需要用户手动开启扫描的按钮,然后获取到扫描的列表,丢进去数组将其展示到页面(在开启之前需要先检测手机的蓝牙是否开启,不然是无法正常连接的)
添加完一些蓝牙设备之后开始调用uniapp的官方api,即可实现连接
注意事项:
1. 连接上时最先要调用notify监听功能,并且可以全局仅调用一次,以防止丢失信息
2. 当你已知服务项的uuid和特征项的uuid时,可以省去获取服务项和获取特征项的功能,直接使用已知的uuid进行连接,可以省下很多多设备连接的时间(具体的请查看完整代码内 nowLinkLis 方法)
3. 目前我所测试的设备中,最好的情况是连接上了7个蓝牙设备,若你在测试中发现只能6,7个设备连上是正常现象的,目前仅测试了安卓和小程序设备,iOS的话由于公司未给我提供设备就没测试
4. 在调用 uni.getBLEDeviceServices 方法中一定要设置一个定时器延迟一点再连接,具体原因不详但是是我踩过坑的
5. 使用固定服务uuid,固定特征uuid进行连接启用notify监听时也同样需要延迟一点再进行连接,不然会报连接失败的错误
完整代码,uniapp中.vue文件,
我已使用固定的uuid,如果需要直接贴上去先获取服务和特征的uuid,更换后再进行测试
<view
v-for="(item, index) in bleDevs"
:key="index"
v-show="item.name.length > 0 && !shows"
v-if="Math.max(100 + item.RSSI, 0) >= 30"
>
group
@change="checkboxChange"
:data-name="item.name"
:data-deviceId="item.deviceId"
>
deviceId: {{ item.deviceId }} 信号强度: {{ item.RSSI }}dBm ({{
Math.max(100 + item.RSSI, 0)
}}%)
连接
断开
{{ item.name }}
-
+
{{ titleTime }}
启动
暂停
停止
<viwe
:class="[item.status ? 'item bakBlue' : 'item']"
v-for="(item, index) in totalList"
:key="index"
>
{{ item.text }}
{{ item.name }}
{{ item.name }}:{{ item.txt }}