Периферийное устройство 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)
}
Не стесняйтесь просить больше кода
Благодарю.