iOS Bluetooth Low Energy (BLE) не обнаруживает характеристику TX

Я использую плату BLE с перьями Arduino и пытаюсь создать приложение для iOS, которое может отправлять данные на плату через BLE. Я могу подключиться, но не могу получить доступ к txCharacteristic

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    guard let characteristics = service.characteristics else {
        return
    }

    for characteristic in characteristics {
        if characteristic.properties.contains(.write) || characteristic.properties.contains(.writeWithoutResponse) {
            writableCharacteristic = characteristic
        }

        //            if(characteristic.uuid == CBUUID(string: "6e400002-b5a3-f393-e0a9-e50e24dcca9e"))
        //            {
        //                txCharacteristic = characteristic
        //            }

        var txUUID = CBUUID(string: "6e400002-b5a3-f393-e0a9-e50e24dcca9e")
        let temp = characteristic.uuid.uuidString;
        switch characteristic.uuid {
        case txUUID:
            txCharacteristic = characteristic;
            break;
        default:
            break;
        }

        peripheral.setNotifyValue(true, for: characteristic)
    }
}

Этот код работает, но обнаруживает только следующие UUID:

temp    String  "00001532-1212-EFDE-1523-785FEABCD123"  
temp    String  "00001531-1212-EFDE-1523-785FEABCD123"  
temp    String  "00001534-1212-EFDE-1523-785FEABCD123"  

Я понял, что эти UUID являются UUID DFU. Как я могу вместо этого обнаружить txCharacteristic?


Добавлено для получения дополнительной информации о том, как я вызываю discoveryCharacteristics():

extension SimpleBluetoothIO: CBPeripheralDelegate {
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard let services = peripheral.services else {
        return
    }

    targetService = services.first
    if let service = services.first {
        targetService = service
        peripheral.discoverCharacteristics(nil, for: service)
    }
}

person Megan    schedule 05.10.2017    source источник
comment
Вы уверены, что это правильный сервис на правильном устройстве? Вы вызвали discoverServices и discoverCharacteristics с правильными аргументами? Попробуйте загрузить браузер BLE и проверьте, что он видит.   -  person Kevin    schedule 05.10.2017
comment
Привет, и спасибо за вашу помощь. Я вызвал DiscoverServices(nil), который должен обнаружить все сервисы. И я добавил код для вызова discoveryCharacteristics() к моему вопросу выше.   -  person Megan    schedule 12.10.2017


Ответы (1)


Я смог понять это, прочитав информацию на этом сайте: https://learn.adafruit.com/getting-started-with-the-nrf8001-bluefruit-le-breakout/adding-app-support

В частности, эта часть (обратите внимание, что UART — это сервис, а TX и RX — характеристики сервиса):

UART Service UUID: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
TX Characteristic UUID: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E
RX Characteristic UUID: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E

Поэтому мне нужно было вызвать периферию.discoverServices() с идентификатором службы UART. В моем примере ниже self.serviceUUID = "6e400001-b5a3-f393-e0a9-e50e24dcca9e"

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    //peripheral.discoverServices(nil)
    //peripheral.discoverServices([CBUUID(string: "6e400001-b5a3-f393-e0a9-e50e24dcca9e")])

    // Disover peripheral with service UUID that was given to us during initialization (self.serviceUUID)
    peripheral.discoverServices([CBUUID(string: self.serviceUUID)])
}

Затем в сервисе didDiscoverCharacteristicsFor мне нужно было найти идентификатор характеристики TX:

// Did Discover Characteristics
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    guard let characteristics = service.characteristics else {
        return
    }

    for characteristic in characteristics {
        if characteristic.properties.contains(.write) || characteristic.properties.contains(.writeWithoutResponse) {
            writableCharacteristic = characteristic
        }

        // TX Characteristic UUID: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E
        // https://learn.adafruit.com/getting-started-with-the-nrf8001-bluefruit-le-breakout/adding-app-support
        let txUUID = CBUUID(string: "6e400002-b5a3-f393-e0a9-e50e24dcca9e")
        switch characteristic.uuid {
        case txUUID:
            txCharacteristic = characteristic;
            break;
        default:
            break;
        }

        peripheral.setNotifyValue(true, for: characteristic)
    }
}
person Megan    schedule 16.10.2017