蓝牙开锁可行性

概念

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个

原文地址:https://www.cnblogs.com/liyonghua/p/8360609.html

时间: 2024-10-19 13:14:41

蓝牙开锁可行性的相关文章

【Foreign】开锁 [概率DP]

开锁 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 4 5 1 2 5 4 3 1 5 2 2 5 4 3 1 5 3 2 5 4 3 1 5 4 2 5 4 3 1 Sample Output 0.000000000 0.600000000 0.900000000 1.000000000 HINT Main idea 一个宝箱内有一个可以开启别的宝箱的钥匙,可以选择k个宝箱,询问能开

[ACM] hihoCoder 1075 开锁魔法III (动态规划,组合数学)

描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数 T (T ≤ 100)表示数据组数. 对于每组数据,第一行有两个整数 n 和 k (1?≤?n?≤?300,?0?≤?k?≤?n). 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 a

哈理工2249开锁魔法 概率dp

开锁魔法II Time Limit: 3000 MS Memory Limit: 256000 K Total Submit: 23(18 users) Total Accepted: 18(16 users) Rating:  Special Judge: No Description 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.崔克茜可以通过魔法,暴力打开一个盒子.但是崔克茜最多只可以使用 k

未完成的开锁动画演示

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>开锁动画</title> <style type="text/css"> .yuan{ border-radius: 200px; background-color: aqua; height: 300px; width: 300

#1075 : 开锁魔法III

描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数 T (T ≤ 100)表示数据组数. 对于每组数据,第一行有两个整数 n 和 k (1 ≤ n ≤ 300, 0 ≤ k ≤ n). 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 a

为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考

http://blog.csdn.net/wojiushiwo987/article/details/8851204为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考 今天中午回宿舍的时候,舍友S开完锁以后,钥匙在锁槽里拔不出来了.以前只是锁不怎么好用,左旋右旋活几下1分钟之内就能打开了.这次,的确可能卡的比较紧吧,室友S旋转了好久没有打开.然后,我接过来弄了好久(几乎同样的方法)也没有打开.此时室友S告诉我,他上午给老师屋开门,没有打开,钥匙断在里面了,刚报修了.此时,我的第一反应就

开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛

规律:a[i][j]=     1/i * a[i-1][j-1]      +      (i-1)/i * a[i-1][j];  (少一个盒子时使用j-1 次魔法的概率)   (少一个盒子时使用j次魔法的概率) 公式推导如下: 设a[i][j]为打开i个盒子正好需要j次魔法的情况. ① 1->1 ② 1->1 , 2->2;        两次 1->2 , 2->1;        一次 ③ 1->1 , 2->2 , 3->3;     三次 1-

hrb——开锁魔法I

解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ double ans=0; for(int i=1;i<=n;i++){ ans+=(1.0/i); } printf("%.4lf\n"

Hiho #1075: 开锁魔法III

Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数$T$ ($T \leq 100$)表示数据组数. 对于每组数据,第一行有两个整数$n$和$k$ ($1 \leq n \leq 300, 0 \leq k \leq