iOS 核心蓝牙从设备获取所有功能描述

iOS Core bluetooth get all features description from device

如何使用 Core Bluetooth 从我的设备获取所有可用功能。

我认为在获取任何信息之前,我们需要通过低功耗蓝牙观察所有设备。

所以第一步是通过 CBCentralManager 扫描所有外围设备 scanForPeripheralsWithServices。在委托回调中:

- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI 

我们可以保存外设标识符并保存外设以便将来处理它,比如改变一些特性,切换off/on等等

但是我的问题是如何得到这个函数的描述,比如我得到了一些特性,但我不知道如何使用。在哪里可以找到关于这个未来的信息。

让我描述一下情况。例如,我有一些声音播放器,我可以通过蓝牙处理音量。

所以我需要先获取外设,然后检测服务,然后发现特征来找到音量"property",但是我怎么找到它,我应该如何理解哪个是min/max音量在哪里可以找到这些信息。例如,我们可以将 0 作为最小交易量,将 1 作为最大交易量。但它也可以在 0 到 1000 或任何其他范围内。如何检测这些信息?

您可以参考这个演示项目here

使用以下代码片段,您可以获得与任何 iOS 支持的外围设备关联的所有特征和服务。

BabyBluetooth *objBluetooth = [BabyBluetooth shareBabyBluetooth];
objBluetooth.scanForPeripherals().begin();

您可以通过这种方式设置委托回调。

-(void)babyDelegate{

    //If any peripheral discovered
    [objBluetooth setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
        NSLog(@"搜索到了设备:%@",peripheral.name);
    }];


    //Set the filtration criteria for the bluetooth peripherals
    [objBluetooth setFilterOnDiscoverPeripherals:^BOOL(NSString *peripheralName, NSDictionary *advertisementData, NSNumber *RSSI) {

        //if ([peripheralName hasPrefix:@"Pxxxx"] ) {
        //    return YES;
        //}
        //return NO;
        if (peripheralName.length >1) {
            return YES;
        }
        return NO;
    }];

    //and so on.
}

外设过滤后,可以从数组中获取,然后使用:

objBluetooth.having(peripheralFromArray).then.connectToPeripherals().discoverServices().discoverCharacteristics().begin();

[_channelForaD40 setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {

//在此处获取您的特征描述 }];

[_channelForaD40 setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristics, NSError *error) {

//在这里读取你的特征值 }];

那么,你终于可以和Bluetooth standards.

比较你的特点了

您无法确定找到每个特征的 "documentation",例如可能的值是什么等
如果 Services & the Characteristics 遵循蓝牙的文档,并且本身 "documented",它只是遵循文档,它是 here。理论上,这些 "well known" 服务和角色应该有一个像“0x0000”这样的 UUID。
示例:Battery service is 0x180F, Battery Level 是 0x2A19,可能的值具有已定义的协议。

其他习俗services/characteristics,就更难了。每个都有自己的文档,并且 UUID 更长(如果它是按照规则开发的)。 如果已设置,您可以阅读 CBDescriptor 以获取更多信息。

在所有情况下,您都必须参考蓝牙低功耗文档,或者如果它是制造商的自定义文档。不管怎样,都是逆向工程。