【问题标题】:BLE writeValueForCharacteristic fails on second useBLE writeValueForCharacteristic 在第二次使用时失败
【发布时间】:2014-11-17 23:30:42
【问题描述】:

我已经成功地将我的代码设置为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。

任何想法将不胜感激。

【问题讨论】:

  • 你能分享一些代码吗?我只使用了 Punchthrough 的 Bean 库,但从未遇到过问题。
  • 嗨,保罗,上面贴了我的代码。我不想像想要一个精简的应用程序那样使用这个库,只需要实现一个简单的 LED 灯和按钮按下功能。上面的代码有效,但仅在您第一次调用时才有效。

标签: bluetooth-lowenergy core-bluetooth


【解决方案1】:

问题不在于您的写入第二次失败,而在于您的数据格式不正确。 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

【讨论】:

  • 天哪,你是对的。非常感谢。 Bean 是一个很棒的小设备,但是文档真的很烂。感谢您的帮助。
猜你喜欢
  • 2015-02-01
  • 2021-04-02
  • 2010-12-21
  • 2016-08-25
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2020-10-02
相关资源
最近更新 更多