Страница 1 из 1

SMS шлюз

Добавлено: 01 май 2017, 18:55
xor
Источник: https://xakep.ru/2015/04/07/195-sms/
Источник: http://alex-exe.ru/radio/wireless/gsm-s ... t-command/

Установка SMS шлюза на базе Debian Linux

Требования:
Свежая система, подключенный USB/COM AT GSM модем.

Устанавливаем пакет Gammu.
apt-get install gammu gammu-smsd

Первоначальная конфигурация
gammu-config

Файлы конфигурации для gammu и gammu-smsd, и примеры
~/.gammurc

Код: Выделить всё

# This is a generated gammurc file.
# It was generated by Gammu configurator 0.4

# In Unix/Linux  : copy it into your home directory and name it .gammurc
#                  or into /etc and name it gammurc
# In Win32       : copy it into directory with Gammu.exe and name gammurc

# Port           : in Windows/DOS: "com*:",
#                  (instead of "*" please put "1", "2", etc.)
#                  in other (Linux/Unix) "/dev/ttyS%"
#                                     or "/dev/ircomm%" ("irda" connection)
#                  (instead of "%" please put "0", "1", "2", etc.)
# Model          : use only, when Gammu doesn't recognize your phone model.
#                  Put it here. Example values: "6110", "6150", "6210", "8210"
# Connection     : type of connection. Use "fbus" or "mbus" or "dlr3" or
#                  "irda" (Infrared over sockets) or "infrared" (DirectIR)
#                  or "at19200" (AT commands on 19200, 8 bits, None parity,
#                  1 stop bit, no flow control) or "at115200" (AT commands on
#                  115200, 8 bits, None parity, 1 stop bit, no flow control)
#                  or "atblue" (AT over BlueTooth) or "dlr3blue" (FBUS
#                  over BlueTooth)
# SynchronizeTime: if you want to set time from computer to phone during
#                  starting connection. Do not rather use this option when want
#                  to reset phone during connection (in some phones need to
#                  set time again after restart)
# Logfile        : Use, when want to have logfile from communication.
# Logformat      : What debug info and format should be used:
#                  "nothing" - no debug level, "text" - transmission dump in
#                  text format, "textall" - all possible info in text format,
#                  "errors"  - errors in text format, "binary" - transmission
#                  dump in binary format
# Use_Locking    : under Unix/Linux use "yes", if want to lock used device
#                  to prevent using it by other applications
# GammuLoc       : name of localisation file

[gammu]

port = /dev/ttyUSB3
model =.
connection = at115200
synchronizetime = yes
logfile = /var/log/gammu-gsm.log
logformat = textalldate
use_locking =.
gammuloc =
/etc/gammu-smsdrc

Код: Выделить всё

# Configuration file for Gammu SMS Daemon

# Gammu library configuration, see gammurc(5)
[gammu]
# Please configure this!
port = /dev/ttyUSB3
connection = at115200
# Debugging
logformat = textalldate

# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = files
logfile = syslog
# Increase for debugging information
debuglevel = 1
RunOnReceive = /usr/lib/gammu/received_sms.sh

# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/
Для корректной отправки и приема SMS на русском языке нужно корректно настроить локали в системе.
(например, ~/.bash_profile):

Код: Выделить всё

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
Для отправки сообщения служит команда gammu sendsms TEXT <нoмер телефона>. Сам текст сообщения нужно направить команде по механизму pipes. Это упрощаeт отправку по СМС текста, который является результатом работы другой программы.
echo "Привeт" | gammu sendsms TEXT +79295556924

Для чтения сообщений существует целый набор комманд. Например эта Она выводит все СМС, хранящиеся в памяти устройства. Остальные можно посмотреть через --help в контекстной помощи.
gammu getallsms

Код: Выделить всё

    Location 1, folder "Inbox", SIM memory, Inbox folder
    SMS message
    SMSC number          : "+79037333332"
    Sent                 : Fri Dec 18 21:17:17 2009 +0300
    Coding               : Unicode (no compression)
    Remote number        : "Beeline"
    Status               : Read
    User Data Header     : Concatenated (linked) message, ID (16 bit) 8444, part 1 of 2
    
    Общее время Ваших разговоров 4 мин.
SMS Daemon работает в фоне, поддерживает кoнтакт с модемом и при получении сообщения выполняет заданные дeйствия. К слову, с перезагрузкой подвисшего модема он тоже спpавляется.
SMS Daemon способен автоматичеcки записывать полученные сообщения в базу данных (поддерживаются среди пpочего SQLite, MySQL, PostgreSQL и MS SQL) или складывать в виде файлов в специальную папку.
Обработчик представляeт собой программу или скрипт пользователя, автоматически запускaемый после приема сообщения. Информация передается обработчику чеpез переменные окружения. Переменная SMS_MESSAGES содержит число полученных соoбщений, значение SMS_1_NUMBER соответствует телефонному номеру отправителя, а SMS_1_TEXT — тексту сообщения.
SMS Daemon мoжно использовать и для отправки сообщений, хотя это несколько выбивается из круга его обязанностей. Это делается при помощи команды gammu-smsd-inject, дейcтвующей в точности как gammu send-sms.
echo "Привет" | gammu-smsd-inject TEXT +79295556924


SMS контроллер для CISCO роутера
Возможно реализовать управление маршрутизаторами CISCO через SMS.
Установим expect
apt-get install expect

Создаем несколько файлов (в скриптах некоторые лишние моменты - задел на перспективу развития):
/usr/lib/gammu/received_sms.sh

Код: Выделить всё

#!/bin/bash

DATE=`date "+%F %T"`
SMS_FILE=/var/log/sms.file
NUMBER_LIST=`cat /usr/lib/gammu/allow_number.list|grep -v ^#|grep -v ^$`
ACTION_SCRIPT=/usr/lib/gammu/action.sh

touch $SMS_FILE
echo "---***---***---***---***---***---" >> $SMS_FILE
echo "---***---***---***---***---***---" >> $SMS_FILE
echo "[$DATE]: New message received" >> $SMS_FILE
echo "[$DATE]: Message count: $SMS_MESSAGES" >> $SMS_FILE
echo "[$DATE]: Parts count: $DECODED_PARTS" >> $SMS_FILE
echo "[$DATE]: Receive data:>>" >> $SMS_FILE
for i in `seq $SMS_MESSAGES` ; do
  OUT_SMS_CLASS="SMS_"$i"_CLASS"
  OUT_SMS_NUMBER="SMS_"$i"_NUMBER"
  OUT_SMS_TEXT="SMS_"$i"_TEXT"
  CMD=${!OUT_SMS_TEXT}
  CMD=${CMD^^}
  CMD_VALIDATION=`echo "${!OUT_SMS_TEXT}" | wc -w`
  echo "[$DATE]: <<< SMS$i >>>" >> $SMS_FILE
  echo "[$DATE]: Class: ${!OUT_SMS_CLASS}" >> $SMS_FILE
  echo "[$DATE]: Number: ${!OUT_SMS_NUMBER}" >> $SMS_FILE
  echo "[$DATE]: Text: ${!OUT_SMS_TEXT}" >> $SMS_FILE
  echo "[$DATE]: Command validation: $CMD_VALIDATION" >> $SMS_FILE
  echo "[$DATE]: Command: $CMD" >> $SMS_FILE
  echo "[$DATE]: <<< EoS >>>" >> $SMS_FILE
  for j in $NUMBER_LIST ; do
    if [ "$j" = "${!OUT_SMS_NUMBER}" ];then
      echo "[$DATE]: Number ${!OUT_SMS_NUMBER} is approved for control." >> $SMS_FILE
      if [ "$CMD_VALIDATION" = "2" ];then
        `$ACTION_SCRIPT $CMD ${!OUT_SMS_NUMBER}`
      else
        `echo "ERR! command don't recognized."|/usr/bin/gammu-smsd-inject TEXT ${!OUT_SMS_NUMBER}`
      fi
    else
      echo "[$DATE]: WARN! Number ${!OUT_SMS_NUMBER} is NOT approved for control." >> $SMS_FILE
      exit 0;
    fi
  done
done
exit 0;
chmod +x /usr/lib/gammu/received_sms.sh

/usr/lib/gammu/action.sh

Код: Выделить всё

#!/bin/bash

###  $1 - host; $2 - command; $3 - sender number;

DATE=`date "+%F %T"`
SMS_CTRL_FILE=/var/log/sms-control.file
NUMBER_LIST=`cat /usr/lib/gammu/allow_number.list|grep -v ^#|grep -v ^$`

ACT_HOST=$1
ACT_IPS=`cat /usr/lib/gammu/host-ip.list|grep -v ^#|grep -v ^$|grep -w ^$ACT_HOST |cut -d : -s -f 2|sed 's/[ \t]//'`
ACT_COMMAND=$2
SENDER_NUMBER=$3

SMS_COMMAND="/usr/bin/gammu-smsd-inject TEXT $SENDER_NUMBER"

touch $SMS_CTRL_FILE
echo "---" >> $SMS_CTRL_FILE
echo "[$DATE]: New control session from $SENDER_NUMBER for $ACT_HOST" >> $SMS_CTRL_FILE
echo "[$DATE]: Command is $ACT_COMMAND" >> $SMS_CTRL_FILE
if [ "$ACT_COMMAND" = "CHANNELDOWN" ]; then
  ACT_DIR="/usr/lib/gammu/actions/"
  ACT_TPL=$ACT_DIR"CHANNELDOWN.exp"
  ACT_SCRIPT="/usr/lib/gammu/actions/"$ACT_HOST"_CHANNELDOWN.exp.sh"
  for i in $ACT_IPS ; do
    echo "[$DATE]: Run CHANNELDOWN action in host $ACT_HOST:$i" >> $SMS_CTRL_FILE
    $ACT_SCRIPT $i adm-user adm-passwd
  done
  echo "CHANNELDOWN for $ACT_HOST command complete."|$SMS_COMMAND
  echo "[$DATE]: Send complete report to $SENDER_NUMBER" >> $SMS_CTRL_FILE
elif [ "$ACT_COMMAND" = "CHANNELUP" ]; then
  ACT_DIR="/usr/lib/gammu/actions/"
  ACT_TPL=$ACT_DIR"CHANNELUP.exp"
  ACT_SCRIPT=$ACT_DIR$ACT_HOST"_CHANNELUP.exp.sh"
  for i in $ACT_IPS ; do
    echo "[$DATE]: Run CHANNELUP action in host $ACT_HOST:$i" >> $SMS_CTRL_FILE
    $ACT_SCRIPT $i adm-user adm-passwd
  done
  echo "CHANNELUP for $ACT_HOST command complete."|$SMS_COMMAND
  echo "[$DATE]: Send complete report to $SENDER_NUMBER" >> $SMS_CTRL_FILE
else
  echo "ERR! command don't recognized."|$SMS_COMMAND
  echo "[$DATE]: Send ERROR report to $SENDER_NUMBER" >> $SMS_CTRL_FILE
  exit 0;
fi

exit 0;
chmod +x /usr/lib/gammu/action.sh

/usr/lib/gammu/allow_number.list

Код: Выделить всё

+79078834421
+79107892389
/usr/lib/gammu/host-ip.list

Код: Выделить всё

CAVE: 10.22.3.66
CAVE1: 192.168.12.1
CAVE2: 192.168.12.2
/usr/lib/gammu/actions/CAVE_CHANNELUP.exp.sh Скрипт будет поднимать определенные BGP сессии

Код: Выделить всё

#!/usr/bin/expect -f

set timeout 20
set IPaddress [lindex $argv 0]
set Username [lindex $argv 1]
set Password [lindex $argv 2]
set Directory /var/log

log_file -a $Directory/sms-control-commands.log
send_log "### /START-SSH-SESSION/ IP: $IPaddress @ [exec date] ###\r"

spawn ssh -o "StrictHostKeyChecking no" $Username@$IPaddress
expect "*assword: "
send "$Password\r"

expect "#"
send "conf t\r"
expect "(config)#"


send "router bgp 65000\r"
expect "(config-router)#"
send "no neighbor 10.222.5.21 shut\r"
expect "(config-router)#"
send "no neighbor 10.222.5.31 shut\r"
expect "(config-router)#"
send "exit\r"
expect "(config)#"
send "exit\r"
expect "#"
send "exit\r"

sleep 3

send_log "r### /END-SSH-SESSION/ IP: $IPaddress @ [exec date] ###\r"
exit
chmod +x /usr/lib/gammu/actions/CAVE_CHANNELUP.exp.sh

/usr/lib/gammu/actions/CAVE_CHANNELDOWN.exp.sh Скрипт будет гасить определенные BGP сессии

Код: Выделить всё

#!/usr/bin/expect -f

set timeout 20
set IPaddress [lindex $argv 0]
set Username [lindex $argv 1]
set Password [lindex $argv 2]
set Directory /var/log

log_file -a $Directory/sms-control-commands.log
send_log "### /START-SSH-SESSION/ IP: $IPaddress @ [exec date] ###\r"

spawn ssh -o "StrictHostKeyChecking no" $Username@$IPaddress
expect "*assword: "
send "$Password\r"

expect "#"
send "conf t\r"
expect "(config)#"

send "router bgp 65000\r"
expect "(config-router)#"
send "neighbor 10.222.5.21 shut\r"
expect "(config-router)#"
send "neighbor 10.222.5.31 shut\r"
expect "(config-router)#"
send "exit\r"
expect "(config)#"
send "exit\r"
expect "#"
send "exit\r"

sleep 3

send_log "r### /END-SSH-SESSION/ IP: $IPaddress @ [exec date] ###\r"
exit
chmod +x /usr/lib/gammu/actions/CAVE_CHANNELDOWN.exp.sh

touch /var/log/sms-control-commands.log
touch /var/log/sms-control.file
touch /var/log/sms.file
chmod 666 /var/log/sms-control-commands.log
chmod 666 /var/log/sms-control.file
chmod 666 /var/log/sms.file

В конфиг SMSD добавим опцию обработчика SMS
/etc/gammu-smsdrc

Код: Выделить всё

[smsd]
RunOnReceive = /usr/lib/gammu/received_sms.sh
/etc/init.d/gammu-smsd restart


Список AT команд
Диалог с модемом происходит по средством AT команд. Мы шлём модулю нужную команду или запрос, а он её выполняет и отвечает. Самая простая команда AT, на которую модуль тут же ответит OK, если модуль подключен и исправен.

Почти все команды имеют 3 режима:
тестовый =? – модуль ответит поддерживает ли он команду и возможные её параметры
чтение ? – ответом будет текущие параметры для этой команды
запись = записываем новые значения для команды.
A/ — повтор предыдущей команды

В статье, идёт речь о GSM модуле SIM900 (B09). Напоминаю, т.к. есть ещё и другие разновидности этого модуля и формат команд с ними может немного отличаться.
По умолчанию модуль настроен 9600 8N1, 9600 – скорость, 8 – бит в посылки, N – нет контроля чётности, 1- стоп бит.

Команда / Ответ / Описание
AT+IPR? / +IPR: 0 OK / Скорость порта: 0 – автоматически 1200 2400 4800 9600 19200 38400 57600 115200
AT+ICF? / +ICF: 3,3 OK / Настройки передачи. Первый параметр:Бит в посылке/чётность/стоп бит 1 – 8/0/2; 2 – 8/1/1; 3 – 8/0/1; 4 – 7/0/2; 5 – 7/1/1; 6 – 7/0/1; Второй параметр – чётность:0 – нечётный; 1 – чётный; 3 – нет
AT+IFC? / +IFC: 0,0 OK / Контроль передачи данных. Первый параметр – терминалом от модуля. Второй параметр – модулем от терминала. 0 – нет контроля; 1 – программный; 2 – аппаратный
AT+GCAP / +GCAP:+FCLASS,+CGSM OK / Возможности модуля.
AT+GMM / SIMCOM_SIM900 OK / Идентификатор модуля
AT+GMR / Revision:1137B09SIM900M64_ST OK / Ревизия
AT+GSN / 01322600XXXXXXX OK / IMEI
AT+COPS? / +COPS: 0,0,"MTS-RUS" OK / Информация об операторе
AT+COPS=? / +COPS: (2,"MTS RUS","","25001"),(1,"MOTIV","MOTIV","25035"),(1,"Utel","Utel","25039"),,(0,1,4),(0,1,2) OK / Доступные операторы
AT+CPAS / +CPAS: 0 OK / Информация о состояние модуля. 0 – готов к работе; 2 – неизвестно; 3 – входящий звонок; 4 – голосовое соединение
AT+CREG? / +CREG: 0,1 OK / Тип регистрации сети. Первый параметр:0 – нет кода регистрации сети; 1 – есть код регистрации сети; 2 – есть код регистрации сети + доп параметры. Второй параметр:0 – не зарегистрирован, поиска сети нет; 1 – зарегистрирован, домашняя сеть; 2 – не зарегистрирован, идёт поиск новой сети; 3 – регистрация отклонена; 4 – неизвестно; 5 – роуминг
AT+CSQ / +CSQ: 17,0 OK / Уровень сигнала:0 -115 дБл и меньше; 1 -112 дБл; 2-30 -110..-54 дБл; 31 -52 дБл и сильнее; 99 – нет сигнала.
AT+CCLK? / +CCLK: "00/01/01,04:21:27+00" OK / Текущая дата и время телефона.
AT+CBC / +CBC: 0,95,4134 OK / Монитор напряжения питания модуля. Первый параметр:0 – не заряжается; 1 – заряжается; 2 – зарядка окончена. Второй параметр:1-100 % — уровень заряда батареи. Третий параметр:Напряжение питание модуля (VBAT), мВ
AT+CADC? / +CADC: 1,7 OK / Значение АЦП (до 2,8В)
AT+CLIP=1 / OK / АОН. 1 – вкл / 0 – выкл
AT+GSMBUSY=0 / OK / Запрет входящих звонков. 0 – разрешены; 1 – запрещены
ATS0=0 / OK / Автоответ. 0 – ручной; 1-более – автоматический после заданного количества звонков
AT+CMGF=1 / OK / Текстовый режим. 1 – включить; 0 – выключить. см. примечание
AT+CSCS= "GSM" / OK / Кодировка текстового режима. Доступны следующие кодировки:IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1. см. примечание
AT+CSCB=0 / OK / Приём специальных сообщений. 0 – разрешен (по умолчанию); 1 – запрещен
ATE0 / OK / ЭХО. 1 – вкл (по умолчанию) / 0 – выкл
ATV1 / OK / Формат ответа модуля. 0 – только ответ; 1 – полный ответ с ЭХО (по умолчанию)
AT+CMEE=0 / OK / Информация об ошибках. 0 – отключён (по умолчанию); 1 – код ошибки; 2 – описание ошибки
AT+CCLK="13/09/25,13:25:33+05" / OK / Установка часов. «yy/mm/dd,hh:mm:ss+zz» Где:год/месяц/дата,часы:минуты:секунды+часовой пояс
AT+CPIN=XXXX / / Ввод PIN кода
AT+CLCK="SC",0,"ПИНКОД" / / команда отключения постоянного запроса от СИМки ПИНкода
ATZ0 / / Сброс настроек до по умолчанию (не до заводских). 0 или 1 – выбор профиля
AT&F / / Сброс настроек до заводских
AT&W / OK / Сохранение настроек для текущего профиля. Параметр 0 или 1 — выбор профиля. Параметр указывать сразу за командой (AT&W0)
AT+CPOWD=1 / NORMAL POWER DOWN / Выключение модуля. 0 – срочное; 1 – нормальное
AT+CFUN=1,1 / / Энергосберегающий режим и перезагрузка. Первый параметр:0 – минимальный функционал; 1 – нормальный режим (по умолчанию); 2 – выключения цепей приёма и передачи сигнала. Второй параметр:0 – выполнить без перезагрузки; 1 – перезагрузить (доступно только в нормальном режиме, т.е. параметры = 1,1)
ATD+790XXXXXXXX; / OK;NO DIALTONE;BUSY;NO CARRIER;NO ANSWER / Позвонить на номер +790XXXXXXXX; Нет сигнала; Если вызов отклонён; Повесили трубку; Нет ответа
ATDL / OK / Позвонить по последнему исходящему номеру
ATA / OK / Ответить на звонок
ATH0 / OK; RING / Повесить трубку/разорвать соединение; Входящий звонок
AT+CLIP=1 / OK; RING; +CLIP: "+790XXXXXXXX",145,"",,"",0 / см. настройки; Входящий звонок с включенным АОН. Где:Первый параметр – номер телефона входящего звонка; 2 – тип входящего номера; 129 – не определен; 161 – национальный; 145 – интернациональный; 177 – сетевой, специальный
AT+CMGS="+790XXXXXXXX"
>Test sms. alex-exe.ru
/ > +CMGS: 15 OK / Отправка СМС. Указываем номер получателя в кавычках и отправляем модулю с символом переноса строки (13 в ASCII). После приглашения «>» вводим текст сообщения. Для отправки в конце сообщения отправляем символ SUB (26 в ASCII) или ESC (27) для отмены.
AT+CMGF=1
AT+CSCS= "GSM"
/ / Режим и кодировка. см. настройки и примечание
/ +CMTI: "SM",4 / Уведомление о приходе СМС. Второй параметр номер пришедшего СМС.
AT+CMGL="REC UNREAD" / +CMGL: 4,"REC UNREAD","+790XXXXXXXX","","13/09/24,23:02:22+24" Test2. OK / Чтение групп СМС. Всего 5 групп:REC UNREAD – входящие непрочитанные; REC READ – входящие прочитанные; STO UNSENT – Пользовательские непрочитанные; STO SENT – пользовательские прочитанные; ALL – прочитать все сообщения
AT+CMGR=2 / +CMGR: "REC READ","+790XXXXXXXX","","13/09/21,11:57:46+24" Test sms. alex-exe.ru OK / Чтение SMS сообщений. Запрос:Первый параметр – номер сообщения. Второй параметр (необязателен):0 – обычный режим (по умолчанию); 1 – не изменять статус сообщения. Ответ:Первый параметр – группа сообщений, см предыдущий пункт. Второй параметр – номер отправителя. 3 – дата отправки. Далее следует текс сообщения.
AT+CMGDA="DEL SENT" / OK / Удаление групп СМС:DEL READ — прочитанные; DEL UNREAD — не прочитанные; DEL SENT — отправленные; DEL UNSENT — не отправленные; DEL INBOX — полученные; DEL ALL — всех сообщения
AT+CMGD=4 / OK / Удаление СМС. Первый параметр – номер сообщения. Второй параметр:0 – удаление указанного сообщения (по умолчанию); 1 – удаление прочитанных сообщений; 2 – удаление прочитанных и отправленных сообщений; 3 – удаление прочитанных, отправленных и не отправленных сообщений; 4 – удаление всех сообщений
AT+CSCA? / +CSCA: "+79126313431",145 OK / Возвращает номер сервис центра отправки сообщений.
AT+VTD=3 / OK / Длительность тоновых сигналов для AT+VTD. Значение параметра 1..255
AT+VTS="1,4,#,A,6,7,0" / OK / Отправить последовательность тоновых сигналов (до 20). Длительность задается командой AT+VTS.
AT+CLDTMF=7, "1,4,#,A,6,7,0" / OK / Проиграть на модуле (через аудио выход) тоновые сигналы. Первый параметр — длительность 1-100. Второй параметр – строка тоновых сигналов, до 20.
AT+VTD и AT+VTS команды, как мне кажется, работаю не корректно. VTD – должна устанавливать длительность тонового сигнала, а не паузу между ними, в то время когда тоновый сигнал в AT+VTS проигрывается быстро.
AT+CUSD=1,"#100#" / OK +CUSD: 0,"Balance:240,68r ", / USSD запрос. Первый параметр – режим обработки операции:0 – выполнить запрос, ответ проигнорировать; 1 – выполнить запрос, вернуть ответ; 2 – отменить запрос. Второй параметр – запрос в кавычках.
ATD#100#; / OK +CUSD: 0,"Balance:240,68r ", / Упрощенный USSD запрос (работает только при GSM кодировке)
Отмечу, что есть 2 варианта USSD запроса: начиная с * и начиная с #. В первом варианте ответ приходит на русском языке, во втором в латинице, если оператор такой запрос поддерживает и не ответит так же, как и в первом случае.
Режим отображения такой же, как и для СМС.


Примечание по текстовому режиму и кодировке
От текстового режима (PDU или текстовый) и кодировки модуля зависит формат ввода номеров, USSD запросов, входящих и исходящих СМС.
Самый геморройный и универсальный вариант – это PDU режим, т.к. в нём можно без проблем отправлять и принимать любые текстовые данные, но из-за его «геморойности» рассматривать его не буду.
Самый простой вариант – GSM кодировка. В нём номера вводятся привычным цифровым методом, исходящие и исходящие сообщения, как СМС, так и USSD в латинице отображаются, как им и полагается. С кириллицей дела обстоят посложнее, модуль входящие сообщения с ней отображает в UNICOD, точнее в HEX значениях UNICOD. С исходящими сообщениями дела обстоят сложнее!
Второй вариант, посложнее – UCS2 кодировка. Входящие и исходящие сообщения, USSD запросы, номера телефонов в запросах – всё пишется в UNICOD. Упрощенные USSD запросы не работают.
Другие варианты мной плохо опробованы, но у них тоже всё идёт в своей кодировке.


Кодировка и режим / Запрос / Ответ
PDU / AT+CMGR=2 / +CMGR: 1,"",38 07919720780110F0000B919710325476F800003190121 175644215D4F29C0E9AB7E72E50985DC6B7CAF8B24B5E07 OK
/ AT+CMGR=3 / +CMGR: 1,"",59 07919720780110F0000B919710325476F800083190122 185134228005400650073007400200073006D00730020 0032002E0020042204350441044200200441043C0441 OK
GSM / AT+CMGR=2 / +CMGR: "REC READ","+79012345678","","13/09/21,11:57:46+24" Test sms. alex-exe.ru OK
/ AT+CMGR=3 AT+CMGR=3 / +CMGR: "REC READ","+79012345678","","13/09/21,12:58:31+24" 005400650073007400200073006D007300200032 002E0020042204350441044200200441043C0441 OK
/ AT+CUSD=1,"#100#" / OK +CUSD: 0,"Balance:240,68r ",
UCS2 / AT+CMGR=2 / +CMGR: "REC READ","002B0037003900300031 0032003300340035003600370038","","13/09/21,11:57:46+24" 005400650073007400200073006D0073002E0020 0061006C00650078002D006500780065002E00720075 OK
/ AT+CMGR=3 / +CMGR: "REC READ","002B00370039003000310032 003300340035003600370038","","13/09/21,12:58:31+24" 005400650073007400200073006D007300200032 002E0020042204350441044200200441043C0441 OK
/ AT+CUSD=1,"00230031 003000300023" / OK +CUSD: 0,"00420061006C0061006E00630065003A0032 00340030002C0036003800720020",64

Кратко о UNICOD.
В юникоде символы кодируются в шестнадцатиричке записанной в текстовом виде, при этом первые 127 символов просто переводятся в HEX, а вот к кириллице добавляется 350h.
Пример: 1 – 0031, G – 0047, z — 007A, Ы — 042B, я — 044F
В статье привёл значительную часть основных команд GSM модуля SIM900 из огромного списка поддерживаемых им. Для большинства задач все приведенные команды не будут нужны, а хватит только малой их части.

sub1:
модуль SIM900A вставил симку, включил, говорит
RDY
+CFUN: 1
+CPIN: READY
Супер, проверяю сеть:
AT+COPS?
+COPS: 0
К сети не подключен. И не ищет.
AT+CREG?
+CREG: 0,0
Проверил наличие доступных сетей с помощью AT+COPS=? видит всех, и того оператора чья симка, а подключаться не хочет.
Что делать? Уже потерял всю надежду…
-----
Можете попробовать проверить наличие сим карты AT+CSDT, посмотреть на возможные ошибки AT+CMEE и AT+CEER.
Еще проверьте модуль с другими симками и можете попробовать вернуть заводские настройки модуля — AT&F.