Internet for Raspberry Pi

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

Изначально статья писалась как обучающий материал, поэтому в ней могут быть слишком очевидные моменты.

Иногда нет необходимость или возможности использовать роутер, когда работаешь с Raspberry Pi, то есть не можешь подключить RPi к Интернетам по Ethernet-кабелю. Тогда можно просто напрямую подключить к ней модем и получить Интернеты.

Оборудование

Чтобы справиться с поставленной задачей, мы возьмем:

Raspberry Pi model B
Модем Huawei E3272

или

Huawei E3372H

или любой другой модем.

В некоторых статьях пишут, что нужен хаб с активным питанием, потому что модем потребляет энергии больше, чем Raspberry Pi, но мы обошлись без него.

Стоит отметить, что для Raspberry Pi есть список поддерживаемых модемов, и в нём модема, что используем мы, нет. Но грустить не стоит, во-первых, потому что это немного устаревший список. И, во-вторых, потому что ядро Linux всегда можно кастомизировать.

Наверное, у вас возник вопрос: “Почему два модема?” Ответ довольно простой. На момент написания статьи в wiki нашей лаборатории был только E3272, который поддерживал 4G. А немного позже, уже на работе, в проекте нам понадобилось перевести Cubieboard на модем с 4G. Смысл тот же, потому что и на RPi, и на Cubie Linux :-)Тогда-то и был протестирован написанный алгоритм на другом модеме—E3372H.

“Только модем”

Система Raspberry Pi, как и других микрокомпьютеров, — это немного измененный Linux, у нас стоит Raspbian (это Debian). Значит есть две проблемы:

  1. Как известно, под Linux просто так, как в Windows, драйвера не устанавливаются.
  2. К тому же многие модемы могут работать в нескольких режимах:
  • CD — как загрузочный диск
  • SD — как usb-накопитель
  • MODEM — как модем

Кроме этого, режимы могут совмещаться, то есть работать в параллели.

Чтобы RPi могла спокойно «увидеть» и начать работать с модемом как с модемом, надо явно (или принудительно) сказать Huawei, что у него по умолчанию будет включен режим модем.

Такой проблемы не возникло на модеме более нового поколения (E3372H). Я просто включила модем в микрокомпьютер, поменяла на нём же режим и проделала остальные необходимые действия.

Модем

Но всё же рассмотрим, как поменять режим модема на примере операционной системы Windows.

Вставляем модем в компьютер. Видим, что сразу же запускается стандартная программа, которая позволяет соединяться с сетью Интернет.

Это означает, что в модеме режим usb-накопителя включен.

Чтобы спокойно переключить режимы в модеме, надо закрыть программу для подключения к сети Интернет. Иногда бывает недостаточно просто закрыть приложении, поэтому завершаем процесс.

Обычно модемы общаются AT-командами.

AT-команды — это такие специальные наборы правил, которые используются для программирования телекоммуникационного оборудования.

Чтобы изменять настройки модема и использовать эти команды, нам нужна любая терминальная программа. Существуют специализированные программы, которые работают именно для программирования AT-команд. Но нам подойдет и PuTTY.

Узнаем, на какой COM-порт подцепился модем. С этим знанием открываем putty, в разделе «Сессии» выбираем тип соединения Serial, вводим номер COM-порта и скорость устанавливаем в 115200 bps.

В разделе «Терминал» локальный отклик и редактирование строк надо установить в статус «включено»:

Теперь, когда мы настроили всё, нажимаем «соединиться» и видим черный экран. Для проверки связи введем функцию

ati

Эта функция показывает нам информацию о модеме.

Теперь можно ввести одну из этих функций:

AT^SETPORT=«A1,A2;10,12,16,A1,A2» 
— Конфигурация по умолчанию
AT^SETPORT=«A1,A2;10,12,16,A2»
— Конфигурация по умолчанию, отключить CD
AT^SETPORT=«A1,A2;10,12,16»
— Конфигурация по умолчанию, отключить CD + SD
AT^SETPORT=«A1,A2;10,12»
— Конфигурация по умолчанию, отключить NDIS + CD + SD
AT^SETPORT=«A1;10,12,13,14,16,A1,A2»
— Включает: все COM порты + NDIS + CD + SD
AT^SETPORT=«A1;10,12,13,14»
— Включает: все COM порты, отключает: NDIS + CD + SD
AT^SETPORT=«A1;10,12,13,14,16»
— Включает: все COM порты + NDIS, отключает: CD + SD
AT^SETPORT=«A1;10,12,13,14,A2»
— Включает: все COM порты + SD, отключает: NDIS + CD

Причем нам нужно отключить режим usb-накопителя и загрузочного диска, а оставить только режим модема.

Вообще для каждого типа модема есть свои правила ввода AT-команд. Но легкий поиск в гугле решает эту проблему.

Конфигурация по умолчанию, отключить CD + SD

Также можно проверить, залочена ли сим-карта или нет, используя функцию CARDLOCK.

  • Первый параметр — 2 означает, что симлока нет, 1 — если модем залочен.
  • Второй параметр — количество оставшихся попыток разблокировки. У нового модема = 10 .

Теперь у нас модем работает в режиме только модем, и его можно подключать к Raspberry Pi.

Raspberry Pi

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

На этих этапах надо подключить Raspberry Pi через другой способ соединения с сетью Интернет. Также надо отметить, что практически все действия производятся от роли root. Если у вас нет пароля от него, или по каким-то причинам вам весело писать sudo, то можно к каждой команде его добавлять :-) Но я всё же напишу их к командам на всякий случай.

Если у вас микрокомпютер давно не обновлялся, то сначала введем две команды:

sudo aptitude update && sudo aptitude upgrade

Каждая команда может работать какое-то время — это всё-таки обновления, так что не стоит сильно переживать, если моментального выполнения не произойдет.

Update обновляет локальный индекс пакетов из репозиториев, которые можно загрузить (программы, библиотеки и т. д.), а upgrade обновляет и загружает сами пакеты, потому что со временем системные программы, функции, библиотеки дорабатываются, изменяются.

Если у вас нет команды aptitude, то

sudo apt-get install aptitude

или все команды aptitude можно заменить apt-get.

PPP

Чтобы устанавливать связь между Raspberry Pi и сетью, нужен протокол. Будем использовать PPP (Point-to-Point Protocol).

sudo aptitude install ppp

usb_modeswitch

Usb_ModeSwitch — это программа, которая реализует возможность переключения режимов USB-устройства, о которых мы уже говорили. Эта утилита нам нужна на случай, если операционная система Raspberry Pi не поймет смены режима модема.

sudo aptitude install usb-modeswitch

Sakis3G

Sakis3G — это такая специальная утилита, которая помогает подключать модем к сети Интернет.

Работает она с устройствами по USB, Bluetooth, Serial. По идее Sakis3G достаточно умная программа, и она может сама читать и подставлять настройки оператора, чья сим-карта вставлена в модем. Поэтому нам она подходит.

Но она нужна нам в связке с usb_modeswitch, потому что сам sakis3g не умеет менять режим модема.

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

Мы установили весь необходимый софт, теперь можно переходить к самому интересному — подключению модема.

Plug-in

Сначала отключим питание от Raspberry Pi и подсоединим модем. Можно использовать для подключения дополнительный хаб с активным питанием, а можно и без него.

Magic

Проверяем, нашелся ли наш модем вообще с помощью

lsusb

и мы должны увидеть что-то подобное:

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

sudo ./sakis3g --interactive

Если она не сработала, то нужно ввести полный путь:

/usr/bin/modem3g/sakis3g --interactive "menu" "console"

Далее видим окно Sakis3G с настройками для сети. Выбираем тип подключения через 3G и тип устройства USB Device. И потом выбираем модель модема, который подключен. В нашем случае это HUAWEI MOBILE. Также может потребоваться выбрать usb interface, если у модема есть несколько слотов или режимов работы. Потом выбираем APN точку доступа.

APN (Access Point Name) — это условное название точки доступа мобильного оператора, через которую пользователь подключается к услуге передачи данных.

Ещё, возможно, Sakis3G попросит логин и пароль для входа. Если у вашего оператора есть такие для доступа к APN, то вводим их.

Стартовое окно Sakis3g

В ходе настройки система может потребовать у вас пароль рута, если вы работаете не из-под него. На RPi он требует установки. И может так случиться, что вы его введете неверно. Тогда Sakis3G прекратит настройку и завершит работу.

Значит, надо установить пароль для root. И затем надо будет снова запустить sakis3g и попробовать подключиться.

После всех этих действий увидим радостное сообщение, что Raspberry Pi подключилась к Интернету!

Чтобы проверить работоспособность подключения попробуем ping:

Видим, что всё работает, поэтому можем выходить в сеть на Raspberry Pi.

Автоматизация

Куда же без неё?

Чтобы выходить в сеть через модем при каждом включении RPi, нам надо выполнять три пункта:

  • подключить модем в МК;
  • переводить его в режим модема с помощью usb_modeswitch;
  • подключать его к Интернету с помощью Sakis3g.

Это получается очень и очень долго. И если мы вдруг захотим, чтобы наш микрокомпьютер самостоятельно подключался к Интернетам через модем, нам нужно автоматизировать эти действия.

С первым пунктом всё просто — один раз подключили модем и больше не трогаем его.

Со вторым пунктом можно поступить так: написать в rc.local

usb_modeswitch -I -c /etc/usb_modeswitch.d/huawei.conf

И теперь при загрузке МК модем автоматически будет менять режим.

Но что делать с третьим пунктом? Ведь там графическая оболочка. Всё достаточно просто. Мы всегда можем запустить sakis3g из терминала с дополнительными параметрами.

Для того, чтобы получить эти параметры, надо после подключения нажать “More option” > “Generate success report”. И самой последней строкой мы видим как раз то, что нам нужно.

Узнав их, вызываем sakis3g с параметром “connect”. Кстати, чтобы отключиться надо поставить “disconnect”.

/usr/bin/modem3g/sakis3g --console --pppd APN=”internet” USBINTERFACE=”1" USBDRIVER=”option” USBMODEM=”12d1:1506" OTHER=”USBMODEM” MODEM=”OTHER” --sudo “connect”

Но опять же это слишком длинная запись, чтобы запоминать её. Поэтому напишем скрипт и будем вызывать просто с помощью start или stop:

И модифицируем наш rc.local (добавляем перед exit 0):

usb_modeswitch -I -c /etc/usb_modeswitch.d/huawei.conf
sudo sh modem3g.sh start

Troubleshooting

Основные причины, из-за которых могут не получаться некоторые шаги:

  • Модем совсем не поддерживается на Raspberry Pi — попробовать другой модем
  • Система RPi не обновлена — обновить
  • Операционная система RPi не поддерживает модем — попробовать другую ОС
  • Модему не хватает питания — подключить через хаб с активным питанием
  • Raspberry Pi «не видит» USB модем — попробовать изменить режим модема
  • Модем берет неправильный ID — проверить, установлен ли Usb_ModeSwitch
  • Не работает Usb_ModeSwitch — использовать для перевода режима модема Sakis3G
  • Sakis3G не запускается — проверить, установлен ли он
  • Sakis3G не запускается — проверить имя пути для запуска Sakis3G
  • Sakis3G не изменяет режим модема — проверить, правильная ли версия Sakis3G установлена
  • Пароль root не подходит — изменить пароль root
  • Нет Интернета — проверить, правильные ли настройки подключения выбраны
  • Нет Интернета — проверить, установлен сетевой протокол PPP

Originally published at wiki.perexy.com on December 12, 2014.