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

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

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

Q: Как мне узнать время без необходимости закрытия pppd?

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

3 ответа

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

Я нашел этот другой пост о переполнении стека, в котором перечислены 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,

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

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

Я отвечу на этот вопрос, потому что это может помочь и кому-то другому. Но для начала хочу поделиться своим опытом мультиплексирования интерфейса 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, чтобы ответить на аналогичный вопрос. Мне любопытно, поделится ли кто-нибудь моим опытом работы со стабильностью или сможет ли кто-нибудь поделиться некоторыми улучшениями.

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

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

Я пробовал то же самое, и ваш пост мне очень помог, наконец-то мне удалось это сделать, следуя руководству по адресу: 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 работать хорошо, теперь это очень медленно.

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

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

Другие вопросы по тегам