8-900-374-94-44
[email protected]
Slide Image
Меню

Rndis cdc: Глава 2. Сведения о классах устройств USBX

Про передачу данных в сетях сотовой связи: klink0v — LiveJournal

?
Categories:
  • Технологии
  • IT
  • Cancel

Вот здесь я задавал вопрос про технологии передачи данных в сетях ОПСОСов (операторов сотовой связи). Чисто ради прикола тогда же я направил этот же вопрос в техподдержку Мегафона, но мне ожидаемо так никто и не ответил. Поэтому отвечаю себе сам.

Теоретически устройство само вольно выбирать по какому протоколу передавать данные: PPP или IP. Практически PPP уже давно никто не использует, потому как эти сессии на стороне оператора надо где-то терминировать, а следовательно и содержать под это дело весьма неслабую инфраструктуру.

В современных 3G и 4G-модемах протокол PPP используется исключительно как костыль, позволяющий без особых трудозатрат со стороны программистов передавать от системы к железке название APN, логин и пароль, а взамен получать IP-адрес на PPP-псевдоинтерфейс операционной системы. Всё. А реально установленная PPP-сессия терминируется самим же клиентским модемом, после чего дальше в эфир идёт уже «голый» IPv4 либо IPv6 (поверх PDP, разумеется).

Кроме того, в винде для RAS-интерфейса есть жестко вшитое ограничение на скорость передачи данных в районе 25 Мбит/с (если я ничего не путаю). Поэтому при переходе с 3G на LTE от костыля в виде PPP производителям оборудования волей-неволей пришлось отказываться. На смену PPP пришли интерфейсы CDC и RNDIS в различных реинкарнациях (вот хорошая статья в педивикии на тему). И если последний не позволяет передавать какие-либо настройки (APN, логин, пароль) от системы к модему, то вот первый с этим прекрасно справляется. Матерные аббревиатуры «QMI», «RMNET», «NCM» — принадлежат всё той же серии и обозначают конкретную реализацию того или иного протокола из семейства CDC.

Поэтому возвращаясь к моей задаче (организовать IPSec через LTE-сеть). Мне подойдёт любой LTE-модем, который подключается к компьютеру по USB с использованием протокола CDC (то есть не NDIS и не PPP). Если смотреть по спецификациям оборудования, то «расово правильные» модемы следует искать по буковкам «QMI» и/или «NCM». PPP не пойдет потому что тормозной; NDIS не годится потому что это будет уже не модем, а роутер. Роутер же не канает потому что нельзя получить честный белый IP непосредственно на системный интерфейс. Как-то так.

P.S. И да, я уже покрутил в своих руках LTE-терминал iRZ TL-21. Он шикарен и вообще весь из себя хорош всем, кроме цены. Под Linux-ом (Ubuntu 14.04) завёлся «из коробки» без каких-либо танцев с бубном. Внутри есть встроенный Watchdog. Будем тестировать его дальше.

Tags: Мегафон, ОПСОСы, железо, технологии

Subscribe

  • ОколоITшный дыбр #33

    Всю минувшую неделю ходил по граблям. Насобирал их энное количество. … Опытным путём выяснил, что в LTE-сетях трактористов (МТС) не ходят UDP…

  • Мимолётная мысль #74

    … Вот тут я писал про снежных собак. Пару недель назад в ближайшем парке кто-то слепил очередную. Вот. Кстати, простояла она чё-то довольно…

  • ОколоITшный дыбр #32

    … Сегодня принял в ЦОДе и смонтировал в шкафу несколько новых серверов. Катишь тележку из клиентской комнаты в машинный зал через четыре двери и…

Photo

Hint http://pics.livejournal.com/igrick/pic/000r1edq

Настройка сетевого соединения на Android-устройствах при подключении через USB к ПК

Mobile SMARTS платформа

← Предыдущая статья Читать далее «Устранение неполадок при подключении Android-устройства к ПК через ADB » →

Категории:  Как подключить ТСД к ПК с помощью USB-кабеля

Теги: Android, клиентское приложение, ТСД

Последние изменения: 28. 07.2020

Для работы с серверной базой Mobile SMARTS в большинстве случаев мобильные устройства должны быть подключены к Wi-Fi или к сотовой сети. Но в некоторых случаях подключение ТСД к Wi-Fi или сотовой сети невозможно, а база Mobile SMARTS должна работать в серверном режиме. Перевести базу в режим прямого обмена с ТСД через проводное подключение нельзя или нежелательно из-за особенностей внедренного решения (например, выполняется онлайн получение документов из учетной системы, после получения документов на ТСД работа может выполняться без связи с сервером).

При подключении Android-устройства к ПК через USB подключение выполняется в одном из следующих режимов (режим выбирается на самом устройстве):

  • MTP (Media Transfer Protocol) — протокол для передачи файлов. В данном режиме выполняется копирование файлов между устройством и ПК. При работе базы Mobile SMARTS в режиме прямого обмена через проводное соединение нужно выбрать на устройстве данную опцию.
  • PTP (Picture Transfer Protocol) — протокол для пересылки изображений из цифровых фотоаппаратов.
     
  • RNDIS (Remote Network Driver Interface Specification) — в данном режиме создается виртуальный канал Ethernet между устройством и ПК.
  • Иногда используются другие режимы: ADB (Android Debug Bridge), CDC Serial (Modem AT Proxy), USB Accessory Mode.

Для того, чтобы при проводном соединении через USB устройство могло подключиться к локальной сети для обмена данными с сервером Mobile SMARTS, следует использовать режим RNDIS. К сожалению, не все версии Android имеют поддержку данного режима. Кроме того, даже если поддержка есть, на ПК может потребоваться установка специального драйвера USB RNDIS, если стандартный драйвер, входящий в состав Windows, не подойдет для вашего устройства.

Как установить соединение в режиме RNDIS:

  1. На Android-устройстве необходимо включить режим разработчика. Для этого необходимо перейти в «Настройки» → «О телефоне», и семь раз подряд нажать на пункт «Номер сборки».

    Для Android 4. 4:

    В разделе настроек «Беспроводные сети» нажмите на пункт «Еще…» и поставьте галочку «USB Internet».

         

    Далее вам будет предложено выбрать версию Windows на ПК. Самая старшая из предложенных версий — Windows 8. Если используется версия старше, также выберите Windows 8. Нажмите «Готово».

       

    Для Android 7.0:

    В разделе «Для разработчиков» (Developer Options) выберите «Конфигурацию USB»:

       

  2. Далее на ПК войдите в «Панель управления» → «Центр управления сетями и общим доступом» → «Изменение параметров адаптера». Откроется окно со списком сетевых адаптеров:

    Если подключение выполнено успешно, добавится новый сетевой адаптер с типом устройства Remote NDIS based Internet Sharing Device.

  3. Для того, чтобы устройство, подключенное через виртуальный канал Ethernet могло устанавливать соединения с машинами в локальной сети, в свойствах основного сетевого подключения следует разрешить использование подключения другим участникам сети:

  4. На этом настройка завершена. Запустите клиентское приложение Mobile SMARTS на ТСД. При наличии соединения с сервером кнопка «Обмен с сервером» будет активна.

    Значок Wi-Fi перечеркнут, т.к. подключения к Wi-Fi сети нет, соединение с сервером выполняется через виртуальный канал Ethernet.

Была ли статья полезна?

Читать далее «Устранение неполадок при подключении Android-устройства к ПК через ADB » →

Android, клиентское приложение, ТСД

встроенный Linux — Как запрограммировать USB RNDIS?

спросил

Изменено 11 лет, 10 месяцев назад

Просмотрено 6к раз

Я использую одну плату контроллера, на которой работает Linux. Я хочу подключить свое устройство к хост-компьютеру (ОС Windows) через USB.

Я решил использовать класс RNDIS для связи между хостом и устройством. У меня есть готовый драйвер на стороне устройства (linux). Когда я подключаю свое устройство к хосту Windows, оно определяет оборудование как неизвестное устройство RNDIS/CDC. Сейчас для разработки драйверов под Windows я использовал «Jungo Windriver 10.10». Он сгенерировал файл INF, и мое устройство было успешно обнаружено в системе.

Как теперь я могу установить связь между хостом и устройством? Я хотел бы отметить, что я новичок в программировании и не имею опыта программирования на стороне Windows.

Я уверен, что мне придется разработать драйвер приложения для обеих сторон (Device-Linux и host-windows)

Кто-нибудь может подсказать, как мне это сделать?

Заранее спасибо….

  • usb
  • встроенный-linux

Во-первых, RNDIS в качестве стандартной поставки доступен в Windows XP и выше, а не в хост-стеке Jungo, а в MS.

Во-вторых, вы знаете, какой у вас готовый драйвер на стороне устройства? Это целевой боковой стек Jungo RNDIS?

Для связи между хостом и целью для устройства RNDIS попробуйте следующие две ссылки от MS, которые помогут вам понять канал управления и данных, а также настройку EP:

http://207. 46.16.248/en-us/ библиотека/ee483123(WinEmbedded.60).aspx http://download.microsoft.com/download/B/0/B/B0B199DB-41E6-400F-90CD-C350D0C14A53/%5BMS-RNDIS%5D.pdf

RNDIS использует два канала, один канал управления и один канал данных . Первоначальная связь начинается с канала управления, затем данные начинают передаваться по каналу данных, который использует две конечные точки BULK, IN и OUT.

Однако следует обратить внимание на то, что спецификация RNDIS требует, чтобы после отправка управляющего сообщения RNDIS в конечную точку канала управления, которую хост будет прослушивать даже в конечной точке прерывания.

Насколько я понимаю, Windows загружает универсальный USB-драйвер клиента (драйвер Jungo) для подключения вашего Linux-устройства. Затем вам нужно будет открыть соединение через конечные точки, возможно, в массовых конечных точках и из них, отформатировать данные (которые вы отправляете) через эти конечные точки в формате протокола RNDIS. Вы должны быть уверены, что ваше Linux-устройство действительно использует интерфейс RNDIS.

Для помощи я могу посоветовать использовать usb logger. Попробуйте подключить ваше Linux-устройство к Windows или Linux, где вы знаете, что это устройство было распознано каким-то драйвером, и там соединение, а затем сделайте журналы того, что происходит на USB. Кажется, вы начинаете исследовать интерфейс USB и его разные протоколы, я думаю, что лучше начать с чего-то готового, попытаться найти и узнать, как люди разбирают, понимают и пишут протоколы USB, например, для устройства kinect.

уже есть модули, которые могут помочь вам при подключении linux mc к win pc. Попробуйте найти модуль g_file_storage, например, который позволит вам монтировать образ файловой системы из linux mc для win pc в качестве отдельного диска, на котором вы можете выполнять форматирование, ввод файлов и т. д. Надеюсь, вы найдете больше в Google. … 🙂 Спасибо, АДЖ

Зарегистрируйтесь или войдите

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

usb — RNDIS «Композитное устройство» не может запуститься

Я разрабатываю составное устройство RNDIS, которое включает в себя устройство RNDIS, устройство usbnet, модемное устройство и самоопределяемое устройство CDC.

На ПК установлена ​​32-разрядная версия Win7, и я использую драйвер RNDIS по умолчанию. Когда я отвечаю на перечисление Windows только устройством RNDIS, все работает нормально. Но когда я включаю все 4 устройства в дескриптор как составное устройство, Windows по-прежнему правильно перечисляет, а остальные 3 устройства работают нормально, но устройство RNDIS сталкивается с проблемой «не удается запустить код ошибки 10».

Я проследил поток данных USB с помощью анализатора USB и обнаружил, что драйвер Windows RNDIS не отправлял сообщения инициализации RNDIS после «Set Configuration».

Опубликованный составной дескриптор устройства:

 devDesc[0] = 0x12; // bLength - Длина дескриптора
 devDesc[1] = 0x01; // bDescriptorType - Тип дескриптора
 devDesc[2] = bcdUSB_LSB; // bcdUSB (LSB) — Устройство, совместимое со спецификацией USB ..
 devDesc[3] = bcdUSB_MSB; // bcdUSB (старший бит)
 devDesc[4] = 0x00; // bDeviceClass - класс устройства
 devDesc[5] = 0x00; // bDeviceSubClass - подкласс устройства
 devDesc[6] = 0x00; // bDeviceProtocol - протокол устройства
 devDesc[7] = bEp0MaxPacketSize; // bMaxPacketSize0 - Максимальный размер пакета для нулевого EP
 devDesc[8] = 0x86; // idVendor (LSB) - ID продавца
 devDesc[9] = 0x12; // idVendor (MSB)
 devDesc[10] = 0x0E; // idProduct (LSB) - ID товара
 devDesc[11] = 0x81; // idProduct (MSB)
 devDesc[12] = 0x02; // bcdDevice (LSB) — номер версии устройства
 devDesc[13] = 0x00; // bcdDevice (старший бит)
 devDesc[14] = 0x01; // iManufacturer - Индекс строкового дескриптора, описывающего производителя
 devDesc[15] = 0x03; // iProduct - индекс строкового дескриптора, описывающего продукт
 devDesc[16] = 0x04; // iSerialNumber - Индекс строкового дескриптора, описывающего серийный номер
 devDesc[17] = 0x01; // bNumConfigurations - Количество конфигураций
 // Дескриптор конфигурации
 configDesc[0] = 0x09; // bLength - Длина дескриптора
 configDesc[1] = 0x02; // bDescriptorType - Тип дескриптора
 configDesc[2] = 177; // wTotalLength (LSB) - Общая длина данных для конфигурации,
 configDesc[3] = 0x00; // wTotalLength (MSB) — включает все дескрипторы для этой конфигурации
 configDesc[4] = 0x05; // bNumInterfaces - Количество интерфейсов, поддерживаемых этой конфигурацией
 configDesc[5] = 0x01; // bConfigurationValue — значение, которое следует использовать для выбора этой конфигурации
 configDesc[6] = 0x00; // iConfiguration - Индекс строкового дескриптора, описывающего эту конфигурацию
 configDesc[7] = 0xC0; // bmAttributes - бит 6: автономное питание, бит 5: удаленное пробуждение
 configDesc[8] = 0xfa; // MaxPower - Максимальная потребляемая мощность для данной конфигурации (мА)
 // Дескриптор интерфейса 0 usbnet
 configDesc[9] = 0x09; // bLength - Длина дескриптора
 configDesc[10] = 0x04; // bDescriptorType - Тип дескриптора
 configDesc[11] = 0x00; // bInterfaceNumber - Индекс (номер) этого интерфейса
 configDesc[12] = 0x00; // bAlternateSetting — значение для выбора альтернативной настройки этого интерфейса
 configDesc[13] = 0x03; // bNumEndpoints - Количество конечных точек, используемых этим интерфейсом
 configDesc[14] = 0xff; // bInterfaceClass - Класс этого интерфейса
 configDesc[15] = 0xff; // bInterfaceSubClass - Подкласс этого интерфейса
 configDesc[16] = 0x00; // bInterfaceProtocol - Протокол этого интерфейса
 configDesc[17] = 0x05; // iInterface - Индекс строкового дескриптора, описывающего этот интерфейс
 // дескриптор конечной точки usbnet
 configDesc[18] = 0x07; // bLength - Длина дескриптора
 configDesc[19] = 0x05; // bDescriptorType - Тип дескриптора
 configDesc[20] = 0x85; // bEndpointAddress — адрес и направление конечной точки
 configDesc[21] = 0x03; // bmAttributes - BULK,ISO,Прерывание
 configDesc[22] = 0x0F; // wMaxPacketSize (LSB) - Максимальный размер пакета
 configDesc[23] = 0x00; // wMaxPacketSize (СЗБ)
 configDesc[24] = bInterval; // bInterval - Интервал опроса (мс)
 configDesc[25] = 0x07; // bLength - Длина дескриптора
 configDesc[26] = 0x05; // bDescriptorType - Тип дескриптора
 configDesc[27] = 0x81; // bEndpointAddress — адрес и направление конечной точки
 configDesc[28] = 0x02; // bmAttributes - BULK,ISO,Прерывание
 configDesc[29] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Максимальный размер пакета
 configDesc[30] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (СЗБ)
 configDesc[31] = 0x00; // bInterval - Интервал опроса (мс)
 configDesc[32] = 0x07; // bLength - Длина дескриптора
 configDesc[33] = 0x05; // bDescriptorType - Тип дескриптора
 configDesc[34] = 0x02; // bEndpointAddress — адрес и направление конечной точки
 configDesc[35] = 0x02; // bmAttributes - BULK,ISO,Прерывание
 configDesc[36] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Максимальный размер пакета
 configDesc[37] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (СЗБ)
 configDesc[38] = 0x00; // bInterval - Интервал опроса (мс)
 // Дескриптор интерфейса 1 ICAT
 configDesc[39] = 0x09; // bLength - Длина дескриптора
 configDesc[40] = 0x04; // bDescriptorType - Тип дескриптора
 configDesc[41] = 0x01; // bInterfaceNumber - Индекс (номер) этого интерфейса
 configDesc[42] = 0x00; // bAlternateSetting — значение для выбора альтернативной настройки этого интерфейса
 configDesc[43] = 0x02; // bNumEndpoints - Количество конечных точек, используемых этим интерфейсом
 configDesc[44] = 0xFF; // bInterfaceClass - Класс этого интерфейса
 configDesc[45] = 0x00; // bInterfaceSubClass - Подкласс этого интерфейса
 configDesc[46] = 0x00; // bInterfaceProtocol - Протокол этого интерфейса
 configDesc[47] = 0x00; // iInterface - Индекс строкового дескриптора, описывающего этот интерфейс
 //Конечные точки ICAT
 configDesc[48] = 0x07; // bLength - Длина дескриптора
 configDesc[49] = 0x05; // bDescriptorType - Тип дескриптора
 configDesc[50] = 0x87; // bEndpointAddress — адрес и направление конечной точки
 configDesc[51] = 0x02; // bmAttributes - BULK,ISO,Прерывание
 configDesc[52] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Максимальный размер пакета
 configDesc[53] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (СЗБ)
 configDesc[54] = 0x00; // bInterval - Интервал опроса (мс)
 configDesc[55] = 0x07; // bLength - Длина дескриптора
 configDesc[56] = 0x05; // bDescriptorType - Тип дескриптора
 configDesc[57] = 0x08; // bEndpointAddress — адрес и направление конечной точки
 configDesc[58] = 0x02; // bmAttributes - BULK,ISO,Прерывание
 configDesc[59] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Максимальный размер пакета
 configDesc[60] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (СЗБ)
 configDesc[61] = 0x00; // bInterval - Интервал опроса (мс)
 //Специфические дескрипторы класса модема
 configDesc[62] = 0x09; // bLength - Длина дескриптора
 configDesc[63] = 0x04; // bDescriptorType - Тип дескриптора
 configDesc[64] = 0x02; // bInterfaceNumber - Индекс (номер) этого интерфейса
 configDesc[65] = 0x00; // bAlternateSetting — значение для выбора альтернативной настройки этого интерфейса
 configDesc[66] = 0x03; // bNumEndpoints - Количество конечных точек, используемых этим интерфейсом
 configDesc[67] = 0x02; // bInterfaceClass - Класс этого интерфейса
 configDesc[68] = 0x02; // bInterfaceSubClass - Подкласс этого интерфейса
 configDesc[69] = 0x01; // bInterfaceProtocol - Протокол этого интерфейса
 configDesc[70] = 0x00; // iInterface - Индекс строкового дескриптора, описывающего этот интерфейс
 configDesc[71] = 0x05; // длина дескриптора Класс связи CS_INTERFACE Триплет «Функциональные дескрипторы»
 configDesc[72] = 0x24; // тип дескриптора
 configDesc[73] = 0x00; // подтип = заголовок
 configDesc[74] = 0x10; // двоично-десятичный код
 configDesc[75] = 0x01; //
 configDesc[76] = 0x05; // 2.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *