Периферийное устройство Core-Bluetooth не сообщает центральному при обновлении данных

Я пытаюсь отправить большие пакеты данных через BLE. Для этого я создал характеристику, которая должна уведомлять центральную службу об изменении данных. Проблема состоит в том, что, по-видимому, периферийное устройство суммирует данные в характеристике, но, очевидно, когда характеристика достигает 552 байтов, она не может хранить больше данных.

Центральный только получает 552 байта и вызывает функцию didReceiveRead 3 раза (я перевожу 200 байтов за раз, поэтому 3 раза - 600 байтов, но только 552 байта делают это минимально (что, я думаю, является пределом с iOS 10)). Этот код также распечатать Unhandled Characteristic UUID: 00000000-0000-0000-0000-000000000000 только один раз и удается setNotifyValue моей характеристикой true, Также didUpdateNotificationStateForназывается только один раз.

Я хотел бы знать, почему моя характеристика складывает данные и не отправляет их по 200 байт за один раз, как хотелось бы.

Код, используемый для периферийного устройства: (Функциональный блок просто принимает данные и int от размера необходимого блока и возвращает блок и данные за вычетом фрагмента)

func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
    switch peripheral.state {
    case .unknown:
        print("peripheral.state is .unknown")
    case .resetting:
        print("peripheral.state is .resetting")
    case .unsupported:
        print("peripheral.state is .unsupported")
    case .unauthorized:
        print("peripheral.state is .unauthorized")
    case .poweredOff:
        print("peripheral.state is .poweredOff")
    case .poweredOn:
        print("peripheral.state is .poweredOn")

        let myService = CBMutableService(type: serviceUUID, primary: true)

        let uuid: CBUUID
        uuid = CBUUID(string: "00000000-0000-0000-0000-000000000000")
        let myCharacetristic = CBMutableCharacteristic(type: uuid, properties: [CBCharacteristicProperties.read,CBCharacteristicProperties.notify,CBCharacteristicProperties.write], value: nil, permissions: [CBAttributePermissions.readable, CBAttributePermissions.writeable])
        chara = myCharacetristic
        myService.characteristics = [myCharacetristic]
        print(myService)

        myPeripheral.add(myService)

        let advertisingData = [CBAdvertisementDataLocalNameKey:"my-peripheral", CBAdvertisementDataServiceUUIDsKey: [serviceUUID]] as [String : Any]
        myPeripheral.startAdvertising(advertisingData)
        print(advertisingData.description)
    }
}

func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
    var max = 0
    if (data.count - 200) > 0{
        max = 200
    }else{
        max =  data.count
    }
    var subdata: Data //subdata is what I want to send
    (subdata, data) = chunck(json: data, max: max)
    print(request.value)
    request.value = subdata
    myPeripheral?.respond(to: request, withResult: CBATTError.success)
}

А для центрального кода есть:

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

    print("Characteristic:")
    for characteristic in characteristics {
        print(characteristic)
        if characteristic.properties.contains(.read) {
            print("\(characteristic.uuid): properties contains .read")
            peripheral.readValue(for: characteristic)
        }
        if characteristic.properties.contains(.notify) {
            print("\(characteristic.uuid): properties contains .notify")
            peripheral.setNotifyValue(true, for: characteristic)
            print("ok for: \(characteristic)")
        }
    }
}

public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {

    print("Unhandled Characteristic UUID: \(characteristic.uuid)")
    print(error)
}
public func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {

    print(characteristic)
    print(characteristic.value)
}

Не стесняйтесь просить больше кода

Благодарю.

0 ответов

Другие вопросы по тегам