Получить данные по bluetooth

Вывод данных полученных через Bluetooth на экран

Есть датчик dht22 с него приходят 2 показателя: Температура и влажность,требуется получить данные по блютус на смартфон и вывести на экран.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
h = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case RECIEVE_MESSAGE: byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); sb.append(strIncom); int endOfLineIndex = sb.indexOf("\r\n"); if (endOfLineIndex > 0) { String sbprint = sb.substring(0, endOfLineIndex); sb.delete(0, sb.length()); txtArduino.setText(sbprint); } //Log.d(TAG, ". Строка:"+ sb.toString() + "Байт:" + msg.arg1 + ". "); break; } };

Но в данном случае все выводиться в 1 текстовое поле, подскажите где можно достать как разделить показатели, или нужно делать 2 Handler, и еще 1 вопрос — частоту опроса датчика нужно менять в скетче ардуино или это можно сделать в каком то цикле в handler.

Вывод всех данных полученных через POST
Добрый вечер! Нужно вывести все данные полученные через POST запрос, но при этом нам не известно.

Потеря данных полученных в Android от Arduino по Bluetooth (appinvertor)
Отправляю сигналы с ардуино, с разных датчиков, в виде "имя датчика + уровень" Пробовал вот так.

Отправка данных из формы и вывод полученных данных
помогите с скриптом на jquery, который бы выполнял вот эту задачу: при нажатии на кнопку.

Вывод данных, полученных из БД, не работает.
Здравствуйте не знаю как изложить свою проблему, нужно вывести в цыкле из БД, а не получается. И.

Senum, можно обойтись одним хандлером (выводите в одно поле? надо в два? что мешает?), частота опроса задана где-то вне вашего куска кода

Датчик отправляет информацию о температуре и уровню влажности, оба показателя идут в 1 поле, нужно в 2. Просто не совсем разобрался как этого сделать. И сразу вопрос если датчиков будет больше то потребуется ли доп хандлер или есть более удобные способы обработки входящий информации?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public void run() { byte[] buffer = new byte[256]; int bytes; while (true) { try { bytes = mmInStream.read(buffer); h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); } catch (IOException e) { break; } } }

фрагмент скетча передающего данные с ардуино :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } }

Senum, ваш код ардуино формирует строку в которой прописаны нужные вам данные. вы эту строку показываете на экране. причем не факт что все данные дойдут одной посылкой, но видимо вам везет и пока все проскакивает одним куском. что бы выделить из этой строки нужные вам величины. просто возьмите и выделите их)

String s = "Humidity: 1.23 %\tTemperature: 4.56 *C"; String[] subs = s.split(" "); float h = Float.parseFloat(subs[1]); float t = Float.parseFloat(subs[3]);

Или в скетче добавить в строку разделители, получится типа csv, который потом split в массив и ракидать по TextView.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
h = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case RECIEVE_MESSAGE: // если приняли сообщение в Handler byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); sb.append(strIncom); // формируем строку int endOfLineIndex = sb.indexOf("\r\n"); // определяем символы конца строки if (endOfLineIndex > 0) { // если встречаем конец строки, String sbprint = sb.substring(0, endOfLineIndex); // то извлекаем строку sb.delete(0, sb.length());// и очищаем sb String[] sb = sbprint.split("U"); for (int i=0; isb.length; i++) { String[] command = sb[i].split("="); if (command[0].compareTo("h") == 0) { txtArduino.setText("Humidity :" + sb); // обновляем TextView } } // обновляем TextView } //Log.d(TAG, ". Строка:"+ sb.toString() + "Байт:" + msg.arg1 + ". "); break; } }; };

видимо я плохо понял, дайте ссылку на пример или где подробно описано выделение и правильная сортировка.
заранее спс

Источник

Hello World для получения данных с Bluetooth (BLE) устройства через C#

Пару недель назад я столкнулся с проблемой, что нормальной и современной статьи по первому получению данных с Bluetooth просто нет. И пришлось повозиться чтобы понять с чего начать и как это вообще осуществить. И чтобы люди не повторяли мои ошибки, вот краткое эссе о том как это можно сделать.

Но для начала пару пафосных слов, для чего это вообще нужно. Современный мир все больше погружается в идеологию интернет вещей. Сейчас всё друг с другом взаимодействует, холодильник с плитой, утюг с пылесосом и т.д. Много шума подняли из-за ЭКГ в Apple Watch, но современные тонометры, пульсометры, термометры уже давно умеют передавать данные через Bluetooth. И вот это всё нужно как-то соединить в единую сеть. И ключевым элементом в этой сети является, как ни крути, компьютер. В связи с этим возникла задача получать данные с определённого устройства через Bluetooth.

Начну с того, что уже у нас было и что усугубило поиск решения. А у нас было приложение написанное на .Net Core. В чем суть приложения неважно, для простоты будем считать, что у нас просто консоль на .Net Core. Ну а устройство буду называть литерой N.

Первые попытки найти что-то работающее с Bluetooth через C# приведут к библиотеке 32feet.

В NuGet пакетах она звучит так 32feet.NET.

И она, кстати, в своей последней продуктовой редакции, даже находит устройства Bluetooth, но не стандарта BLE [как выяснилось гораздо позже]. Например тот же OnePlus 5T стабильно отыскивался, но необходимое устройство N нет. Параллельно с этим удалось отыскать и официальный ответ автора, что его библиотека с BLE не взаимодействует в принципе, и даже нет смысла пробовать. Хотя на Github и есть предварительная версия InTheHand.Devices.Bluetooth, которая должна поддерживать BLE, но в ней так много все подменено, а документации вовсе никакой нет, что даже скомпилировать проект с идеями взятыми с 32feet.NET не сложилось.

Новые изыскания привели меня к более стандартным решениям, а именно к Universal Windows Platform (UWP). При разработке данной платформы, Microsoft, охваченная идеей универсальности и единым приложением для компьютера и телефона, постаралась и сделала взаимодействие с Bluetooth. И вот здесь как раз всё хорошо работает, но… У нас проект на .Net Core… И этим уже ничего не поделаешь.

Сразу скажу, что решения по взаимодействию библиотек UWP с .Net Core отыскать не удалось и проект пришлось переключать на 4.7.1., благо это не сложно. Хотя были мысли как оставить проект на .Net Core и например сделать отдельный Windows сервис с передачей данных по именованный каналам (named pipe) или поднять WCF сервис и с ним уже наладить взаимодействие, но в нашем случае это не имело практического смысла.

Так что в итоге мы имеем перед стартом:

  • «Windows от Universal Windows Platform»
    C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17134.0\Windows.winmd
  • «System.Runtime.WindowsRuntime»
    C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

Вот мой пример кода, как получить данные с устройства.

Данный код рассчитан на то, что устройство уже добавлено (соединено).

 public class BluetoothObserver < BluetoothLEAdvertisementWatcher Watcher < get; set; >public void Start() < Watcher = new BluetoothLEAdvertisementWatcher() < ScanningMode = BluetoothLEScanningMode.Active >; Watcher.Received += Watcher_Received; Watcher.Stopped += Watcher_Stopped; Watcher.Start(); > private bool isFindDevice < get; set; >= false; private async void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) < if (isFindDevice) return; if (args.Advertisement.LocalName.Contains("deviceName")) < isFindDevice = true; BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress); GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(); if (result.Status == GattCommunicationStatus.Success) < var services = result.Services; foreach (var service in services) < if (!service.Uuid.ToString().StartsWith("serviceName")) < continue; >GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsAsync(); if (characteristicsResult.Status == GattCommunicationStatus.Success) < var characteristics = characteristicsResult.Characteristics; foreach (var characteristic in characteristics) < if (!characteristic.Uuid.ToString().StartsWith("characteristicName")) < continue; >GattCharacteristicProperties properties = characteristic.CharacteristicProperties; if (properties.HasFlag(GattCharacteristicProperties.Indicate)) < characteristic.ValueChanged += Characteristic_ValueChanged; GattWriteResult status = await characteristic.WriteClientCharacteristicConfigurationDescriptorWithResultAsync(GattClientCharacteristicConfigurationDescriptorValue.Indicate); return; >if (properties.HasFlag(GattCharacteristicProperties.Read)) < GattReadResult gattResult = await characteristic.ReadValueAsync(); if (gattResult.Status == GattCommunicationStatus.Success) < var reader = DataReader.FromBuffer(gattResult.Value); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input); //Читаем input >> > > > > > > private void Characteristic_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args) < var reader = DataReader.FromBuffer(args.CharacteristicValue); byte[] input = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(input); //Читаем input >private void Watcher_Stopped(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementWatcherStoppedEventArgs args) < ; >>

Источник

Как я могу посмотреть передаваемые байты по протоколу Bluetooth?

Спустя почти полтора года я снова решил вернуться к этому вопросу. У меня стоит задача: отслеживать нажатые клавиши на беспроводных наушниках, и при получении определенного пакета — выполнять уже какое-то действие в коде. Чтоб подойти к решению этой задачи, прежде я хочу выводить все пакеты в консоль с помощью Python3 или же C/C++ (предпочтительнее 1 вариант). Как я могу получить эти пакеты именно в коде с помощью Python/C/C++ ? То есть это НЕ должна быть команда для терминала в стиле os.system(‘hcitool . ‘) , а именно исходник. А методом «тыка» я уже смогу определить, какой пакет отвечает за нажатые клавиши на беспроводных наушниках. Также я пытался использовать Wireshark (Windows), но к слову, ни один пакет он не уловил. Я предполагаю, что можно создать соединение через Python3 и модуль socket на Linux : socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) , и затем уже выводить пакеты для анализа. Не обязательно показывать код (но было бы неплохо посмотреть на минимально воспроизводимый пример на Python3 ). Хотя бы просто направьте в правильную сторону, где я смогу почитать об этом. К слову, я искал в интернете и вот СОВСЕМ не обнаружил толковых результатов.

Хм. все запутано. на хабре есть идея habr.com/ru/post/417303 проверяется sndrec быстро. Не могу проверить. Запись звука с безпроводных наушников можно сделать. Если это не сработает — нужно что б дрова поддерживали проброс сигнала кнопки — и смотреть что там в дрова зашили.

@eri — да, наушники спарены. Из всего того, что мне удалось сделать на данный момент — получить ответ AT+BRSF=191 , я в свою очередь подал команду — AT+BRSF:20\r\r\nOK\r\n , после этого я подаю еще какие-то команды, и на этом скрипт замирает. Я так понимаю, что это режим конфигурации, и мне вряд ли удастся получить желаемый результат. Ось — Kali Linux 2021.1. На виндовс десятке бессмысленно запускать — кажется, не поддерживается какой-то из протоколов (но с этим не уверен)

Источник

Читайте также:  Earbuds bluetooth and wired
Оцените статью
Adblock
detector