如何从中央设备(iPhone 7)向外围设备(PSoC BLE)写入布尔值

时间:2018-05-04 13:55:44

标签: ios objective-c bluetooth-lowenergy cbperipheral cbcentralmanager

我是BLE实施的新手,所以请耐心等待。我使用的是Xcode 9.3,iOS版本11.3和PSoC 4200 BLE设备。

我有一个连接到PSoC模块的自定义电路,它输出一个电压,通过uint32数据包发送到我的iOS应用程序。我的下一步是能够创建一个UIButton对象(现在只是一个开/关)并将其状态传递回PSoC。

忘记用于设置PSoC的软件(赛普拉斯的PSoC Creator 4.0只是fyi),我想知道在Xcode中使用哪种委托方法/方法来实现这个...我最好的猜测是peripheralManager:didReceiveWriteRequests:协议中的CBPeripheralManagerDelegate。如果我只能在中心读取特​​性后才能写回外设,那么我可以暂时使用uint32电压包的最后8位,如果这是该过程所需要的。如果更好地创建一个新的uint8或布尔数据包,并且只使用它作为写入特性而不干预uint32,那么我也可以这样做。

到目前为止,我没有传输时间要求或能耗问题......我只需要将该布尔值发送到PSoC。

非常感谢任何帮助,谢谢。

更新: 调用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];
        }
    }
}

0 个答案:

没有答案