6

我有一个连接了 SIM900 GSM 附加板的 Raspberry Pi。我已经pppd按照本指南建立了 GPRS 连接。(适用于不同的 GSM 模块,但步骤相同)

我想定期向AT+CCLK?SIM900 发送 AT 命令 ( ) 以检查时钟。我已经管理使用发送临时 AT 命令,screen但是何时pppd启动我不能screen用来连接到串行线路。它只是直接退出说[screen is terminating]。我猜这是因为pppd正在使用它连接到互联网。

问:如何在不关闭 pppd 的情况下获取时钟时间?

查看用户手册的一部分,它说 SIM900 有一个为 GSM0710 标准设计的多路复用器。这会有用吗?如果是这样,我将如何实现这一目标?

4

4 回答 4

5

好的,我几乎已经解决了这个问题,但卡在了最后一个障碍。以为我会展示我所做的事情,因为它可能会帮助其他人。

我发现this other post on stack overflow列出了3种可能的方法来实现这一点。当 PPP(以我​​有限的经验)很好且轻松地处理这个问题时,我不想通过 AT 命令控制 gprs。RPi 只有一个串口,所以我不能多路复用多个串口。

所以这让我只能通过单个串行接口进行多路复用,希望 SIM900 支持这一点。我在这里找到了使用 GSM07.10 标准的 SIM900 多路复用器的用户手册。

我找不到太多关于如何设置多路复用的信息,但最终在四处挖掘之后,我在 linux 内核的 n_gsm 模块上找到了这个文档。我几乎可以按照它在说什么,但不足以编写我自己的程序来设置许多虚拟串行端口。

谢天谢地,在谷歌搜索之后,我发现这位非凡的绅士已经创建了一个 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");

sleep(1.5)在尝试读取响应之前,我还编辑了第 128 行,因为它有时会返回错误,因为它没有及时得到响应。

所以我运行 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 模型的第 2 层,也就是数据链路层?

无论如何,这就是我已经走了多远。我决定暂时把它放在一边,只使用 NTP,但我希望这对其他人有帮助。如果您确实找到了解决方案或可以提出一些我可能错过的建议,请务必说出来。谢谢

于 2015-03-12T10:56:04.103 回答
3

我会回答这个问题,因为它也可能对其他人有帮助。但我想先分享我在多路复用 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直接开始使用。对于两者cmuxpppd我创建了一个在启动时运行的 systemd 服务,因此在启动时 Raspbian 正在设置多路复用器并通过 PPP 与 Internet 连接。当连接处于活动状态时,我正在发送一条 SMS 消息(通过辅助多路复用器)以报告终端现在在线。


我还在Seeed 论坛上写了这篇文章来回答类似的问题。我很好奇是否有人分享我的稳定性经验,或者是否有人能够分享一些改进。

于 2019-12-16T14:24:32.813 回答
1

我也在尝试同样的方法,您的帖子对我帮助很大,最后我按照以下指南成功地做到了: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 的串行配置中禁用了它)

让我知道它是否适合你。

于 2015-07-07T19:44:37.317 回答
1

我遇到了同样的问题([屏幕正在终止],第 2 级停止)。注意cmux AT 命令到串口和设置线路规则sleep()之间的延迟。耽搁时间不宜过长。如果您没有及时设置线路规则,调制解调器有超时从 cmux 模式重置。这里有一些细节和证据。write()ioctl()

至于我,我已经完全消除了这种延迟。

于 2016-01-25T19:18:14.090 回答