Написано приложение для Android на основе примера HeartRateMonitor из примеров RAD Studio.
Стандарный пример HeartRateMonitor не удается проверить - при компиляции выдает ошибку.
Мой пример запускается и работает,находит нужное устройство и сервис.После того, как все подключено и найдено - я запускаю уведомления FBLEDevice->SetCharacteristicNotification( HRMEASUREMENTGattCharact1, true);
Но в событие BluetoothLE1CharacteristicRead компоненты попадает только если в таймере крутится FBLEDevice->ReadCharacteristic(нужная характеристика).
Если не запустить таймер, то в событие BluetoothLE1CharacteristicRead не попадает никак.
В примере HeartRateMonitor от Rad Studio не используется ни таймер ни поток и судя по всему идет постоянный опрос устройства и вывод данных нужной характеристики.
Вот часть кода, которая выполняется после поиска устройства
Вопрос
Android23
Здравствуйте.
Написано приложение для 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
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.