2014-11-17 2 views
0

Я успешно установил свой код как делегат CBCentralManager и CBPeripheral и могу подключиться к своему устройству Bluetooth, полностью используя все обратные вызовы и методы. Тем не менее, я могу установить значение только с помощью метода writeValueForCharacteristic. Если я попытаюсь выпустить вторую команду, тогда ее просто игнорируют - почти так же, как она вообще не отправляется. Я знаю, что устройство работает, так как я могу использовать тестовое приложение той же самой компании, чтобы контролировать его.BLE 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.

Любые идеи будут оценены.

+0

Можете ли вы поделиться какой-то код? Я использовал библиотеку Bean только из Punchthrough, но у меня не было проблемы. – Paulw11

+0

Привет, Пол, разместил мой код выше. Я не хочу использовать библиотеку в качестве скудного приложения, и мне нужно только реализовать простой светодиодный индикатор и функцию нажатия кнопки. Код выше работает, но только в первый раз, когда вы его вызываете. – Roo

ответ

0

Проблема не в том, что ваша запись не срабатывала во второй раз, так что ваши данные не отформатированы правильно. Bean protocol documentation не самый ясный (именно поэтому гораздо проще использовать SDK), но если вы внимательно посмотрите на формат заголовка GT, вы увидите, что для каждого сообщения необходимо увеличивать поле бит двух бит. Поскольку у вас есть фиксированное значение, вторая и последующая записи игнорируются Bean как дублирующиеся сообщения.

Я сделал следующие изменения в свой код, и я могу переключить светодиод -

@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 
+0

Боже, да, ты прав. Спасибо. Бин - отличное устройство, но документация действительно отстойная. Спасибо за вашу помощь. – Roo