ZTE MF180: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
(Скрипт -> USSD вида #xxx#; раскодирование UCS-2)
 
(не показаны 2 промежуточные версии 2 участников)
Строка 7: Строка 7:


== Швейцарский нож ==
== Швейцарский нож ==
Далее, необходимо (вернее, можно обойтись и посылкой AT-команд, но мы же слишком ленивы для этого) использовать небольшой, но очень полезный скрипт скрипт
Далее, необходимо (вернее, можно обойтись и посылкой AT-команд, но мы же слишком ленивы для этого) использовать небольшой, но очень полезный скрипт:


{{hider hiding|
|title=Скрипт
|content=
<source lang=perl>
<source lang=perl>
#!/usr/bin/perl -w
#!/usr/bin/perl -w
Строка 16: Строка 19:
#    подробнее параметры коммандной строки:
#    подробнее параметры коммандной строки:
#    mf100.pl help
#    mf100.pl help
#    29-04-2012
#    Отправка USSD-команд вида #102#
#    Раскодирование ответа UCS-2 -> UTF-8
#    Ivan Krylov <aitap@jabber.ru>


#    Copyright (C) 2010  Mikhail Burshtynskiy  (mikhail@m-blog.pp.ua)
#    Copyright (C) 2010  Mikhail Burshtynskiy  (mikhail@m-blog.pp.ua)
 
#    This program is free software: you can redistribute it and/or modify
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#    (at your option) any later version.
 
#    This program is distributed in the hope that it will be useful,
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#    GNU General Public License for more details.
 
#    You should have received a copy of the GNU General Public License
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
############################################################################################
############################################################################################
# настройка модема на примере Debian lenny версия ядра: 2.6.30-bpo.2-686; Ubuntu 9.10   
# настройка модема на примере Debian lenny версия ядра: 2.6.30-bpo.2-686; Ubuntu 9.10   
Строка 57: Строка 65:
# вам поможет команда: # rmmod option
# вам поможет команда: # rmmod option
############################################################################################
############################################################################################
 
use strict;
use strict;
use File::Basename;
use File::Basename;
use POSIX qw(O_RDWR O_NOCTTY);
use POSIX qw(O_RDWR O_NOCTTY);
use Encode qw{encode from_to};
use Term::ANSIColor qw(:constants);
use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;
$Term::ANSIColor::AUTORESET = 1;
 
#параметры
#параметры
my $usb_1='/dev/ttyUSB1';
my $usb_1='/dev/ttyUSB1';
Строка 69: Строка 78:
my $timeout=20;# выход по таймауту
my $timeout=20;# выход по таймауту
#######################
#######################
 
my $exit_="Время ожидания истекло, выход.";
my $exit_="Время ожидания истекло, выход.";
my $error="ERROR\n";
my $error="ERROR\n";
Строка 99: Строка 108:
my $par=shift @ARGV;
my $par=shift @ARGV;
if($par){
if($par){
unless ($par=~m/^\*[0-9]{3}[*0-9]*#$|^[0-9]$|^on$|^off$|^sig$|^info$|^cdstop$|^cdrun$|^-*help$|^network$|^search$|^storage$|^modem$|^pin$|^sequrity$/i){
unless ($par=~m/^[*#][0-9]{3}[*0-9]*#$|^[0-9]$|^on$|^off$|^sig$|^info$|^cdstop$|^cdrun$|^-*help$|^network$|^search$|^storage$|^modem$|^pin$|^sequrity$/i){
print BOLD, RED, "\nНЕВЕРНАЯ КОМАНДА!",RESET,"\n\n$help";
print BOLD, RED, "\nНЕВЕРНАЯ КОМАНДА!",RESET,"\n\n$help";
exit;
exit;
Строка 178: Строка 187:
exit if $answer eq "0";
exit if $answer eq "0";
print RED, BOLD, "введено некорректное значение!\n\n", RESET and redo MARK4 unless $answer=~m/^1$/;
print RED, BOLD, "введено некорректное значение!\n\n", RESET and redo MARK4 unless $answer=~m/^1$/;
 
print BOLD, "ВНИМАНИЕ! При вводе PIN кода будте предельно внимательны.\nУ вас 3 или менее попыток.\n", RESET;
print BOLD, "ВНИМАНИЕ! При вводе PIN кода будте предельно внимательны.\nУ вас 3 или менее попыток.\n", RESET;
MARK5:{
MARK5:{
Строка 228: Строка 237:
my $producer=info('CGMI', qr/(^.{3,})/);
my $producer=info('CGMI', qr/(^.{3,})/);
       print BOLD, "Производитель: ", RESET, "$producer\n" if $producer;
       print BOLD, "Производитель: ", RESET, "$producer\n" if $producer;
 
my $model=info('CGMM', qr/(^.{3,})/);
my $model=info('CGMM', qr/(^.{3,})/);
print BOLD, "Модель: ", RESET, "$model\n" if $model;
print BOLD, "Модель: ", RESET, "$model\n" if $model;
 
my $prog=info('CGMR', qr/(^.{5,})/);
my $prog=info('CGMR', qr/(^.{5,})/);
print BOLD, "Версия ПО: ", RESET, "$prog\n" if $prog;
print BOLD, "Версия ПО: ", RESET, "$prog\n" if $prog;
 
my $imei=info('CGSN', qr/(^\d{15,})/);
my $imei=info('CGSN', qr/(^\d{15,})/);
print BOLD, "IMEI: ", RESET, "$imei\n" if $imei;
print BOLD, "IMEI: ", RESET, "$imei\n" if $imei;
 
my $iems=info('CIMI', qr/(^\d{15,})/);
my $iems=info('CIMI', qr/(^\d{15,})/);
print BOLD, "IEMS: ", RESET, "$iems\n" if $iems;
print BOLD, "IEMS: ", RESET, "$iems\n" if $iems;
 
my $number=info('CNUM', qr/\+CNUM:\D+,"(\+?\d{10,})",\d+/);
my $number=info('CNUM', qr/\+CNUM:\D+,"(\+?\d{10,})",\d+/);
if($number){
if($number){
Строка 246: Строка 255:
print BOLD, "Ваш номер: ", RESET, "$number\n";
print BOLD, "Ваш номер: ", RESET, "$number\n";
}
}
 
print BOLD, "Сигнал сети: ", RESET, sig(info('CSQ', qr/\+CSQ: (\d+?),\d{2}/))."\n";#уровень сигнала сети
print BOLD, "Сигнал сети: ", RESET, sig(info('CSQ', qr/\+CSQ: (\d+?),\d{2}/))."\n";#уровень сигнала сети
my $operator=operator();
my $operator=operator();
Строка 310: Строка 319:
Нажмите ENTER для продолжения, при этом при неудачной регистрации
Нажмите ENTER для продолжения, при этом при неудачной регистрации
модем "перескочит" на родную сеть
модем "перескочит" на родную сеть
 
или для подключения в ручном режиме наберите:
или для подключения в ручном режиме наберите:
SAY
SAY
Строка 317: Строка 326:
в дальнейшем при следующем подключении модема необходимо
в дальнейшем при следующем подключении модема необходимо
будет явно выбрать сеть или изменить режим поиска сети.
будет явно выбрать сеть или изменить режим поиска сети.
 
или: 0  для выхода
или: 0  для выхода
   
   
Строка 376: Строка 385:
if($st){
if($st){
if($st=~/^[0-9A-F]+$/i){
if($st=~/^[0-9A-F]+$/i){
return pack("H*", $st);
$st = pack("H*", $st);
}else{
encode("ucs-2",$st);
return $st;
from_to($st,"ucs-2","utf-8");
}
}
return $st;
}elsif($@ =~ /Timeout/){
}elsif($@ =~ /Timeout/){
return $exit_;
return $exit_;
Строка 486: Строка 496:
}
}
}
}
 
sub check_pin{
sub check_pin{
my $pin;
my $pin;
Строка 499: Строка 509:
return $pin;
return $pin;
}
}


</source>
</source>
}}


== Вскрываем ==
== Вскрываем ==
Строка 543: Строка 557:


== Ссылки ==
== Ссылки ==
* [http://m-blog.pp.ua/%D0%B1%D0%B5%D0%B7-%D1%80%D1%83%D0%B1%D1%80%D0%B8%D0%BA%D0%B8/14.html источник вдохновения и скрипта] - там все издевательства производятся над MF100
* [http://m-blog.pp.ua/%D0%B1%D0%B5%D0%B7-%D1%80%D1%83%D0%B1%D1%80%D0%B8%D0%BA%D0%B8/14.html источник вдохновения и скрипта] - там все издевательства производятся над MF100; домен в данный момент на парковке




[[Category:USB-Модемы]]
[[Category:USB-Модемы]]
[[Category:Руководства]]
[[Category:Руководства]]

Текущая версия на 09:12, 29 апреля 2012

Сабж

Билайновский модем, куплен в августе 2010 за 700 с чем-то RUR

Заставляем систему видеть

Для корректной работы проще всего поставить ядро с поддержкой драйвера option (чтобы не мучаться с usbserial и udev).

Швейцарский нож

Далее, необходимо (вернее, можно обойтись и посылкой AT-команд, но мы же слишком ленивы для этого) использовать небольшой, но очень полезный скрипт:

Скрипт
#!/usr/bin/perl -w

#    v 07122010
#    скрипт для выполнения ussd и других команд 3G модема ZTE MF100 (возможно будет работать и на других модемах, не проверено...)
#    подробнее параметры коммандной строки:
#    mf100.pl help

#    29-04-2012
#    Отправка USSD-команд вида #102#
#    Раскодирование ответа UCS-2 -> UTF-8
#     Ivan Krylov <aitap@jabber.ru>

#     Copyright (C) 2010  Mikhail Burshtynskiy  (mikhail@m-blog.pp.ua)
 
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
 
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
 
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
############################################################################################
# настройка модема на примере Debian lenny версия ядра: 2.6.30-bpo.2-686; Ubuntu 9.10   
# Включаем модем, он определяется как USB CD-ROM диск( /dev/scd0 или /dev/scd1 и т.д) на котором софт для windows
# отключаем USB CD-ROM командой:
# $ eject /dev/scd0
# модем отключается, секунд через 30 (примерно) включается, появляются новые устройства:
# /dev/ttyUSB0
# /dev/ttyUSB1
# /dev/ttyUSB2
# инет работает на /dev/ttyUSB2
# далее два варианта:
# 1. если модем работает стабильно, то просто отключаем автозагрузку USB CD-ROM диска воспользовавшись этим скриптом
# введите команду:
# $ ./mf100.pl cdstop      #(чтобы включить обратно: $ ./mf100.pl cdrun )
# 2. если модем периодически отключается то переключаем модем в режим только модема,
# при этом отключается кардридер и доступ к USB CD-ROM диску.
# ОСТОРОЖНО! при переключении меняется идентификатор модема, если у вас ядро версии 2.6.29 или выше то нет проблем.
# введите команду:
# $ ./mf100.pl modem      #(чтобы переключить обратно: $ ./mf100.pl storage )
# настраиваем инет на /dev/ttyUSB2
# всё...
#
# если при подключении модема появляется только /dev/ttyUSB0
# вам поможет команда: # rmmod option
############################################################################################
 
use strict;
use File::Basename;
use POSIX qw(O_RDWR O_NOCTTY);
use Encode qw{encode from_to};
use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;
 
#параметры
my $usb_1='/dev/ttyUSB1';
my $usb_2='/dev/ttyUSB2';
my $timeout=20;# выход по таймауту
#######################
 
my $exit_="Время ожидания истекло, выход.";
my $error="ERROR\n";
####
my $name=$0;
$name=basename $name if $name =~m|^/usr|;
my $help=<<"HELP";
Использование:
$name команда
например USSD команды (проверка, пополнение счета и другие):
$name *111#, $name *код*код пополнения#, ... 
Другие опции:
info      различная информация о модеме
on        включить модем
off       выключить модем
modem     переключиться в режим модема (отключается встроенный кардридер и автозагрузка встроенного CD-ROM диск)
storage   отключить режим модема
cdstop    отключить автозапуск встроенного диска (на нем ПО для windows)
cdrun     включить автозапуск встроенного диска
sig       мониторинг уровеня сигнала сети,  для выхода Ctrl^C
search    выбор режима поиска сети GSM/3G(WCDMA)
network   сканировать сеть и вывести список доступных операторов связи
          + возможность ручного выбора оператора если есть доступны(й|е) для регистрации
pin       ввести PIN (PUK) код
sequrity  изменить, активировать/деактивировать  PIN код.
help      показать этот текст
HELP
####
my $par=shift @ARGV;
if($par){
	unless ($par=~m/^[*#][0-9]{3}[*0-9]*#$|^[0-9]$|^on$|^off$|^sig$|^info$|^cdstop$|^cdrun$|^-*help$|^network$|^search$|^storage$|^modem$|^pin$|^sequrity$/i){
		print BOLD, RED, "\nНЕВЕРНАЯ КОМАНДА!",RESET,"\n\n$help";
		exit;
	}
####
	if($par=~/help/i){
		print $help;
		exit;
	}
####
unless(-c $usb_1){print BOLD, RED, "модем не найден\n", RESET;exit;}
unless(-c $usb_2){print BOLD, RED, "модем не найден\n", RESET;exit;}
####
	if(sysopen(USB, $usb_2, O_RDWR | O_NOCTTY)){
		system("stty -iutf8 hupcl -icrnl -opost -onlcr -isig -icanon -echo -echoe -echok -F $usb_2");
	}else{
		print "$!, выход\n" and exit if $par=~m/^info$/i;
		print "$!, выход\n" and exit unless sysopen(USB, $usb_1, O_RDWR | O_NOCTTY);
		system("stty -iutf8 hupcl -icrnl -opost -onlcr -isig -icanon -echo -echoe -echok -F $usb_1");
	}
	select((select(USB), $| = 1)[0]);
#####
	my $sim_status=info('CPIN?', qr/(ERROR: SIM failure)/);#проверка SIM
	print BOLD, RED, "$sim_status\n", RESET if $sim_status;
#####
my $pin_info=info('CPIN?', qr/SIM (PIN.*|PUK.*)/);#проверка необходимости ввода PIN PUK кода
print BOLD, qq(ВНИМАНИЕ! Модем ожидает ввод $pin_info\n), RESET if $pin_info;
#####
	if($par=~/pin/i){
		pin_puk() unless info('CPIN?', qr/(READY)/);# ввод PIN PUK
	}elsif($par=~/sequrity/i){#изменить, активировать, деактивировать  PIN код
		if(info('CPIN?', qr/(READY)/)){
			while(1){
				if(info('clck="SC",2', qr/\+CLCK: ?(1)/)){
MARK1:{
					print "\n1  отключить проверку PIN кода\n";
					print "2  изменить PIN код\n";
					print "или\n0  выход\nваш выбор? введите цифру:";
					chomp(my $answer=<>);
					exit if $answer eq "0";
					print BOLD, RED, "введено некорректное значение!\n\n", RESET and redo MARK1 unless $answer=~m/^[12]$/;
					if($answer == 1){
						print BOLD, "ВНИМАНИЕ! При вводе PIN кода будте предельно внимательны.\nУ вас 3 или менее попыток.\n", RESET;
MARK2:{
						print UNDERLINE, "\n-> деактивация PIN кода <-\n", RESET;
						my $pin=check_pin('Введите PIN код:');
						my $pin_=info(qq(clck="SC",0,"$pin"), qr/(ERROR.*)/);
						if($pin_){
							if ($pin_=~m/PUK/i){
								print pin_puk() ? redo MARK1 : last;
							}
							print RED, BOLD, "$pin_\n", RESET and redo MARK2;
						}
							print BOLD, "OK\n",RESET;
}
					}
					if($answer == 2){
						print BOLD, "ВНИМАНИЕ! При вводе PIN кода будте предельно внимательны.\nУ вас 3 или менее попыток.\n", RESET;
MARK3:{
						print UNDERLINE, "\n-> изменение PIN кода <-\n", RESET;
						my $pin1=check_pin('Введите старый PIN код:');
						my $pin2=check_pin('Введите новый PIN код:');
						my $pin_=info(qq(cpwd="SC",$pin1,$pin2), qr/(ERROR.*)/);
						if($pin_){
							pin_puk() and last if $pin_=~m/PUK/i;
							print RED, BOLD, "$pin_\n", RESET and redo MARK3;
						}
						print BOLD, "OK\n", RESET;
} 
					}
}
					last;
				}else{
MARK4:{
					print "\n1  включить проверку PIN кода\n";
					print "или\n0  выход\nваш выбор? введите цифру:";
					chomp(my $answer=<>);
					exit if $answer eq "0";
					print RED, BOLD, "введено некорректное значение!\n\n", RESET and redo MARK4 unless $answer=~m/^1$/;
 
					print BOLD, "ВНИМАНИЕ! При вводе PIN кода будте предельно внимательны.\nУ вас 3 или менее попыток.\n", RESET;
MARK5:{
					print UNDERLINE, "\n-> активация PIN кода <-\n", RESET;
					my $pin=check_pin('Введите PIN код:');
						my $pin_=info(qq(clck="SC",1,"$pin"), qr/(ERROR.*)/);
						if($pin_){
							if ($pin_=~m/PUK/i){
								print pin_puk() ? redo MARK4 : last;
							}
							print RED, BOLD, "$pin_\n", RESET and redo MARK5;
						}
							print BOLD, "OK\n", RESET;
}
}
					last;
				}
			}
		}
	}elsif($par=~/off/i){
		print RED, $error, RESET unless switch('cfun=0', 'отключение модема');
	}elsif($par=~/on/i){
		print RED, $error, RESET unless switch('cfun=1', 'включение модема');
	}elsif($par=~/cdstop/i){
		my $stat=info('zcdrun=8', qr/(Close autorun state)/);
		$stat ? print "$stat\n" : print RED, $error, RESET;
	}elsif($par=~/cdrun/i){
		my $stat=info('zcdrun=9', qr/(Open autorun state)/);
		$stat ? print "$stat\n" : print RED, $error, RESET;
	}elsif($par=~/modem/i){
		my $stat=info('zcdrun=e', qr/(Enter download mode)/);
		$stat ? print "OK\n" : print RED, $error, RESET;
	}elsif($par=~/storage/i){
		my $stat=info('zcdrun=f', qr/(exit download mode)/);
		$stat ? print "OK\n" : print RED, $error, RESET;
	}elsif($par=~/sig/i){ #мониторинг уровеня сигнала сети
		print "Для выхода - Ctrl^C\n";
		my $sig="";
		my $s="";
		my $usb;
			while(1){
				$s=info('CSQ', qr/\+CSQ: (\d+?),\d{2}/);
				print BOLD, "Сигнал сети: ", RESET, sig($s)."\n" if  $s && $s ne $sig;
				$sig =$s if $s;
				sleep 1;
			}
	}elsif($par=~/info/i){ #различная информация 
		print "\n";
		my $producer=info('CGMI', qr/(^.{3,})/);
      print BOLD, "Производитель: ", RESET, "$producer\n" if $producer;
 
		my $model=info('CGMM', qr/(^.{3,})/);
		print BOLD, "Модель: ", RESET, "$model\n" if $model;
 
		my $prog=info('CGMR', qr/(^.{5,})/);
		print BOLD, "Версия ПО: ", RESET, "$prog\n" if $prog;
 
		my $imei=info('CGSN', qr/(^\d{15,})/);
		print BOLD, "IMEI: ", RESET, "$imei\n" if $imei;
 
		my $iems=info('CIMI', qr/(^\d{15,})/);
		print BOLD, "IEMS: ", RESET, "$iems\n" if $iems;
 
		my $number=info('CNUM', qr/\+CNUM:\D+,"(\+?\d{10,})",\d+/);
		if($number){
			$number=~s/(.+)/\+$1/ unless $number=~/^\+/;
			print BOLD, "Ваш номер: ", RESET, "$number\n";
		}
 
		print BOLD, "Сигнал сети: ", RESET, sig(info('CSQ', qr/\+CSQ: (\d+?),\d{2}/))."\n";#уровень сигнала сети
		my $operator=operator();
		print BOLD, "Оператор: ", RESET, "$operator\n" if $operator;#оператор сети
		my $mode_=mode();
		print BOLD, "Режим поиска сети: ", RESET, "$mode_" if $mode_;
		print "\n";
      exit;
	}elsif($par=~/search/i){# выбор режима поиска сети
		my $status=0;
		my $mode_=mode();
		print BOLD, "Текущие настройки: $mode_", RESET if $mode_;
			while(1){
				print <<SAY;
Выберите:
1 автоматически, GSM+WCDMA
2 автоматически, GSM+WCDMA, предпочтительно GSM
3 автоматически, GSM+WCDMA, предпочтительно WCDMA
4 автоматически, только GSM
5 автоматически, только WCDMA
0 выход
SAY
				print "ваш выбор? введите цифру:";
				chomp(my $answer=<>);
				print RED, BOLD, "\nВВЕДЕНО НЕВЕРНОЕ ЗНАЧЕНИЕ!\n\n", RESET and redo unless $answer=~m/^[0-5]$/;
				last if $answer == 0;
				$status=switch('zsnt=0,0,0') if $answer == 1;
				$status=switch('zsnt=0,0,1') if $answer == 2;
				$status=switch('zsnt=0,0,2') if $answer == 3;
				$status=switch('zsnt=1,0,0') if $answer == 4;
				$status=switch('zsnt=2,0,0') if $answer == 5;
				print RED, $error, RESET unless $status;
				print "OK\n" if $status == 1;
				last;
			}
	}elsif($par=~/network/i){# сканирование сети и возможность ручного выбора оператора если есть доступны(й|е)
		print "ждите...\n";
		my $operators=info('COPS=?', qr/^\+COPS: (.+$)/);
		my($i, @operators, @available);
		foreach (split /,?\((\d.+?\d)\),?/, $operators){$i++;push @operators, $_ if $i%2 == 0;}
			foreach (@operators){
				my( $stat, $operator)=$_=~m/(^\d),".+?","(.+?)","/;
				push @available, $operator if $stat eq '1';
				$stat="unknown" unless $stat;
				$stat="доступен" if $stat eq '1';
				$stat="текущий" if $stat eq '2';
				$stat="запрещен" if $stat eq '3';
				printf "%-20s%s\n", $operator, $stat;
			}
			if(@available){#если есть доступны(й|е) операторы
CYCLE_1:
				while(1){
					my $i=0;
					print BOLD, "доступные операторы:\n", RESET;
					map{print ++$i."  ".$_."\n"}(@available);
					print "или\n0  выход\nваш выбор? введите цифру:";
					chomp(my $answer=<>);
					print RED, BOLD, "Введено неверное значение!\n", RESET and redo if $answer=~m/^\D$/ && $answer > scalar @available;
					last if $answer == 0;
					system("clear");
						while(1){
							print << 'SAY';
Нажмите ENTER для продолжения, при этом при неудачной регистрации
модем "перескочит" на родную сеть
 
или для подключения в ручном режиме наберите:
SAY
							 print BOLD, "m\n", RESET;
							 print << 'SAY';
в дальнейшем при следующем подключении модема необходимо
будет явно выбрать сеть или изменить режим поиска сети.
 
или: 0  для выхода
 
SAY
							print "ваш выбор? ";
							chomp(my $answer2=<>);
							print RED, BOLD, "Введено неверное значение!\n", RESET and redo unless $answer2=~m/^m$|^0$|^$/i;
							last CYCLE_1 if $answer2 eq '0';
							my $mode=4;
							$mode=1 if $answer2;
							print RED, BOLD,"\nОШИБКА! НЕУДАЛОСЬ ПОДКЛЮЧИТЬСЯ\n\n", RESET and next CYCLE_1 unless switch("cops=$mode,1,$available[$answer-1]", 'ждите...');
							print RED, BOLD, "\nОШИБКА! НЕУДАЛОСЬ ПОДКЛЮЧИТЬСЯ, ПЕРЕКЛЮЧЕНИЕ НА РОДНУЮ СЕТЬ...\n\n", RESET and next CYCLE_1 unless info('cops?', qr/^\+COPS: [\d,]+"(.+?)"/) eq $available[$answer-1];
							print BOLD, "OK\n", RESET and last CYCLE_1;
						}
				}
			}
	}else{# ussd команда
		my $count;
		while(1){
		if(info('zoprt?', qr/^\+ZOPRT: (\d)/) eq '5' && !$sim_status){
			my $operator=operator();#оператор сети
			print RED, "сеть недоступна\n", RESET and exit unless $operator; #  проверка зарегистрирован ли модем в сети
			my $sig=info('CSQ', qr/\+CSQ: (\d+?),\d{2}/);
			print "$operator ".sig($sig)."\tзапрос отправлен, ждите...\n";#оператор+уровень сигнала сети
			my $answer=ussd($par);
   		print "$answer\n" if $answer;
			last;
		}else{
			last if $sim_status;
			print RED, "неудача, выход\n", RESET and last if $count;
			print RED, "неудача, повтор...\n", RESET;
			sleep 5;
			$count++;
		}
		}
	}
	close USB;
}else{
	print RED, BOLD, "не указана команда", RESET, "\n\n$help";
}
####
sub ussd{# USSD команды
my $st;
print USB "at+cusd=1,${_[0]},15\015\012";
{eval{
local $SIG{ALRM}=sub{ die "Timeout"; };#таймаут
alarm($timeout);
	while(<USB>){
#	   print;
		$st=$1 if m/^\+CUSD:.+?"(.+?)",[0-9]{2}/;
		last if m/CMTI/;
		$st="NO CARRIER\n" if m/NO CARRIER/;
		$st=$error if m/^ERROR/;
		last if $st;
	}
alarm(0);
}}
	if($st){
		if($st=~/^[0-9A-F]+$/i){
			$st = pack("H*", $st);
			encode("ucs-2",$st);
			from_to($st,"ucs-2","utf-8");
		}
		return $st;
	}elsif($@ =~ /Timeout/){
		return $exit_;
	}else{
		return;
	}
}
####
sub info{#
my $info;
my $pattern=$_[1];
print USB "at+${_[0]}\015\012";
{eval{
local $SIG{ALRM}=sub{ die "Timeout"; };#таймаут
${_[0]}=~m/COPS=/i ? alarm($timeout+40) : alarm($timeout);
	while(<USB>){
#print;
		last if m/^OK/;
		$info=$1 if m/$pattern/i;
		last if m/ERROR|^NO CARRIER/;
	}
alarm(0);
}}
print "$exit_\n" and return "" if $@ =~ /Timeout/;
$info ? return $info : return "";
}
####
sub switch{# изменение настроек модема
my $r="";
print "$_[1]\n" if $_[1];
print USB "at+${_[0]}\015\012";
{eval{
local $SIG{ALRM}=sub{ die "Timeout"; };#таймаут
${_[0]}=~m/COPS=/i ? alarm($timeout+40) : alarm($timeout);
	while(<USB>){
#print;
		$r=1 if m/^OK/;
		$r=0 if m/ERROR|^NO CARRIER/;
		last if $r || $r eq "0";
	}
alarm(0);
}}
print "$exit_\n" and return -1 if $@ =~ /Timeout/;
return $r;
}
####
sub sig{
return "неизвестно" unless $_[0];
$_[0] == 99 ? return "неизвестно" : return sprintf("%.0f", $_[0]*100/31)."%";
}
####
sub operator{#информация о сети
my $operator=info('cops?', qr/^\+COPS: [\d,]+"(.+?)"/);
$operator ? return "$operator ".info('zpas?', qr/^\+ZPAS: ("\w+?")/) : return "";
}
####
sub mode{#определение текущего режима поиска сети
my $mode=info('zsnt?', qr/^\+ZSNT: (\d,\d,\d)/);
	if($mode){
		return "автоматически, GSM+WCDMA\n" if $mode eq "0,0,0";
		return "автоматически, GSM+WCDMA, предпочтительно GSM\n" if $mode eq "0,0,1";
		return "автоматически, GSM+WCDMA, предпочтительно WCDMA\n" if $mode eq "0,0,2";
		return "автоматически, только GSM\n" if $mode eq "1,0,0";
		return "автоматически, только WCDMA\n" if $mode eq "2,0,0";
		return "вручную, GSM+WCDMA\n" if $mode eq "0,1,0";
		return "вручную. только GSM\n" if $mode eq "1,1,0";
		return "вручную, только WCDMA\n" if $mode eq "2,1,0";
	}
}
####
sub pin_puk{
system("clear");
my($m1, $m2, $m3, $pin_puk, $info);
	while($pin_puk=info('CPIN?', qr/(SIM PUK|SIM PIN)/)){
			if($pin_puk=~m/SIM PIN/i){
				print BOLD, "ВНИМАНИЕ! При вводе PIN кода будте предельно внимательны.\nУ вас 3 или менее попыток.", RESET, "\n0 - выход\n" unless $m1;
				$m1=1;
#				print "";
				my $answer=check_pin('Введите PIN код:');
				print RED, BOLD, "ERROR: incorrect password\n", RESET and next unless switch("cpin=$answer");
			}
			if($pin_puk=~m/SIM PUK/i){
				system("clear") unless $m3;$m3=1;
				print BOLD, "ВНИМАНИЕ! Вы исчерпали попытки ввода PIN кода.\nВведите восьмизначный PUK код, будте осторожны, количество попыток ограничено.", RESET, "\n0 - выход\n" unless $m2;
				$m2=1;
				print "Введите PUK код:";
				chomp(my $answer=<>);
				return if $answer eq "0";
				redo unless $answer;
				print RED, "введено некорректное значение! PUK код - восьмизначное число\n", RESET and redo unless $answer=~m/^\d{8}$/;
				my $answer2=check_pin('Введите новый PIN код:');
				print RED, BOLD, "ERROR: incorrect password\n", RESET and next unless switch("cpin=$answer,$answer2");
			}
	}
$info=info('CPIN?', qr/\+CPIN: ?(.+)$/);
$info=info('CPIN?', qr/\+CME ?(.+)$/) unless $info;
	if($info){
		print BOLD, "OK\n", RESET and return 1 if $info=~m/READY/i;
		print RED, "Unsupported, exit (PH-SIM PIN (SIM lock))\n", RESET and return if $info=~m/PH-SIM PIN/i;
		print RED, "Unsupported, exit (PH-NET PIN (Network personnalisation))\n", RESET and return if $info=~m/PH-NET PIN/i;
		print RED, "Unsupported, exit (SIM PIN2)\n", RESET and return if $info=~m/SIM PIN2/i;
		print RED, "Unsupported, exit (SIM PUK2)\n", RESET and return if $info=~m/SIM PUK2/i;
		print "$info\n" and return if $info=~m/ERROR/i;
	}else{
		print RED, BOLD, "ERROR\n", RESET and return;
	}
}
 
sub check_pin{
my $pin;
	while(1){
		print $_[0];
		chomp($pin=<>);
		exit if $pin eq "0";
		next unless $pin;
		print RED, "введено некорректное значение! PIN код: 4 - 8 цыфр\n", RESET and next unless $pin=~m/^\d{4,8}$/;
		last;
	}
return $pin;
}

Вскрываем

Изначально модем определяется как CD-ROM, на котором есть драйвера только под Windows (несмотря на заявленную поддержку MacOS X). После извлечения оного модем становится виден как 3 tty устройства, с которыми уже можно попробовать поработать, но разве нам нужны эти пляски?

Потому просто берем и отключаем cdrom командой:

./mf100.pl cdstop

Если скрипт ответил "OK", можно переткнуть модем и удостовериться, что больше нас ничто не беспокоит.

Звоним

Многие провайдеры используют коварный флаг, который разрывает соединение каждые 2-3 минуты и коварный билайн в их числе. Недуг лечится опять же, просто:

./mf100.pl modem

Кто как, а я для дозвона с незапамятных времен использую wvdial, ибо для ppp/pppd нужно писать много букав, а в kppp/gnome-ppp - много тыкать мышкой. Лень.

для wvdial используем такой конфиг (пользователь/пароль/точка доступа специфичны для вашего провайдера):

[Dialer beeline-3g]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","home.beeline.ru"
Phone = *99#
ISDN = 0
Stupid Mode = 1
Auto Reconnect = 0
Idle Seconds = 0
Username = beeline
Password = beeline
Modem Type = USB Modem
Modem = /dev/ttyUSB2

теперь запускаем wvdial и радуемся интернету:

wvdial beeline-3g

Ссылки