Отправка AT-команд на SIM900 при активном pppd

У меня есть Raspberry Pi с подключенной дополнительной платой SIM900 GSM. Мне удалось установить GPRS-соединение с pppd, выполнив это руководство. (Это для другого модуля GSM, но действия такие же)

Я хотел бы периодически отправлять AT-команду (AT+CCLK?) на SIM900, чтобы проверить часы. Мне удалось отправить специальные AT-команды с помощью screen, но когда pppd работает, я не могу использовать screen для подключения к последовательной линии. Он сразу же выходит, говоря [screen is terminating]. Я предполагаю, что это потому, что pppd использует его для подключения к Интернету.

В: Как мне узнать время, не закрывая pppd?

В части руководства пользователя говорится, что SIM900 имеет мультиплексор, разработанный по стандарту GSM0710. Было бы это полезно? Если да, то как мне этого добиться?


person geekman92    schedule 09.03.2015    source источник


Ответы (4)


Я отвечу на этот вопрос, потому что это может помочь и кому-то другому. Но для начала хочу поделиться своим опытом мультиплексирования интерфейса UART. После того, как я все это настроил, казалось, что все работает хорошо. Но когда я пытался подключиться к VPN или передать какие-то файлы, Raspbian полностью зависал. Я не уверен, в чем именно проблема, но похоже, что она связана с n_gsm или cmux компонентами. Однако приложения с низкой пропускной способностью, такие как ping, telnet или SSH, работают нормально. Модуль n_gsm отмечен как экспериментальный и, вероятно, не должен использоваться в производственной среде.


Модуль ядра n_gsm по умолчанию не включен в Raspbian. Чтобы начать использовать драйвер CMUX, нам нужно обновить Raspbian и загрузить исходные файлы ядра, после чего мы сможем скомпилировать модуль n_gsm.

  1. Убедитесь, что ваша система обновлена, установите зависимости и обновите ядро ​​
sudo -i
apt update
apt dist-upgrade
apt install bc bison git build-essential flex libssl-dev
rpi-update
sync
reboot
  1. Загрузите исходные коды ядра, чтобы мы могли создать собственный модуль ядра
wget -O /usr/bin/rpi-source https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source
chmod +x /usr/bin/rpi-source
/usr/bin/rpi-source -q --tag-update
rpi-source
  1. Создайте модуль ядра для экспериментальной поддержки дисциплины линии GSM MUX
cd /root/linux/drivers/tty/
make -C /lib/modules/$(uname -r)/build M=$(pwd) -e CONFIG_N_GSM=m modules
cp /root/linux/drivers/tty/n_gsm.ko /lib/modules/`uname -r`/kernel/drivers/tty/
depmod
modprobe n_gsm

Вы также можете добавить модуль в свой / etc / modules, если хотите загружать его автоматически при загрузке.

  1. Загрузите и скомпилируйте драйвер GSM MUX (CMUX)
cd /usr/local/src/
git clone https://github.com/Rtone/cmux.git
cd cmux

Обычно вам нужно отредактировать cmux.c перед компиляцией. Вот разница, которую я использовал для своей установки.

diff --git a/cmux.c b/cmux.c
index 1af0f50..f13edfe 100644
--- a/cmux.c
+++ b/cmux.c
@@ -29,6 +29,7 @@
 #include <linux/types.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/sysmacros.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <err.h>
@@ -50,13 +51,13 @@
 #endif

 /* serial port of the modem */
-#define SERIAL_PORT    "/dev/ttyS1"
+#define SERIAL_PORT    "/dev/ttyAMA0"

 /* line speed */
 #define LINE_SPEED     B115200

 /* maximum transfert unit (MTU), value in bytes */
-#define MTU    512
+#define MTU    1400

 /**
 * whether or not to create virtual TTYs for the multiplex
@@ -66,7 +67,7 @@
 #define CREATE_NODES   1

 /* number of virtual TTYs to create (most modems can handle up to 4) */
-#define NUM_NODES      4
+#define NUM_NODES      2

 /* name of the virtual TTYs to create */
 #define BASENAME_NODES "/dev/ttyGSM"
@@ -313,15 +314,9 @@ int main(void) {
        *       to fit your modem needs.
        *       The following matches Quectel M95.
        */
-       if (send_at_command(serial_fd, "AT+IFC=2,2\r") == -1)
-               errx(EXIT_FAILURE, "AT+IFC=2,2: bad response"); 
-       if (send_at_command(serial_fd, "AT+GMM\r") == -1)
-               warnx("AT+GMM: bad response");
        if (send_at_command(serial_fd, "AT\r") == -1)
                warnx("AT: bad response");
-       if (send_at_command(serial_fd, "AT+IPR=115200&w\r") == -1)
-               errx(EXIT_FAILURE, "AT+IPR=115200&w: bad response");
-       sprintf(atcommand, "AT+CMUX=0,0,5,%d,10,3,30,10,2\r", MTU);
+       sprintf(atcommand, "AT+CMUX=0,0,0,%d,253,3,254,0,0\r", MTU);
        if (send_at_command(serial_fd, atcommand) == -1)
                errx(EXIT_FAILURE, "Cannot enable modem CMUX");

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

make
cp cmux /usr/bin/cmux
cmux
  1. Использование новых последовательных интерфейсов

Теперь мы можем использовать новые интерфейсы. Вместо использования /dev/ttyAMA0 теперь мы можем использовать как /dev/ttyGSM1, так и /dev/ttyGSM2. Я использую первый с pppd, а второй - для одновременной отправки AT-команд. По какой-то причине я не мог продолжать использовать wvdial, поэтому я полностью отказался от этого и начал использовать pppd напрямую. И для cmux, и для pppd я создал службу systemd, которая запускается при загрузке, одна за другой, поэтому при запуске Raspbian настраивает мультиплексор и подключается к Интернету через PPP. Когда соединение установлено, я отправляю SMS-сообщение (через вторичный мультиплексор), чтобы сообщить, что терминал теперь в сети.


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

person Thomas Lobker    schedule 16.12.2019
comment
Привет, я попробовал ваши шаги, и у меня возникла проблема при загрузке ядра. При использовании rpi-source я столкнулся со следующей проблемой: `` Makefile: 590: include / config / auto.conf: нет такого файла или каталога Makefile: 621: include / config / auto.conf.cmd: нет такого файла или каталога / bin / sh: 1: flex: not found scripts / Makefile.lib: 188: recipe for target 'scripts / kconfig / zconf.lex.c' failed `` Есть еще несколько строк, которые я не могу написать здесь в комментариях. Пожалуйста помогите. - person theashwanisingla; 08.01.2020
comment
@theashwanisingla, похоже, отсутствует предварительное условие flex. Вы можете установить это с помощью apt install flex, и тогда все будет в порядке. - person Thomas Lobker; 12.01.2020
comment
Привет, я установил flex согласно вашему предложению. Но все еще застрял в той же проблеме при выполнении команды make на 3-м шаге для сборки модуля ядра. - person theashwanisingla; 13.01.2020
comment
@theashwanisingla, возможно, этот источник может вам помочь? github.com/notro/rpi-source/wiki - person Thomas Lobker; 14.01.2020

Хорошо, я почти решил эту проблему, но застрял на самом последнем препятствии. Думал, что покажу, что мне удалось сделать, потому что это может помочь кому-то другому.

Я нашел этот другой пост о переполнении стека, в котором перечислены 3 возможных способа достижения этого. Я не хотел управлять gprs с помощью AT-команд, когда PPP (по моему ограниченному опыту) справляется с этим хорошо и легко. RPi имеет только один последовательный порт, поэтому я не мог мультиплексировать через несколько последовательных интерфейсов.

Так что у меня осталось мультиплексирование через единственный последовательный интерфейс, будем надеяться, что SIM900 это поддерживает. Я нашел здесь руководство пользователя мультиплексора SIM900 который использует стандарт GSM07.10.

Я не смог найти много информации о том, как настроить мультиплексирование, но в конце концов, покопавшись, я нашел этот документ о модуле n_gsm в ядре Linux. Я почти могу понять, о чем идет речь, но этого недостаточно, чтобы написать свою собственную программу для настройки нескольких виртуальных последовательных портов.

К счастью, после еще нескольких поисков в Google я обнаружил, что этот выдающийся джентльмен создал программу C для использования n_gsm модуль для настройки виртуальных последовательных портов для нас.

Я скачал, настроил и собрал программу в соответствии с инструкциями и попытался загрузить модуль n_gsm. К сожалению, RPi не включает модуль n_gsm по умолчанию, поэтому мне пришлось пойти и собрать новое ядро ​​с добавлением n_gsm в качестве модуля. Я выполнил инструкцию на веб-сайте RPi, и это очень хорошо.

Для SIM900 мне пришлось изменить строку 322, чтобы удалить &w в конце команды AT+IPR. Он должен выглядеть так:

if (send_at_command(serial_fd, "AT+IPR=115200\r") == -1) errx(EXIT_FAILURE, "AT+IPR=115200: bad response");

Я также отредактировал строку 128 на sleep(1.5), прежде чем пытаться прочитать ответ, поскольку иногда он возвращал ошибку, потому что не получил ответа вовремя.

Итак, я запускаю программу cmux (с sudo, поскольку она должна создавать новые устройства / dev / ttyGSM *), и она запускает AT-команды, устанавливает дисциплину линии и создает новые виртуальные последовательные устройства, но когда я пытаюсь открыть серийный номер терминал с screen /dev/ttyGSM1 115200 экраном просто возвращает [screen is terminating].

Я сделал sudo fuser /dev/ttyGSM1, который ничего не вернул, поэтому его не использует никакой другой процесс.

Затем я попробовал echo AT > /dev/ttyGSM1, который вернул -bash: /dev/ttyGSM1: Level 2 halted.

Я не понимаю, о чем идет речь, и не смог найти никакой информации в этом сообщении. Может быть, речь идет об уровне 2 модели OSI, также известном как уровень канала передачи данных?

Во всяком случае, вот как далеко я зашел. Я решил пока отложить это в сторону и просто использовать NTP, но я надеюсь, что это поможет кому-то другому. Если вы найдете решение этой проблемы или можете предложить что-то, что я, возможно, пропустил, пожалуйста, скажите. Спасибо

person JSE    schedule 12.03.2015

Я пробовал то же самое, и ваш пост мне очень помог, наконец, мне удалось это сделать, следуя руководству по адресу: https://github.com/guowenxue/embedded_project/tree/master/program/ldattach_gsm0701

но без патча для драйвера n_gsm фактически исчезли устройства с 1 по 3. со стандартным n_gsm.c, ldattach создал 63 устройства с 1 по 4, остальные нет.

Я много играл с настройками, если у вас возникнут проблемы, я могу опубликовать вам весь ldattach.c, в любом случае я думаю, что он будет работать как стандарт.

Единственным недостатком сейчас является то, что при использовании ppp полоса пропускания настолько мала, что большинство команд at отвечает за секунды, я также пытаюсь заставить pop работать хорошо, теперь он действительно медленный.

Я думаю, мне следует снизить пропускную способность виртуальных серийных номеров, поскольку у меня нет управления потоком HW (я также отключил его в последовательной конфигурации ldattach)

дайте мне знать, работает ли это для вас.

person Luca    schedule 07.07.2015
comment
Восстановление старого сообщения здесь - но с аналогичной проблемой (кроме Quectel M95). Из коробки PPP работал нормально. Я перекомпилировал ядро, как указано выше, чтобы добавить n_gsm и получить 4 устройства ttyGSM * с помощью cmux. После этого я могу отправлять AT-команды на ttyGSM1, но ppp теперь не работает - похоже, не работает ни на одном из устройств ttyGSM *. Если я не использую cmux, он не будет работать на / dev / serial0 (как и раньше) - хотя cmux работает с / dev / serial0 при запуске ppp, время ожидания первой AT-команды в сценарии чата истекает. - person The Naughty Otter; 26.11.2019

У меня была такая же проблема ([экран гаснет], уровень 2 остановлен). Позаботьтесь о sleep() задержке между write() командой cmux AT на последовательный порт и установкой дисциплины линии через ioctl(). Задержка должна не быть длинной. У модемов есть тайм-аут для сброса из режима cmux, если вы не установили дисциплину линии вовремя. Вот некоторые подробности и доказательства.

Что касается меня, то я вообще убрал эту задержку.

person konstunn    schedule 25.01.2016