Вопрос или проблема
Похоже, что возможно запустить USB по IP, например, с использованием usbip
, который является частью некоторых дистрибутивов Linux, таких как https://www.archlinux.org/packages/?q=usbip
Существует ли что-то подобное для Bluetooth по IP? (НЕ: IP по Bluetooth).
Это позволило бы физически разделить, скажем, смартфон с поддержкой BT от гарнитуры с поддержкой BT посредством интернета.
Linux bnep
может быть способен на это, но мне не удалось найти инструкции, как это сделать.
Хотя в нашем технологическом мире сегодня кажется, что всё возможно, насколько я знаю, настоящий Bluetooth-to-Bluetooth-over-IP никогда не был реализован. Я постараюсь объяснить трудности, которые, хотя и не непреодолимы, являются причиной этой ситуации.
Bluetooth сам по себе является стандартом беспроводной технологии для обмена данными на малых расстояниях. Обычно он используется для соединений «устройство-устройство» и включает в себя понятие спаривания, для целей безопасности. Протокол Bluetooth крайне универсален и может использоваться для множества целей. Его популярность объясняется тем, что он работает на частотах, которые являются глобально не лицензированными (но не нерегулируемыми).
Настоящий Bluetooth-to-Bluetooth-over-IP потребует от двух устройств Bluetooth спаривания через IP. Это не то же самое, что, например, два человека, использующие Skype для разговоров по Интернету через Bluetooth-гарнитуры, потому что гарнитуры спарены с компьютерами, а не друг с другом.
Вот некоторые выдержки из статьи Википедии Модель OSI:
Уровень 1: Физический уровень
Физический уровень параллельного SCSI работает на этом уровне, как и физические уровни Ethernet и других локальных сетей, таких как Token Ring, FDDI, ITU-T G.hn, и IEEE 802.11 (Wi-Fi), а также персональных сетей, таких как Bluetooth и IEEE 802.15.4.
Уровень 4: Транспортный уровень
Примером протокола транспортного уровня в стандартном интернет-стеке является Протокол управления передачей (TCP), который обычно строится поверх Протокола Интернета (IP).
TCP и UDP являются протоколами транспортного уровня 4, в то время как Bluetooth является протоколом более низкого физического уровня 1. Таким образом, вы можете использовать TCP или UDP поверх Bluetooth, так же как вы используете TCP и UDP поверх Ethernet, но наоборот сделать гораздо сложнее.
Стек протоколов Bluetooth включает в себя собственные транспортные протоколы: L2CAP и RFCOMM, при этом соединения RFCOMM используют уровень L2CAP. Вы можете работать с некоторым IP-туннелированием через Bluetooth, инкапсулируя UDP-пакеты в соединениях RFCOMM.
С точки зрения чистой терминологии OSI, невозможно, что даже является противоречием по терминам, использовать протокол уровня 1 поверх протокола уровня 4.
Практически мы могли бы представить программный виртуальный адаптер, который заявил бы о себе Linux на клиентской стороне как о физическом устройстве Bluetooth и общался бы по IP с другим таким виртуальным устройством Bluetooth на серверной стороне Linux. Но сложность, связанная с эмуляцией уровней OSI и программными затратами, необходимыми для реализации очень универсального протокола Bluetooth и его архитектуры мастер-слейв, делает создание такой общей реализации очень трудоемкой задачей, которая вряд ли осуществится, поскольку в настоящее время нет спроса на такое программное обеспечение.
Я недавно думал о чем-то похожем. Что я хочу сделать, так это использовать хаб для домашней автоматизации, который, к сожалению, не может охватить весь дом с одним радиоприемником.
Моя настройка выглядит следующим образом: компьютер с установленным bluez + клиент usbip <- LAN -> другой компьютер с физическим Bluetooth USB-ключом + сервер usbip.
Оказалось, что это работает вполне нормально. С точки зрения Bluez, он не может отличить локальные и удаленные USB-ключи.
(Машины на базе Linux 4.9.80 + up-to-date-usbip + Bluez 5.48; arm)
Я не пробовал это на практике, но это информация, которую я нашел о “Bluetooth по IP”.
Книга Сетевое взаимодействие в ядре Linux очень техническая, но она описывает, как сделать “Bluetooth по IP”:
На стороне сервера:
pand --listen --role=NAP
На стороне клиента:
pand --connect btAddressOfTheServer
Это создает виртуальный интерфейс bnep0
.
Похоже, это просто дает вам L2CAP, который может отправлять пакеты только по “пиконету”. Но для L2CAP существуют размышления о том, как отправить их по IP в драфте IETF: Передача IP-пакетов по Bluetooth-сетям.
IETF может рассмотреть возможность запуска L2CAP по IP через контроллер хоста с помощью нового протокола:
+------------+ | L2CAP | +------------+ | IP | +------------+ | Foo2 Proto.| +------------+ | Host Cont. | +------------+
Рисунок 4.3.3 – 3-й. Возможный стек протоколов Bluetooth для IP-сетевого взаимодействия
И затем я также нашел UbiPAN: Расширенная персональная сеть Bluetooth, которая упоминает “Bluetooth по IP” – но, к сожалению, похоже, что UbiPAN не был выпущен как свободное программное обеспечение.
Хорошо, я немного больше изучил это. Это невозможно.
Вот почему: Для того чтобы это работало, вам потребуется, чтобы Bluetooth-чип в компьютере передавал информацию вместо того, чтобы отвечать самому.
Эта функциональность пока не существует.
Я не могу поделиться документацией в данный момент, так как она является собственностью и конфиденциальной.
Если вы являетесь членом BT SIG, вы можете просмотреть дорожную карту Bluetooth в разделе панорама на bluetooth.org
Harrymc прав.
Это невозможно или, по крайней мере, нецелесообразно.
Вы могли бы спарить свой телефон с одним компьютером, а свою гарнитуру с другим компьютером, тем самым имея два соединения Bluetooth. Соединение между компьютерами можно объединить любым способом, который вам нравится, и, в свою очередь, передавать всю Bluetooth-коммуникацию. Это заставит выглядеть так, будто вы объединили Bluetooth по IP, и вы, вероятно, сможете заставить их взаимодействовать и выполнять некоторые из предполагаемых вами действий.
Но на самом деле между двумя устройствами нет соединения Bluetooth.
Устройство A имеет соединение Bluetooth с компьютером.
Устройство B имеет соединение Bluetooth с другим компьютером.
Эти два устройства не смогут спариться и подключиться друг к другу напрямую. Теоретически можно построить что-то, что позволит установить прямую Bluetooth-связь, но преодоление уровней и управление ключами связи будет настоящим кошмаром, и это всего лишь начало, у меня нет представления о том, как решить управление пакетами и частотное прыжки, частота прыжков Bluetooth составляет 1600 прыжков/с для одного слот-пакета.
Если кто-то действительно это сделал, я был бы очень впечатлён и очень хотел бы заглянуть под капот.
Смотрите https://esphome.io/components/bluetooth_proxy.html для Bluetooth-прокси, но с его ограничениями.
Ответ или решение
Bluetooth по IP (Bluetooth over IP) представляет собой концепцию, которая действительно привлекает внимание, однако на сегодняшний день существуют серьезные ограничения и технические трудности, которые не позволяют осуществить ее полноценную реализацию. В отличие от USB по IP, Bluetooth работает на более низком уровне модели OSI, что создает определенные сложности в организации передачи данных.
Проблематика
Bluetooth — это беспроводной стандарт, ориентированный на обмен данными на коротких расстояниях. Он использует различные протоколы и технологии, включая L2CAP и RFCOMM, для организации соединений между устройствами. Эти протоколы работают на низком уровне OSI, что делает их трудными для инкапсуляции в более высокие уровни протоколов, таких как IP.
Технические ограничения
-
Параллельные подключения: В отличие от USB, который можно "разделить" по IP, Bluetooth требует установления соединений между устройствами, что влечет за собой процесс их сопряжения. Поиск для установления соединения и управление ключами аутентификации (link keys), а также частота переключения между каналами (frequency hopping), усложняют задачу.
-
Протоколы передачи: Bluetooth использует свои собственные протоколы для передачи данных. В то время как UDP и TCP могут быть использованы поверх Bluetooth, попытка инкапсулировать Bluetooth-сообщения в пакетах IP является намного более сложной задачей, чем сделать это с USB.
Возможные обходные пути
Хотя полнофункциональный Bluetooth по IP не реализован, существуют некоторые способы взаимодействия между Bluetooth-устройствами через IP-протоколы:
-
Промежуточные устройства: Можно использовать компьютеры или серверы в качестве промежуточных узлов, к которым будут подключены Bluetooth-устройства. Например, можно подключить смартфон к одному компьютеру и Bluetooth-наушники к другому. Затем эти компьютеры могут обмениваться данными через IP-инфраструктуру. Это создаст видимость работы Bluetooth по IP, но на самом деле устройства подключены к разным компьютерам.
-
Использование виртуальных адаптеров: Возможно создание программных решений, которые эмулируют Bluetooth-устройства, отправляя и принимая данные через IP. Тем не менее, это потребует значительных усилий по программированию и поддержке всех аспектов Bluetooth.
-
Экспериментальные разработки: Исследуются и предлагаются экспериментальные протоколы, такие как draft-akers-atwal-btooth, которые могут потенциально сделать передачу IP-пакетов по Bluetooth более целесообразной, но эти разработанные спецификации остаются на уровне исследований и не имеют внедрения в основную практику.
Заключение
Таким образом, для реализации концепции Bluetooth по IP необходимо решить ряд технических проблем, связанных с протоколами и управлением соединениями. На данный момент нет стандартного способа разработки Bluetooth по IP, так как это требует глубокой интеграции и поддержки низкоуровневых функций Bluetooth, которые в основном реализуются производителями аппаратного обеспечения. Невозможность прямого соединения между Bluetooth-устройствами через IP превращает эту задачу в сложный и маловыполнимый проект без четкой потребности в широкой реализации.
За дополнительной информацией и для изучения возможных решений стоит обращаться к специализированным ресурсам и сообществам, занимающимся Bluetooth-технологиями и сетевыми протоколами.