如何为BLE创建一个写作characeristic

时间:2018-01-04 06:42:08

标签: ios objective-c bluetooth-lowenergy core-bluetooth cbcentralmanager

您好我正在尝试为我的应用创建一个写特性

我的特色创作代码就是这个

 // Start with the Read CBMutableCharacteristic
self.transferCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]
                                                                  properties:CBCharacteristicPropertyNotify|CBCharacteristicPropertyRead                                                                       value:nil
                                                                 permissions:CBAttributePermissionsReadable];

self.writeCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:WRITE_CHARACTERISTIC_UUID]
                                                                 properties:CBCharacteristicPropertyNotify|CBCharacteristicPropertyWriteWithoutResponse                                                                       value:nil
                                                                permissions:CBAttributePermissionsWriteable];
// Then the service
CBMutableService *transferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]
                                                                    primary:YES];

// Add the characteristic to the service
transferService.characteristics = @[self.transferCharacteristic, self.writeCharacteristic];

// And add it to the peripheral manager
[self.peripheralManager addService:transferService];

我已经确认添加服务时存在两个特征。虽然当我扫描这个外围设备时它只显示一个特征。 扫描码:

[self.centralManager scanForPeripheralsWithServices:nil
                                            options:nil];

我检查了各种链接,看到我写的写作特征是正确的,任何人都可以指出我在这里做错了什么,为什么我的服务只显示一个特征?

注意:这是iPhone到iPhone的应用程序。 Lightblue应用程序显示两个具有准确属性的特征

修改

特征提取:

[peripheral discoverCharacteristics:nil forService:service];

1 个答案:

答案 0 :(得分:0)

我可以在swift中为您提供完成代码的代码,您必须将其转换为目标c。

在我们将数据写入外设之前,我们需要知道如何编写数据。我们需要注意两种类型的CBC特性写入类型。 CBC特性写入类型可以是.withResponse或.withoutResponse。 .withResponse属性类型从外设获取响应以指示写入是否成功。 .withoutResponse不会从外围设备发回任何响应。 要写入一个特性,我们需要用实例NSData写一个值,我们将通过调用writeValue(for:,type:CBCharacteristicWriteType.withResponse)方法来实现:

blePeripheral.writeValue(data!, for: txCharacteristic, type: CBCharacteristicWriteType.withResponse)

现在,您将能够写入具有可写属性的特征。

 func writeValue(data: String){
  let valueString = (data as NSString).data(using: String.Encoding.utf8.rawValue)
    if let blePeripheral = blePeripheral{
       if let txCharacteristic = txCharacteristic {
          blePeripheral.writeValue(valueString!, for: txCharacteristic, type: CBCharacteristicWriteType.withResponse)
        }
    }
}

在上面的writeValue(data)函数中,我们将输出字符串格式化为NSData,然后检查是否设置了BLE外设和txCharacteristic变量。如果是,我们然后调用writeValue()函数,如前所述。 因为我们使用CBCharacteristicWriteType.withResponse类型编写了值,所以我们可以通过在委托中实现以下函数来通知响应:

func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
    guard error == nil else {
        print("Error discovering services: error")
      return
    }
     print("Message sent")
}