Tamkovich.com: Телеком/VoIP блог
Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys
Приём и отправка SMS через GSM модем с помощью gnokii
5 мая, 2010 by Сергей Тамкович
Разное GSM, SMSНекоторое время назад я писал как легко и просто можно отправлять и принимать SMS с помощью GSM модема и AT команд. Ещё проще делать это с помощью программы gnokii. Отправка SMS:
echo 'ya sms-ko !' | gnokii --sendsms +79260000000 |
Принять SMS чуть сложнее. На самом деле GSM модем принимает SMS самостоятельно, наша же задача заключаетя в том, что бы прочитать SMS из GSM терминала и удалить её. Перед тем как читать SMS, получим список папок с короткими сообщениями на нашем терминале:
gnokii --showsmsfolderstatus GNOKII Version 0.6.28 No. Name Id #Msg ======================================================== 0 SIM card SM 1 |
Gnokii показывает что доступна всего 1 папка с SMS под названием SM — это симкарта установленная в терминал. В терминале Teleofis RX201 собственные папки отсутствуют, однако если вы используете в качестве терминала обычный мобильный телефон, то, скорее всего там будут и другие папки кроме сим-карты (SM). Последняя цифра в графе — количество сообщений в данной папке. Имя папки с короткими сообщениями необходимо для того, что бы прочитать сообщение из этой папки:
gnokii --getsms SM 1 GNOKII Version 0.6.28 1. Inbox Message (Unread) Date/time: 05/05/2010 13:04:18 +0400 Sender: +79036967798 Msg Center: +79262909090 Text: Test1 |
SM — это тип памяти откуда мы пытаемся прочесть сообщение, 1 — номер ячейки. Сообщения помещаются в ячейки последовательно начиная с 1ой. (Unread) — флаг, указывающий на то, что мы читаем это сообщение впервые. При последующих попытка чтения этого сообщения флаг изменится на (Read). Sender — номер, с которого было отправлено данное сообщение. За раз можно читать несколько сообщений, для этого указываем диапазон ячеек (первую и последнюю):
gnokii --getsms SM 1 5 GNOKII Version 0.6.28 1. Inbox Message (Read) Date/time: 05/05/2010 13:04:18 +0400 Sender: +79036967798 Msg Center: +79262909090 Text: Test1 2. Inbox Message (Unread) Date/time: 05/05/2010 13:33:28 +0400 Sender: +79036967798 Msg Center: +79262909090 Text: Xxx GetSMS SM 3 failed! (The given location is empty.) GetSMS SM 4 failed! (The given location is empty.) GetSMS SM 5 failed! (The given location is empty.) |
Из этого примера мы видим, что ячейки 3-5 — пустые. Если ячейка не существует, gnokii выдаст другое сообщение:
GetSMS SM 31 failed! (The given memory location is invalid.) |
В сим карте от Мегафона всего 30 ячеек. Что бы принимать больше 30 сообщений — следует удалять прочитанные сообщения. Делается это с помощью команды:
gnokii --deletesms SM 1 GNOKII Version 0.6.28 Deleted SMS SM 1 |
Эта команда, как вы уже догадались, удалит SMS из ячейки 1 на сим-карте установленной в GSM модеме. Удалять сообщения, как и читать их, можно целыми диапазонами:
gnokii --deletesms SM 1 5 GNOKII Version 0.6.28 Deleted SMS SM 1 Deleted SMS SM 2 Deleted SMS SM 3 Deleted SMS SM 4 Deleted SMS SM 5 |
Удаляет все сообщения из первых 5 ячеек сим карты. Удаление «пустой» ячейки не является ошибкой, по этому вы не увидите никаких сообщений об ошибках, не смотря на то, что ячейки 1, 3, 4 и 5 — пустые. Однако попытка удаления несуществующей ячейки — ошибкой является, о чём и сообщит gnokii:
gnokii --deletesms SM 32 GNOKII Version 0.6.28 DeleteSMS SM 32 failed!(The given memory location is invalid.) |
Вот и всё — периодически читаем сообщения и не забываем удалять прочитанные.
Возможно кому-то понравится режим непрерывного чтения SMS, который поддерживает gnokii. Работая в этом режиме, gnokii непрерывно опрашивает GSM модем и выводит в консоль информацию о принятых сообщениях:
gnokii --smsreader GNOKII Version 0.6.28 Entered sms reader mode... SMS received from number: 79036967798 Got message 1: Hello! ^CShutting down Exiting sms reader mode... |
Осталось лишь заметить, что для работы gnokii требуется конфигурационный файл $HOME/.gnokiirc — усли его нет, параметры берутся из файла /etc/gnokiirc. В этом файле указывается порт, к которому подключен GSM терминал, скорость, протокол работы с терминалом и т.д. Мой конфигурационный файл (для Teleofis RX201) выглядит вот так:
[global] port = /dev/ttyUSB0 model = AT initlength = default connection = serial use_locking = no serial_baudrate = 115200 smsc_timeout = 10
Для того что бы отправлять и принимать SMS с компьютера, не обязательно покупать GSM модем, для экспериментов подойдёт любой телефон который поддерживается gnokii. А список поддерживаемых моделей у gnokii — очень большой.
Разное GSM, SMS
Кстати, напоминаю, устройство Teleofis RX201 поддерживает большое количество скоростей:
Скорость по умолчанию — 460800. Однако линуксовый драйвер (Fedora 12) на этой скорости работать не умеет. Решение — подключить модем к компьютеру с Windows, и через HyperTerminal cvсменить скорость по умолчанию на 115200:
а сможет ли gnokii отправить СМС на русском языке?
Лично я не пробовал однако не вижу для этого препятствий. Главное использовать правильную кодировку, насколько я представляю — UTF-16.
а какой командой можна скопировать часть текста например первые 6 символов непрочитанной смс?
>а какой командой можна скопировать часть текста например первые 6 символов непрочитанной смс?
А за чем?
1. читаем смс
2. проверяем первые 6 символов
3. ЕСЛИ То что нужно, удаляем смс симки.
ИНАЧЕ пропускаем.
Если GPRS модем законектился и принимает/передаёт данные в/из интернета, то отправка SMS сообщений становится невозможной. Как можно отправить SMS в таком случае (если нет доступа к модему чтоб разорвать соединение)?