Как рекламировать VNC-сервер с использованием UPnP?

Вопрос или проблема

Я размышляю над идеей возродить стандарт 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-сессия, при этом должны быть выполнены следующие шаги:

  1. VNC-сервер должен ожидать, когда VNC-клиент установит TCP-соединение по предоставленному URL.
  2. VNC-клиент должен установить TCP-соединение по предоставленному URL.
  3. 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 для реализации рекламы вашего сервиса. Вот общая последовательность действий:

  1. Установка libupnp:

    sudo apt-get install libupnp-dev
  2. Программирование сервиса:
    Используя 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 сервис запущен и доступен.")
  3. Обработка запросов:
    Вам также понадобится код, который будет обрабатывать запросы на запуск приложений и инициализацию сессий VNC. Это можно реализовать с помощью Flask или любого другого веб-фреймворка для управления HTTP запросами.

Шаг 4: Проверка работы

После того как вы настроили сервер и запустили его, проверьте, виден ли ваш VNC сервера в сети. Вы можете использовать такие инструменты, как UPnP Inspector или любой UPnP клиент, чтобы увидеть ваши услуги.

Шаг 5: Подключение к VNC

Когда MirrorLink клиент (ваш автомобиль) захочет подключиться к VNC серверу, он должен сделать TCP соединение по URL, который вы вернули. Убедитесь, что ваш сервер слушает на правильном порту и может обрабатывать входящие соединения.

Заключение

Теперь у вас есть общее представление о том, как рекламировать VNC сервер с использованием UPnP. Вы используете описание сервиса, запускаете сервер на Raspberry Pi, обрабатываете соответствующие запросы и обеспечиваете доступ через TCP соединения.

Если у вас есть дополнительные вопросы или возникли сложности, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...