Raspberry pi pppd激活时向SIM900发送AT命令
我有一个树莓Pi与SIM900 GSM附加板连接。我已通过以下方式与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标准设计的多路复用器。这有用
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");