Я отвечу на этот вопрос, потому что это может помочь и кому-то другому. Но для начала хочу поделиться своим опытом мультиплексирования интерфейса UART. После того, как я все это настроил, казалось, что все работает хорошо. Но когда я пытался подключиться к VPN или передать какие-то файлы, Raspbian полностью зависал. Я не уверен, в чем именно проблема, но похоже, что она связана с n_gsm
или cmux
компонентами. Однако приложения с низкой пропускной способностью, такие как ping, telnet или SSH, работают нормально. Модуль n_gsm
отмечен как экспериментальный и, вероятно, не должен использоваться в производственной среде.
Модуль ядра n_gsm
по умолчанию не включен в Raspbian. Чтобы начать использовать драйвер CMUX, нам нужно обновить Raspbian и загрузить исходные файлы ядра, после чего мы сможем скомпилировать модуль n_gsm
.
- Убедитесь, что ваша система обновлена, установите зависимости и обновите ядро
sudo -i
apt update
apt dist-upgrade
apt install bc bison git build-essential flex libssl-dev
rpi-update
sync
reboot
- Загрузите исходные коды ядра, чтобы мы могли создать собственный модуль ядра
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
- Создайте модуль ядра для экспериментальной поддержки дисциплины линии 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, если хотите загружать его автоматически при загрузке.
- Загрузите и скомпилируйте драйвер 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
- Использование новых последовательных интерфейсов
Теперь мы можем использовать новые интерфейсы. Вместо использования /dev/ttyAMA0
теперь мы можем использовать как /dev/ttyGSM1
, так и /dev/ttyGSM2
. Я использую первый с pppd, а второй - для одновременной отправки AT-команд. По какой-то причине я не мог продолжать использовать wvdial
, поэтому я полностью отказался от этого и начал использовать pppd
напрямую. И для cmux
, и для pppd
я создал службу systemd, которая запускается при загрузке, одна за другой, поэтому при запуске Raspbian настраивает мультиплексор и подключается к Интернету через PPP. Когда соединение установлено, я отправляю SMS-сообщение (через вторичный мультиплексор), чтобы сообщить, что терминал теперь в сети.
Я также написал это сообщение на форуме Seeed, чтобы ответить на аналогичный вопрос.. Мне любопытно, поделится ли кто-нибудь моим опытом работы со стабильностью или сможет ли кто-нибудь поделиться некоторыми улучшениями.
person
Thomas Lobker
schedule
16.12.2019