概念
CBPeripheral
蓝牙外设,比如蓝牙手环、蓝牙心跳监视器、蓝牙打印机。
CBCentralManager
蓝牙外设管理中心,与手机的蓝牙硬件模板关联,可以获取到手机中蓝牙模块的一些状态等,但是管理的就是蓝牙外设。
CBService
蓝牙外设的服务,每一个蓝牙外设都有0个或者多个服务。而每一个蓝牙服务又可能包含0个或者多个蓝牙服务,也可能包含0个或者多个蓝牙特性。
CBCharacteristic
每一个蓝牙特性中都包含有一些数据或者信息。
每个蓝牙4.0设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务,一个服务包含若干个特征,特征是是外界交互的最小单元,服务和特征都是用UUID唯一标示的。
外围设备(蓝牙)和中央设备(手机)交互的桥梁是服务和特征,两个都有一个唯一标识CBUUID
来确定一个服务或者特征:
外围设备CBPeripheral介绍:
属性:id,name,state
其中state状态有:未连接、已连接、正在连接、正在取消连接
CBPeripheral实例:<CBPeripheral: 0x17577a50, identifier = 8B85D3FF-D73A-469A-BFE8-60A8FA9B4C76, name = Meizu H1, state = connected>
需求
文档要求
Apple APP | 主页面 | 设备搜索及配对 | |||||
门状态显示 | |||||||
显示开锁滑条(按键) | |||||||
设置页面 | 名称修改 | ||||||
密码修改 | |||||||
开锁模式选择 | 滑动开锁 | ||||||
密码开锁 | |||||||
电容感触开锁 | |||||||
删除设备 | |||||||
帮助页面 |
其他功能要求
1、一个手机app可同时控制20把锁;(此功能暂时定7个)
2、蓝牙与锁必须一一对应,默认首次配对用户为本锁的管理者;
3、管理者只要与锁连接,手机APP就会显示所有配对设备的ID信息;
4、管理者可根据需求增加或者删减配对设备;
5、管理者可以在手机上禁止配对新的蓝牙设备;
6、APP可以在手机上储存锁活动的日期和时间;
7、APP储存的日志可以记录开锁方式、时间、ID等信息;
8、APP基本操作说明
9、中英文切换;
手机端工作流程
手机端创建一个管理者manage
手机端将搜到的蓝牙锁赋值给对象peripheral
发现设备、建立连接、查看服务、查看特征,读写操作
即 手机探测到蓝牙锁、手机主动和蓝牙锁建立物理连接、peripheral查看自己的某些service、peripheral查看该service下面的某些特征、从蓝牙锁里读取或修改特征信息
1、manage 开始扫描外围设备
[manage scanForPeripheralsWithServices:uuid数组 options:options]
1)搜索特定指定设备:第一个参数传服务uuid数组
2)搜索所有特设备,第一个参数传nil
2、手机端收到扫到一批设备peripheral,根据条件筛选部分peripheral,对其进行连接
//之前没保存过外设,将其保存;之前保存过,则只修改rssi
[manage connectPeripheral:peripheral options:nil];
4、连接到peripheral时,手机端收到响应,然后peripheral搜索服务
[peripheral discoverServices:nil] 传uuid则搜索指定服务,传nil搜多所有服务
6、连接到服务后,手机端收到响应,根据某些条件,筛选出特定服务,然后搜索特征
[peripheral discoverCharacteristics:nil forService:service];
7、搜到特征后,手机端收到响应、然后手机端可对特征进行读/写操作
[peripheral readValueForCharacteristic:characteristic];
[peripheral writeValue:<#(nonnull NSData *)#> forCharacteristic:<#(nonnull CBCharacteristic *)#> type:<#(CBCharacteristicWriteType)#
技术细节探讨
关于数据更新问题:
起个定时器,对已扫描的设备执行scanForPeripherals,
1、更新已连接的设备数组
2、对新扫描的蓝牙设备进行处理,新加入,还是对旧信息的rssi更新
既完成了对rssi的检测,又确保断开的锁被重新连上
以上操作可以解决两个问题
1、有些已连接设备断了,可以重新连上。2、可以更新已连接设备的信号强度。
根据UUID查询某些设备是否连接:
connectedPeripherals = [self.bluetoothManager retrievePeripheralsWithIdentifiers:@[self.filterUUID]];
改方法什么场景下使用?1、在扫描前,先产看下某些设备的连接情况。2、跟数据更新有关,在特定情况下,检查已连接设备是否还连接着,结合定时器使用?
完成一次交互的过程
手机相当于客户端
蓝牙相当于服务器
1、扫描设备,并连接:物理上的连接成功
2、向外围设备声明用户需要哪些服务
3、向某个服务声明要进行某些个具体交互:[managel discoverCharacteristics:nil forService:uartService];
4、手机收到外围设备返回来的特征信息,即可进行读写操作
操作流程
1、手机搜索蓝牙
2、读取蓝牙数据,如果该蓝牙无管理者,将其设为管理者,并在本地记录
3、第二次连接蓝牙,显示锁的状态
4、管理者对蓝牙进行开关操作
如何开锁?
向指定设备发送连接,搜索服务,搜索特征值,然后向蓝牙发送数据(写入数据),失去设备连接
如何上锁?
管理者带着特定参数访问蓝牙
问题
1、同时控制7把锁
2、如何区分该蓝牙为初始状态,如何将手机设置管理为蓝牙的管理者
设想:读取蓝牙特征信息,若为初始值,对蓝牙进行写入操作,改变某些属性,并在手机端记录本手机是该蓝牙的管理者。
3、页面的设计要重来吗,素材
4、文档需求与原app的功能的如何取舍
5、提供测试设备
关于测试:
1、物理按键重置安全性?如果不能轻易重置蓝牙锁,app端如何反复进行测试。
参考
Git:YmsCoreBluetooth
iOS CoreBluetooth 的使用讲解 iOS学习笔记30-系统服务(三)蓝牙