Отсутствует (nil) "значение" в didUpdateValueFor
Мы пишем приложение для iPad (в быстром), чтобы отслеживать другое приложение для iPad (более старое, написанное в цели C) с помощью BLE.
Я добавил некоторые периферийные функции BLE в старое приложение, которое настраивает службу и характеристики, запускает рекламу и поддерживает характеристику обновленной на частоте 1 Гц с данными локального состояния.
Затем я добавил центральную функциональность BLE в новое приложение /swift, которое сканирует рекламодателей, подключает их, обнаруживает службы, обнаруживает характеристики, а затем получает обновления и декодирует данные.
Все это прекрасно работает, КРОМЕ ТОГО, когда я получаю обновления данных на Swift/ центральной стороне, "значение" характеристики, как представляется, равно нулю. Я дважды проверил свое дерево характеристик, мои UUID, мои разрешения, все, кажется, в порядке. Обратите внимание, что мое периферийное устройство всегда рекламируется и постоянно обновляется, похоже, оно не мешает процессу подключения, но, может быть, мне нужно по-разному упорядочить его (например, не влияет ли функция рекламы на передачу данных)?
Ниже я предоставил соответствующие функции. Есть что-нибудь, что выглядит не так?
Код конфигурации на стороне периферийных устройств /iOS/Objective C. Это код, который устанавливает мое дерево характеристик со всеми разрешениями и возможностями.
-(void) OnPoweredOnInit
{
CBUUID *uuidService = [CBUUID UUIDWithString:pUUIDObserverService];
CBUUID *uuidData = [CBUUID UUIDWithString:pUUIDObserverData];
CBUUID *uuidTX = [CBUUID UUIDWithString:pUUIDObserverSerialTX];
CBUUID *uuidRX = [CBUUID UUIDWithString:pUUIDObserverSerialRX];
char_Data = [[CBMutableCharacteristic alloc] initWithType:uuidData properties:CBCharacteristicPropertyWrite|CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsWriteable|CBAttributePermissionsReadable];
char_TX = [[CBMutableCharacteristic alloc] initWithType:uuidTX properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
char_RX = [[CBMutableCharacteristic alloc] initWithType:uuidRX properties:CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable];
service_Obs = [[CBMutableService alloc] initWithType:uuidService primary:YES];
service_Obs.characteristics = @[char_Data, char_TX, char_RX];
[ptr_CBPeriphMgr addService:service_Obs];
}
Код отправки на стороне периферийных устройств /iOS/Objective C. Это всегда называется каждую секунду или около того. Обратите внимание, что я тоже всегда рекламирую - это проблема? Я не видел, чтобы что-то говорило, что это проблема...
-(void) Update
{
// two bytes of state, 1 byte of units, 4 bytes of milliPSI
Byte tmp[7];
tmp[0] = (m_LastState >> 1) % 16;
tmp[1] = m_LastState % 16;
tmp[2] = m_LastUnits % 16;
tmp[3] = (m_LastmilliPSI >> 3) % 16;
tmp[4] = (m_LastmilliPSI >> 2) % 16;
tmp[5] = (m_LastmilliPSI >> 1) % 16;
tmp[6] = (m_LastmilliPSI >> 0) % 16;
NSData *data = [NSData dataWithBytes:tmp length:7];
bool z = [ptr_CBPeriphMgr updateValue:data forCharacteristic:char_Data onSubscribedCentrals:nil];
}
Получение кода на стороне Central/iOS/Swift. Я знаю, что мое использование опций небрежно, я все еще к ним привыкаю. Это вызывается, но не проходит тест if (didUpdateValueFor.value!= Nil), что означает отсутствие данных для декодирования. Кажется, что все UUID совпадают, и он срабатывает в ожидаемое время, просто без полезной нагрузки...
func peripheral(_ cm:CBPeripheral, didUpdateValueFor: CBCharacteristic, error: Error?)
{
if (m_Peripheral != nil)
{
if (m_Peripheral == cm)
{
if (didUpdateValueFor.uuid.uuidString == stringuuid_DataCharacteristic)
{
if (didUpdateValueFor.value != nil). //<-- gets called
{
let array = [UInt8](didUpdateValueFor.value!) //<-- does NOT get called
if (array.count >= 7)
{
let state:UInt16 = UInt16(array[0]) * 16 + UInt16(array[1])
let units:UInt16 = UInt16(array[2])
let milliPSI:UInt32 = UInt32(array[3]) * 4096 + UInt32(array[4]) * 256 + UInt32(array[5]) * 16 + UInt32(array[6])
for o in general_observers { o.RxBlueFIREData(state:state, units:units, milliPSI:milliPSI) }
}
}
}
}
}
}
Что-то выше выглядит неправильно? Что-либо, что я делаю неправильно или не могу сделать, может привести к тому, что значение "value" будет нулевым в событии обновления (которое в противном случае срабатывает в нужное время с ожидаемыми UUID).