Raspberry pi pppd激活时向SIM900发送AT命令

Raspberry pi pppd激活时向SIM900发送AT命令,raspberry-pi,gsm,at-command,pppd,sim900,Raspberry Pi,Gsm,At Command,Pppd,Sim900,我有一个树莓Pi与SIM900 GSM附加板连接。我已通过以下方式与pppd建立了GPRS连接。(用于不同的GSM模块,但步骤相同) 我希望定期向SIM900发送AT命令(AT+CCLK?),以检查时钟。我使用screen管理发送临时AT命令,但当pppd启动时,我无法使用screen连接到串行线路。它直接退出说[屏幕正在终止]。我猜这是因为pppd正在使用它连接到互联网 Q:如何在不关闭pppd的情况下获取时钟时间 查看部分内容,SIM900有一个按照GSM0710标准设计的多路复用器。这有用

我有一个树莓Pi与SIM900 GSM附加板连接。我已通过以下方式与
pppd
建立了GPRS连接。(用于不同的GSM模块,但步骤相同)

我希望定期向SIM900发送AT命令(
AT+CCLK?
),以检查时钟。我使用
screen
管理发送临时AT命令,但当
pppd
启动时,我无法使用
screen
连接到串行线路。它直接退出说
[屏幕正在终止]
。我猜这是因为
pppd
正在使用它连接到互联网

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


查看部分内容,SIM900有一个按照GSM0710标准设计的多路复用器。这有用吗?如果是这样的话,我该如何做到这一点呢?

好的,我几乎已经解决了这个问题,但仍停留在最后一个障碍上。我想我会展示我所做的一切,因为这可能会帮助其他人

我在stack overflow上找到了实现这一点的3种可能方法。我不想通过AT命令控制gprs,而PPP(在我有限的经验中)可以很好地轻松地处理这一点。RPi只有一个串行端口,因此无法通过多个串行接口进行多路复用

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

我找不到关于如何设置多路复用的太多信息,但最终在深入研究后,我在linux内核中的n_gsm模块上找到了一份文档。我只能大致了解它所说的内容,但还不足以编写自己的程序来设置多个虚拟串行端口

谢天谢地,在浏览了谷歌之后,我发现这位非凡的绅士不得不使用n_gsm模块为我们设置虚拟串行端口

我按照说明下载、配置和构建程序,并尝试加载n_gsm模块。不幸的是,RPi没有默认包含n_gsm模块,因此我不得不使用n_gsm模块构建一个新内核。我在RPi网站上关注了这一点,非常好

对于SIM900,我必须更改第322行以删除
AT+IPR
命令末尾的
&w
。它应该知道它看起来像:

if(发送at命令(串行fd,“at+IPR=115200\r”)=-1)
errx(退出_故障,“AT+IPR=115200:错误响应”)

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

因此,我运行cmux程序(使用sudo创建新的/dev/ttyGSM*设备),它运行AT命令,设置线路规程并创建新的虚拟串行设备,但当我尝试用
screen/dev/ttyGSM1 115200
打开串行终端时,screen只返回
[屏幕正在终止]

我做了
sudofuser/dev/ttyGSM1
,它没有返回任何内容,因此没有其他进程使用它

然后,我尝试在>/dev/ttyGSM1
上执行
回显,返回
-bash:/dev/ttyGSM1:level2暂停

我不确定这是指什么,也找不到有关此消息的任何信息。它可能是在谈论OSI模型的第2层,也就是数据链路层吗


不管怎么说,我已经走了这么远。我已经决定把它放在一边,现在只使用NTP,但我希望这能帮助其他人。如果你真的找到了解决办法,或者可以提出一些我可能遗漏的建议,请说出来。谢谢

我也在尝试同样的方法,你的帖子对我帮助很大,最后我按照以下指南成功地做到了:

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

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

现在唯一的缺点是,当使用ppp时,带宽很低,大多数at命令需要几秒钟才能回复,我也在尝试让pop正常工作,现在真的很慢

我认为我应该降低虚拟串行的带宽,因为我没有硬件流控制(我还在ldattach的串行配置中禁用了它)

请告诉我它是否对您有效。

我也有同样的问题([屏幕正在终止],第2级暂停)。注意
sleep()。延迟应。如果您没有及时设置线路规程,调制解调器将有超时时间从cmux模式重置。有一些细节和证据


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

我将回答这个问题,因为它可能也会帮助其他人。但我想先分享一下复用UART接口的经验。在我设置好之后,似乎一切都进行得很顺利。但当我试图连接到VPN或传输一些文件时,Raspbian完全僵住了。我不确定到底是什么问题,但它似乎与
n\u gsm
cmux
组件有关。不过,像ping、telnet或SSH这样的低带宽应用程序似乎工作正常gsm模块被标记为实验性模块,可能不应用于生产。


默认情况下,
n\u gsm
内核模块不包括在Raspbian中。要开始使用CMUX驱动程序,我们需要更新Raspbian并下载内核源文件,然后我们可以编译
n\u gsm
m
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");