Вот здесь я задавал вопрос про технологии передачи данных в сетях ОПСОСов (операторов сотовой связи). Чисто ради прикола тогда же я направил этот же вопрос в техподдержку Мегафона, но мне ожидаемо так никто и не ответил. Поэтому отвечаю себе сам.
Теоретически устройство само вольно выбирать по какому протоколу передавать данные: 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
Всю минувшую неделю ходил по граблям. Насобирал их энное количество. … Опытным путём выяснил, что в LTE-сетях трактористов (МТС) не ходят UDP…
… Вот тут я писал про снежных собак. Пару недель назад в ближайшем парке кто-то слепил очередную. Вот. Кстати, простояла она чё-то довольно…
… Сегодня принял в ЦОДе и смонтировал в шкафу несколько новых серверов. Катишь тележку из клиентской комнаты в машинный зал через четыре двери и…
Photo
Hint http://pics.livejournal.com/igrick/pic/000r1edq
Mobile SMARTS платформа
← Предыдущая статья Читать далее «Устранение неполадок при подключении Android-устройства к ПК через ADB » →
Категории: Как подключить ТСД к ПК с помощью USB-кабеля
Теги: Android, клиентское приложение, ТСД
Последние изменения: 28. 07.2020
Для работы с серверной базой Mobile SMARTS в большинстве случаев мобильные устройства должны быть подключены к Wi-Fi или к сотовой сети. Но в некоторых случаях подключение ТСД к Wi-Fi или сотовой сети невозможно, а база Mobile SMARTS должна работать в серверном режиме. Перевести базу в режим прямого обмена с ТСД через проводное подключение нельзя или нежелательно из-за особенностей внедренного решения (например, выполняется онлайн получение документов из учетной системы, после получения документов на ТСД работа может выполняться без связи с сервером).
При подключении Android-устройства к ПК через USB подключение выполняется в одном из следующих режимов (режим выбирается на самом устройстве):
Для того, чтобы при проводном соединении через USB устройство могло подключиться к локальной сети для обмена данными с сервером Mobile SMARTS, следует использовать режим RNDIS. К сожалению, не все версии Android имеют поддержку данного режима. Кроме того, даже если поддержка есть, на ПК может потребоваться установка специального драйвера USB RNDIS, если стандартный драйвер, входящий в состав Windows, не подойдет для вашего устройства.
Как установить соединение в режиме RNDIS:
На Android-устройстве необходимо включить режим разработчика. Для этого необходимо перейти в «Настройки» → «О телефоне», и семь раз подряд нажать на пункт «Номер сборки».
Для Android 4. 4:
В разделе настроек «Беспроводные сети» нажмите на пункт «Еще…» и поставьте галочку «USB Internet».
Далее вам будет предложено выбрать версию Windows на ПК. Самая старшая из предложенных версий — Windows 8. Если используется версия старше, также выберите Windows 8. Нажмите «Готово».
Для Android 7.0:
В разделе «Для разработчиков» (Developer Options) выберите «Конфигурацию USB»:
Далее на ПК войдите в «Панель управления» → «Центр управления сетями и общим доступом» → «Изменение параметров адаптера». Откроется окно со списком сетевых адаптеров:
Если подключение выполнено успешно, добавится новый сетевой адаптер с типом устройства Remote NDIS based Internet Sharing Device.
Для того, чтобы устройство, подключенное через виртуальный канал Ethernet могло устанавливать соединения с машинами в локальной сети, в свойствах основного сетевого подключения следует разрешить использование подключения другим участникам сети:
На этом настройка завершена. Запустите клиентское приложение Mobile SMARTS на ТСД. При наличии соединения с сервером кнопка «Обмен с сервером» будет активна.
Значок Wi-Fi перечеркнут, т.к. подключения к Wi-Fi сети нет, соединение с сервером выполняется через виртуальный канал Ethernet.
Была ли статья полезна?
Читать далее «Устранение неполадок при подключении Android-устройства к ПК через ADB » →
Android, клиентское приложение, ТСД
спросил
Изменено 11 лет, 10 месяцев назад
Просмотрено 6к раз
Я использую одну плату контроллера, на которой работает Linux. Я хочу подключить свое устройство к хост-компьютеру (ОС Windows) через USB.
Я решил использовать класс RNDIS для связи между хостом и устройством. У меня есть готовый драйвер на стороне устройства (linux). Когда я подключаю свое устройство к хосту Windows, оно определяет оборудование как неизвестное устройство RNDIS/CDC. Сейчас для разработки драйверов под Windows я использовал «Jungo Windriver 10.10». Он сгенерировал файл INF, и мое устройство было успешно обнаружено в системе.
Как теперь я могу установить связь между хостом и устройством? Я хотел бы отметить, что я новичок в программировании и не имею опыта программирования на стороне Windows.
Я уверен, что мне придется разработать драйвер приложения для обеих сторон (Device-Linux и host-windows)
Кто-нибудь может подсказать, как мне это сделать?
Заранее спасибо….
Во-первых, 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.
уже есть модули, которые могут помочь вам при подключении linux mc к win pc. Попробуйте найти модуль g_file_storage, например, который позволит вам монтировать образ файловой системы из linux mc для win pc в качестве отдельного диска, на котором вы можете выполнять форматирование, ввод файлов и т. д. Надеюсь, вы найдете больше в Google. … 🙂 Спасибо, АДЖ
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Электронная почта
Требуется, но не отображается
Электронная почта
Требуется, но не отображается
Я разрабатываю составное устройство 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.