Перейти к содержанию
Fire Monkey от А до Я
  • 0

Компонент BluetoothLE и RAD STUDIO 11.2 - как читать характеристики без таймера и без потока


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

 

 

Изменено пользователем Android23
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
5 часов назад, OnePeople сказал:

Я бы не использовал их компоненты Bluetooth. Используйте стандартные рекомендации google.

Что вы имеете ввиду ? Можно какую то конкретную ссылку на рекомендации ?

Ссылка на комментарий
  • 0

Спасибо за информацию, но это все же не то.

 

Нужно именно на c++ в  Rad Studio. Желательно без сторонних компонентов. 

Меня полностью устраивает компонент BluetoothLE, с единственной проблемой, о которой я написал выше.

Может все же кто то владеет информацией ?

Я так понимаю что мне нужно ка то установить свойство Indicate, но как это сделать я не пойму.

 

 

Ссылка на комментарий
  • 0
6 часов назад, Android23 сказал:

Желательно без сторонних компонентов. 

Ну так это и есть чистая нативная платформа. компонент BluetoothLE написан также. Только тут вы делаете все так, как говорит вам гугл, и избегаете ошибок embarcadero. Браться за android и не уметь писать по справке гугл, то еще занятие, рано или поздно придется.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...