Отправка коротких сообщений (SMS) через сотовый телефон, подключенный к компьютеру


Недавно я приобрел телефон Ericsson R320s. В комплекте поставлялось стандартное программное обеспечение, которое, как выяснилось, не было приспособлено для отправки русскоязычных коротких сообщений (SMS). И я решил написать программу отправки сообщений в кодировке UCS-2 (кириллические сообщения отправляются именно в нем). Кодировка сообщения описана в стандарте ETSI GSM 03.38, а структура в ETSI GSM 03.40, хотя большую часть информации я получил из руководства разработчика, написанного Siemens для владельцев S-серии телефонов «sms_pdumode.pdf».

Существует 2 типа сообщений: текстовые и PDU (Protocol Data Unit). В общем, это одно и то же, просто в режиме отправки текстовых сообщений Вы не сможете передавать русские буквы и, вообще, буквы не английского алфавита (греческие и др.), поскольку программное обеспечение телефона не будет их преобразовывать в формат PDU. Поэтому сразу начнем рассмотрение передачи сообщений в режиме PDU.

Будем различать принятые и исходящие сообщения.

Формат принятого сообщения:

1-12 байт 1 байт 2-12 байт 1 байт 1 байт 7 байт 1 байт 0-140 байт
SCA PDU-type OA PID DCS SCTS UDL UD

Биты поля PDU-type называются так:

  RP UDHI SRI     MMS MTI
биты 7 6 5 4 3 2 1 0

Поле MTI должно быть таким: бит 0 = 0, бит 1 = 0.

Формат исходящего сообщения:

1-12 байт 1 байт 1 байт 2-12 байт 1 байт 1 байт 0, 1 или 7 байт 1 байт 0-140 байт
SCA PDU-type MR DA PID DCS VP UDL UD

Биты поля PDU-type называются так:

  RP UDHI SRR VPF RD MTI
биты 7 6 5 4 3 2 1 0

MTI должно быть таким: бит 0 = 1, бит 1 = 0.

Все неиспользуемые биты нужно установить в 0.

Названия и назначение полей:

SCA номер SMSC (СМС-сервером)
PDU-type поле данных протокола
MR количество успешно переданых (0..255) сообщений с телефона
OA телефон отправителя
DA телефон получателя
PID идентификатор протокола: указывает SMSC, как обрабатывать сообщение
DCS схема кодирования данных в поле данных
SCTS время получения сообщения SMS-сервером
VP время действия сообщения (если сообщение не будет получено абонентом в течение этого времени, SMSC его не будет передавать)
UDL длина поля данных
UD поле данных
RP указывает на наличие поля ответа
UDHI указывает на наличие заголовка в поле UD
SRI требование принимающегополучить статус сообщения
SRR требование отправителя получить статус сообщения
VPF флаг наличия поля VP
MMS количество неотправленных сообщений в SMSC
RD удалить дубликаты
MTI тип сообщения: если 00 — входящее, 01 — исходящее

Важно!

Все поля подразумевают то, что они шестнадцатиричные (кроме битовых). Но в телефон они отправляются в виде символов. Т. е. если поле имеет значение 41H, то передаются два символа: 34H («4») и 31H («1»).

SCA

Длина поля — 1 байт Тип номера — 1 байт Номер от 0 до 6 байт
  • Длина содержит байт, указывающий длину номера SMSC + 1 байт типа этого номера.
  • Тип номера может быть или 81H — национальный, или 91H — международный. Но лучше использовать 91H с нашими Московскими операторами.
  • Поле номера кодируется следующим образом: каждая пара цифр меняется местами. Если количество цифр нечетно, тогда в конец номера дописывается 0xF.

Например, для Московского БИЛАЙН'а номер SMSC: +790173100 Поле SCA будет выглядеть так: 069197103701F0

Если параметр длина поля = 0, тогда телефон должен взять номер SMS из своих настроек. А поскольку уверенным в правильности этого номера быть нельзя, как, впрочем, и в том, что Ваша модель телефона сработает именно так, лучше всегда здесь указывать номер SMSC.

PDU

  • RP: установим его в 0
  • UDHI: установим его в 0
  • SRI: (устанавливаетя в SMSC)
  • SRR:=Установим в 0
  • VPF: Установим в 00
  • MMS: (устанавливается в SMSC)
  • RD: Установим=в 0
  • MTI: Описано выше

Поле MR формируется в SMSC, но нужно что-либо там хранить, например 0x0.

OA и DA

Формируются аналогично полю SCA.

Пример:

Если нужно записать национальный номер (в Москве сообщение по такому номеру не дойдет), 1234567 преобразуется в 0781214365F7.

PID

Сообщает транспортному уровню, какой протокол высшего уровня должен обрабатывать это сообщение.

Некоторые возможности:

  • 00H: обычное сообщение
  • 41H: замещать сообщение типа 1
  • 42H: замещать сообщение типа 2
  • 43H: замещать сообщение типа 3
  • ......
  • 47H: замещать сообщение типа 7

DCS

Фактически нужны только два варианта поля+флажок вывода на экран:

  • 80H: кодировка UCS2 (70 знаков);
  • 00H: кодировка 7-бит (160 знаков, но не кириллическая).

Если при этом указать, что старший полубайт равен FH, то сообщение будет выводиться сразу на экран, как в старой системе БИ+GSM (т. н. Flash-SMS). Причем сообщение будет отображаться на экране независимо от кодировки, если Ваш аппарат поддерживает UCS2 (например, Нокия Логоменеджер не умеет отправлять Flash-SMS на русском языке).

Т. е. для Flash-SMS:

  • F8H: кодировка UCS2 (70 знаков);
  • F0H: кодировка 7-бит (160 знаков, но не кириллическая).

UDL

Длина поля данных в байтах. Собственно, если сообщение состоит из одного символа UCS2, то его длина — 2 байта, а если из одного символа в 7-битной кодировке — один байт.

UD

Начнем с UCS2. Сама кодировка повторяет Unicode. Т. е. для английских символов просто однобайтовой кодировки добавляется байт 00H. Для русских (те, что начинаются с C0H в Windows-кодировке) можно создать такое правило:

Из байта вычитается C0H и прибавляется 410H (кроме букв "ё" и "Ё", которые в Unicode имеют коды 0451H и 0401H соответственно). Точное описание кодировок можно увидеть здесь: http://www.webclub.ru/content/markup_refs/article-40.html

7-битная кодировка. Английские буквы этой кодировки по кодам не отличаются от восьмибитной. Русских букв нет.

Упаковка 160 символов в 140 байт производится следующим образом.

Первый байт записывается так:

старший бит берется из младшего бита 2-го байта, 7 остальных бит — биты первого символа.

Второй байт записывается так:

два старших бита берутся из младших разрядов 3-го байта, а шесть младших — из оставшихся битов второго символа и т. д.

Пример: кодирование слова hellohello

Семибитная запись 10 букв:

h e l l o h e l l o
68 65 68 68 6F 68 65 68 68 6F
1101000 1100101 1101100 1101100 1101111 1101000 1100101 1101100 1101100 1101111

Девять восьмибитных байтов со словом hellohello:

1 1101000 00 110010 100 11011 1111 1101 01000 110 100101 11 1101100 1 1 1101100 110111
E8 32 9B FD 46 97 D9 EC 37

В следующей таблице представлена псевдорусская кодировка, которую я предлагаю для телефонов, не поддерживающих кириллицу.

А Б В Г Д Е Ё Ж З и й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
A 6 B G D E Й * З u щ K L M H O P P C T Y F X _ _ W _ _ Ы Ь _ _ _
41 36 42 05 06 45 C9 2A 33 75 F9 4B 08 4D 48 4F 0B 50 43 54 59 0F 58 57 626C 62

Такая кодировка позволяет отображать на экранах аппаратов Motorola, Siemens (модели младше S25) и других, не понимающих формат UCS2, почти русские сообщения. К сожалению, не все символы русского языка можно передать таким кодом.

Как передать или принять сообщение через телефон

Для этого Ваш телефон должен поддерживать AT+C команды. Описание практически всех команд Вы можете просмотреть в руководстве Siemens для владельцев S-серии телефонов , я же приведу только те из них, которые нужны для отправки и приема сообщений.

Передача сообщения:

В COM-порт, к которому подключен телефон, нужно отправить строчку: "AT+CMGS", дождаться отклика в виде символа ">" и передать сформированное сообщение в COM-порт. Если передача информации в телефон происходит успешно, то телефон откликнется строкой "OK".

Второй вариант: используем команды передачи сообщения из памяти телефона. Т.е. выбираем в качестве памяти хранения SIM, записываем в память сообщение, получаем номер этого сообщения в памяти, передаем сообщение с этим номером в эфир и стираем его из памяти. Этот вариант я использовал при отладке своей программы и до сих пор применяю для отправки сообщений не UCS2 (может быть, именно поэтому такие сообщения передаются неустойчиво).

Каждая строчка, переданная в телефон, должна оканчиваться символом 26H.

Описание команд Вы можете найти здесь.

Пример формирования сообщения.

  • 069197103701F001000B919710276338F60008020410:
  • 06=05 для номера SMSC + 1 байт интернациональности SMSC
  • 91=интернациональность SMSC
  • 97103701F0=+790173100 плюс признак окончания номера F
  • 01=PDU Type:
    • MTI=01 -> исходящий SMS
  • 00=MR - параметр, который устанавливается в SMSC
  • 0B=длина номера получателя-1 (10 знаков в номере)
  • 91=интернациональность получателя
  • 9710276338F6=+79017236836 — номер получателя
  • 00=PID идентификатор номера протокола, если не равен 0, то должен быть равен 41..47 для того, чтобы замещать сообщения с теми же номерами протокола (как в БИ+!!!)
  • 08=DCS схема кодирования данных: кириллическое сообщение
  • 02=длина сообщения
  • 0410=сообщение: "А"

Передаем его на телефон в терминальной программе:

  • AT+CMGS
  • Ш 069197103701F001000B919710276338F60008020410
  • OK





Дополнительно

Отправка коротких сообщений (SMS) через сотовый телефон, подключенный к компьютеру

Отправка коротких сообщений (SMS) через сотовый телефон, подключенный к компьютеру

Недавно я приобрел телефон Ericsson R320s. В комплекте поставлялось стандартное программное обеспечение, которое, как выяснилось, не было приспособлено для отправки русскоязычных коротких сообщений (SMS). И я решил написать программу отправки сообщений в кодировке UCS-2 (кириллические сообщения отправляются именно в нем). Кодировка сообщения описана в стандарте ETSI GSM 03.38, а структура в ETSI GSM 03.40, хотя большую часть информации я получил из руководства разработчика, написанного Siemens для владельцев S-серии телефонов «sms_pdumode.pdf».

Существует 2 типа сообщений: текстовые и PDU (Protocol Data Unit). В общем, это одно и то же, просто в режиме отправки текстовых сообщений Вы не сможете передавать русские буквы и, вообще, буквы не английского алфавита (греческие и др.), поскольку программное обеспечение телефона не будет их преобразовывать в формат PDU. Поэтому сразу начнем рассмотрение передачи сообщений в режиме PDU.

Будем различать принятые и исходящие сообщения.

Формат принятого сообщения:

1-12 байт 1 байт 2-12 байт 1 байт 1 байт 7 байт 1 байт 0-140 байт
SCA PDU-type OA PID DCS SCTS UDL UD

Биты поля PDU-type называются так:

  RP UDHI SRI     MMS MTI
биты 7 6 5 4 3 2 1 0

Поле MTI должно быть таким: бит 0 = 0, бит 1 = 0.

Формат исходящего сообщения:

1-12 байт 1 байт 1 байт 2-12 байт 1 байт 1 байт 0, 1 или 7 байт 1 байт 0-140 байт
SCA PDU-type MR DA PID DCS VP UDL UD

Биты поля PDU-type называются так:

  RP UDHI SRR VPF RD MTI
биты 7 6 5 4 3 2 1 0

MTI должно быть таким: бит 0 = 1, бит 1 = 0.

Все неиспользуемые биты нужно установить в 0.

Названия и назначение полей:

SCA номер SMSC (СМС-сервером)
PDU-type поле данных протокола
MR количество успешно переданых (0..255) сообщений с телефона
OA телефон отправителя
DA телефон получателя
PID идентификатор протокола: указывает SMSC, как обрабатывать сообщение
DCS схема кодирования данных в поле данных
SCTS время получения сообщения SMS-сервером
VP время действия сообщения (если сообщение не будет получено абонентом в течение этого времени, SMSC его не будет передавать)
UDL длина поля данных
UD поле данных
RP указывает на наличие поля ответа
UDHI указывает на наличие заголовка в поле UD
SRI требование принимающегополучить статус сообщения
SRR требование отправителя получить статус сообщения
VPF флаг наличия поля VP
MMS количество неотправленных сообщений в SMSC
RD удалить дубликаты
MTI тип сообщения: если 00 — входящее, 01 — исходящее

Важно!

Все поля подразумевают то, что они шестнадцатиричные (кроме битовых). Но в телефон они отправляются в виде символов. Т. е. если поле имеет значение 41H, то передаются два символа: 34H («4») и 31H («1»).

SCA

Длина поля — 1 байт Тип номера — 1 байт Номер от 0 до 6 байт
  • Длина содержит байт, указывающий длину номера SMSC + 1 байт типа этого номера.
  • Тип номера может быть или 81H — национальный, или 91H — международный. Но лучше использовать 91H с нашими Московскими операторами.
  • Поле номера кодируется следующим образом: каждая пара цифр меняется местами. Если количество цифр нечетно, тогда в конец номера дописывается 0xF.

Например, для Московского БИЛАЙН'а номер SMSC: +790173100 Поле SCA будет выглядеть так: 069197103701F0

Если параметр длина поля = 0, тогда телефон должен взять номер SMS из своих настроек. А поскольку уверенным в правильности этого номера быть нельзя, как, впрочем, и в том, что Ваша модель телефона сработает именно так, лучше всегда здесь указывать номер SMSC.

PDU

  • RP: установим его в 0
  • UDHI: установим его в 0
  • SRI: (устанавливаетя в SMSC)
  • SRR:=Установим в 0
  • VPF: Установим в 00
  • MMS: (устанавливается в SMSC)
  • RD: Установим=в 0
  • MTI: Описано выше

Поле MR формируется в SMSC, но нужно что-либо там хранить, например 0x0.

OA и DA

Формируются аналогично полю SCA.

Пример:

Если нужно записать национальный номер (в Москве сообщение по такому номеру не дойдет), 1234567 преобразуется в 0781214365F7.

PID

Сообщает транспортному уровню, какой протокол высшего уровня должен обрабатывать это сообщение.

Некоторые возможности:

  • 00H: обычное сообщение
  • 41H: замещать сообщение типа 1
  • 42H: замещать сообщение типа 2
  • 43H: замещать сообщение типа 3
  • ......
  • 47H: замещать сообщение типа 7

DCS

Фактически нужны только два варианта поля+флажок вывода на экран:

  • 80H: кодировка UCS2 (70 знаков);
  • 00H: кодировка 7-бит (160 знаков, но не кириллическая).

Если при этом указать, что старший полубайт равен FH, то сообщение будет выводиться сразу на экран, как в старой системе БИ+GSM (т. н. Flash-SMS). Причем сообщение будет отображаться на экране независимо от кодировки, если Ваш аппарат поддерживает UCS2 (например, Нокия Логоменеджер не умеет отправлять Flash-SMS на русском языке).

Т. е. для Flash-SMS:

  • F8H: кодировка UCS2 (70 знаков);
  • F0H: кодировка 7-бит (160 знаков, но не кириллическая).

UDL

Длина поля данных в байтах. Собственно, если сообщение состоит из одного символа UCS2, то его длина — 2 байта, а если из одного символа в 7-битной кодировке — один байт.

UD

Начнем с UCS2. Сама кодировка повторяет Unicode. Т. е. для английских символов просто однобайтовой кодировки добавляется байт 00H. Для русских (те, что начинаются с C0H в Windows-кодировке) можно создать такое правило:

Из байта вычитается C0H и прибавляется 410H (кроме букв "ё" и "Ё", которые в Unicode имеют коды 0451H и 0401H соответственно). Точное описание кодировок можно увидеть здесь: http://www.webclub.ru/content/markup_refs/article-40.html

7-битная кодировка. Английские буквы этой кодировки по кодам не отличаются от восьмибитной. Русских букв нет.

Упаковка 160 символов в 140 байт производится следующим образом.

Первый байт записывается так:

старший бит берется из младшего бита 2-го байта, 7 остальных бит — биты первого символа.

Второй байт записывается так:

два старших бита берутся из младших разрядов 3-го байта, а шесть младших — из оставшихся битов второго символа и т. д.

Пример: кодирование слова hellohello

Семибитная запись 10 букв:

h e l l o h e l l o
68 65 68 68 6F 68 65 68 68 6F
1101000 1100101 1101100 1101100 1101111 1101000 1100101 1101100 1101100 1101111

Девять восьмибитных байтов со словом hellohello:

1 1101000 00 110010 100 11011 1111 1101 01000 110 100101 11 1101100 1 1 1101100 110111
E8 32 9B FD 46 97 D9 EC 37

В следующей таблице представлена псевдорусская кодировка, которую я предлагаю для телефонов, не поддерживающих кириллицу.

А Б В Г Д Е Ё Ж З и й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
A 6 B G D E Й * З u щ K L M H O P P C T Y F X _ _ W _ _ Ы Ь _ _ _
41 36 42 05 06 45 C9 2A 33 75 F9 4B 08 4D 48 4F 0B 50 43 54 59 0F 58 57 626C 62

Такая кодировка позволяет отображать на экранах аппаратов Motorola, Siemens (модели младше S25) и других, не понимающих формат UCS2, почти русские сообщения. К сожалению, не все символы русского языка можно передать таким кодом.

Как передать или принять сообщение через телефон

Для этого Ваш телефон должен поддерживать AT+C команды. Описание практически всех команд Вы можете просмотреть в руководстве Siemens для владельцев S-серии телефонов , я же приведу только те из них, которые нужны для отправки и приема сообщений.

Передача сообщения:

В COM-порт, к которому подключен телефон, нужно отправить строчку: "AT+CMGS", дождаться отклика в виде символа ">" и передать сформированное сообщение в COM-порт. Если передача информации в телефон происходит успешно, то телефон откликнется строкой "OK".

Второй вариант: используем команды передачи сообщения из памяти телефона. Т.е. выбираем в качестве памяти хранения SIM, записываем в память сообщение, получаем номер этого сообщения в памяти, передаем сообщение с этим номером в эфир и стираем его из памяти. Этот вариант я использовал при отладке своей программы и до сих пор применяю для отправки сообщений не UCS2 (может быть, именно поэтому такие сообщения передаются неустойчиво).

Каждая строчка, переданная в телефон, должна оканчиваться символом 26H.

Описание команд Вы можете найти здесь.

Пример формирования сообщения.

  • 069197103701F001000B919710276338F60008020410:
  • 06=05 для номера SMSC + 1 байт интернациональности SMSC
  • 91=интернациональность SMSC
  • 97103701F0=+790173100 плюс признак окончания номера F
  • 01=PDU Type:
    • MTI=01 -> исходящий SMS
  • 00=MR - параметр, который устанавливается в SMSC
  • 0B=длина номера получателя-1 (10 знаков в номере)
  • 91=интернациональность получателя
  • 9710276338F6=+79017236836 — номер получателя
  • 00=PID идентификатор номера протокола, если не равен 0, то должен быть равен 41..47 для того, чтобы замещать сообщения с теми же номерами протокола (как в БИ+!!!)
  • 08=DCS схема кодирования данных: кириллическое сообщение
  • 02=длина сообщения
  • 0410=сообщение: "А"

Передаем его на телефон в терминальной программе:

  • AT+CMGS
  • Ш 069197103701F001000B919710276338F60008020410
  • OK