Raspberry Pi. Установка и настройка комплекта MTC Коннект 4 (модем Huawei E171) на Raspbian



Соответственно одной коммерческой задаче мне придется использовать 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. Подключение к интернету.

Начинаем.

Данил Борчевкин,
lab409.ru

ПЕРВЫМ ДЕЛОМ

Первым делом я подцепил модем к моноблоку с Windows на борту, поставил Коннект-менеджер с модема и подключился к интернету, дабы удостовериться, что соединение есть и все любые последующие проблемы будут только из-за того, что у меня кривые руки. Коннект есть, трафик считается, гугл открывается, можно работать уже на Raspberry.

ДЕЛАЕМ МОДЕМ МОДЕМОМ

Как ни странно, но после подключения модема к USB он определяется как диск. Для переключения его в режим модема необходимо установить usb-modeswitch. Заодно подтянем и все необходимое, а после совершим reboot:

sudo apt-get update
sudo apt-get install usb-modeswitch minicom ppp
sudo reboot

После перезагрузки проверяем, что теперь у нас из себя представляет модем и доступны ли его порты:


$ lsusb
Bus 001 Device 005: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
$ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2

Вот и отлично. Можно начинать работать. под ttyUSB2 у меня клавиатура. Для начала, подключимся к модему через терминал minicom и узнаем его модель посредством AT-команды ati0. Делается это просто — набираем команду и нажимаем Enter:

$ sudo minicom -D /dev/ttyUSB0
< ati0
Manufacturer:
Model: E171
Revision: 21.157.00.01.143
IMEI: ************* [естественно, что там цифры, но свой IMEI я не покажу]
+GCAP: +CGSM, +DS, +ES

Для выхода из minicom следует нажать Ctrl + A затем Q и подтвердить выход. Теперь мы точно удостоверились в модели модема на случай, если придется прыгать с бубном.

Кстати, мы приблизились к первой проблеме — если мы сейчас выключим и включим Raspberry, то при вводе команды lsusb мы увидим следующее:

$ sudo shutdown -h now
[передергиваем питание и ждем пока загрузится RPi]
$ lsusb
Bus 001 Device 005: ID 12d1:155b Huawei Technologies Co., Ltd.

Наш модем снова стал накопителем, сменился ID устройства (с 12d1:1506 на 12d1:155b, где 12d1 — ID вендора) и снова превратился в cdrom. И так будет всегда, если RPi будет включаться с уже вставленным модемом, т.е. до подачи питания. На данном этапе это лечится передергиванием модема (вынул-всунул) и в принципе, может и не критично. Конкретно в моей ситуации, такое поведение ОС меня не устраивает, поэтому буду добиваться однозначного определения модема при включении.

Для решения данной проблемы необходимо создать файл /etc/udev/rules.d/41-usb_modeswitch.rules:

$ sudo nano /etc/udev/rules.d/41-usb_modeswitch.rules

и пишем в него следующую строчку (если у вас другой модем, не забудьте вставить туда свои ID производителя и устройства):

ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="155b", RUN+="usb_modeswitch '%b/%k'"

Важно задать правило для udev именно для ID, по которому у нас определяется модем как накопитель, а не наоборот!!! Т.е. 12d1 155b — это накопитель, 12d1 1506 — это модем. В файл rules вписываем ID накопителя

Выключаем RPi:

$ sudo shutdown -h now

Для надежности и достоверности теста можно передернуть питание. Включаем RPi и сразу смотрим на вывод

lsusb

. Если определился как модем — то все отлично, если нет — то вам в список полезных ссылок=))

ПОДКЛЮЧЕНИЕ К 3G

Есть два пути — ручная настройка или использование сторонних разработок. Для простоты выберем второй вариант.

Создадим папку, скачаем в нее Sakis3G, разархивируем и дадим права на выполнение данной утилиты

$ mkdir ~/3g
$ cd 3g/
$ wget http://sourceforge.net/projects/vim-n4n0/files/sakis3g.tar.gz
$ tar -xzvf sakis3g.tar.gz
$ sudo chmod +x sakis3g

Далее, запустим Sakis3G в интерактивном режиме для установления соединения:

$ sudo ./sakis3g --interactive

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, разархивируем в каталог ~/3g:

$ mkdir ~/3g
$ cd ~/3g
$ wget http://zool33.uni-graz.at/petz/umtskeeper/src/umtskeeper.tar.gz
$ tar -xzvf umtskeeper.tar.gz
$ chmod +x umtskeeper

ВАЖНО! umts_keeper уже идет вместе с sakis3g. Поэтому можно качать только umts_keeper и не делать предыдущий шаг.

Для автоматического подключения и реконнекта при дропе необходимо запустить umtskeeper с соответствующими параметрами (в моем случае с МТС и ID модема 12d1:1506):

# ./umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1506' APN='CUSTOM_APN' CUSTOM_APN='internet.mts.ru' SIM_PIN='0000' APN_USER='mts' APN_PASS='mts'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no'

После этого ждем, пока не загорится диод на модеме, сообщающий, что все хорошо и интернет есть. Завершить работу umtskeeper можно нажатием Ctrl+C.

Действие данной утилиты с данными параметрами происходит безмолвно, поэтому смотрим лог:

$ tail /var/log/umtskeeper.log -f

АВТОЗАГРУЗКА

Для авто подключения при запуске RPi воспользуемся одним из вариантов, а именно — редактированием /etc/rc.local:

$ sudo nano /etc/rc.local

куда внесем запуск umtskeeper (не забудьте указать путь, специфичный вашей Raspberry). Не забываем в конце поставить & для запуска в фоне:

/home/pi/3g/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1506' APN='CUSTOM_APN' CUSTOM_APN='internet.mts.ru' SIM_PIN='0000' APN_USER='mts' APN_PASS='mts'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --nat 'no' &

Перезагружаемся и проверяем.

РЕЗЮМЕ И КРИТИКА

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

ПОЛЕЗНЫЕ ССЫЛКИ

Маленький британский шпион – закладка на Raspberry Pi
GPRS usb modem, Huawei E171
Huawei E1550 3G modem
Run a script on start up


22 комментария на «“Raspberry Pi. Установка и настройка комплекта MTC Коннект 4 (модем Huawei E171) на Raspbian”»

    • Следующая моя статья, она уже подготовлена — посвящена именно удаленному доступу к RPi, но не через получение белго IP от провайдера, а через VPS и поднятия туннеля

    • Дружище, а не подскажешь ли одну вещь? Значит, имеем Малину с подключенным 3G модемом. По команде ifconfig видим IP адрес, например 20.10.111.216, и пытаемся управлять GPIO через webiopi. И ничего не получается. По локалке через WiFi все работает.

    • не работал c webiopi, поэтому ничего подсказать не могу

    • Спасибо, что ответил, уважаемый danil_borchevkin. С твоего позволения еще один вопрос… Все что касается моего первого вопроса, только без webiopi. Т.е. все попытки подключиться извне к Малине проходят неудачно. Но, повторюсь, локалка по WiFi работает без вопросов. Большое спасибо за внимание.

    • Правильно ли я понимаю, что вам нужно удаленно управлять RPi через 3G модем — т.е. у вас где то установлена RPi, и вы удаленно пытаетесь подключиться по IP-адресу через веб-интерфейс, SSH и т.д?

      Если мои предположения верны — то это не сработает — сотовые операторы выдают т.н. «серый» IP — свой локальный, и для выхода в интернет у них общий гейт — т.о. вы пытаетесь подключиться на гейт, а не на RPi. Решение в таком случае:
      1. Купить «белый» IP — статический IP — такая услуга есть у каждого оператора.
      2. Если нужно SSH — то поднимать ReverseSSH
      3. Воспользоваться DNS (например, https://www.noip.com/remote-access), чтобы имея динамический IP, иметь статический IP с форвардингом до динамического.
      4. Может быть есть еще варианты, но самые популярные — выше.

  1. Взялся настраивать свой модем:
    $ lsusb
    Bus 001 Device 004: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
    При настройке через Sakis3G получил ошибку:
    Port /dev/ttyUSB0 is currently occupied by 2687 gammu-smsd.

    Остановил gammu-smsd, успешно сделал ручную настройку для Мегафона internet / gdata / gdata

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

    • не знаю, не пробовал. Гугление быстрого результата тоже не дало

      Для синхронизации времени можно использовать GPS-модуль, статей на эту тематику (синхронизация времени) огромное количество

    • Способов много, но мой вопрос был как сохранить возможность выхода в инет через модем и работу с СМС.

    • Скорее всего готового решения для Raspberry нет — если нужно одновременно обрабатывать и AT-команды, и поддеривать активным интернет; по крайней мере, я не встречал. Конкретная была ситуация — поддерживать подключение + узнавать качество связи через АТ-команды — решение так и не было найдено

    • Теперь понятно для чего в B+ количество USB-портов увеличили 🙂

  2. Возможно ли как-то узнать на каком именно порту (/dev/ttyUSBXXX) подключен модем?
    Как выяснилось, при наличии нескольких USB устройств, например модем и GPS применик, при перезагрузке порты раздаются случайным образом.
    Сейчас стоит задача автоматического (на языке Си) определения порта USB-GPS. Пытался читать порты чтобы обнаружить внутри NMEA, так при попытке чтения из одного из модемных портов получаю повисание устройства по ssh.

    • Для решения этого необходимо настроить правила для udev — есть статья как раз на эту тему http://robocraft.ru/blog/arduino/2985.html. Присвоив уникальное имя для точки монтирования, не будет необходимости в алгоритмах для определения что конкретно висит на /dev/ttyUSBXXX, а обращаться непосредственно к модему или GPS по конкретным точкам, например /dev/3gmodem и /dev/gps

    • Как должна выглядеть строка для переименования порта? В указанной Вами статье для Debian приведен пример:

      BUS=="usb", SYSFS{idProduct}=="6001", SYSFS{idVendor}=="0403", SYSFS{serial}=="A6007Jii", NAME="myCraftDuino"

      отличающийся от Вашего по формату (для Raspbian, что не удивительно)

      ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="155b", RUN+="usb_modeswitch '%b/%k'"

      Я пробовал:

      ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", NAME="gpsusb"

      Но по-прежнему:

      [   89.638696] usb 1-1.2: new full-speed USB device number 5 using dwc_otg
      [   89.741260] usb 1-1.2: New USB device found, idVendor=067b, idProduct=2303
      [   89.741297] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
      [   89.741313] usb 1-1.2: Product: USB-Serial Controller
      [   89.741327] usb 1-1.2: Manufacturer: Prolific Technology Inc.
      [   89.749316] pl2303 1-1.2:1.0: pl2303 converter detected
      [   89.754582] usb 1-1.2: pl2303 converter now attached to ttyUSB0
      $ lsusb
      Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
      Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
      
      
    • Для понимания сначала нужен вывод udevtest для вашего устройства. udevtest показывает, какие правила применяются для данного устройства, а также отладочную информацию udev

      Я дал статью для примера — для того, чтобы узнать актуальную информацию на сегодняшний день и для конкретно вашей комбинации софта и оборудования, нужно воспользоваться:

      $man udev
      

      Если есть проблемы с назначением имени, можно создавать на точку монтирования символические ссылки — делается это заменой в правиле NAME=«mydevice» na SYMLINK+=«mydevice»

      Что касается работы с udev и написания правил, вам лучше обратиться к первоисточникам:

      https://wiki.debian.org/ru/udev
      http://reactivated.net/writing_udev_rules.html

    • Спасибо, уже разобрался. Привел там нужную строчку.

  3. Уважаемый ivanserov. Являясь давним Вашим поклонником осмелюсь задать вопрос: не могли бы Вы расписать (разжевать) строку реконнекта. ./umtskeeper —sakisoperators «USBINTERFACE=’0′ OTHER=’USBMODEM’ USBMODEM=’12d1:1506′ APN=’CUSTOM_APN’ CUSTOM_APN=’internet.mts.ru’ SIM_PIN=’0000′ APN_USER=’mts’ APN_PASS=’mts’» —sakisswitches "—sudo —console" —deicename ‘Huawei’ —log —silent —nat ‘no’
    Где-то в глубине души я понимаю что это выполняется sakis3g, но, мне кажется, где-то я чего-то не прописываю. С USBMODEM=’12d1:1506 я разобрался. Большое спасибо.

  4. В частности меня интересует как вписать туда пункт из меню «Pleace select APN» (internet.mts.ru), чтобы подключаться по-Вашему по настройкам зашитым в модем. Вручную у меня все работает.

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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение