Вопрос или проблема
Я хотел бы сделать ОЧЕНЬ маленький, с низким энергопотреблением сервер USB через IP. Я знаю, что в Linux есть пакет “usbip”, но доступен ли он на микроконтроллере, таком как ESP32?
Нет; насколько я знаю, единственный совместимый другой конец для модуля usbip
ядра Linux — это Windows, и модуль внутри ядра Linux, и ничего из этого не работает на ESP32. Это даже указано в FAQ:
Есть ли у вашей реализации USB/IP совместимость с другими подобными продуктами?
Нет, на данный момент.
Вам нужно что-то, что может работать под управлением Linux, например, система на модуле от Microchip, Rockchip или какая-то другая плата с SoC, способная запускать Linux (например, Raspberry Pi и другие).
Однако честная правда в том, что USB-over-IP, и особенно USB-over-IP-over-Wifi (учитывая, что вы упоминаете ESP32), почти всегда является неправильным выбором. USB — это очень «пинг-понговый» протокол на физическом уровне. Это означает большое количество маленьких пакетов, каждый из которых должен быть запрошен хостом. Это потребляет много пропускной способности и энергии и делает USB через сети с высокой задержкой невыносимо медленным или даже невозможным, если драйверы, взаимодействующие с USB-устройством, ожидают какой-то безвредной максимальной задержки и в противном случае предполагают неисправность.
Другими словами, независимо от того, что вы пробуете, сеть не является прозрачным транспортом для USB.
Гораздо разумнее разрешить низкопотребляющему удаленному устройству фактически выполнить роль USB-хоста и взаимодействовать с устройством, а затем просто предоставлять услугу, которую это устройство предлагает через подходящий для сети протокол. Например, если вы хотите подключить USB-накопитель, дайте низкопотребляющему устройству запустить сервер SFTP (ssh), SMB/CIFS или NFS. Если вы хотите подключить принтер, пусть оно запустит сервер печати; если вы хотите подключить сканер, пусть будет сервер сканера; если вы хотите подключить звуковой адаптер, сервер звука и так далее. Таким образом, вы используете сеть с соответствующим размером пакетов (и каждый пакет имеет высокую нагрузку), и задержка, ограничивающая пропускную способность, не является задержкой между двумя стековыми USB плюс сеть плюс фактическая задержка USB, а только задержка между одним стеком USB и устройством.
Это требует гораздо меньше ресурсов. Для некоторых из этих проблем на самом деле есть эталонные реализации, ориентированные на микроконтроллеры, которые вы можете портировать на свой конкретный ESP32.
Ответ или решение
Поддержка USB/IP на ESP32: Свет на ситуацию
Введение
Вопрос о поддержке протокола USB/IP на микроконтроллерах, таких как ESP32, вызывает интерес у разработчиков, стремящихся создать низкопотребляющее устройство, способное выполнять задачи, связанные с передачей данных по USB через сеть. Рассмотрим детали этой ситуации и подходим ли мы к возможности интеграции такого решения в проект.
Текущая реализация USB/IP
На данный момент реализация USB/IP, которая распространена в среде операционных систем, таких как Linux, использует четко определенные модули и архитектуру, которые не могут быть адаптированы для работы на платформе ESP32. USB/IP позволяет передавать устройства USB через сеть, предоставляя возможность взаимодействия с USB-устройствами, находящимися на удаленных хостах. Однако, реализация данного протокола требует наличия полной ОС, такой как Linux, что недоступно на легковесных системах, основанных на микроконтроллерах.
Как указано в FAQ, совместимость реализации USB/IP с другими аналогичными продуктами отсутствует. Это означает, что даже если бы мы попытались адаптировать USB/IP для ESP32, она не смогла бы эффективно работать из-за недостатка ресурсов и архитектурных ограничений микроконтроллера.
Проблемы с производительностью и надежностью
Технология USB, как известно, требует высокоточной и быстро отвечающей среды для работы с небольшими пакетами данных. USB функционирует на принципе запрос-ответ, где каждое устройство требует подтверждения от хоста перед отправкой данных. Высокая латентность, свойственная сетям Wi-Fi, делает использование USB-over-IP неэффективным и даже невозможным в некоторых случаях. Эта проблема усугубляется тем фактом, что многие драйвера USB уже предположительно принимают минимальные задержки, что в условиях нестабильной сети может приводить к сбоям.
Рекомендации по использованию ESP32
Более разумный подход к интеграции USB-устройств с ESP32 заключается в том, чтобы позволить этому низкопотребляющему устройству выполнять роль хоста USB, взаимодействуя непосредственно с подключенными устройствами, а затем предоставляя службы, соответствующие запросам удаленных клиентов через сетевые протоколы, такие как SFTP, SMB/CIFS или NFS. Например, при подключении USB-накопителя можно запустить сервер SFTP, а для принтеров — сервер печати. Такой подход не только упрощает взаимодействие, но и значительно экономит сетевые ресурсы.
Заключение
Подводя итог, можно с уверенностью сказать, что использование USB/IP в контексте ESP32 не является тем самым решением, которое обеспечит высокую производительность и эффективность. Вместо этого, рассмотрите возможность реализации сетевых сервисов, которые смогут взаимодействовать с USB-устройствами путем опосредованного доступа, что даст возможность более эффективно использовать ресурсы вашего проекта и обеспечить более стабильную работу.