iOS开发 最近开发了蓝牙模块,在此记录总结一下

news/2024/7/3 6:57:20

为什么80%的码农都做不了架构师?>>>   hot3.png

1.基本概念

<1>中心者模式:常用的(其实99.99%)就是使用中心者模式作为开发,就是我们手机作为主机,连接蓝牙外设。由于开发只用到了中心者模式,所以我也只介绍中心者模式。

<2>管理者模式:这个基本用到的比较少,我们手机自己作为外设,自己创建服务和特征,然后有其他的设备连接我们的手机。

<3>服务(services):蓝牙外设对外广播的必定会有一个服务,可能也有多个,服务下面包含着一些特征,服务可以理解成一个模块的窗口。

<4>特征(characteristic):存在于服务下面的,一个服务下面也可以存在多个特征,特征可以理解成具体实现功能的窗口,一般特征都会有value,也就是特征值,特征是与外界交互的最小单位。

<5>UUID:以理解成蓝牙上的唯一标识符(硬件上肯定不是这个意思,但是这样理解便于我们开发),为了区分不同的服务和特征,或者给服务和特征取名字,我们就用UUID来代表服务和特征。

<6>外设名字(name):不是每一个蓝牙外设都是拥有name的。在开发的时候,当你发现name属性为空,这是很正常的,我曾经就因为这个问题纠结了很久。

2.具体的操作流程

<1>遵循两个协议

CBCentralManagerDelegate(中心管理的协议),CBPeripheralDelegate(外设的协议),并打开手机的蓝牙。

<2>创建一个中心管理(CBCentralManager),并设置代理。

代理一旦设置,就会走协议(CBCentralManagerDelegate)里面的方法。

<3>扫描周围的外设

当-(void)centralManagerDidUpdateState:(CBCentralManager *)central方法检测到本机蓝牙开启的时候,开始扫描([central scanForPeripheralsWithServices:nil options:nil];)周围的外设,必须是本机蓝牙开启之后才去扫描周围外设。

<4>获取扫描到的外设

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI;会返回扫描到的外设。如果你不关闭扫描,这个方法会一直被调用。

<5>连接外设

在上一步中选择一个外设进行连接。

- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary<NSString *, id> *)options;

在下面三个方法中可以返回蓝牙连接的状态。如果连接成功,我们就开始设置外设的代理,并获取该外设的服务;

-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;

[peripheral setDelegate:self];

[peripheral discoverServices:nil];

<6>获取已连接外设的服务

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error;

该方法可以返回已连接外设的服务。在这里我们找到我们需要的服务,并获取对应服务的特征。

<7>获取对应服务的特征

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;

这个方法会给出你选择的服务里面的特种。在这里,我们找到我们需要的特种,并作为全局变量存储起来,因为我们在后面对外设进行写操作的时候会用到。这一点切记!

<8>对外设进行写操作

- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;

这里注意的是,一定要确保二进制流的正确性,检查特征的属性是否为可写,特征就是将上一步拿到的特征传入即可,type有两种,根据具体的硬件进行选择即可。对于读操作,因为比较简单,这里就不多说了。

到这里,作为中心者模式,大体的流程都已经走完。

3.使用过成功可能会遇到的坑

<1>必须在蓝牙打开的时候,才能调用扫描外围设备的API。

<2>中心外设向别的外设写入对数据的时候,一定要保证二进制串的正确性(这方面上我是吃过很大的亏的)。

4.推荐的第三方

在此,本来我是想自己封装一套蓝牙的调用机制,但是我看了BabyBlueTooth之后就放弃了。所以我强烈推荐BabyBlueTooth这个第三方库,想要的同学可以去github上面进行搜索。

5.最后附上demo地址

由于我的代码是基于我们的智能密码锁写出来的,里面的规则不便拿出来共享。所以,还是建议看BabyBlueTooth的Demo。如有任何疑问请添加QQ:2799569272,一起讨论。

谢谢阅读,如有不对之处,欢迎指出。

转载于:https://my.oschina.net/Atoman/blog/895109


http://lihuaxi.xjx100.cn/news/240842.html

相关文章

Unity接入安卓sdk查看应用内存占用

注&#xff1a;若不清楚如何在unity中接入android sdk可先了解下相关流程。项目地址&#xff1a;http://download.csdn.net/download/yhuangher/9976564 在项目后期进行内存优化&#xff0c;在android端进行内存优化时做了若干辅助工具&#xff0c;比如此款&#xff0c;查看系统…

1115 Counting Nodes in a BST

我的DFS void DFS(Node* root){if(rootNULL)return;if(root->lchild){root->lchild->layer root->layer1;cnt[root->lchild->layer] ;maxLayer max(maxLayer,root->lchild->layer);DFS(root->lchild);}if(root->rchild){root->rchild->…

CSS控制字体在一行内显示不换行

当一行文字超过DIV或者Table的宽度的时候&#xff0c;浏览器中默认是让它换行显示的&#xff0c;如果不想让他换行要怎么办呢&#xff1f;用CSS让文字在一行内显示不换行的方法&#xff1a; 一般的文字截断(适用于内联与块)&#xff1a; 1 .text-overflow { 2 display:bloc…

Linux下des对称性加密

最近对接公安审计一些经历 对方的需求&#xff1a; 打成zip包对zip包进行des-cbc对称性加密&#xff0c;使用约定好的 -K和-iv值比如 -K "abcd$#!" -iv "efgh$#!"加密后做base64编码起初是想尝试用 php 去做&#xff0c;经过一阵折腾之后发现&#xff0c;p…

1062 最简分数

注意点&#xff1a; 1. 对两个分数之间的理解&#xff0c;这应该是一个开区间而不是闭区间 2. 读入的时候用 scanf("%d/%d %d/%d %d",&N1,&M1,&N2,&M2,&K) 不可以&#xff0c;分号前后会被视为一个整体。 AC代码 #include<cstdio> #i…

linux系统开机静态分配ip地址

在/etc/sysconfig/network-scripts/ifcfg-eth0文件中 添加&#xff1a; IPADDR192.168.1.100&#xff08;设置静态地址&#xff09; NETMASK255.255.255.0&#xff08;设置子网掩码&#xff09; GATEWAY192.168.1.1&#xff08;设置网关地址&#xff09; 修改&#xff1a; BOOT…

C#图片处理常见方法性能比较

在.NET编程中&#xff0c;由于GDI的出现&#xff0c;使得对于图像的处理功能大大增强。在文通过一个简单黑白处理实例介绍在.NET中常见的图片处理方法和原理并比较各种方法的性能。 黑白处理原理&#xff1a;彩色图像处理成黑白效果通常有3种算法&#xff1b; (1).最大值法: 使…

1081 Rational Sum 有理数类型题处理 需再做

一、有理数结构体的几个约束 struct fraction{LL up,down;fraction(LL _up,LL _down):up(_up),down(_down){} }; &#xff08;1&#xff09;如果这个有理数是0&#xff0c;则让分子为0&#xff0c;分母为1(这方便后来输出时归于整数一类) &#xff08;2&#xff09;如果这个…