当pppd处于活动状态时,将AT命令发送到SIM900

时间:2015-03-09 10:23:46

标签: raspberry-pi gsm at-command pppd sim900

我有一个连接了SIM900 GSM附加板的Raspberry Pi。我已设法通过this guidepppd建立GPRS连接。 (它适用于不同的GSM模块,但步骤相同)

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

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

查看部分user manual,它说SIM900有一个符合GSM0710标准的多路复用器。这有用吗?如果是这样,我将如何实现这一目标?

4 个答案:

答案 0 :(得分:5)

好的,我几乎已经解决了这个问题,但最后一步遇到了障碍。以为我会展示我设法做的事情,因为它可以帮助别人。

我发现堆栈溢出this other post列出了实现此目的的3种可能方法。当PPP(在我有限的经验中)很好地处理这个问题时,我并不想通过AT命令控制gprs。 RPi只有一个串口,因此无法通过多个串行接口进行复用。

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

我无法找到有关如何设置多路复用的大量信息,但最终在挖掘后我在linux内核的n_gsm模块上找到了this文档。我可以跟随它所说的但不足以编写我自己的程序来设置一些虚拟串口。

值得庆幸的是,经过一些谷歌搜索后,我发现这位非凡的绅士created a C program使用n_gsm模块为我们设置虚拟串口。

我按照说明下载,配置和构建了程序,并尝试加载n_gsm模块。不幸的是,RPi并没有将n_gsm模块作为默认模块包含在内,所以我不得不去构建一个新的内核,并添加n_gsm作为模块。我跟着RPi网站上的instruction非常好。

对于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模型的第2层a.k.a数据链路层吗?

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

答案 1 :(得分:1)

我正在尝试同样的事情,你的帖子对我非常有帮助,最后我按照以下指南成功完成了这项工作:https://stackoverflow.com/a/24316133/1316346

但是没有 n_gsm驱动程序的补丁,实际上这样做,设备1到3就消失了。使用标准的n_gsm.c,ldattach创建了63个设备1到4正在处理其他设备。

我已经玩了很多设置,如果你有任何问题我可以发布你整个ldattach.c,无论如何我认为它将作为标准。

现在唯一的缺点是,当使用ppp时,带宽太低,以至于大多数命令需要几秒钟才能回复,我也试图让流行音乐运行良好,现在真的很慢。

我认为我应该降低虚拟连续出版物的带宽,因为我没有流量控制(我也在ldattach的串行配置中禁用了它)

请告诉我它是否适合您。

答案 2 :(得分:1)

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

至于我,我完全取消了这个延迟。

答案 3 :(得分:0)

我将回答这个问题,因为它可能也会对其他人有所帮助。但是,我想从分享UART接口多路复用的经验开始。我完成所有设置后,一切似乎都运行良好。但是,当我尝试连接到VPN或传输某些文件时,Raspbian完全冻结了。我不确定到底是什么问题,但它似乎与n_gsmcmux组件有关。但是,像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
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 forum to answer a similar question上写了这篇文章。我很好奇,如果有人分享我的稳定性经验,或者有人能够分享一些改进。