蓝牙开锁可行性

概念

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把锁

ios连接蓝牙设备最多7个

2、如何区分该蓝牙为初始状态,如何将手机设置管理为蓝牙的管理者

  设想:读取蓝牙特征信息,若为初始值,对蓝牙进行写入操作,改变某些属性,并在手机端记录本手机是该蓝牙的管理者。

3、页面的设计要重来吗,素材

4、文档需求与原app的功能的如何取舍

5、提供测试设备

关于测试:

1、物理按键重置安全性?如果不能轻易重置蓝牙锁,app端如何反复进行测试。

参考

Git:YmsCoreBluetooth

iOS CoreBluetooth 的使用讲解    iOS学习笔记30-系统服务(三)蓝牙    

低功耗蓝牙 4.0 可以同时连接多少个蓝牙设备,可以同时与多少个蓝牙设备进行数据通讯和传输?

蓝牙RSSI计算距离    ios连接蓝牙设备最多7个

posted @ 2018-01-27 10:58  素染年华  阅读(1224)  评论(0编辑  收藏  举报