我会回答这个问题,因为它也可能对其他人有帮助。但我想先分享我在多路复用 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 与 Internet 连接。当连接处于活动状态时,我正在发送一条 SMS 消息(通过辅助多路复用器)以报告终端现在在线。
我还在Seeed 论坛上写了这篇文章来回答类似的问题。我很好奇是否有人分享我的稳定性经验,或者是否有人能够分享一些改进。