最近2年一直从事蓝牙方面的开发,做了三个门禁的产品,一个手环的产品。现在将开发中所遇到的一些问题进行总结如下,如有错误请各位指教。
本文适合已经了解过蓝牙相关的。因为是公司项目,懒得在封装,所以有的截图不是很全,但是不影响整体,望谅解。若有不懂的,可以留言,我如果能解答就会为你们解答。
蓝牙相关的原理那些就不讲了。就直接说下怎么开始开发:
首先,将你那些蓝牙交互的servicesID和Characteristics通过一个头文件进行定义

然后在创建一个蓝牙管理类来进行管理蓝牙相关的:
先通过单例来创建蓝牙,这样保障项目中只有一个蓝牙中心管理者:

初始化蓝牙中心管理者:

只要蓝牙中心管理者初始化成功后就会调用下面这个方法,可以在每个状态变化时候写相关的代码:

接下来就是扫描设备,可以在蓝牙状态为打开的时候进行调用,也可以写个方法,让其他界面在需要的时候进行调用:
PS:两个参数都可以填nil,这样扫描的就是所有的蓝牙设备,如果指定CBUUID,就只会去搜索含有CBUUID的蓝牙设备。

执行完上面的方法,如果通过指定的CBUUID有搜索到蓝牙设备就会调用下面的方法,这个方法会返回蓝牙的所有信息(即蓝牙的广播信息)。因为我的项目中是做的封装,所以我得到的这些信息我都通过代理传递出去的,哪里需要扫描以后的信息,直接成为代理即可,通过代理来进行连接。

接下来就是连接失败,断开连接,连接成功的3个方法。因为我们做的是手环产品,所以说在连接成功后会保存设备的identier.UUIDString,进行自动重新连接。自动重连的方法附后

接下来就是CBPeripheralDelegate,这里想去遍历services和characteristics,在遍历characteristics的时候,可以对一些需要连接之后进行的操作处理,比如需要连接就写入某些值,对某些characteristics进行监听(notify)都可以在这里进行处理。我们项目做的操作有点多,就只贴一个读取电量的了。

接下来就是进行读取值和写值的操作。读取值和写值的操作建议也是用一个单例来进行操作,因为如果通道号很多,在这里写以后不方便维护,所以也用代理的方式进行操作,这样维护很方便,而且也好找。读取值和写值的代理操作就不贴上来了。

好了,iOS的蓝牙开发到这就结束了,流程都是这样的,剩下的就是读值和写值的操作了。这个才是最重要的。哦,对了,还有一个让蓝牙自动重连的方法,如下

因为我们项目用到了ANCS,所以说下了解的东西,ANCS的什么原理我也不想说了,网上一大堆。只说说使用的注意事项:
1、这个我们这边做不了任何操作,只能硬件去做处理(这个功能只能由硬件进行操作,启动以后用户点了配对以后所发送的消息由苹果进行操控,代码控制不了)
2、连上以后只要通知栏里面有的通知就会推送到手环过去(就是那些网上说的手环能够接收什么QQ消息,微信消息都是通过这个实现的)
3、ANCS连接以后会在系统的蓝牙设置那里多一个你们的设备名字和后面的状态,如果系统设置有连接过设备以后在APP里面就搜索不到蓝牙了。(我们是通过我们设备的servicesID去搜索的,不知道设置为nil会不会搜索到其他设备),如果是这样,可以通过下面的方法去获取系统连接过的设备进行判断,然后叫用户先去忽略设备即可:
4.最近又有ANCS的新用途,能通过ANCS来进行挂断手机的电话和控制手机音乐,以及遥控拍照

讲点其他的:
1.开发中最好能够分开封装,比如蓝牙的中心管理者进行封装,对蓝牙的读写值也进行封装,这样便于修改以及维护
2.如果是读取的数据量有点多,例如手环这样的项目,最好也对常用的哪些DATA的转换也进行封装
网友评论