USB-модемы

Материал из База знаний проекта Russian Fedora

Перейти к: навигация, поиск
Страница находится в работе
Ответственный: не указан

USB-3G/EDGE/GPRS модемы различных операторов связи, в простонаречии USB-модемы.

Содержание

Подготовка

sudo yum update                 # необходимо обновиться, чтобы список поддерживаемых устройств был актуальным
sudo yum install wammu          # будет полезна чтобы читать SMS
sudo yum install usb_modeswitch # для поддержки USB-модемов Huawei, T-Mobile, Vodafone, Option, ZTE, Novatel
sudo yum install minicom        # для терминального подключения к модему по /dev/ttyUSB*
usermod -a -G dialout <user>    # необходима для доступа к /dev/ttyUSB*

Естественно, если эти программы [wammu, usb_modeswitch, minicom] в системе уже установлены, то ставить их снова не надо, но обновить систему - обязательно.

Скрипт для отправки USSD-запросов

#!/bin/bash
function decodeUCS2 () # декодирует UCS
{
    bytes=$(echo -n $1 | sed "s/\(.\{2\}\)/\\\x\1/g")
    REPLY=$(printf $bytes | iconv -f UCS-2BE -t UTF-8)
}
function encodePDU () # кодирует в PDU
{
    in=$1
    let "in_len=${#in}-1"
    for chr in $(seq  0 $in_len)
    do
        let "chr2=$chr+1"
        let "t=$chr%8+1"
        if [ "$t" -ne 8 ]; then
            byte=$(printf "%d" "'${in:$chr:1}")
            let "c=$byte>>($chr%8)"
            let "c2=(1<<$t)-1"
            byte2=$(printf "%d" "'${in:$chr2:1}")
            let "b=$byte2 & $c2"
            let "c=$b<<(8-$t) | $c"
            REPLY=$REPLY$(echo "obase=16; $c" | bc | sed "s/^\(.\{,1\}\)$/0\1/")
        fi
    done
}
function USSD () # выполняет USSD запрос
{   
    $(printf "AT+CUSD=1,$1,15\r\n" > /dev/ttyUSB$ttyID)
    REPLY=$(grep -m 1 "+CUSD" /dev/ttyUSB$ttyID | sed "s/.*\"\([A-F0-9]*\)\".*/\1/")
    decodeUCS2 $REPLY
}
function data_traffic () # преобразователь инфы авторепортов модема
{
    i= 0
    REPLY=$1
    REPLY2=$1
    data_text=( "байт" "Кбайт" "Мбайт" "Гбайт" "Тбайт" ) #ИМХО больше никто не скачает
    while [ $REPLY2 -gt 1024 ]
    do
        REPLY=$(echo "scale = 2 ; $REPLY/1024" | bc)
        REPLY2=$(echo "$REPLY2/1024" | bc)
        let "i=i+1"
    done
    REPLY="$REPLY ${data_text[$i]}"
}
if ls /dev/ttyUSB* > /dev/null; then
    ttyID= Здесь должен быть номер вашего /dev/ttyUSB, например ttyID=2. В подключенном и отключенном режимах он разный. 
    
    if [ -z "$*" ]; then
        op=$(zenity --list --text="Выберите операцию:" --column="" --column="" --height="280" --width="280" --title="Билайн Интернет Дома" --print-column=1 --hide-column=1 "balance" "Проверить баланс" "start" "Активация стартового баланса" "req" "Выполнить USSD запрос" "at" "Выполнить AT комманду" "info" "Информация о соединении")
    elif [ $# -gt 1 ]; then
        op=$(echo -n $* |sed "s/\(.*\) .*/\1/")
        op2=$(echo -n $* |sed "s/.* \(.*\)/\1/")
    else
        op=$*
    fi
    case $op in
        balance)
            USSD "AA184C3602"
            MSG=$(echo -n $REPLY | sed "s/\.Дета.*//")
            ;;
        start)
            USSD "AA182CA68AC562B111"
            MSG=$REPLY
            ;;
        req)
            if [ -z "$op2" ]; then
                number=$(zenity --entry --text="Введите номер" --title="Билайн Интернет Дома" --width=270)
            else
                number=$op2
            fi
            encodePDU $number
            USSD $REPLY
            MSG=$REPLY
            ;;
        at)
            if [ -z "$op2" ]; then
                cmd=$(zenity --entry --text="Введите AT комманду" --title="Билайн Интернет Дома" --width=270)
            else
                cmd=$op2
            fi
            cmd=$(echo -n $cmd | tr a-z A-Z)
            cmd2=$(echo -n $cmd | sed "s/^AT//; s/\(.[A-Za-z0-9]*\).*/\1/")
            $(printf "$cmd\r\n" > /dev/ttyUSB$ttyID)
            MSG=$(grep -m 1 "$cmd2" /dev/ttyUSB$ttyID)
            ;;
        info)
            DSFLOWRPT=$(grep -m 1 "SFLOWRPT" /dev/ttyUSB$ttyID | sed "s/.*://g")
            for i in `seq 1 5`
            do
                info_[$i]=$(echo -n "$DSFLOWRPT" | cut -f$i -d, | sed "s/./ibase=16; /" | bc)
            done
            let "time=${info_[1]}/60"
            let "speed_trans=${info_[2]}/1024"
            let "speed_rec=${info_[3]}/1024"
            data_traffic "${info_[4]}" ; trans_data=$REPLY
            data_traffic "${info_[5]}" ; rec_data=$REPLY
            MSG="Время соединения: $time мин.<br/>Передача данных: $speed_trans Кбит/c<br/>Получение данных: $speed_rec Кбит/с<br/>Передано данных: $trans_data<br/>Получено данных: $rec_data"
            ;;
        *)
            MSG="Неверная операция"
    esac
else
    MSG="Модем не подключен"
fi
if [ -n "$MSG" ]; then
    $(notify-send "Билайн Интернет Дома" "$MSG")
fi

Билайн

ZTE MF626

Есть два вида этих модемов:

  1. держатель SIM карты полностью выступает из модема;
  2. держатель SIM карты частично выступает из модема.

Я буду описывать второй тип, поскольку его можно прошить и использовать в Linux. Первый тип модема невозможно перешить (или я не знаю как).

Для начала ответим на вопрос: Зачем его прошивать? Дело в том, что операторы связи специально заблокировали модемы таким образом, чтобы не было никакой возможности использовать в этих модемах SIM карты других операторов связи. Для этого, они изменили внутреннюю микропрограмму таким образом, что если не сделать определенных действий, то модем теряет связь.
Однако, пользователи интернета заметили, что если обновить прошивку с официального сайта ZTE, то модем может работать с любыми SIM-картами. Прошивка ищется на просторах интернета, называется MF626UpdateTool_GLOBE_PHV1.2.exe. Также, этот процесс очень хорошо расписан [1]. Не важно что там описан процесс для ZTE MF627, поскольку эти модемы практически идентичны.

Мы остановимся на установке данного модема в Fedora 14. Для более поздних версий системы могут быть отличия, но обычно - не принципиальные.

Вставляем модем в USB порт. Часто это делают через удлинитель. Если используется удлинитель поставляемый в комплекте, то проблем не должно возникнуть, иначе возможны проблемы с определением устройства, нестабильной работы. Поэтому в случае неустойчивой работы модема или иных проблем, стоит обратить внимание на качество USB-удлиннителя.

Простой способ проверить поставилось ли устройство, это посмотреть его есть ли файл устройства в /dev

$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 Фев  1 21:20 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Фев  1 21:20 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 2 Фев  1 21:20 /dev/ttyUSB2

Как видно из листинга, устройство определилось.

Так же для просмотра подключенных USB-устройств можно воспользоваться специализированной командой:

$ lsusb

Теперь вы можете настроить соединение в NetworkManager-е.

Мегафон

Huawei E352

Данная модель достаточно новая (на начало 2012 года), поэтому в Fedora 14 поддержка отсуствует (с чем пришлось столкнуться при подключении). На Fedora 16 модем заработал без проблем, но с одной особенностью при настройке соединения, о чём - ниже.

После определения системой подключенного устройства в меню (по правой клавише "мыши") появляется пункт "Новое подключение к мобильной сети GSM...". Выбираем его, в появившемся окне указываем страну и оператора ("Российская Федерация" и "Megafon"), а вот на странице с выбором тарифного плана стоит остановиться особо: в некоторых регионах выбор тарифного плана не имеет значения, а где-то - имеет. В моём случае заработало подключение только при тарифном плане "UGSM". Т.е. необходим некоторый эксперимент при подключении. Так же необходимо установить в свойствах подключения "Тип" подключения "3G (UMTS/HSPA)" вместо "Предпочитать 3G (UMTS/HSPA)".

Собственно в случае E352 всё. Осталось только поднять созданное соединение (а после создания оно активируется сразу автоматически).

P.S. В процессе эксплуатации модема выяснилось, что с Fedora 16 модем работает не очень хорошо. Проявяется это срывами соединения (если после установки соединения на иконке соединения в трее пишется не "H" - соединение быстро сорвётся (с "H" всё отлично работает) и невозможностью установки соединения после обрыва до "вынуть/вставить" модем или полной перезагрузки системы.

с F19 на F20 в NM

После обновления с F19 на F20 в NM перестали определяться модемы

Проверяем, установлен ли пакет ModemManager.

После запускаем службы:

su -c "systemctl start ModemManager.service && systemctl enable ModemManager.service"

После 'reboot' и NM снова обнаруживает usb-модемы.

Продолжение следует...