alexandre_frolov
alexandre_frolov
936 просмотров0 комментариев

Отправляем и принимаем SMS с помощью SIM868 на Repka Pi

В этой статье мы продолжим рассказ об использовании модуля GSM/GPRS/GNSS Bluetooth HAT, созданного на базе SIM868, для беспроводной передачи данных.

Из первой статьи вы узнали, как с помощью упомянутого модуля обмениваться данными между микрокомпьютером Repka Pi с JSON-сервисом, доступным в интернете, по каналу GPRS. Вторая статья рассматривает такой обмен глубже, на уровне AT-команд, передаваемых в модуль через UART.

Теперь настала очередь рассказать об отправке и приеме коротких текстовых сообщений SMS (Short Message Service). Этот канал передачи данных пригодится, например, в тех случаях, если в месте расположения вашего оборудования недоступен ни WiFi, ни GPRS.

Сообщения SMS можно передавать в текстовом режиме, а также в так называемом режиме PDU (Protocol Data Unit). В первом случае длина сообщения не может превышать 160 байт, и в нем не должно быть, в частности, символов кириллицы (используется 7-битная кодировка по стандарту GSM 03.38). Пользоваться режимом PDU сложнее, но в нем нет этих недостатков.

Далее мы рассмотрим работу в обоих режимах как с помощью Python и библиотеки RoverConnect, так и через AT-команды.

Вы научитесь получать список сообщений, кодировать и раскодировать сообщения PDU вручную, а также с помощью специально предназначенных для этого онлайн-сервисов, удалять сообщения и выполнять другие операции с SMS с помощью AT-команд.

Работа с SMS при помощи  библиотеки RoverConnect

Библиотека RoverConnect предоставляет удобные функции для отправки, приема и удаления сообщений SMS (Short Message Service), содержащих символы кириллицы, из программ Python.

Прежде чем запускать программу send-receive-sms.py, отправляющую и принимающую SMS, вам нужно собрать макет, состоящий из модуля  GSM/GPRS/GNSS Bluetooth HAT с SIM-картой и микрокомпьютера Repka OS, как это было описано в первой статье серии.

Также приготовьте смартфон для обмена сообщениями SMS с модулем.

Перед подключением модуля обязательно отключите вывод сообщений на UART0 с помощью repka-config (описано в упомянутой статье).

Установка необходимых библиотек

Программа send-receive-sms.py, описанная в этой статье, основана на использовании библиотек Python SIM800L, библиотек RoverConnect, Telemetry и SmsTz.

Сначала вам нужно установить библиотеку SIM800L, сайт которой находится по адресу https://pypi.org/project/sim800l-gsm-module/1.0.0/.

Установка описана здесь https://github.com/Ircama/raspberry-pi-sim800l-gsm-module, и она несложна:

# apt update
# apt install python3-pip
# python3 -m pip install sim800l-gsm-module

Запустите эти команды в консоли SSH, подключившись к Repka OS, запущенной на микрокомпьютере Repka Pi. Вам потребуются права пользователя root.

Вслед за установкой SIM800L скопируйте в рабочий каталог библиотеки RoverConnect, Telemetry и SmsTz:

# git clone git@github.com:AlexandreFrolov/rover_connect2.git

Заметим, что в библиотеке SIM800L уже имеются функции, предназначенные для отправки и приема SMS в текстовом режиме. Однако они непригодны для работы с сообщениями, содержащими символы кириллицы.

Библиотека RoverConnect и SmsTz реализует режим PDU (Protocol Data Unit), пригодный для работы с сообщениями на русском и других языках в кодировке Unicode. Режим PDU используют все основные российские мобильные операторы.

Запуск программы отправки и получения SMS

Исходный текст программы send-receive-sms.py, способной отправлять и принимать сообщения SMS, представлен в листинге 1.

Листинг 1. Программа https://github.com/AlexandreFrolov/rover_connect2/blob/main/send-receive-sms.py

import traceback
import re
import time
import datetime
from collections import namedtuple
from sim800l import SIM800L
from rover_connect import SmsTz
from rover_connect import RoverConnect

if __name__ == "__main__":
    rover = RoverConnect('/dev/ttyS0', 'internet.mts.ru')
    phone_number = input('Номер телефона для отправки (7XXXXXXXXXX):\n')
    message = input('Текст сообщения:\n')
    rover.send_sms(phone_number, message)

    result = rover.get_sms()
    for r in result:
        print(r[0], ' ', r[1], ' ', r[2], '\n', r[3])

    rover.delete_all_sms()

После запуска программа send-receive-sms.py создает объект RoverConnect, передавая ему интерфейс последовательного порта, а также настройки APN (Access Point Name), необходимые для подключения к сети мобильного оператора.

Далее программа запрашивает с консоли номер мобильного телефона, на который будет отправлено сообщение SMS. Важно соблюдать формат номера — вначале идет код страны (7 для России), а далее десять цифр номера.

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

Получив номер телефона и текст сообщения, программа send-receive-sms.py отправляет сообщение с помощью функции send_sms класса RoverConnect. На отправку сообщения может уйти некоторое время.

Как только сообщение будет отправлено, программа получает с помощью функции get_sms класса RoverConnect и выводит на консоль список принятых и сохраненных в модуле GSM/GPRS/GNSS Bluetooth HAT сообщений SMS. Это сообщения, которые были отправлены на номер вашей SIM-карты, вставленной в модуль GSM/GPRS/GNSS Bluetooth HAT.

Прочитанные сообщения затем удаляются функцией delete_all_sms класса RoverConnect.

Ниже мы показали пример отправки сообщения «Сообщение на русском. English message also.» на номер 7925XXXXXXX (часть цифр скрыта):

python3 send-receive-sms.py
Номер телефона для отправки (7XXXXXXXXXX):
7925XXXXXXX
Текст сообщения:
Сообщение на русском. English message also.
1   7911XXXXXXX   2023-11-28 10:00:06+03:00
 Этот абонент звонил вам 1 раз. Последний 28.11.2023 9:38.

Следующий тест заключался в отправке сообщения со смартфона на номер телефона SIM-карты модуля. После этого программа была запущена еще раз, и теперь она получила текст предыдущего отправленного сообщения:

python3 send-receive-sms.py
Номер телефона для отправки (7XXXXXXXXXX):
7925XXXXXXX
Текст сообщения:
Тест отправки и получения
1   7925XXXXXXX   2023-12-01 13:44:00+03:00
 Ответ на сообщение

На рис. 1 показан немного отредактированный скриншот экрана смартфона с перепиской (удален номер телефона, на который мы отправляли SMS).

Рис. 1. Переписка через SMS в окне смартфона

Как видите, программа send-receive-sms.py способна работать с символами кириллицы. Использовать эту программу легко, однако «под капотом» у нее скрыт непростой механизм работы с сообщениями в режиме PDU.

Текстовый режим отправки SMS и режим PDU

В спецификации GSM существует два способа отправки SMS — в текстовом режиме и в режиме PDU.

Как нетрудно догадаться из названия, в текстовом режиме сообщение представляет собой обычный текст. Но этот текст представлен символами в кодировке GSM 7-bit, и не может содержать символы кириллицы.

Кроме того, в текстовом режиме существует довольно серьезное ограничение на длину сообщения — 160 символов. Если нужно передать более длинный текст, его приходится разбивать на несколько сообщений SMS.

Формат PDU позволяет отправлять сообщения в разных кодировках, в том числе с символами кириллицы. При этом длина сообщения не ограничивается 160 символами.

Сообщение SMS в формате PDU включает в себя заголовок и тело сообщения, номер получателя, кодировку символов и другие параметры. При отправке SMS в этом формате программа должна формировать эти заголовки, а после приема —  правильно их раскодировать.

Подготовка к работе

Перед началом работы запаситесь документацией по AT-командам, а также установите и запустите в Repka OS терминальную программу minicom.

Загрузка документации по AT-командам

Скачайте документацию по AT-командам SIM868, на базе которого сделан модуль GSM/GPRS/GNSS Bluetooth HAT, с сайта SIMCom (предварительно зарегистрируйтесь).

В частности, вам, возможно, пригодится файл SIM800 Series_AT Command Manual_V1.12.pdf с руководством SIM800 Series_ AT Command Manual.

Простые примеры работы с SMS в текстовом режиме приведены в описании GSM/GPRS/GNSS HAT User Manual, которое можно загрузить с сайта Waveshare Electronics.

Установка и запуск терминала minicom

Изучение AT-команд мы будем выполнять с помощью терминальной программы minicom. В предыдущей статье серии мы уже рассказывали об установке и настройке этой программы. Для удобства приведем кратко нужные команды для установки и запуске в Repka OS:

# apt install minicom
# minicom -D /dev/ttyS0

Далее в консоли SSH появится окно программы minicom, где можно вводить AT-команды и получать результаты их выполнения.

Проверьте, включен ли эхо-режим, с помощью команды AT. Если вы увидели эту команду и ответ на нее OK, режим включен. Если команда AT не отобразилась в консоли, для удобства работы с этой статьей включите эхо-режим командой ATE1.

Напомним, что команда ATE0 выключает эхо-режим.

Работа в текстовом режиме на уровне AT-команд

Чтобы лучше разобраться в тонкостях отправки и приема сообщений SMS, расскажем об основных AT-командах, предназначенных для этого, и опробуем их в работе. При этом сначала испытаем простой текстовый режим, а после этого перейдем к изучению режима PDU.

Установка текстового режима работы

Чтобы узнать текущий режим работы с SMS или установить нужный, используется команда AT+CMGF.

Для проверки текущего режима введите команду AT+CMGF?. Для установки текстового режима или режима PDU воспользуйтесь следующими командами:

  • AT+CMGF=0 — режим PDU;
  • AT+CMGF=1 — текстовый режим

На рис. 2 мы показали пример использования этой команды.

Рис. 2. Пример использования команды AT+CMGF

Сначала мы узнали, что установлен режим PDU, так как команда AT+CMGF? вернула значение 0. Далее мы установили текстовый режим работы и убедились при помощи все той же команды, что он установился.

Проверка и установка номера центра обслуживания SMS

Для успешной отправки SMS необходимо установить телефонный номер центра обслуживания, свой для разных мобильных операторов. Вы можете найти этот номер в интернете по запросу вида «номер центра смс мегафон», «номер центра смс мтс» и так далее.

Проверить установку номера центра обслуживания можно следующей командой:

AT+CSCA?
+CSCA: "+79168999100",145
OK

В качестве первого параметра команда возвращает искомый номер, а в качестве второго — формат написания номера:

  • 161 — национальный номер абонента сети ISDN.
  • 145 — международный номер (+7,+3, и так далее)
  • 129 — остальные номера (такие как 8XXX)

Убедитесь, что этот номер соответствует вашему мобильному оператору. Для установки нового номера используйте такую команду:

AT+CSCA="+79168999100",145

Отправка сообщения SMS

После ввода строки сообщения в ответ на приглашение > нужно нажать комбинацию клавиш Ctrl+Z (символ с кодом 0x1A) для отправки сообщения:

AT+CMGS="8925XXXXXXX"
> Hello from SIM868!
+CMGS: 104
OK

Здесь мы отправили сообщение «Hello from SIM868!» на номер 8925XXXXXXX. На рис. 3 показано принятое сообщение SMS в окне смартфона.

Рис. 3. Принятое сообщение SMS на экране смартфона

Вы можете убедиться самостоятельно, что этот способ не подходит для отправки сообщений с символами кириллицы.

Просмотр принятых сообщений SMS

Приведенные ниже AT-команды позволяют прочитать список сообщений SMS:

  • AT+CMGL="ALL" — список всех сообщений SMS;
  • AT+CMGL="REC UNREAD" — список непрочитанных SMS;
  • AT+CMGL="REC READ" — список прочитанных SMS;
  • AT+CMGL="STO UNSENT" — сохраненные, но не отправленные сообщения;
  • AT+CMGL="STO SENT" — сохраненные отправленные сообщения

На рис. 4 показан результат чтения двух сообщений командой AT+CMGL="ALL".

Рис. 4. Получены два сообщения в формате PDU

Эти сообщения провайдер мобильной сети отправил в формате PDU, однако наш модуль находится в текстовом режиме. Поэтому полученные данные требуют дополнительной распаковки, чем мы займемся позже.

Обратите внимание, что в ответ на команду AT+CMGL="ALL" пришло два уведомления +CMGL:

+CMGL: 1,"REC UNREAD","w�44534","","23/12/02,09:40:15+12"
…
+CMGL: 2,"REC UNREAD","w�44534","","23/12/02,09:40:15+12"
…

Числа 1 и 2 представляют собой индексы сообщений в памяти модуля SIM868. Вслед за ним идет статус сообщения "REC UNREAD", означающий что сообщение получено, но еще не прочитано.

Далее идет номер отправителя, но так как сообщение в формате PDU, то оно отображается в неправильной кодировке.

После номера отправителя следует пустое поле номера сервисного центра, а также дата и время отправки сообщения.

Чтобы увидеть полученное сообщение в текстовом формате, отправьте со смартфона на телефон SIM-карты, установленной в модуле  GSM/GPRS/GNSS Bluetooth HAT, сообщение на английском языке.

Через некоторое время после отправки в окне терминальной программы появится уведомление о сохранении нового сообщения SMS в памяти модуля:

+CMTI: "SM",3

Строка “SM” указывает, что сообщение было сохранено в SIM-карте модуля. Число 3 — это индекс сообщения в памяти (два сообщения были приняты модулем ранее).

После получения такого уведомления ваша программа может прочитать все или некоторые сообщения. На рис. 5 мы показали уведомление +CMTI, а также результаты чтения всех сообщений и сообщения с индексом 3.

Рис. 5. Чтение сообщения в текстовом формате

Для чтения сообщения с индексом, равным 3, мы использовали команду AT+CMGR=3.

Как видите, теперь в уведомлении показан номер, с которого пришло SMS (часть цифр номера мы скрыли), а также текст сообщения на английском языке “Hello from smartphone!” в читаемом виде.

Чтобы узнать, какие же сообщения нам пришли, запустим описанную ранее программу send-receive-sms.py, умеющую читать и отправлять сообщения в формате PDU (рис. 6) .

Рис. 6. Результат чтения сообщений программой send-receive-sms.py

Оказалось, что мобильный провайдер прислал предупреждение о списании средств, разбив его на два сообщения PDU. Мы также увидели наше сообщение, отправленное в текстовом формате.

Оказывается, пора пополнить баланс!

Сделаем это в личном кабинете мобильного провайдера и узнаем новый баланс в терминале minicom:

at+cusd=1,"#100#",15
OK
+CUSD: 0, "Balance:1376r", 15

Как видите теперь денег на счету достаточно и номер SIM-карты в модуле GSM/GPRS/GNSS Bluetooth HAT отключен не будет. Так что не пренебрегайте периодической проверкой баланса аккаунта SIM-карты, установленной в вашем устройстве.

Процедура проверки баланса с помощью библиотеки RoverConnect описана в первой статье серии, посвященной модулю  GSM/GPRS/GNSS Bluetooth HAT, а с помощью AT-команды — во второй.

Удаление сообщений SMS

Чтобы освободить ресурсы модуля, нужно своевременно удалять прочитанные сообщения SMS. Эта операция выполняется при помощи команды AT+CMGD.

В текстовом режиме команда удаления сообщения с заданным индексом выглядит так:

AT+CMGD=1

Здесь удаляется сообщение с индексом 1.

Пример использования этой команды показан на рис. 7.

Рис. 7. Результат удаления сообщения с индексом 1

В этом примере сначала был включен текстовый режим командой AT_CMGF=1, после чего был получен список всех сообщений командой AT+CMGL=”ALL” (эта команда работает только в текстовом режиме).

На экране появился список из пяти сообщений. Мы удалили сообщение с индексом 1 командой AT+CMGD=1, после чего в памяти осталось только четыре сообщения с индексом от 2 до 5.

Команде AT+CMGD можно задать второй параметр, указывающий, какие сообщения требуется удалить:

  • 0 — сообщение, индекс которого задан первым параметром команды;
  • 1 — все прочитанные сообщения из предпочтительного хранилища сообщений, при этом непрочитанные и неотправленные сообщения оставляются нетронутыми;
  • 2 — аналогично предыдущему, но нужно отправить неотправленные исходящие сообщения;
  • 3 — все прочитанные сообщения, в том числе отправленные и неотправленные, но нужно оставить нетронутыми непрочитанные сообщения;
  • 4 — удалить вообще все сообщения

Таким образом, в текстовом режиме команда AT+CMGD=1,4 удаляет все сообщения.

Также можно удалять сообщения командой AT+CMGDA. В текстовом режиме ей можно указать, что нужно удалить:

  • "DEL READ" — все прочитанные сообщения;
  • "DEL UNREAD" — все непрочитанные сообщения;
  • "DEL SENT" — все отправленные сообщения;
  • "DEL UNSENT" — все неотправленные сообщения;
  • "DEL INBOX" — все принятые сообщения;
  • "DEL ALL" — вообще все сообщения

Например, в текстовом режиме следующая команда удалит все сообщения:

AT+CMGDA="DEL ALL"

Работа в режиме PDU

Теперь перейдем к изучению режима работы с сообщениями SMS в режиме PDU. Напомним, что в этом режиме длина сообщений не ограничена 160 байтами, и сообщения могут содержать, в частности, символы кириллицы в кодировке Unicode.

Переключение в режим PDU

Переключаем модуль в режим PDU и проверяем, что он переключился:

AT+CMGF=0
OK
AT+CMGF?
+CMGF: 0
OK

Получение сообщений SMS

Теперь наш модуль находится в режиме PDU и можно начинать эксперименты по отправке и получению сообщений SMS.

Для начала отправляем с мобильного телефона два сообщения SMS с текстом «абв123» и «где456» на номер SIM-карты, вставленной в модуль GSM/GPRS/GNSS Bluetooth HAT.

С помощью команды AT+CMGL читаем все полученные SMS:

AT+CMGL=4
+CMGL: 1,1,"",31
07919761980644F2040B919752214365F730008322120415032210C043004310432003100320033
+CMGL: 2,0,"",31
07919761980644F0040B919752214365F730008322120414194210C043304340435003400350036
OK

Команде AT+CMGL передается параметр, указывающий, какие сообщения нужно прочитать:

  • 0 — непрочитанные;
  • 1 — прочитанные;
  • 4 — все сообщения

Перед блоком данных PDU идет строка +CMGL. В нашем случае это такие строки:

  • "+CMGL: 1,1,"",31"
  • "+CMGL: 2,0,"",31"

Здесь "+CMGL" означает, что пришел со списком сообщений. В нашем примере:

  • «1», «2» —индекс номер сообщения;
  • «0», что сообщение еще не прочитано, «1» — что сообщение прочитано;
  • "" (пустые кавычки) — указывают на отсутствие информации об отправителе сообщения:
  • «31» — длина тела сообщения

Раскодирование полученных сообщений

Итак, сообщения получены, но, чтобы получить текст сообщения и другие параметры, их надо раскодировать.

Программа send-receive-sms.py, приведенная в начале статьи, раскодирует эти сообщения с помощью функций библиотеки RoverConnect. Но если вы получаете сообщение с помощью AT-команд, то их можно легко раскодировать с помощью, например, сервиса Online SMS-DELIVER PDU Decoder или SMS Server Tools 3 (об этом расскажем позже).

Строка PDU представляет собой текст, состоящий из байтов в шестнадцатеричной кодировке.

Обычно строка сообщения SMS в формате PDU состоит из двух частей:

  • номер телефона центра обслуживания, такой как «+79168999100»;
  • элемент данных транспортного протокола обслуживания Transport Protocol Data Unit (TPDU), в котором находятся номер получателя сообщения, текст сообщения и другие поля

Для примера мы будем раскодировать сообщение PDU, полученное нашим модулем при отправке на него со смартфона сообщения SMS с текстом «абв123»:

07919761980644F2040B919752214365F70008322120415032210C043004310432003100320033

Номер телефона центра обслуживания

Номер телефона центра обслуживания SMSC записан в SIM-карте и может не передаваться в сообщениях. Если этот номер передается, то его формат показан на рис. 8.

Рис. 8. Кодирование номера телефона

Номер начинается с двух октетов, первый из которых определяет длину номера в октетах, а второй — тип номера (национальный или международный). Далее следуют октеты номера в закодированном виде.

Рассмотрим пример кодирования номера центра обслуживания одного из мобильных операторов +79168960442. В сообщении, которое мы будем декодировать, этот номер представлен строкой:

0791 9761980644F2

Здесь длина поля номера составляет 0x07 октетов (само поле длины не учитывается).

Тип номера — 0x91, что соответствует международному номеру, Такие номера начинаются с символа «+», однако в сообщениях PDU этот символ включать не нужно.

Далее следует закодированный номер центра обслуживания 9761980644F2. Для раскодирования переставьте местами каждую пару цифр в номере и уберите букву F. Эта буква добавляется при кодировании, если количество цифр в номере нечетное.

В итоге после раскодирования будет так — 79168960442. Полученный результат соответствует номеру +79168960442.

Тип сообщения

Продолжим разбор оставшейся части сообщения:

04 0B91 9752214365F7 0008322120415032210C043004310432003100320033

Здесь содержится тип сообщения PDU, номер отправителя сообщения, идентификатор протокола, схема кодирования данных, отметка о времени и само передаваемое сообщение (рис. 9).

Рис. 9. Оставшаяся часть сообщение

Поле типа сообщения PDU Type состоит из битовых полей, назначение которых приведено на рис. 10.

Рис. 10. Поле PDU Type

В нашем случае тип сообщения задан как 0x04. Это означает, что сообщение входящее (SMS- Deliver, так как младшие два бита равны нулю), и что сообщения с тем же идентификатором и адресом доставки будут отклонены (бит с номером 2 равен 1).

Другие биты типа сообщения находятся в нулевом состоянии.

Заметим, что содержимое поля PDU Type принятого сообщения определяется оператором мобильной связи.

Номер отправителя сообщения

Поле со значением 0B91 в нашем принятом сообщении содержит длину номера отправителя (равно 11 в десятичной системе счисления) и тип адреса отправителя (аналогично показанной на рис. 9 расшифровке номера отправителя). Далее следует 11 октетов номера отправителя:

0B91 9752214365F7

Преобразуем номер аналогично тому, как мы это делали для номера центра обслуживания, и получаем 79251234567 (номер указан только для примера).

Идентификатор протокола и схема кодирования данных

Следующие два октета 0008 содержат идентификатор протокола PID и схему кодирования данных TP-DCS.

Нулевое значение поля TP-PID означает, что дополнительные протоколы не используются. Что касается значения TP-DCS, то здесь применяется кодировка UCS2 (Unicode).

Возможные значения схем кодирования:

  • 0x00 — кодировка 7-бит (160 знаков, только латинские символы);
  • 0x04 — кодировка 8-бит (140 знаков, только латинские символы);
  • 0x08 — кодировка UCS2 (Unicode), 70 знаков, 2 байта на символ

Отметка о времени

Следом за идентификатором протокола и схемой кодирования идет отметка о времени TP-SCTS (Time stamp) в формате полу-октетов:

32212041503221

Здесь:

  • 32 — год (2023);
  • 21 — номер месяца (декабрь);
  • 20 — день (02 декабря);
  • 41 — час (14 часов);
  • 50 — минуты (05 минут);
  • 32 — секунды (23 секунды);
  • 21 —закодированная временная зона TZ

В поле TZ находится разница в 15-минутных интервалах между локальным временем и временем GMT (может быть отрицательной). Чтобы получить значение временной зоны, нужно поменять местами цифры октета TZ и разделить значение TZ на четыре.

Таким образом, значение 21 преобразуется в 12, а после деления на 4 получаем зону +3.

Раскодирование текста сообщения

Итак, осталось раскодировать текст самого сообщения:

0C 0430 0431 0432 0031 0032 0033

Здесь значение 0C — это длина текста сообщения в октетах, равно 12 в десятичной системе счисления. Далее идет текст сообщения.

Напомним, что мы передавали текст «абв123». Этому тексту соответствует часть строки «0430 0431 0432 0031 0032 0033». Здесь используется кодировка UCS2 (она же Unicode), для представления каждого символа используются два октета.

Как видите, процесс декодирования сообщения в формате PDU не очень прост. Хорошая новость что за вас все может сделать библиотека RoverConnect, при подготовке которой в части работы с PDU была использована статья SMS+python - закрывая тему.

Также для декодирования PDU в режиме онлайн можно воспользоваться этим сайтом (рис. 11).

Рис. 11. Раскодированное сообщение

Введите строку принятого сообщения в поле SMS-DELIVER PDU, а затем щелкните кнопку Decode. На странице появится сообщение с раскодированными полями.

Аналогичный результат можно получить и на другом сайте (рис. 12).

Рис. 12. Другой сайт для онлайн-раскодирования сообщений PDU

Скопируйте строку сообщения в поле PDU Message Entry/Display, а затем щелкните расположенную рядом с этом полем кнопку Convert. Вы увидите результат раскодирования.

Кодирование сообщения PDU для отправки

Итак, вы научились раскодировать принятое сообщение PDU. Теперь давайте решим обратную задачу — создадим сообщение PDU вручную и отправим его на номер смартфона из модуля GSM/GPRS/GNSS Bluetooth HAT с помощью AT-команд.

Будем передавать все то же сообщение — «абв123» на номер +79251234567 (указан только для примера).

Тип сообщения

Первый октет нашего сообщения должен быть равен 0x00, что соответствует отправляемому сообщению типа SMS deliver.

Обратите внимание, что время жизни отправляемого сообщения не установлено, так как биты 3 и 4 поля VPF равны нулю (рис. 10).

Тип среды передачи данных

Далее нужно задать октет типа среды передачи данных TP-MR (Message Reference) в виде 11. Это значение указывает, что сообщение SMS-SUBMIT будет отправлено через сеть GSM.

Уникальный номер сообщения

Следом идет уникальный номер сообщения TP-MR (Message Reference). Его можно не указывать, мы зададим нулевое значение.

Номер получателя сообщения

После уникального номера сообщения нам нужно задать телефонный номер получателя сообщения в описанном ранее формате (рис. 9).

Возьмем номер 79251234567 и преобразуем его в соответствии с описанным ранее алгоритмом:

001100 0B91 9752214365F7

Здесь фиолетовым цветом выделены только что описанные поля типа сообщения, типа среды передачи данных, а также уникальный номер сообщения. Далее идут октеты номера получателя сообщения.

Идентификатор протокола

После номера получателя идет идентификатор протокола TP-PID (Protocol Identifier). Его можно не задавать, и мы укажем нулевое значение:

0011000B919752214365F700

Здесь октет протокола выделен жирным шрифтом.

Кодировка данных

Укажем кодировку данных как 08, что соответствует UCS2 (Unicode):

0011000B919752214365F70008

Значение выделено жирным шрифтом.

Срок действия сообщения

После кодировки данных задается срок действия, или «годности» сообщения. Это время, в течение которого сообщения сохраняется в центре службы коротких сообщений SMSC.

Здесь указано значение 0x0B, однако как мы говорили, в поле VPF заданы нулевые биты и поэтому срок хранения передаваемого сообщения не был установлен:

0011000B919752214365F700080B

Срок действия выделен жирным шрифтом.

Если нужно задать срок хранения сообщения, укажите биты VPF:

  • 00b поле VPF отсутствует 0;
  • 01b резерв в Siemens;
  • 10b поле VPF использует относительный формат;
  • 11b поле VPF использует абсолютный формат

При задании относительного формата VPF кодируется одним байтом:

  • 0 .. 143 (VPF + 1) * 5 минут = максимально можно задать 12 часов с шагом 5 минут;
  • 144 .. 167 12 часов + (VPF – 143)*30 минут = максимально можно задать 24 часа;
  • 168 .. 196 (VPF – 166) * 1 день = максимально можно задать 30 дней;
  • 197 .. 255 (VFP – 192) * 1 неделю = максимально можно задать 63 недели

Если используется абсолютный формат VPF кодируется аналогично SCTS и представляет собой время, по истечении которого центр обслуживания SMS может удалять сообщение:

  • 32 — год (2023);
  • 21 — номер месяца (декабрь);
  • 20 — день (02 декабря);
  • 41 — час (14 часов);
  • 50 — минуты (05 минут);
  • 32 — секунды (23 секунды);
  • 21 —закодированная временная зона TZ

Пользовательские данные сообщения

И, наконец, текст сообщения PDU завершают пользовательские данные, или другими словами, текст сообщения.

Байт OC задает длину сообщения, после которой идет закодированный в UCS2 текст «абв123»:

0011000B919752214365F70008AA0C043004310432003100320033

Длина выделена жирным шрифтом, после нее идут октеты сообщения.

Заметим, что на этом сайте можно закодировать сообщение без ручной работы (рис. 13).

Рис. 13. Онлайн-кодирование сообщений PDU

В поле Destination Number введите номер телефона получателя, а в списке Encoding выберите Unicode – 16 bits. Затем щелкните кнопку PDU Encode, и в поле PDU Code вы увидите только что описанный код сообщения PDU.

Вы можете легко проводить эксперименты, изменяя поля PDU и отправляя полученный код через терминал minicom. Расскажем, как это сделать.

Отправка закодированного сообщения PDU

Чтобы отправить закодированное сообщение, запустите в Repka OS терминал minicom, и введите следующие команды:

AT+CMGF=0
OK
AT+CMGS=26
> 0011000B919752214365F70008AA0C043004310432003100320033

+CMGS: 111
OK

Замените здесь номер телефона 79251234567 закодированным номером своего смартфона.

Команде AT+CMGS нужно ввести длину закодированного сообщения PDU , уменьшенную на единицу. После того, как появится приглашение в виде «>», введите строку сообщения и нажмите комбинацию клавиш Ctrl+Z (символ с кодом 0x1A) для отправки.

Через некоторое время сообщение придет на ваш смартфон.

Удаление сообщений в режиме PDU

И в текстовом режиме, и в режиме PDU, удаление сообщений из памяти модуля выполняется командой AT+CMGDA. В режиме PDU ей нужно передать параметр, указывающий, какие сообщения нужно удалить:

  • 1 — все прочитанные;
  • 2 — все непрочитанные;
  • 3 — все отправленные;
  • 4 — все неотправленные;
  • 5 — все принятые;
  • 6 — вообще все

Полезные ссылки

Итоги

Из этой статьи вы узнали, как можно принимать и отправлять сообщения SMS в текстовом режиме и в режиме PDU при помощи Python и библиотеки RoverConnect, а также через AT-команды. В отличие от текстового ежима, режим PDU позволяет передавать и принимать сообщения SMS с символами кириллицы, и у него нет ограничений на 160 символов.

Для работы вы собрали стенд для изучения AT-команд, состоящий из модуля GSM/GPRS/GNSS Bluetooth HAT на базе SIM868 и микрокомпьютера Repka Pi, описанный ранее в первой и второй   статьях, посвященных этому модулю.

Теперь вы умеете выполнять все самые необходимые операции с SMS: получать список сообщений, отправлять и получать, кодировать и раскодировать сообщения PDU вручную, удалять ненужные сообщения.

Вы познакомились с онлайн-сервисами, позволяющими кодировать и раскодировать сообщения SMS в формате PDU. Это может облегчить отладку программ, работающих с SMS в этом режиме.

Отметим, что модуль SIM868 позволяет добавить в ваше оборудование возможности смартфона. Следите за нашими статьями, посвященными этому модулю.

Использованные изображения

https://upload.wikimedia.org/wikipedia/commons/b/bf/Sms_spam_from_a_server.jpg


Комментарии (0)

Для участия в обсуждении вы должны быть авторизованным пользователем

Навигация

ВойтиРегистрацияТемы