RoboCraft
Соответственно одной коммерческой задаче мне придется использовать 3G-модем вместе с Raspberry. В качестве 3G-дейвайса был выбран комплект МТС Коннект 4 (дело было в г.Обнинск, выбирать особо не пришлось). Цель — поднять соединение с авто подключением и реконнектом при дропе.
Исходная точка:
1. Raspberry Pi (версия не важна).
2. Raspbian Debian Wheezy Version: January 2014 Release date: 2014-01-07.
3. Плата питается от блока питания 5V 1A. Не пытайтесь запустить RPi от USB (USB отдает всего 500 мА максимум). При питании от USB RPi будет постоянно перезагружаться из-за нехватки питания.
4. Подключение к интернету.
Первым делом я подцепил модем к моноблоку с Windows на борту, поставил Коннект-менеджер с модема и подключился к интернету, дабы удостовериться, что соединение есть и все любые последующие проблемы будут только из-за того, что у меня кривые руки. Коннект есть, трафик считается, гугл открывается, можно работать уже на Raspberry.
ДЕЛАЕМ МОДЕМ МОДЕМОМ
Как ни странно, но после подключения модема к USB он определяется как диск. Для переключения его в режим модема необходимо установить usb-modeswitch. Заодно подтянем и все необходимое, а после совершим reboot:
После перезагрузки проверяем, что теперь у нас из себя представляет модем и доступны ли его порты:
Вот и отлично. Можно начинать работать. под ttyUSB2 у меня клавиатура. Для начала, подключимся к модему через терминал minicom и узнаем его модель посредством AT-команды ati0. Делается это просто — набираем команду и нажимаем Enter:
Для выхода из minicom следует нажать Ctrl + A затем Q и подтвердить выход. Теперь мы точно удостоверились в модели модема на случай, если придется прыгать с бубном.
Кстати, мы приблизились к первой проблеме — если мы сейчас выключим и включим Raspberry, то при вводе команды lsusb мы увидим следующее:
Наш модем снова стал накопителем, сменился ID устройства (с 12d1:1506 на 12d1:155b, где 12d1 — ID вендора) и снова превратился в cdrom. И так будет всегда, если RPi будет включаться с уже вставленным модемом, т.е. до подачи питания. На данном этапе это лечится передергиванием модема (вынул-всунул) и в принципе, может и не критично. Конкретно в моей ситуации, такое поведение ОС меня не устраивает, поэтому буду добиваться однозначного определения модема при включении.
Для решения данной проблемы необходимо создать файл /etc/udev/rules.d/41-usb_modeswitch.rules:
и пишем в него следующую строчку (если у вас другой модем, не забудьте вставить туда свои ID производителя и устройства):
Важно задать правило для udev именно для ID, по которому у нас определяется модем как накопитель, а не наоборот. Т.е. 12d1 155b — это накопитель, 12d1 1506 — это модем. В файл rules вписываем ID накопителя
Для надежности и достоверности теста можно передернуть питание. Включаем RPi и сразу смотрим на вывод
. Если определился как модем — то все отлично, если нет — то вам в список полезных ссылок=))
ПОДКЛЮЧЕНИЕ К 3G
Есть два пути — ручная настройка или использование сторонних разработок. Для простоты выберем второй вариант.
Создадим папку, скачаем в нее Sakis3G, разархивируем и дадим права на выполнение данной утилиты
Далее, запустим Sakis3G в интерактивном режиме для установления соединения:
sakis3g имеет графическое меню. В принципе, оно должно быть понятно. Для установления соединения будем выбирать следующие пункты
Connect with 3G / USB device / Mobile Connect / Interface #0 /
В следуюющем окне под названием «Please select APN» просят выбрать из двух вариантов:
1. (internet.mts.ru) — это настройки, я так понимаю, зашитые в модем
2. Custom APN…
Можно не заморачиваться и выбрать первый пункт. Параметры будут указаны автоматически.
При выборе второго пункта, придется в последующем вводить параметры APN:
1. APN: internet.mts.ru
2. APN_USER: mts
3. APN_PASS: mts
и только после этого будет осуществляться попытка соединения.
Указанные мною параметры APN — для Калининградской области. Для другого региона узнайте их у своего оператора, как это и советует программа.
После подключения появится сообщение о том, что ваш модем подключен к сети. Жмем ОК и попадаем в главное меню. Можно выйти, получить информацию о соединении или отключиться от сети.
Если просмотреть все пункты в во всех меню sakis3g, то нигде нельзя будет найти опции — авто реконнект при потере соединения. К сожалению нужна еще одна утилита.
РЕКОННЕКТ ПРИ ДРОПЕ
Скачаем утилиту umtskeeper, разархивируем в каталог
ВАЖНО! umts_keeper уже идет вместе с sakis3g. Поэтому можно качать только umts_keeper и не делать предыдущий шаг.
Для автоматического подключения и реконнекта при дропе необходимо запустить umtskeeper с соответствующими параметрами (в моем случае с МТС и ID модема 12d1:1506):
После этого ждем, пока не загорится диод на модеме, сообщающий, что все хорошо и интернет есть. Завершить работу umtskeeper можно нажатием Ctrl+C.
Действие данной утилиты с данными параметрами происходит безмолвно, поэтому смотрим лог:
Для авто подключения при запуске RPi воспользуемся одним из вариантов, а именно — редактированием /etc/rc.local:
куда внесем запуск umtskeeper (не забудьте указать путь, специфичный вашей Raspberry). Не забываем в конце поставить & для запуска в фоне:
Перезагружаемся и проверяем.
РЕЗЮМЕ И КРИТИКА
Критика, как всегда одна — высокоуровневые утилиты, настройка не через файлы конфигов, что понижает прозрачность и надежность. Я думаю, это тема для отдельной статьи.
Raspberry Pi 3 и USB Modem ZTE MF823D
Задача: научить Raspberry Pi 3 общаться через Usb модем
Мне всегда было интересно, а можно ли к миникомпьютеру Raspberry Pi 3 Model B подключить имеющийся у меня модем (USB модем LTE USB Modem ZTE MF823D) от Beeline который я проапгрейдил/отучил от SIM карты изначального заточенного под него поведения, а оператора TELE 2. Т.к. текущий тарифы куда выгоднее, к примеру за 400р целых 12Gb интернета. А в моих проектах это как нельзя кстати. Так вот ниже все что потребовалось, чтобы мой миникомпьютер научился ходить в интернет без привязки к проводному домашнему интернету.
Подключаю модем в любой свободный порт на Raspberry Pi 3, открываю консоль и вижу всю информацию по нему как опознала его система:
[Sun Apr 9 14:16:29 2017] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[Sun Apr 9 14:16:29 2017] usb 1-1.2: New USB device found, idVendor=19d2, idProduct=1403
[Sun Apr 9 14:16:29 2017] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[Sun Apr 9 14:16:29 2017] usb 1-1.2: Product: ZTE Technologies MSM
[Sun Apr 9 14:16:29 2017] usb 1-1.2: Manufacturer: ZTE,Incorporated
[Sun Apr 9 14:16:29 2017] usb 1-1.2: SerialNumber: MF825C0ZTED00000CP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0
[Sun Apr 9 14:16:29 2017] usb-storage 1-1.2:1.2: USB Mass Storage device detected
[Sun Apr 9 14:16:29 2017] scsi host0: usb-storage 1-1.2:1.2
[Sun Apr 9 14:16:29 2017] usbcore: registered new interface driver cdc_ether
[Sun Apr 9 14:16:29 2017] rndis_host 1-1.2:1.0 usb0: register ‘rndis_host’ at usb-3f980000.usb-1.2, RNDIS device, 36:4b:50:b7:ef:2d
[Sun Apr 9 14:16:29 2017] usbcore: registered new interface driver rndis_host
[Sun Apr 9 14:16:29 2017] usbcore: registered new interface driver rndis_wlan
[Sun Apr 9 14:16:30 2017] scsi 0:0:0:0: CD-ROM CWID USB SCSI CD-ROM 2.31 PQ: 0 ANSI: 2
[Sun Apr 9 14:16:30 2017] sr 0:0:0:0: [sr0] scsi-1 drive
[Sun Apr 9 14:16:30 2017] cdrom: Uniform CD-ROM driver Revision: 3.20
[Sun Apr 9 14:16:30 2017] sr 0:0:0:0: Attached scsi CD-ROM sr0
[Sun Apr 9 14:16:30 2017] sr 0:0:0:0: Attached scsi generic sg0 type 5
Смотрю какое устройство сейчас в системе:
$ lsusb | grep ZTE
Bus 001 Device 004: ID 19d2:1403 ZTE WCDMA Technologies MSM
USB модем поднимает в системе устройство с присвоенным IP адрес от DHCP— сервиса (по умолчанию: 192.168.0.1) на самом модеме:
usb0 Link encap:Ethernet HWaddr 36:4b:50:b7:ef:2d
inet addr:192.168.0.182 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:60 errors:0 dropped:0 overruns:0 frame:0
TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
RX bytes:13257 (12.9 KiB) TX bytes:7378 (7.2 KiB)
Вижу что в системе модем представился сетевой картой и получил от DHCP сервиса модема сетевой адрес: 192.168.0.182, а сам модем работает по адресу 192.168.0.1, если подключиться через VNC к Raspberry Pi 3 Model B и открыть браузер где в строке адреса указать: http://192.168.0.1 я увижу, что модем работает и интернет подается через мобильного оператора Tele2:
Клавиша Win → Internet — Chromium Web Browser: затем нажимаю Ctrl +L чтобы курсор встал в строку адреса и набираем здесь: http://192.168.0.1 и нажимаем клавишу Enter
Так отлично, модем видит интернет от SIM карты оператора Tele2, теперь на системе Raspbian смотрю, как настроены маршруты для выхода в интернет:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default router 0.0.0.0 UG 202 0 0 eth0
default 192.168.0.1 0.0.0.0 UG 204 0 0 usb0
192.168.0.0 * 255.255.255.0 U 204 0 0 usb0
192.168.1.0 * 255.255.255.0 U 202 0 0 eth0
- сеть 192.168.0.0/24 → от DHCP-сервиса модема
- сеть 192.168.1.0/24 → от DHCP-сервиса моего Mikrotik“а
Проверяю, а есть ли интернет через интерфейс USB модема:
$ ping -I usb0 ya.ru
PING ya.ru (213.180.204.3) from 192.168.0.182 usb0: 56(84) bytes of data.
64 bytes from www.yandex.ru (213.180.204.3): icmp_seq=1 ttl=53 time=815 ms
64 bytes from www.yandex.ru (213.180.204.3): icmp_seq=2 ttl=53 time=395 ms
64 bytes from www.yandex.ru (213.180.204.3): icmp_seq=3 ttl=53 time=395 ms
Да есть но вот время отклика меня как-то смущает.
Проверяю, а есть ли интернет через интерфейс eth0 самой платы:
$ ping -I eth0 ya.ru
PING ya.ru (93.158.134.3) from 192.168.1.124 eth0: 56(84) bytes of data.
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=1 ttl=57 time=5.40 ms
64 bytes from www.yandex.ru (93.158.134.3): icmp_seq=2 ttl=57 time=4.27 ms
Из данного вывода видно, что доступ в сеть интернет наиболее стабильно будет вести при использовании интернет локальной сети чем USB модема, но это и так изначально было понятно. Просто я хотел рассмотреть и альтернативную возможность, так сказать резервный интернет. Что очень хорошо, что система Raspbian самостоятельно определила USB-модем и его ни как не пришлось настраивать, за исключением что нужно настроить на максимальную безопасность фаервола (либо через ufw, либо через iptables) и сервис удаленного подключения из вне, а лучше соединение c ним вести через VPN сеть.
Итак, что я имею сейчас, интернет через USB модем от миникомпьютера возможен. Пока на этой ноте я прощаюсь, я уже задумал следующие заметки:
- Это настройка фаервола
- Это настройка VPN клиента для безопасного подключения к миникомпьютеру Raspberry Pi 3 Model B удаленно.
А пока я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.
Internet for Raspberry Pi
Raspberry Pi — одноплатный компьютер размером с банковскую карту, изначально разработанный как бюджетная система для обучения детей программированию. Но в итоге это стало целой платформой, которой пользуются не только дети для обучения, но и программисты для проектов.
Изначально статья писалась как обучающий материал, поэтому в ней могут быть слишком очевидные моменты.
Иногда нет необходимость или возможности использовать роутер, когда работаешь с Raspberry Pi, то есть не можешь подключить RPi к Интернетам по Ethernet-кабелю. Тогда можно просто напрямую подключить к ней модем и получить Интернеты.
Оборудование
Чтобы справиться с поставленной задачей, мы возьмем:
или любой другой модем.
В некоторых статьях пишут, что нужен хаб с активным питанием, потому что модем потребляет энергии больше, чем Raspberry Pi, но мы обошлись без него.
Стоит отметить, что для Raspberry Pi есть список поддерживаемых модемов, и в нём модема, что используем мы, нет. Но грустить не стоит, во-первых, потому что это немного устаревший список. И, во-вторых, потому что ядро Linux всегда можно кастомизировать.
Наверное, у вас возник вопрос: “Почему два модема?” Ответ довольно простой. На момент написания статьи в wiki нашей лаборатории был только E3272, который поддерживал 4G. А немного позже, уже на работе, в проекте нам понадобилось перевести Cubieboard на модем с 4G. Смысл тот же, потому что и на RPi, и на Cubie Linux :-)Тогда-то и был протестирован написанный алгоритм на другом модеме—E3372H.
“Только модем”
Система Raspberry Pi, как и других микрокомпьютеров, — это немного измененный Linux, у нас стоит Raspbian (это Debian). Значит есть две проблемы:
- Как известно, под Linux просто так, как в Windows, драйвера не устанавливаются.
- К тому же многие модемы могут работать в нескольких режимах:
- CD — как загрузочный диск
- SD — как usb-накопитель
- MODEM — как модем
Кроме этого, режимы могут совмещаться, то есть работать в параллели.
Чтобы RPi могла спокойно «увидеть» и начать работать с модемом как с модемом, надо явно (или принудительно) сказать Huawei, что у него по умолчанию будет включен режим модем.
Такой проблемы не возникло на модеме более нового поколения (E3372H). Я просто включила модем в микрокомпьютер, поменяла на нём же режим и проделала остальные необходимые действия.
Модем
Но всё же рассмотрим, как поменять режим модема на примере операционной системы Windows.
Вставляем модем в компьютер. Видим, что сразу же запускается стандартная программа, которая позволяет соединяться с сетью Интернет.
Это означает, что в модеме режим usb-накопителя включен.
Чтобы спокойно переключить режимы в модеме, надо закрыть программу для подключения к сети Интернет. Иногда бывает недостаточно просто закрыть приложении, поэтому завершаем процесс.
Обычно модемы общаются AT-командами.
AT-команды — это такие специальные наборы правил, которые используются для программирования телекоммуникационного оборудования.
Чтобы изменять настройки модема и использовать эти команды, нам нужна любая терминальная программа. Существуют специализированные программы, которые работают именно для программирования AT-команд. Но нам подойдет и PuTTY.
Узнаем, на какой COM-порт подцепился модем. С этим знанием открываем putty, в разделе «Сессии» выбираем тип соединения Serial, вводим номер COM-порта и скорость устанавливаем в 115200 bps.
В разделе «Терминал» локальный отклик и редактирование строк надо установить в статус «включено»:
Теперь, когда мы настроили всё, нажимаем «соединиться» и видим черный экран. Для проверки связи введем функцию
Эта функция показывает нам информацию о модеме.
Теперь можно ввести одну из этих функций:
Причем нам нужно отключить режим usb-накопителя и загрузочного диска, а оставить только режим модема.
Вообще для каждого типа модема есть свои правила ввода AT-команд. Но легкий поиск в гугле решает эту проблему.
Также можно проверить, залочена ли сим-карта или нет, используя функцию CARDLOCK.
- Первый параметр — 2 означает, что симлока нет, 1 — если модем залочен.
- Второй параметр — количество оставшихся попыток разблокировки. У нового модема = 10 .
Теперь у нас модем работает в режиме только модем, и его можно подключать к Raspberry Pi.
Raspberry Pi
Для того, чтобы RPi смогла найти модем, необходимо сначала сделать предварительные установки.
На этих этапах надо подключить Raspberry Pi через другой способ соединения с сетью Интернет. Также надо отметить, что практически все действия производятся от роли root. Если у вас нет пароля от него, или по каким-то причинам вам весело писать sudo, то можно к каждой команде его добавлять :-) Но я всё же напишу их к командам на всякий случай.
Если у вас микрокомпютер давно не обновлялся, то сначала введем две команды:
Каждая команда может работать какое-то время — это всё-таки обновления, так что не стоит сильно переживать, если моментального выполнения не произойдет.
Update обновляет локальный индекс пакетов из репозиториев, которые можно загрузить (программы, библиотеки и т. д.), а upgrade обновляет и загружает сами пакеты, потому что со временем системные программы, функции, библиотеки дорабатываются, изменяются.
Если у вас нет команды aptitude, то
или все команды aptitude можно заменить apt-get.
Чтобы устанавливать связь между Raspberry Pi и сетью, нужен протокол. Будем использовать PPP (Point-to-Point Protocol).
usb_modeswitch
Usb_ModeSwitch — это программа, которая реализует возможность переключения режимов USB-устройства, о которых мы уже говорили. Эта утилита нам нужна на случай, если операционная система Raspberry Pi не поймет смены режима модема.
Sakis3G
Sakis3G — это такая специальная утилита, которая помогает подключать модем к сети Интернет.
Работает она с устройствами по USB, Bluetooth, Serial. По идее Sakis3G достаточно умная программа, и она может сама читать и подставлять настройки оператора, чья сим-карта вставлена в модем. Поэтому нам она подходит.
Но она нужна нам в связке с usb_modeswitch, потому что сам sakis3g не умеет менять режим модема.
Скачиваем архив с Sakis3G, создаем папку и распаковываем архив туда:
Мы установили весь необходимый софт, теперь можно переходить к самому интересному — подключению модема.
Plug-in
Сначала отключим питание от Raspberry Pi и подсоединим модем. Можно использовать для подключения дополнительный хаб с активным питанием, а можно и без него.
Magic
Проверяем, нашелся ли наш модем вообще с помощью
и мы должны увидеть что-то подобное:
Причем надо следить за тем, какой ID выставлен.
Должно быть примерно так:
Bus 001 Device 010: ID 12d1:1506 Huawei Technologies Co., Ltd.
Сразу возникает вопрос: почему именно 1506? Ответ такой: именно это шестнадцатеричное число показывает комбинацию, которая соответствует режиму модема. Причем всё, что не 1506 (режим «только модем») говорит, что модем установлен в режиме usb-накопителя с определенным набором функций.
У нас же видим другой ID:
Bus 001 Device 010: ID 12d1:14fe Huawei Technologies Co., Ltd.
Это и означает, что система Raspbian не увидела измененный режим для модема (то есть можно было не заморачиваться с AT-командами :-). В этом случае сработает usb_modeswitch и модем поменяет ID на правильный. Для этого достаточно просто вызвать саму программу с необходимыми параметрами:
Четвертая строчка говорит нам о том, что мы загружаем конфигурационный файл для нашего модема, в котором прописаны правила перевода модема в другой режим.
Например, такой файл для E3372H:
Как только увидите заветные четыре цифры 1506, можно переходить к подключению модема через sakis. Вводим команду:
Если она не сработала, то нужно ввести полный путь:
Далее видим окно Sakis3G с настройками для сети. Выбираем тип подключения через 3G и тип устройства USB Device. И потом выбираем модель модема, который подключен. В нашем случае это HUAWEI MOBILE. Также может потребоваться выбрать usb interface, если у модема есть несколько слотов или режимов работы. Потом выбираем APN точку доступа.
APN (Access Point Name) — это условное название точки доступа мобильного оператора, через которую пользователь подключается к услуге передачи данных.
Ещё, возможно, Sakis3G попросит логин и пароль для входа. Если у вашего оператора есть такие для доступа к APN, то вводим их.
В ходе настройки система может потребовать у вас пароль рута, если вы работаете не из-под него. На RPi он требует установки. И может так случиться, что вы его введете неверно. Тогда Sakis3G прекратит настройку и завершит работу.
Значит, надо установить пароль для root. И затем надо будет снова запустить sakis3g и попробовать подключиться.
После всех этих действий увидим радостное сообщение, что Raspberry Pi подключилась к Интернету!
Чтобы проверить работоспособность подключения попробуем ping:
Видим, что всё работает, поэтому можем выходить в сеть на Raspberry Pi.
Автоматизация
Чтобы выходить в сеть через модем при каждом включении RPi, нам надо выполнять три пункта:
- подключить модем в МК;
- переводить его в режим модема с помощью usb_modeswitch;
- подключать его к Интернету с помощью Sakis3g.
Это получается очень и очень долго. И если мы вдруг захотим, чтобы наш микрокомпьютер самостоятельно подключался к Интернетам через модем, нам нужно автоматизировать эти действия.
С первым пунктом всё просто — один раз подключили модем и больше не трогаем его.
Со вторым пунктом можно поступить так: написать в rc.local
И теперь при загрузке МК модем автоматически будет менять режим.
Но что делать с третьим пунктом? Ведь там графическая оболочка. Всё достаточно просто. Мы всегда можем запустить sakis3g из терминала с дополнительными параметрами.
Для того, чтобы получить эти параметры, надо после подключения нажать “More option” > “Generate success report”. И самой последней строкой мы видим как раз то, что нам нужно.
Узнав их, вызываем sakis3g с параметром “connect”. Кстати, чтобы отключиться надо поставить “disconnect”.
Но опять же это слишком длинная запись, чтобы запоминать её. Поэтому напишем скрипт и будем вызывать просто с помощью start или stop:
И модифицируем наш rc.local (добавляем перед exit 0):
Troubleshooting
Основные причины, из-за которых могут не получаться некоторые шаги:
- Модем совсем не поддерживается на Raspberry Pi — попробовать другой модем
- Система RPi не обновлена — обновить
- Операционная система RPi не поддерживает модем — попробовать другую ОС
- Модему не хватает питания — подключить через хаб с активным питанием
- Raspberry Pi «не видит» USB модем — попробовать изменить режим модема
- Модем берет неправильный ID — проверить, установлен ли Usb_ModeSwitch
- Не работает Usb_ModeSwitch — использовать для перевода режима модема Sakis3G
- Sakis3G не запускается — проверить, установлен ли он
- Sakis3G не запускается — проверить имя пути для запуска Sakis3G
- Sakis3G не изменяет режим модема — проверить, правильная ли версия Sakis3G установлена
- Пароль root не подходит — изменить пароль root
- Нет Интернета — проверить, правильные ли настройки подключения выбраны
- Нет Интернета — проверить, установлен сетевой протокол PPP