关于iOS蓝牙开发小结

2017-11-16  本文已影响945人  ShenYj

公司项目是做心电监测的,实时采集心电数据.

项目是自己基于CoreBluetooth封装的, 没有采用第三方库.
原来没有做过蓝牙通信, 也是从头学起的, 好在iOS开发相对于简单一些, 接口封装的都比较简单实用, 不过这期间因为设备、高标准的需求, 也的确是遭遇了不少的挑战, 这一路走来也都逐个突破了.

例如:

  1. 当时设备的Pairing影响到重连
    最终查阅一堆资料, 最终是设备端采取的安全机制问题, 也因此查阅了蓝牙底层协议栈,对蓝牙进一步有所了解和掌握,虽然对于iOS开发上并无太大帮助,但对技术的基类,进一步的研究学习,相信今后还是有很大的帮助的,在学习过程中也发现很多从事蓝牙开发的iOS工程师,对蓝牙技术栈并不了解,或者了解; 也因此了解到, 虽然公司本质是做蓝牙硬件通信这方面的, 但是对蓝牙的技术储备实在是不敢恭维
  1. 通信速度没有达到厂家的最高标准
    这个也是棘手的问题, 从代码层又无从下手, iOS上又无法修改ATT_MTU_Size(获取底层上可以实现,但和很多从事这方面的人交流或者是查询很多资料后并未发现如何去实现),在最终无奈的情况下,邮件将我的疑问反馈给工厂那边, 那边又搪塞说啊啊啊你这个速度就已经很正常了...但是在最高波特率115200下的传输速度不稳这件事还是无法解决, 关于iPhone 7/plus新增的BLE extension功能有何提升,在速度上我也是没有看出明显变化, 总之这件事似乎也不了了之了
  1. 强实时, 保后台
    因为是做心电监测的, 时效性肯定是重中之重, 起初做项目的时候压根不知道要保证那么长的时间, 项目做出来了, 突然说出来这个需求,当时就有点冒冷汗了,自测一次最长时间是48h (原公司只有Android项目, 据说最早是外包的, 由于需要做iOS, Android自学后写出来的, 当时是蓝牙3.0, 因为MFI等一些原因被拒, 然后打算只做BLE 4.0,并专门招一个iOS), 算是达到了最低标准, 也松了口气, 而且项目内原来的一部分数据处理存在内存泄漏, 优化后还是有提升空间的
  1. OTA
    做蓝牙不得不提OTA, 也就是空中升级功能, 一开始并没有这个需求, 不过既然从事了蓝牙开发, 就在不断学习蓝牙中提早的了解了这方面的姿势, 在需求下来后, 因为硬件那边先要适配Android 3.0 , 所以我只能先按照规定下来的逻辑撸代码了, 最终在4.0设备适配好后, 在进行联调和优化, 好在准备充分,这块算是最顺利的, 我们的产品升级文件比较小,大概155KB的一个txt文件,这里要提一下,网上很多资料都说iOS发送文件长度超过20Byte就会丢掉,我分别按照20Byte、50Byte、70Byte和150Byte等调试过, 除了50、70Bye丢包率严重外,150Byte最为稳定, 并不像网上说的那样, 既然单个包的大小我定位了150Byte,这里面还会包含于硬件规定好的协议头、尾等8Byte, 这样数据部分是142Byte, 所以将原始文件每142Byte拆出来加上协议8Bye组成一个个150Byte的包, 一次完整的升级文件大概被分成1093个包左右, 2min中内完成, 而且在我连续几十次的不断测试下,才会出现几个丢包, 这主要与设备频繁的执行OTA过程,设备发热等原因有关, 如果只是一次或者几次的执行OTA过程, 基本上可以保证丢包率为0

随着功能不断的添加, 优化, 适配, 之前最近几天前发现一个重大BUG, 连接设备后, 大概5分钟左右会断开一次, 控制台报错信息:

Error Domain = CBErrorDomain 
               Code = 6 "The connection has timed out unexpectedly." 
    UserInfo =  {
                    NSLocalizedDescription =The connection has timed out unexpectedly.
                }

测试设备: iPhone 6
设备系统: iOS 11.0.X (具体版本号不记得了)

突然冒出来这么个大BUG, 我也是懵逼了, 难道最近一直忙着写其他需求, 忽略了? 最近改代码新增BUG? 还是一直存在没留意没发现?

当时身边没有其他测试手机,就想着用自己的手机先跑下 ,结果Xcode 提示不支持该版本iOS 系统, 然后我就想着是不是iOS系统自身的BUG,把测试机给升级到了iOS 11.1.1, 可升级完后, Xcode9.0又不能支持这么高版本的iOS系统了. 检查Xcode更新又没有, 真是蛋疼啊.....

换了设备,依旧, 找了个Android机跑了下, 一切正常, 又找了个iOS 10的测试机跑来一切正常, 稍微淡定了一些, 看样子是新增问题, 等等看, 等收到Xcode更新后升级完跑在iOS 11.1.1上看看.于是先去查询下这方面资料

遇到这个问题的很少, 在Stack Overflow上搜到几个, 系统版本还是iOS 8.0+的,并不是近期的,简单看了下, 应该不是一回事. 在苹果技术论坛中发现了一例相同的BUG 链接, 等了很久都没有更新, 查询资料也没有什么进展, 不得不去苹果网站手动找Xcode更新, 更新后,跑在iOS 11.1.1上,目前一切正常, 希望这个BUG被苹果真正修复了, 否则这样严重的BUG对于蓝牙强实时的产品就是严重的冲击.

上一篇下一篇

猜你喜欢

热点阅读