Содержание

Huawei 173 - 3G от Мегафон

Исходные данные: Ubuntu 10.04.2, Мегафон (Красноярск)

Вообще в самом модеме уже есть софт для работы. Поддерживаются Windows и Linux (вроде бы и MAC OS, но не пробовал). Но после перепрошивки модема новым Firmware в Linux работа приложения Mobile Partner прекратилась. Переустановка не помогла. Понижать версию прошивки модема не хотелось и я стал пробовать оживить устройство через Network Manager.

Сразу скажу - фирменный софт написан на Java и довольно тормозной, поэтому ну его нафиг. Единственный его плюс - можно удобно смотреть и пополнять балансы, отправлять SMS. На этом удобства заканчиваются.

Внимание! Фирменный софт модифицирует sudoers, что небезопасно и вообще ай-ай-ай: http://habrahabr.ru/blogs/linux/131302/

Поэтому я решил избавиться от этой поделки и жить проще и удобнее.

Для начала обязательно удаляем Mobile Partner (если конечно он был установлен):

# ./UninstallMobilePartner

Далее нужно установить пакет usb-modeswitch, иначе NM не увидит наш модем:

# sudo apt-get install usb-modeswitch

Создаем файлик /etc/usb_modeswitch.d/12d1:140c (да, именно такое имя файла - 12d1:140c)

 
########################################################
# Huawei E173  (HSPA+ modem)

DefaultVendor= 0x12d1
DefaultProduct=0x140c

TargetVendor=  0x12d1
TargetProduct=0x140c

CheckSuccess=20

MessageContent="55534243123456780000000000000011060000000000000000000000000000"

Создаем еще один файлик /etc/udev/rules.d/45-huawei173.rules

SUBSYSTEM=="usb", SYSFS{idProduct}=="140c", SYSFS{idVendor}=="12d1", RUN+="/lib/udev/modem-modeswitch --vendor 0x12d1 --product 0x140c --type option-zerocd"

Далее настраиваем NM:

Перетыкаем модем, ждем пока определятся всего его запчасти, соединяемся.

Примечание: почему-то мое субъективное мнение таково, что скорость соединения стала выше и само соединение стабильнее.

Еще примечание: первая попытка подключения завершается неудачей, при повторном подключении все ОК. Ощущение что просто не успевает подгрузиться какой-то модуль, но не проверял.

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

Неопробовано в боевых условия, взял отсюда: http://wiki.russianfedora.ru/index.php/USB-модемы

#!/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

Переключение в разные режимы

режим «только модем»

echo -e "AT^U2DIAG=0" > /dev/ttyUSB0

режим «modem + CD-ROM»

echo -e "AT^U2DIAG=1"  > /dev/ttyUSB0

режим «modem + CD-ROM + Card Reader»

echo -e "AT^U2DIAG=255"  > /dev/ttyUSB0

режим «modem + Card Reader»

echo -e "AT^U2DIAG=256"  > /dev/ttyUSB0

режим «edge/gprs»

echo -e "AT+ZSNT=1,0,0\r\n" > /dev/ttyUSB0

режим 3g

echo -e "AT+ZSNT=0,0,2\r\n" > /dev/ttyUSB0

Разлочка модема

Asus WL-500gP + E173 (Мегафон)

Для начала необходимо обновить прошивку модема, взять можно здесь: http://kras.shop.megafon.ru/modems/88430.html#files

Прошивку для Asus WL-500gP берем тут: https://code.google.com/p/wl500g/, аккуратно выбираем среди прощивок именно свою модель! Перешиваем роутер, делаем базовые настройки (SSID, шифрование и т.д.).

Втыкаем модем в роутер, открываем USB Network Devices ⇒ 3G/CDMA Modem, устанавливаем следующие параметры:

Остальные настройки по желанию

Применяем изменения: Apply ⇒ Finish

После перезагрузки все должно заработать.