美文网首页
iOS 蓝牙

iOS 蓝牙

作者: 拉链扣 | 来源:发表于2018-08-01 11:33 被阅读0次

最近搞了一段时间的蓝牙,把一些收获体会和大家分享一下,其实网上大神们写的蓝牙相关的都比较实用全面了,我主要是想贴一下我项目里不太一样的地方。

蓝牙的流程什么的在这里我就不赘述了,大家可以自行google。另外给大家推荐一个大牛用block封装的蓝牙---babyBlueTooth,个人感觉还是不错的。言归正传,

  首先,需要仔细看看硬件的说明文档(由于本人项目硬件比较坑,文档不详细害的我走了很多的弯路),对蓝牙的操作常用的无非就是read write 和 notify。根据一般步骤:

1,建立中心角色 2,扫描外设(discover)3,连接外设(connect) 4,扫描外设中的服务和特征(discover)(这些都是一般流程,就不再重复了),现在说一下扫描到服务和特征后的一些注意事项,一个设备里的服务和特征往往比较多,大部分情况下我们只是关心其中几个,所以一般会在发现服务和特征的回调里去匹配我们关心那些,这些就要根据硬件的文档具体操作了,例如我的:

执行操作后就到了 5,外设做数据交互(explore and interact),数据的读分为两种,一种是直接读(reading directly),另外一种是订阅(subscribe)。从名字也能基本理解两者的不同。实际使用中具体用一种要看具体的应用场景以及特征本身的属性。特征有个properties字段(characteristic.properties),它是一个整型值,有如下几个定义:


注意:这个属性也有可能是叠加的,例如,返回的characteristic.properties = 0x26,即同时有三个属性:CBCharacteristicPropertyWriteWithoutResponseCBCharacteristicPropertyWrite CBCharacteristicPropertyIndicate

我的项目中交互的特征properties的值是0x10,表示你只能用订阅的方式来接收数据。我这里是用订阅的方式,启动订阅的代码如下:

1[_peripheral setNotifyValue:YES forCharacteristic:_readCharacteristic];

注意:这句是必须要加的,否则硬件是不会给你返回数据的。

假如propertites是订阅,当设备有数据返回时,同样是通过一个系统回调通知我,就会走如下方法:- (void)peripheral:(CBPeripheral *)peripheraldidUpdateValueForCharacteristic:(CBCharacteristic *)characteristicerror:(NSError *)error.  这个方法是你写入数据后就会调用的,前提是设置了代理。我在开发的过程中就遇到了这个问题,我执行write操作后这个方法不走,开始我以为是流程逻辑的问题,后来终于解决了,是因为写入不成功,所以,假如这个方法不走的话原因就一个那就是蓝牙没有收到你发的正确的数据。因为这个函数都是以"did"开头的,函数不用你调用,达到条件后系统后自动调用,没有调用仅是因为没有达到条件,当然,前提是你设置了代理。

到这里数据就能发能收了基本的需求也就OK了。

另外,我还要说一下发送数据的一些小的注意的地方,我觉得我项目中数据还是比较麻烦的,涉及的地方也比较多。蓝牙接收的数据是NSData格式的,返回的也是NSData的,所以一般都要转化成NSData的。下面是几种格式的转化(均为转载,特此申明):

1,字符串转为NSData(非编码):

例如,NSString *modelStr = @“1311212313”;

NSLog(@“NSData = %@”,[self convertHexStrToData:modelStr]);

打印结果:

NSData = <13112123 13>,length = 5

注意,与下面的方法的对比


还是上面的字符串,进行下面操作

打印结果:NSData = <01030101 02010203 0103>,length = 10

上面两种情况是转成 相应NSData的方法,可以根据文档提供的数据长度的要求使用。

2,求累加和(校验和)(CHECKSUM)的求法

顾名思义,累加和即是所求数据依次累加的和,一般的规则就是前n-1个字节之和的低字节,CHECKSUM=0x100-CHECKSUM(上一步的校验和),得到的cs字节长度1byte,类型为NSData,具体代码如下,

例如,求上节中的data的累加和:

NSData *csData = [self getCheckSum:[self convertHexStrToData:modelStr]];csData即要的结果。

数据类型的转化还有最基本的byte[]的操作,在这里就不说了。

  根据BLE4.0协议,蓝牙数据缓存区最大接收20字节,如果数据包过大的话,可以通过拆分成小的数据包来操作,具体的可以通过使用定时器来发送或者直接通过循环发送(在我项目中两种我都试过了,是都可以的,但是还是那句话,还是要具体看文档操作的),但是要注意的是,定时器的精度不是很高,(据说低于50ms就有误差了,本人没有实际测)。

相关文章

网友评论

      本文标题:iOS 蓝牙

      本文链接:https://www.haomeiwen.com/subject/csvlvftx.html