Как записать логическое значение на периферийное устройство (PSoC BLE) с центрального устройства (iPhone 7) - PullRequest
0 голосов
/ 04 мая 2018

Я очень новичок в реализации BLE, так что терпите меня. Я использую Xcode 9.3, iOS версии 11.3 и устройство PSOC 4200 BLE.

У меня есть пользовательская схема, подключенная к модулю PSoC, которая выводит напряжение, которое будет отправлено через пакеты данных uint32, в мое приложение iOS. Мой следующий шаг - создание объекта UIButton (пока только вкл / выкл) и передача его состояния обратно в PSoC.

Забыв о программном обеспечении, используемом для настройки PSoC (Cypress's PSoC Creator 4.0, просто к вашему сведению), я хотел бы знать, какой метод / методы делегата использовать в Xcode, чтобы заставить это работать ... мое лучшее предположение - peripheralManager:didReceiveWriteRequests: в протокол CBPeripheralManagerDelegate. Если я могу записать обратно на периферийное устройство только после того, как характеристика будет считана центральным, то я могу пока использовать последние 8 битов пакета напряжения uint32, если этого требует процесс. Если вместо этого лучше создать новый пакет uint8 или логический пакет и просто использовать его как характеристику записи, не вмешиваясь в uint32, то я тоже могу это сделать.

На данный момент у меня нет требований к времени передачи или энергопотреблению ... Мне просто нужно отправить это логическое значение в PSoC.

Любая помощь будет высоко ценится, спасибо.

UPDATE: после вызова peripheral:didUpdateValueForCharacteristic:error: я звоню [self getTransducerData:characteristic withPeripheral:peripheral error:error];

Вот что происходит с этим методом (я добавил, что я думаю, что это правильный способ использования writeValue:forCharacteristic:type:)

- (void)getTransducerData:(CBCharacteristic*)characteristic withPeripheral:(CBPeripheral*)peripheral
                error:(NSError*)error {
    NSData* data = [characteristic value];
    const uint8_t *reportData = [data bytes];
    uint32_t v0 = (uint32_t)reportData[0];
    uint32_t v1 = (uint32_t)reportData[1] << 8;
    uint32_t v2 = (uint32_t)reportData[2] << 16;
    //uint32_t v3 = (uint32_t)reportData[3] << 24;

    int32_t voltage = v0 | v1 | v2; //| v3;

    if ((characteristic.value) || !error) {

        /* _captureOn is the boolean value after my UIButton object receives a touch.  
           On and Off.  
           If it's on, notify the peripheral with the last 8 bits of the uint32_t characteristic with 0x01.*/
        if (_captureOn) {
            uint8_t temp[4];
            temp[0] = v0;
            temp[1] = v1;
            temp[2] = v2;
            temp[3] = 0x01;
            NSData *data = [NSData dataWithBytesNoCopy:temp length:4 freeWhenDone:YES];
            [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
        }

        self.transducerValue = voltage;
        self.realVoltage = voltage/1000000.0;

        //self.levelView.value = self.realVoltage;

        if (self.realVoltage <= _originalHigh && self.realVoltage >= _originalLow) {
            self.testerVoltage = self.realVoltage;
            self.middleTachometer.currentLevel = (float)self.realVoltage;
            self.transducerPosition.text = [NSString stringWithFormat:@"%0.3lf V", self.realVoltage];
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...