可可豆BLE PITFALLS

缩写(按出现的顺序)

BLE –蓝牙低

PCB —印刷电路板

API —应用程序编程接口

每个使用iOS BLE的开发人员都知道,并非所有功能都像文档中所描述的那样好。 今天,我想描述一些使用BLE时可能会棘手的要点。 我想为您(读者,我想是BLE开发人员)提供一些信息,以使您在Cocoa BLE世界中的旅程更轻松,更高效。

因此,您首先需要知道的是以下问题的答案:“究竟是哪里出了问题—在我这边还是在连接的设备上? 当我向设备发送命令时,会发生什么情况吗?”

要获得此问题的答案,我建议使用以下几种方法:

  • 嗅探器工具
  • 用于测试API的第三方应用程序
  • 测井
  • 设备的固件版本,无需加密或任何其他保护即可与之一起使用

因此,让我们讨论每个点的更多细节。

嗅探器工具 -此工具可让您在不使用CoreBluetooth框架的情况下与数据包相交并对其进行分析。 区分BLE通信的不同方面(请求,响应,未处理的错误,意外消息等)可能非常有帮助。要设置此工具,基本上,您需要做一些事情:特殊的Ppcband固件Mac。 我使用了Wireshark和Nordic Semiconductors测试板。 它们一起为嗅探活动提供了强大的工具集。

嗅探器工具可以在两种模式下使用-广告和连接。

有用的链接是:

  • 有关嗅探工具及其工作方式的信息
  • 嗅探器工具— nRF-Sniffer-UG
  • Wireshark
  • XQuartz(某些版本的Wireshark需要)

用于测试API的第三方应用程序 -测试设备最快的方法之一就是使用第三方解决方案。 使用此类产品,您可以轻松扫描,发现,发送/接收甚至模拟设备的某些功能。 很好的例子是

  • 浅蓝
  • 蓝壁虎

记录 -大多数BLE设备与另一端的智能手机通话。 因此,了解手机本身发生的情况至关重要。 检查电话中发生的事情最有用的技术之一就是使用操作系统自己的日志记录功能。

在iOS中,启用蓝牙日志记录需要在设备中安装特殊的配置文件。 您可以在https://developer.apple.com/bluetooth/(链接是外部的)上找到有关启用它的更多信息。

启用后,iTunes可以将日志同步到计算机,并且可以对其进行分析。

固件 -为了保护自己的产品,通常在应用程序和设备之间使用加密的通信协议。 这种方法为用户确保了更高的安全级别,但同时在开发方面要困难得多。 为了简化此过程,请在开发过程中始终使用未加密的固件版本,并仅出于生产目的提供更高级别的安全性。 当然,这会稍微影响固件开发时间,但这也减少了您方面使用此类固件开发出色应用程序所需的工作。

至此,我假设开发环境已经启动并正在运行,而您所要做的只是弄污双手并编写一些代码以使应用程序栩栩如生:)。

现在,要确保您的用户获得最佳的用户体验,您应该完全控制应用程序内的所有进程,并相应地控制其所有方面。 基本上,您应该考虑以下几点:

  • 蓝牙设备可用性(状态观察)
  • 连接的设备超时
  • 多行响应处理(如果需要)
  • 背景(如果需要)
  • 多设备连接(如果需要)

我不会在上面的列表中描述每个点的所有方面,相反,我会为您提供一些建议。

状态观察 -对我们来说幸运的是,iOS可以同时在少数设备上工作,因此,有些对象可以处理蓝牙设备上的工作。 当然,我们将使用这种可能性。 一种方法是准备一个简单的设备扫描程序,这将使您在蓝牙设备启动,运行和工作时获得通知。该方法简单有效,可能如下:

 进口基金会 
导入CoreBluetooth

最后的BLEStatusObserver类:NSObject {

公共结构通知{
公共静态let BLEStatusObserverDidDetectBLEStatusChange =“ BLEStatusObserverDidDetDBLEBLEStatusChangeNotification”

结构键{
静态让可用性=“可用性”静态让消息=“消息”
}
}
静态让观察者= BLEStatusObserver()

var isBleDeviceActive:Bool {
返回currentState == .poweredOn
}
私人var centralManager:CBCentralManager?
私人var currentState:CBManagerState = .unknown

//标记:-生命周期

覆盖init(){
super.init()

centralManager = CBCentralManager(代理:自我,队列:无)
}
}

扩展名BLEStatusObserver:CBCentralManagerDelegate {
//标记:-CBCentralManagerDelegate

func centralManagerDidUpdateState(_ Central:CBCentralManager){
var notificationMessage:String? = nilswitch central.state {
案例。未经授权:
notificationMessage = NdynamicLocalizableString“ bleService.message.StatusUnathorized”)
案例.unsupported:
notificationMessage = NdynamicocalizableString(“ bleService.message.Unsupported”)
案例.poweredOff:
notificationMessage = NdynamicocalizableString(“ bleService.message.PowerOff”)
案例.poweredOn:
notificationMessage = NdynamicocalizableString(“ bleService.message.PowerOn”)
默认:
打破
}

currentState = central.state

NotificationCenter.default.post(名称:NSNotification.Name(原始值:BLEStatusObserver.Notifications.BLEStatusObserverDidDetectBLEStatusChange),
对象:无,userInfo:[
Notifications.Keys.availability:central.state == .poweredOn,
Notifications.Keys.message:notificationMessage? ”
])
}
}

超时 —默认情况下,CoreBluetooth不处理BLE请求的超时,因此您应该自己实现这种机制。 在这里,您可以在项目要求内使用所有创造力。 我想您需要知道的唯一一件事-是的,需要超时。

另一个有用的方面可能是有关数据包传输速度和依赖性的知识。 有人已经准备好在真实设备(例如该设备)上进行测试,您可能还需要查看官方蓝牙文档(例如该设备)。 我想这次可能取决于几件事:

  • BLE设备的发射器型号
  • 固件的实现(不同的功能可能需要不同的时间来执行,在一个项目上,我们有一个请求,可能在设备端执行的时间最多为4秒)
  • 从设备范围
  • 发射功率

考虑到这一点,我建议在50-100 ms之内开始作为起点,并根据需要进行调整。

多线响应 -某些固件可能针对特定请求返回几行响应(由于数据包大小限制或实现或其他原因)。 在这种情况下,我想建议就确切的通信协议和每个请求/响应的结构达成一致。 例如,可能是这样的:

  • 每个请求应为n字节,未使用空间为0
  • 每个响应都应在某些符号内开始/结束

这种方法非常简单,相信我,非常有效。 如果实施此行为,您甚至可能在晚上睡得更好🙂

还有一点-确保您一次执行1个请求。 要使用这种方法,NSOperationQueue可能会非常有帮助。 我不会深入介绍实现的细节,但我想强调的是,您应该创建某种AsyncOperation来正确处理所有情况。 (也许这个🙂)

背景 -这很有趣。 说真的,很有趣。 您应该阅读所有可用的文档,然后再做一次。 很多事情都是棘手的。 我无法在这里描述所有棘手的部分,我想这是另一篇文章的问题(关于这方面的内容)。

您需要了解有关CocoaTouch中的背景的所有信息—它可以工作,但有时可能无法按预期工作。 在这种情况下,只有一种解决方案-再次阅读文档。

guess,我想现在您可以开始编码🙂(希望如此)。

Apple Developer —核心蓝牙编程指南

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html

https://developer.apple.com/bluetooth/

WWDC 2012视频—核心蓝牙101

https://developer.apple.com/videos/wwdc/2012/#703

WWDC 2012视频—高级核心蓝牙

https://developer.apple.com/videos/wwdc/2012/#705

WWDC 2013视频—核心蓝牙

https://developer.apple.com/videos/wwdc/2013/#703

讲解

https://www.cloudcity.io/blog/2015/06/11/zero-to-ble-on-ios-part-one/

要点

https://gist.github.com/calebd/93fa347397cec5f88233

嗅探器工具:

http://www.argenox.com/bluetooth-low-energy-ble-v4-0-development/library/ultimate-guide-to-debugging-bluetooth-smart-ble-products/