BLE 特性未保留
Posted
技术标签:
【中文标题】BLE 特性未保留【英文标题】:BLE Characteristic not retained 【发布时间】:2015-07-18 14:13:28 【问题描述】:我正在编写一个与多个(5 到 10 个)相同的 BLE 设备通信的应用程序。每个 BLE 设备都有多个特性,有些是静态的,有些是更新的,有些是可以写入的。
该应用程序在导航控制器中嵌入了多个 ViewController,并且适用于 ios 设备(特别是 IOS 8+ 和 iPhone 6)。
为了使程序高效并与 CoreBluetooth 一起工作,我创建了类来管理 BLE 交互:
-
BLE 控制类 - 扫描并连接正确的 BLE 设备。
和
-
BLE 服务类 - 连接后扫描特征并根据其类型进行适当设置。
外围设备发送并由管理器接收的已知连接特征的数据然后存储在后端 SQLite db 中。
我面临的问题是回写连接的外围设备特性。我已经收集了 CBCharacteristic 中的特征,但是当我尝试将 CBCharacteristic 的值为 NULL 时,它不会在类中持续存在。
以下是我使用过的代码的总结:
BLEServicesClass 中的 CBCharacteristic 定义
#import "BLEServicesClass.h"
#import "BLEControlClass.h"
NSString *srModeUUIDString = @"346D0003-12A9-11CF-1279-81F2B7A91332";
@interface BLEServicesClass() <CBPeripheralDelegate>
@private
CBPeripheral *servicePeripheral;
CBCharacteristic *srModeCharacteristic;
@end
didDiscoverCharacteristicForService
- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
NSArray *characteristics = [service characteristics];
CBCharacteristic *characteristic;
if ([[characteristic UUID] isEqual:srModeUUID])
NSLog(@"didDiscoverServices - Mode Characteristic");
srModeCharacteristic = characteristic;
写入特征
-(void)writeCharacteristic:(CBCharacteristic *)whichCharacteristic data:(NSData*)data device:(NSString *)device
NSArray *devices;
devices = [[BLEControlClass sharedInstance] connectedPeripherals];
int i;
for (i = 0; i < [[[BLEControlClass sharedInstance] connectedPeripherals] count]; i++)
CBPeripheral *peripheral=[[[BLEControlClass sharedInstance] connectedPeripherals] objectAtIndex:i];
peripheral.delegate=self;
NSString *tesfordevice = peripheral.name;
if (tesfordevice == device)
[whichCharacteristic.service.peripheral writeValue:data forCharacteristic:whichCharacteristic type:CBCharacteristicWriteWithResponse];
这是由以下人员调用的:
-(void)writeModeCharacteristic:(NSData*)data :(NSString *)device
[self writeCharacteristic:srModeCharacteristic data:data device:device];
我的问题是 srModeCharacteristic 在被发现时最初设置正确,但后来为 NULL。
有什么帮助吗?
【问题讨论】:
为什么不存储对外围设备的引用以及保存连续循环的特征。您是否将 BLEServices 类实例保存在内存中? 嗨,我循环遍历一个保留列表 pf 外围设备以找到正确的数据,因为我正在向它发送一个带有外围设备名称的 NSString...(希望这是有道理的)...关于将类实例保留在内存中? 您需要确保您有一个强引用 - 持有对您的对象的引用的属性或 iVar。在没有看到更多代码的情况下,无法再说明为什么该变量为 nil 好的...解决了这个问题。我已将所有特征保存到 NSMutableDictionary 中,并以 peripheral.name 作为键。然后我可以访问它们并给它们写信。感谢您向 Paulw11 的正确方向轻推... 【参考方案1】:我建议始终按需解决特征,即通过迭代并使用匹配的 UUID 获取第一个特征。如果没有,请发出新的扫描 - 对服务也是如此。
这样您的程序将很容易重新连接。
【讨论】:
【参考方案2】:像我在我的应用程序中所做的那样创建一个 BLE 单例类。每当应用程序处于运行状态时,它都会在整个应用程序生命周期中保持特征的价值。
【讨论】:
以上是关于BLE 特性未保留的主要内容,如果未能解决你的问题,请参考以下文章