Здравствуйте.
Написано приложение для Android на основе примера HeartRateMonitor из примеров RAD Studio.
Стандарный пример HeartRateMonitor не удается проверить - при компиляции выдает ошибку.
Мой пример запускается и работает,находит нужное устройство и сервис.После того, как все подключено и найдено - я запускаю уведомления FBLEDevice->SetCharacteristicNotification( HRMEASUREMENTGattCharact1, true);
Но в событие BluetoothLE1CharacteristicRead компоненты попадает только если в таймере крутится FBLEDevice->ReadCharacteristic(нужная характеристика).
Если не запустить таймер, то в событие BluetoothLE1CharacteristicRead не попадает никак.
В примере HeartRateMonitor от Rad Studio не используется ни таймер ни поток и судя по всему идет постоянный опрос устройства и вывод данных нужной характеристики.
Вот часть кода, которая выполняется после поиска устройства
void __fastcall TForm3::BluetoothLE1EndDiscoverDevices(
TObject* const Sender, TBluetoothLEDeviceList* const ADeviceList)
{
Memo1->Lines->Add(IntToStr(ADeviceList->Count) + " device found:");
for (int i = 0; i < ADeviceList->Count; i++) {
Memo1->Lines->Add(ADeviceList->Items[0]->DeviceName);
Memo1->Lines->Add("");
}
FBLEDevice = NULL;
if (ADeviceList->Count > 0) {
FBLEDevice = ADeviceList->First();
}
if (FBLEDevice == NULL) {
Memo1->Lines->Add("Device not found!");
} else {
FServicesDiscovered = false;
FBLEDevice->DiscoverServices();
if (FBLEDevice->Services->Count == 0) {
Memo1->Lines->Add("No services found!");
} else {
TBluetoothGattCharacteristicList* CharList = NULL;
TBluetoothGattDescriptorList* Descriptor = NULL;
for (int i = 0; i < FBLEDevice->Services->Count; i++) {
CharList = FBLEDevice->Services->Items[i]->Characteristics;
Memo1->Lines->Add(
FBLEDevice->Services->Items[i]->UUIDName + " : " +
GUIDToString(FBLEDevice->Services->Items[i]->UUID));
for (int j = 0; j < CharList->Count; j++) {
Memo1->Lines->Add("--> " + CharList->Items[j]->UUIDName +
" : " +
GUIDToString(CharList->Items[j]->UUID));
Descriptor = CharList->Items[j]->Descriptors;
for (int k = 0; k < Descriptor->Count; k++) {
Memo1->Lines->Add(
"--> " + Descriptor->Items[k]->UUIDName + " : " +
GUIDToString(Descriptor->Items[k]->UUID));
}
}
}
FHRGattService = NULL;
HRMEASUREMENTGattCharact1 = NULL;
HRMEASUREMENTGattCharact2 = NULL;
FHRGattService = FBLEDevice->GetService(HRSERVICE);
if (FHRGattService != NULL) {
Memo1->Lines->Add("Service found!");
HRMEASUREMENTGattCharact1 = FHRGattService->GetCharacteristic(
HRMEASUREMENT_CHARACTERISTIC1);
HRMEASUREMENTGattCharact2 =
FHRGattService->GetCharacteristic(
HRMEASUREMENT_CHARACTERISTIC2);
} else {
Memo1->Lines->Add("Service not found");
}
FBLEDevice->SetCharacteristicNotification(
HRMEASUREMENTGattCharact1, true);
}
К то в теме , подскажите что не так ?
Как сделать без таймера.
Чтобы в событие BluetoothLE1CharacteristicRead попадало тогда, когда действительно придут данные с характеристикой от клиента.
Если кто может разобраться, пример Rad Studio находится в папке \CPP\Multi-Device Samples\Device Sensors and Services\Bluetooth