我已成功将代码设置为CBCentralManager
和CBPeripheral
代理,并且可以连接到我的蓝牙设备,实现所有回调和方法就好了。但是,我只能使用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。
任何想法都将不胜感激。
答案 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