Я очень новичок в реализации 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];
}
}
}