Отсутствует (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).

0 ответов

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