Вопрос или проблема
Я размышляю над идеей возродить стандарт MirrorLink, реализовав его на базе Linux, так как в моей машине не поддерживается Android Auto, и я не хочу заменять устройство только из-за этого.
Я нашел документацию по MirrorLink
Согласно этой документации, я должен установить TCP-соединение между клиентом ML (автомобильная магнитола) и сервером (смартфон) и использовать UPnP для объявления, какие приложения на основе VNC я могу использовать. (Если я правильно понял)
В настоящее время у меня есть Raspberry Pi с операционной системой RPi OS, работающая в качестве сервера MirrorLink (смартфон). У меня запущен DHCP-сервер, и я вижу, что моя машина получает IP-адрес. MirrorLink использует VNC для отображения содержимого на сенсорном экране автомобиля, поэтому у меня работает VNC-сервер на стандартном порту.
Моя проблема заключается в недостатке знаний по UPnP. Вот цитата из документации:
Запуск VNC-сервера автоматически осуществляется через UPnP. VNC-сервер MirrorLink должен быть запущен, когда запускается любое приложение в ответ на действие LaunchApplication сервиса UPnP TmApplicationServer:1, как указано в [4]. Действие LaunchApplication должно вернуть URL к VNC-серверу, который проводит VNC-сессию. Если возвращенный URL уже используется в любой установленной VNC-сессии, эта сессия продолжится без каких-либо изменений. В противном случае должна быть установлена новая VNC-сессия, при этом должны быть выполнены следующие шаги:
- VNC-сервер должен ожидать, когда VNC-клиент установит TCP-соединение по предоставленному URL.
- VNC-клиент должен установить TCP-соединение по предоставленному URL.
- VNC-сервер и клиент должны инициализировать VNC-сессию в соответствии с VNC-протоколом.
Я думаю, что смогу написать XML-файл, являющийся описанием сервиса, который я хочу объявить через UPnP, но не знаю, как точно его рекламировать в локальной сети. ЕдинственныеTutorials которые я нашел касались использования UPnP для потоковой передачи медиаданных или перенаправления портов. Я предполагаю, что может быть какая-то библиотека, которая может помочь? Возможно ли это с помощью apache2?
Я был бы признателен за:
- любую информацию о том, как рекламировать сервисы через UPnP в локальной сети
- любую обратную связь о терминах, которые я использовал неправильно
Ответ или решение
Чтобы рекламировать VNC сервер с помощью UPnP, вам потребуется выполнить несколько шагов, начиная с создания описания сервиса и заканчивая фактической реализацией и отправкой уведомлений на локальную сеть. Давайте разберём по порядку.
Шаг 1: Изучение UPnP
UPnP (Universal Plug and Play) — это набор сетевых протоколов, который позволяет устройствам находить и взаимодействовать друг с другом в сети. Основные компоненты UPnP включают Discovery (обнаружение), Control (управление) и Eventing (события).
Шаг 2: Создание XML описания сервиса
Вы правы, создавая XML файл для описания вашего сервиса. Этот файл описывает, как к вашему VNC серверу можно подключиться. Пример структуры XML может выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="urn:schemas-upnp-org:service-1-0">
<service>
<serviceType>urn:upnp-org:service:TmApplicationServer:1</serviceType>
<serviceId>urn:upnp-org:serviceId:TmApplicationServer</serviceId>
<SCPDURL>/path/to/your/service.xml</SCPDURL>
<controlURL>/path/to/your/control</controlURL>
<eventSubURL>/path/to/your/eventsub</eventSubURL>
</service>
</root>
Шаг 3: Реализация UPnP на Raspberry Pi
На Raspberry Pi вы можете использовать библиотеку libupnp
для реализации рекламы вашего сервиса. Вот общая последовательность действий:
-
Установка libupnp:
sudo apt-get install libupnp-dev
-
Программирование сервиса:
Используя C/C++ или Python, вы можете написать программу, которая будет рекламировать ваш VNC сервер. Если вы предпочитаете Python, вы можете использовать библиотеки, такие какminiupnpc
илиpyupnp
.Вот простой пример на Python с использованием библиотеки
pyupnp
:from upnpy import UPnP upnp = UPnP() # Запуск UPnP upnp.start() # Рекламируем VNC сервер upnp.add_service( service_type="urn:upnp-org:service:TmApplicationServer:1", service_id="urn:upnp-org:serviceId:TmApplicationServer", scpd_url="/path/to/your/service.xml", control_url="/control", event_sub_url="/eventsub" ) print("UPnP сервис запущен и доступен.")
-
Обработка запросов:
Вам также понадобится код, который будет обрабатывать запросы на запуск приложений и инициализацию сессий VNC. Это можно реализовать с помощью Flask или любого другого веб-фреймворка для управления HTTP запросами.
Шаг 4: Проверка работы
После того как вы настроили сервер и запустили его, проверьте, виден ли ваш VNC сервера в сети. Вы можете использовать такие инструменты, как UPnP Inspector или любой UPnP клиент, чтобы увидеть ваши услуги.
Шаг 5: Подключение к VNC
Когда MirrorLink клиент (ваш автомобиль) захочет подключиться к VNC серверу, он должен сделать TCP соединение по URL, который вы вернули. Убедитесь, что ваш сервер слушает на правильном порту и может обрабатывать входящие соединения.
Заключение
Теперь у вас есть общее представление о том, как рекламировать VNC сервер с использованием UPnP. Вы используете описание сервиса, запускаете сервер на Raspberry Pi, обрабатываете соответствующие запросы и обеспечиваете доступ через TCP соединения.
Если у вас есть дополнительные вопросы или возникли сложности, не стесняйтесь задавать их!