我正在尝试编写一款可以访问Zephyr HxM Smart心脏监护仪的蓝牙LE应用程序。此显示器有几种蓝牙服务,但我对电池服务,心率服务以及具有活动和峰值加速的自定义服务感兴趣。电池电平,(BAT),心率测量(HR)和自定义测量(CUS)各有一个特征。 HxM每秒更新一次。
我使用Android 4.4的Galaxy S4进行此操作。
文档中没有按预期工作。
我最初的做法是:
Read BAT
Set notification for HR
Set notification for CUS.
然后等待回调。设置通知意味着调用
BluetoothGatt.setCharacteristicNotification(Characteristic char , boolean enabled)
(也可以通知BAT,但是,规范并不要求支持它。但是,HxM确实支持它。)
这没有用。我得到了人力资源的BAT和通知,但不是CUS。如果我取消了第二步,我收到了CUS的通知。我无法得到这两个。 (这表明我正在正确地阅读这些特征,因此[可能]不是问题。)
我发现有些迹象表明Android的蓝牙堆栈存在同步问题,但没有硬文档。然后我尝试了以下内容:
Read BAT.
Wait for the BAT reading, then set notification for HR,
Get HR, then disable notification for HR, and start notification for CUS.
Get CUS, then disable notification for CUS, and start notification for HR.
And continue to loop.
我得到了BAT,就是这样。
通过反复试验,我发现了以下作品:
Read BAT.
Wait for the BAT reading, then set notification for HR,
Get HR, then start notification for CUS.
Get CUS, then start notification for HR.
And continue to loop.
(与上面相同,但没有禁用通知。)通常,我得到一个HR读数,然后在200毫秒内得到一个CUS。可以假设它们来自同一更新。 (数据中没有时间戳,必须保持简短为LE。)实际上逻辑更复杂,因为在预期的读数不会进入时需要定时器。这个逻辑更加复杂(并且更容易出错)比我的第一次尝试,这是文档似乎说的恰当的。
我已经联系过Zephyr,他们说HxM Smart已经在Windows上进行了广泛的测试,并且会同时进行通知。还有迹象表明它可以在iOS上运行。
还有一个我不明白的问题。要获取通知,您必须在本地启用“特征”以通知,例如:
BluetoothGattDescriptor descriptor = characteristic
.getDescriptor(UUID_CLIENT_CHARACTERISTIC_CONFIG);
resSet = descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
resWrite = mBluetoothGatt.writeDescriptor(descriptor);
这是每个特征设置,并且只需要在首次接收特征时进行一次。相反,我发现每次设置通知时都必须这样做。这可能会导致事情有足够的时间延迟。我不知道。这种反复试验花费了我很多时间。如果有一个关于它是如何工作的明确陈述那将是很好的。
我应该注意,对于返回结果的所有调用,结果为true(成功)。
我为长篇大论道歉。我的问题是:
我找不到任何文档,我必须做所描述的事情。所有迹象都表明您设置了通知并等待回调。 是否有文档,或者这是一个错误,还是一个糟糕的实现?(或者是我的错误?)我特别想知道我必须做什么的文档。< / p>
其次,还有一个复杂的问题。我试图调试例程,看看代码实际上在做什么。当我到达BluetoothGatt.class时,源代码行与调试堆栈所说的不匹配。因此我假设S4没有使用标准的Android。我不知道从哪里去。令人沮丧的是,虽然我有一些似乎有用的东西,但它很蹩脚,几乎肯定不那么健壮。
感谢您的帮助。
答案 0 :(得分:1)
我在顺序写入多个值时遇到了同样的问题,在它们之间放置一个Thread.sleep(200)来解决问题(唉,我应该说)。也许这有助于获取通知。 在Nexus 5上的Android 4.4.2上测试了这一点。不,4.4并没有解决所有问题...
答案 1 :(得分:1)
我可能已经很晚了,但您应该实施排队架构来设置您的特征以发送通知。我在帖子https://stackoverflow.com/a/18207869/3314615中使用了类似的技术miznick,最后只为原生BLE堆栈编写了包装代码,因为我使用了BLE的几个应用程序。从那时起,我一直没有收到通知的问题。我同意你的看法,Android BLE文档应该有关于BLE Stack不同步的某种信息或警告。坦率地说,我认为应该重写它来处理同步写入调用并将它们排队。
答案 2 :(得分:0)
首先,为第一个特征设置通知(即setCharacteristicNotification并设置描述符)。
并且,在onDescriptorWrite回调函数中设置第二个特征的通知。