#android #bluetooth #serial-port #rfcomm
#Android #bluetooth #последовательный порт #rfcomm
Вопрос:
Это очень расстраивает, поскольку я пытаюсь неделями и даже не имею понятия в Интернете.
Я работаю над проектом, который считывает / записывает последовательные данные Bluetooth на различном сельскохозяйственном оборудовании.
большинство этих аппаратных средств старые, и изменение скорости передачи данных их SPP не является вариантом.
Я использую Android Bluetooth chat в качестве основы для чтения / записи, я только изменил UUID, чтобы разрешить подключение к имеющимся у меня устройствам
Мне удалось прекрасно считывать данные с устройства чтения тегов с плохой скоростью 19 200 и красиво форматировать
Однако сейчас я застрял на весах, которые имеют скорость передачи данных в бодах 9 600 и показывают забавные символы в моем приложении, что даже близко не соответствует формату, который должен исходить от весов
Этот проект был выполнен ранее на старой Windows Mobile, и скорость передачи данных в бодах можно было изменить в их API
Есть ли способ сделать это в Android или я лаю не на то дерево?
Ответ №1:
Редактировать: Исправлены некоторые ошибки.
В Интернете нет хорошей информации об этом — и большая ее часть неверна — не доверяйте никому!
В частности, эти две вещи не соответствуют действительности:
- RFCOMM и SPP (профиль последовательного порта) — это два названия одного и того же. (Однако они очень тесно связаны.)
- Нет необходимости устанавливать скорость передачи данных для соединения RFCOMM / SPP.
Вот что я нашел:
Последовательные соединения Bluetooth выполняются, как описано в SPP, с использованием RFCOMM. RFCOMM — это соединение, которое работает через L2CAP и позволяет отправлять последовательные данные и параметры управления в кадрах. Он в значительной степени основан на древнем стандарте под названием TS 07.10. SPP — это профиль Bluetooth.
Этот фрейминг также позволяет отправлять внеполосные данные для таких целей, как управление последовательными сигналами (DTR, CTS и т.д.) И для настройки скорости передачи данных в бодах.
Из спецификации SPP:
DevA может информировать DevB о настройках порта RS232 с помощью команды удаленного согласования портов непосредственно перед установлением DLC. Это необходимо сделать, если API для уровня адаптации RFCOMM предоставляет эти настройки (например, скорость передачи в бодах, четность).
К сожалению, Android вообще не предоставляет эту функциональность. Я полагаю, что возможно отправить команду согласования удаленного порта самостоятельно, но я почти уверен, что для этого потребуется переопределить RFCOMM, для чего требуется доступ к L2CAP, которого у нас нет.
Команда удаленного согласования портов подробно описана здесь, стр. 31. Примечание «Для всех параметров назначены значения по умолчанию, если согласование не выполняется, выбирается значение по умолчанию«.
Поэтому невозможно установить желаемую скорость передачи данных на Android. Он будет использовать скорость передачи данных по умолчанию, которую использует ваш адаптер Bluetooth (вероятно, 9600).
Также обратите внимание, что Windows поддерживает настройку скорости передачи данных bluetooth-адаптеров.
Комментарии:
1. Я изменил скорость передачи данных в бодах моего адаптера ELM 327 Bluetooth OBD-2 (китайский клон ELM стоимостью 10 долларов) с 38400 по умолчанию на 230400 — Android будет выполнять сопряжение с устройством, но когда я использую приложение терминала, которое работало раньше, я вообще не получаю ответа от устройства… Интересно, заблокировано ли устройство или есть способ заставить его снова работать (в любой системе / ОС). У меня есть аналогичный адаптер OBD-2 с USB, который работает с 230,4 тыс.
2. Если можно, я бы попробовал протестировать на уровне 115200 или ниже, поскольку эти скорости более распространены. В пути может быть какой-то код, который считает, что вы не можете перейти выше 115200.
3. Проблема в том, что я действительно не могу установить скорость передачи данных в бодах на приемнике (Android)… единственное приложение, которое я нашел, которое может ее установить play.google.com/store/apps /… не подключается к устройству, сопряженному в ОС (требуется BT PIN снова и снова). Я еще не тестировал в чистом Linux (ноутбук) с ключом BT. Может ли Linux (не Android) установить скорость передачи данных BT в бодах? Плохо то, что в других приложениях терминала нет ответа (тех, кто не может установить скорость) — если бы устройство было живым, оно, по крайней мере, отправило бы что-то обратно даже при неправильной команде ввода…
4. Я не тестировал на Linux, но я ожидаю, что это возможно. Вы определенно не можете установить скорость передачи данных в бодах на Android. Я ожидаю, что приложение ссылается на USB-последовательные адаптеры, которые оно, по-видимому, также поддерживает.
5. Какой позор, что удаленное согласование портов невозможно на Android! Кроме того, совершенно странно, что это едва документировано, и Google, похоже, даже не заинтересован в подтверждении запросов, связанных с этой функцией, отмечая их как устаревшие ( здесь и здесь ).
Ответ №2:
Предположительно, какой-то преобразователь Bluetooth в последовательный подключен к устаревшим устройствам? Если это так, вы должны иметь возможность запрограммировать его один раз, чтобы всегда использовать определенную скорость передачи данных. Тогда клиенту Bluetooth не нужно было бы устанавливать скорость передачи данных…
Комментарии:
1. Спасибо! Мне удалось установить скорость передачи данных физического соединения между устройством и адаптером Bluetooth. теперь это работает просто великолепно! Я пришел к выводу, что нет скорости передачи данных в бодах, с которой можно было бы возиться, когда дело доходит до соединений Bluetooth
2. @Zigi как на самом деле вам удалось установить скорость физического соединения в бодах? У меня похожая проблема, и на данный момент я застрял на скорости 9600 бит / с. Я настроил скорость передачи данных принтера на 115200 бит / с, но все еще очень медленно, и не похоже, что настройка скорости передачи данных принтера на что-либо повлияла..