BLE writeValueForCharacteristic在第二次使用时失败

时间:2014-11-17 23:30:43

标签: bluetooth-lowenergy core-bluetooth

我已成功将代码设置为CBCentralManagerCBPeripheral代理,并且可以连接到我的蓝牙设备,实现所有回调和方法就好了。但是,我只能使用writeValueForCharacteristic方法设置一次值。如果我尝试发出第二个命令,那么它就会被忽略 - 几乎就像它根本没有被发送一样。我知道设备正在运行,因为我可以使用同一家公司的测试应用程序来控制它。

我也尝试过实现CBWriteCharacteristicWithResponse方法,该方法按预期触发,没有错误。

- (void) setLEDState {
    char testDataPacketStart[] = {0xa0};
    char testDataHeader[] = {0x05, 0x00};
    char testDataPayload[] = {0x20, 0x01, 0x00, 0x00, 0x00};

    if (_isLEDLit == false) {
       testDataPayload[4] = 0xff;
       _isLEDLit = true;
    }
    else {
        _isLEDLit = false;
    }

    NSData *testDataHeaderObject = [[NSData alloc] initWithBytes:testDataHeader length:2];
    NSData *testDataPayloadObject = [[NSData alloc] initWithBytes:testDataPayload length:5];

    UInt16 crc1 = [[self class] computeCRC16:testDataHeaderObject startingCRC:0xffff];
    UInt16 crc2 = [[self class] computeCRC16:testDataPayloadObject startingCRC:crc1];

    char testDataAssembledPacket[10] = {};
    testDataAssembledPacket[0] = testDataPacketStart[0];
    testDataAssembledPacket[1] = testDataHeader[0];
    testDataAssembledPacket[2] = testDataHeader[1];

    int lenPacket = sizeof(testDataPayload);
    for (int byteCount = 0; byteCount < lenPacket; byteCount++) {
        testDataAssembledPacket[byteCount + 3] = testDataPayload[byteCount];
    }

    testDataAssembledPacket[8] = (UInt8)(crc2 & 0xFF);
    testDataAssembledPacket[9] = (UInt8)(crc2 >> 8);

    NSData *testDataAssembledPacketObject = [[NSData alloc] initWithBytes:testDataAssembledPacket length:sizeof(testDataAssembledPacket)];

    [_myParentWindow printMessage: [[NSString alloc] initWithFormat:@"Sending buffer: %@",     testDataAssembledPacketObject]];

[self.activePeripheral writeValue:testDataAssembledPacketObject forCharacteristic:_serial_pass_characteristic type:CBCharacteristicWriteWithResponse];

}

该设备,如果使用,是Lightblue的Bean。

任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题不在于您的写入第二次失败,而是您的数据格式不正确。 Bean protocol documentation不是最清楚的(这就是为什么使用SDK要容易得多),但如果你仔细观察GT Header的格式,你会发现两位消息计数字段需要增加对于每条消息。当你有一个固定值时,Bean会忽略第二次和后续写入作为重复消息。

我对您的代码进行了以下更改,我可以切换LED -

@property char msgCount;

- (void) setLEDState {
    char testDataPacketStart[] = {0x80};
    testDataPacketStart[0]=testDataPacketStart[0] | (self.msgCount<<5);
    self.msgCount=++self.msgCount % 4;

    ...  The rest of your method unchanged