Не могу получить показания температуры в лучшем маяке... в моем уме. Мне нужен супергерой

У меня есть задача, где мне нужно прочитать 2 параметра из BLE Beacon. Документация серьезно отсутствовала, и после значительных усилий мне удалось получить некоторую основную информацию о считывании данных с BLE Beacon.

Параметры для чтения
1) Батарея Напряжение датчика
2) Температура маяка имеет встроенный датчик температуры.

Я думаю, что я попробовал почти все популярные библиотеки Python BLE, но я просто не могу получить показания температуры от маяка. "Я думаю", я могу читать напряжение. Причина, по которой я сказал "я думаю", заключается в том, что значение, кажется, соответствует тому, что было предоставлено в минимальном документе. А также, когда я вставляю маяк в зарядное устройство, я вижу, как значение увеличивается, что указывает на то, что это показание напряжения. Поскольку я не мог прочитать температуру (потому что UUID, которые упомянуты в документе, значение, кажется, не изменяется). Я попытался включить датчик всеми возможными способами и способами, описанными - написав 01:00 и т. Д. Я потратил немало времени, чтобы проанализировать эту вещь. Я запустил анализатор пакетов и смог захватить данные, передаваемые между маяком и мобильным приложением (у них есть мобильное приложение). Но опять же, я не могу понять, как показания температуры передаются между маяком и приложением. Позвольте мне разбить весь материал на более мелкие блоки.

Аппаратное обеспечение: BLE-маяк, с которого можно считывать напряжение и температуру. Датчик температуры встроен в маяк. И сам маяк от Texas Instruments, но датчик температуры, напряжения измеряется третьей стороной. Они предоставили нам некоторую минимальную информацию, и было трудно разобраться в некоторых предложениях, так как им трудно общаться на английском языке.

Последовательность получения данных выглядит следующим образом

  1. Сканирование на маяки
  2. Когда маяк найден, подключитесь к нему
  3. Включить уведомление
  4. Установить интервал уведомления
  5. Получите показания напряжения и температуры.

Я был в состоянии сделать первые 4 очень быстро, и "половину" № 5, то есть получить часть напряжения. Когда я говорю очень быстро, я имею в виду, что я получил этот материал практически без документации в то время.

Согласно информации, которая у меня есть, данные находятся в этих характеристиках /UUID. Также обратите внимание, что UUID не являются стандартными 128-битными, и это вызывало проблемы при использовании определенных библиотек. Но после некоторых попыток я получил возможность читать / записывать их, используя дескрипторы и т. Д. Дескрипторы и другие вещи, которые я напечатал, - это те, которые я читаю, используя PYGATT ( оболочку Python для gatttool).

UUID помечены как 1-й, 2-й, 3-й и 4-й параметры, и это имеет следующее, чтобы сказать о параметрах

 - A: 1 byte (2nd Param)
 - B: Maj + Min values, 4 bytes (4th Param)
 - C: 4 bytes (3rd Param)
 - D: Enable/disable notification ( I have been able to turn this on )
 - E: Set notification interval ( I have been able to set this and can notice the change in notification interval )

Это минимально, чтобы не иметь большого файла. Все, что он делает, это следующее: мобильное приложение подключается к маяку, затем запускаются уведомления, и мобильное приложение получает умеренные показания. Как я уже упоминал, у меня нет проблем с чтением напряжения, это только температура, при которой я застреваю. Я был на этом уже неделю. Я думаю, что перепробовал почти все, что мог придумать. Я даже перечислил все записываемые характеристики и попробовал записать числа вроде 1 (включает датчик?). Я мог бы предложить вознаграждение за это сразу, если бы это было возможно. Я редко так долго зацикливаюсь на проблеме. Это сводит меня с ума. Я приближаюсь к своему остроумию - думаю, пришло время для супергероя - кто-нибудь там?:) Я могу предоставить всю необходимую информацию, если кто-то может указать, что не так. Я даже написал приложение Cordova... и попробовал кучу вещей с моего телефона Android. Я могу подключиться... написать характеристики, прочитать материал и т.д., но температура готова, нет! Это просто не сдвинется с места. Все, что я получаю, это тот же набор значений (я использовал JSON.stringify для отображения A, B и C). Я могу побеспокоиться о порядке байтов позже. Я думаю, это меньшая проблема.

Связь между маяком и сторонним мобильным приложением в порядке, он может считывать информацию о температуре просто отлично.

Я смотрел на данные проволочной акулы и уверен, что данные о температуре передаются на этом этапе. Но потом, когда я декодирую "значение", это выглядит как напряжение. В нем упоминается l2cap, но я не уверен, как это используется здесь для отправки показаний температуры (если он использует это в первую очередь).

Обновление: Писал по всем записываемым характеристикам. Написал такие значения, как 1, 0100, 2, 7 на каждую записываемую характеристику. В то же время я читал каждую читаемую характеристику (в цикле) и сравнивал (просто true/false) с предыдущим набором значений. Это казалось быстрым и простым способом узнать, изменилось ли что-то. Не хотел рисковать с преобразованием гекса в плавание. Я могу выяснить порядок байтов позже.

Из полученных данных (wireshark) я вижу только 3 записи, происходящие на маяке.

1 ответ

Решение

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

Исходя из значений, кажется, что эти четыре байта представляют напряжение в поплавке (если вы игнорируете абсурдный коэффициент 10^-38, который приходит, потому что используется только 4 байта вместо 8 байтов).

Поскольку обычно температура T получается из измерения удельного сопротивления, где удельное сопротивление R пропорционально напряжению U (если ток постоянен), вы в принципе можете рассчитать температуру T по напряжению U.

Проблема в том, что T(R) относительно линейна, но не идеально (в отличие от U(R), который предполагается U=RI). Таким образом, вам может потребоваться построить значения для T(U), чтобы узнать кривую, которую они используют.

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

Лучший вариант - спросить об их функции T(U), которую они используют. Если они могут и предоставят это для вас...

Другие вопросы по тегам