Comments 27
кто-нибудь понял суть проблемы автора?
сейчас буквально любая usb-сетевуха работает с буквально любым телефоном, просто подключаешь и сразу пользуешься, ничего не нужно делать дополнительно. у него какой-то другой более сложный юзкейс?
Тоже не понял. Сколько было всяческих переходников типа "8" в 1 с Ethernet на борту, сколько разных мобил - ни разу проблем не было.
Столкнулся с подобным, когда хотел написать приложение для настройки раций Motorola. По usb они через cdc подымают сетевой интерфейс и далее уже общаются по tcp-соединению. В итоге, завелось только на айфоне.
а можно подробней? что можно сделать с рациями Motorola через айфон?
Если смотреть свежие серии DP4000/DM4000 (на DP3000 в айфоне нет драйвера, а с совсем свежими R7 не сталкивался), то почти все, если разобрать протокол работы с ними.
Я делал тестовую для работы с базовыми функциями, т.к. задача была убрать возможность переключения зоны радиостанции, а каждый перешивать для смены зоны - неудобно. Писал на очень странной платформе "Apache Cordova", т.к. исторически сложилось, что все либы для работы я написал на js, а переписывать на java/swift - нет времени и ресурсов, это все же pet-проект.
Скрытый текст

очень интересно почитать про протоколы работы. Как смогли считать данные с РС? Если можно поясните с чего начать? есть тоже пару идей, но не знаю в какую сторону копать начинать
https://github.com/rick51231/node-dmr-lib/ , но пока нет времени обновлять ее дальше. Те радиостанции, которые попадались мне, работают по протоколу XCMP.
Изучал через сниффер пакетов от родного софта (cps, rm) и стороннего (trbonet, smartptt, transtrbo/trbotools и другие, которые умеют подключать станцию как control station).
сейчас буквально любая usb-сетевуха работает с буквально любым телефоном
Сейчас это когда ? На какой версии Android ? Автор показал почему оно НЕ работает на его устройстве (Samsung Galaxy S20, Android 13). Возможно, в более новых версия Android либо исправили regexp определяющий имя сетевого интерфейса (добавили что-то типа \|usb\\d), либо ядро Linux сконфигурировали так, чтобы всем сетевым интерфейсам присваивалось имя вида eth?. На ядре linux 6.x сетевому интерфейсу устройства CDC Ethernet Gadget всё еще присваивается имя usb? поумолчанию. Подозреваю, что это можно настроить в Device-Tree без перекомпиляции ядра.
сейчас это последние лет шесть, куча разных телефонов, такая же куча usb сетевух, до последнего noname с алиэкспресс за пачку сухарей - всё просто работает, и всегда работало.
также по своим увлечениям вращаюсь в довольно большом комьюнити, где всем нужна usb сетевуха и у всех естественно самые разные телефоны. чтобы сетевуха не заработала с каким-то телефоном не видел ни разу, как и каких-то гайдов/советов по выбору сетевух. никому это не нужно, всё просто работает искаропки у всех.
тут вот выше упомянули рации, возможно какие-то девайсы (не usb сетевухи, а что-то специфическое) так себя и ведут, я не знаю, поэтому и спросил. но в тексте понамешаны и сетевые карты, и какие-то умные гейтвеи притворяющиеся сетевухой, возможно из-за кривого перевода, непонятно нифига
у вас вот прям были случаи с не доисторическим железом, чтобы вокнули обычный usb-ethernet адаптер и он не заработал?
У меня похожая история. Один и тот же USB-хаб раздаёт интернеты по проводу на Mi Pad 6 (ядро 4.19.157, андроид 14), но Mi Pad 5 (ядро 4.14.180, андроид) при этом полностью игнорирует сетевой интерфейс. И Mi Note 10 Pro (ядро 4.14.180, андроид 11) тоже ethernet не видит.
Хм, только сейчас заметил, что у них одна версия ядра (хотя сборка разная -- хеш отличается).
На Pixel 9 проблем тоже нет, кстати -- он ещё и отдельно отмечает значком, что подключен интернет по проводу.
ну, как минимум один (хоть и немножко странный) юзкейс придумать могу. подключить кабелем один телефон к другому и на слейве включить режим usb-модема. оно там как раз cdc-ethernet поднимет и задетектится как usb0.
Источник: https://news.ycombinator.com/item?id=44219405
Обойти проблему можно выставив метку в MAC:
Thanks, setting the MAC address to global bit works on my Moto Android 15, Honor Android 9, and GSI 16 from a Raspberry Pi [1].
It now appears as eth0 and routes created only after turning off the Wi-Fi, DHCP is obtained regardless.
ECM scores 270Mbit, RNDIS 150Mbit.
А тут подробнее про изменения в коде:
It was later reverted1 because "there are devices in the field using usbX interfaces for tethering". Shortly after that, it got re-landed but only supported Android V+2
Что-то я не понял проблемы. Если проблема в строчке конфига, то что мешает исправить эту строчку на верную? При чём тут рут/не рут? Ты уже подключился по ADB, значит же, уже есть рут?
Строчка конфига - задаётся при сборке ядра, а не в рабочей системе. Вам надо пересобрать ядро конкретно для вашей модели телефона, изменив этот параметр (а производители далеко не всегда дают нормальные исходники), залить его (т.е. требуется разблокировать загрузчик) и уже потом этот тип устройств будет работать.
ADB с рутом вообще напрямую не связано и прекрасно работает без разблокировки загрузчика и рута - вот только прав особых при этом не будет.
При какой такой сборке ядра? Я говорю про конфиг, в котором определён параметр config_ethernet_iface_regex
с регуляркой, по которой андроидная часть (которая на Java написана) опознаёт нужные интерфейсы. Что мешает его отредактировать?
PS. Кстати, удивительно, для чего вообще в принципе эта регулярка нужна. Закрадывается подозрение, что андроидная часть просто парсит этой регуляркой какой-то выхлоп системных утилит типа ifconfig
. Спрашивается — нахрена так? Неужели у ядра нет API вида «перечисли мне все адаптеры Ethernet», что приходится такими костылями добывать нужную информацию?
Неужели у ядра нет API вида «перечисли мне все адаптеры Ethernet»
да.. как тов голову не приходило наверное что будут мобильник по "ужасному проводу" подключать в то время когда полно "чудесных" беспроводных технологий ;)
перечислилка адаптеров https://developer.android.com/reference/java/net/NetworkInterface#getNetworkInterfaces()
выдает перечень, но если адаптер не eth а usb как здесь и описано то это некоторая проблема
Как будто бы перечисление адаптеров определённого вида только мобильникам нужно. Уверен, во всяких модемах/маршрутизаторах это тоже далеко не последняя часть.
Ссылка, которую вы дали — это как раз и есть андроидная часть, а я говорю про ядро linux. Вот в комментарии ниже DaemonGloom предложил более правдоподобную версию — что для ядра всё является ethernet-адаптером, что для андроида могут быть разными устройствами. Правда, я всё равно не понимаю — ядро же их тоже как-то должно различать и явно не по строчке названия (которое оно само же и генерирует), а значит, скорее всего, должен быть механизм запроса адаптеров определённого вида.
Конфиг из framework - скорее всего, потребует замены прошивки целиком. Это крайне вендорозависимый кусок софта, разобрать и собрать обратно его крайне проблематично. Не говоря уж о несовпадении подписи.
Вся суть регулярки - в том, чтобы не включить в этот список разнообразные lte-модемы, vpn и прочие штуки, которые тоже формально являются ethernet устройством с точки зрения ядра.
ADB с рутом вообще напрямую не связано и прекрасно работает без разблокировки загрузчика и рута - вот только прав особых при этом не будет.
Насколько я помню по процедуре включения ADB на своём телефоне, чтобы он заработал, сначала надо активировать режим разработчика, до галочки которого можно добраться, прожав какую-то хитрую комбинацию в настройках телефона. Я так понимаю, это и есть та самая «разблокировка».
Почему Android не может использовать CDC Ethernet