iOS蓝牙 + Protobuf 相关开发经验总结

随便写一些开发中遇到的问题和解决方法。

蓝牙相关

扫描相关

  • 苹果是支持重复扫描同一个蓝牙设备的,但是默认会给你去重,所以你在蓝牙的代理中获取到的都是去重以后的。
    如果你想要重复扫描一个蓝牙设备(比如频繁获取他的RSSI强度信号)你可以在扫描开始时加入如下的 opetions。坏处就是如果你周围有海量的蓝牙设备,会比较混乱。
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[_centerManager scanForPeripheralsWithServices:nil options:options];
  • 苹果的蓝牙扫描不会给开发者提供蓝牙的mac信息,被包装成了一个经过苹果加密后的UUID,所以如果需要使用到mac的话,需要通过其他手段获取蓝牙设备的mac,比如让硬件工程师配合。

  • 苹果的蓝牙相对于大部分安卓手机来说,连接质量都稳定得多(毕竟手机也贵)。

  • 苹果不会和蓝牙设备协商数据包大小(MTU),或者有一个很高的上限,所以基本靠开发者控制(此条存疑,我尝试过一包200个字节传输,都没有问题,给人的感觉是支持的上限很高,但我没有探索过这个上限的极限在哪,也可能上限在硬件设备那边。我们是低功耗蓝牙)。

  • 两个页面单独创建的 CBCentralManager 对象不可以共用一个蓝牙对象,比如在上个页面通过一个 CBCentralManager 对象扫描到的蓝牙设备,到下一个 Controller 再新建一个CBCentralManager,并把上个页面的蓝牙对象传输过来,新的CBCentralManager不可以连接这个蓝牙对象。所以要 CBCentralManager 和蓝牙对象一起传输。

回调

  • 苹果提供的蓝牙相关的代理方法基本都要用到,不要偷懒,开发的时候最好全都处理掉。

Protobuf

  • Protobuf 的一般还需要一个解析模块,建议单独处理,做好和蓝牙模块的拆分。
  • Protobuf 使用有点麻烦,需要在 Build Phases 中给编译好的 “.pbobjc” 文件添加 “-fno-objc-arc”标识,使用ARC的方式处理(只针对 Objective-C,Swift 还没试过。Swift是真的好用得多,尤其是枚举)。
  • 其他的可以去看谷歌的文档,介绍的很详细。

其他建议

  • CBCentralManager 扫描到的蓝牙对象最好再做一层包装,方便给蓝牙设备添加其他标志状态,或者记录连接情况。

总结

Protobuf的特性对蓝牙这种小数据量传输的场景有很好的便利性,而且数据安全性很高,数据包也小得多,是一个很好的技术协作场景。

你可能感兴趣的:(iOS蓝牙 + Protobuf 相关开发经验总结)