如何将 Arduino 与 GSM 模块连接并 ping 通网站?
本文将介绍如何将 Arduino 与 GSM 模块连接并 ping 通网站。您需要以下组件:
Arduino 开发板
GSM 模块(SIM800C、SIM900A 是常见的型号,但您也可以使用其他型号的模块)
GSM (2G) SIM 卡,或带有 2G 备用功能的 4G SIM 卡(Jio SIM 卡不适用于本项目)
GSM 天线
您也可以使用 GSM 模块开发板,例如下图所示的开发板(SIM 卡槽位于开发板的另一侧)−

GSM 模块通过 UART 与微控制器交互(参见上图左下角的 UART 跳线孔)。我们将使用 SoftwareSerial 连接到 GSM 模块。电路图如下所示。

如您所见,我们将 GSM 模块的 RX 连接到 Arduino 的引脚 5,TX 连接到引脚 9,GND 连接到 GND。由于 GSM 模块将使用单独的 1A+ 适配器供电,因此无需将 Vcc 连接到 Arduino(它需要的电流超过了 Arduino 引脚所能提供的电流)。在 UART 连接中,一个模块的 TX 连接到另一个模块的 RX,反之亦然,因此 Arduino 的引脚 5 将用作 TX(因为它连接到 GSM 模块的 RX),引脚 9 将用作 RX。
GSM 模块使用 AT 命令工作。本文篇幅有限,无法详细介绍 AT 命令。但是,您应该知道每个 GSM 命令都有其对应的 AT 命令手册,您应该参考该手册进行所有操作(发送短信、拨打电话、连接互联网等)。
SIM900 的 AT 命令手册可在此处找到。
但是,上述 AT 命令手册中不包含 ping 命令。对于这些命令,您需要参考SIM900_PING_AT_Manual。
要 ping 一个网站,主要需要用到的 AT 命令是 AT+CIPPING。它的语法是 −
AT+CIPPING = <IPAddr or Domain Name>[,<retryNum>[,<dataLen>[,<timeout>[,<ttl>]]]]
如方括号所示,除第一个参数外,所有参数均为可选参数。
参数说明如下
IP地址或域名 可以是"abc.xyz.lmn.pqr"格式的IP地址,也可以是类似"www.google.com"的域名。
dataLen 要发送的ping回显请求次数(默认值为4,范围为1到100)。
dataLen ping 回显请求数据的长度(默认值为 32,范围为 0 到 1024)
timeout 模块等待单个回显应答的时长(以 100 毫秒为单位)(默认值为 100,范围为 1 到 600)
ttl 生存时间(默认值为 64,范围为 1 到 255)。它主要用于告知网络路由器数据包在网络中停留的时间是否过长。在上述示例中,我们指示如果数据包在网络中停留了 64 跳或更多,则应将其丢弃。
为了使 CIPPING 正常工作,必须激活 GPRS 上下文(AT+CGATT = 1)。
大多数情况下,此功能默认启用,但您可能需要检查 (AT+CGATT),如果未设置为 1,请手动将其设置为 1。每个 ping 请求的回复格式如下:-
+CIPPING: <replyId>, <IpAddress>, <replyTime>, <ttl>\r
其中,
replyId 顾名思义,是回复的 ID 或编号。
IpAddress 是发送回复的远程主机的 IP 地址。
replyTime 是接收响应所花费的时间(以 100 毫秒为单位)。
ttl 如前所述,是生存时间。
如果回显请求超时,则响应的 replyTime 值将设置为 600,ttl 值将设置为 255。
Arduino 代码
下面是执行 ping 操作的 Arduino 代码(我们 ping 的是 google.com)。
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(9, 5); // RX, TX
void setup()
{
gsmSerial.begin(9600); // 设置GSM模块的波特率
Serial.begin(9600); // 设置串口监视器(Arduino)的波特率
delay(1000);
Serial.println("Preparing to ping");
Ping();
}
void loop()
{
}
void Ping()
{
Serial.println("Attach to GPRS");
gsmSerial.println("AT+CGATT=1\r");
delay(2000);
Serial.println("Setting the APN");
gsmSerial.println("AT+CSTT=\"YourAPN\"\r");
delay(2000);
Serial.println("Bringing up the wireless connection");
gsmSerial.println("AT+CIICR\r");
delay(8000);
Serial.println("Getting local IP address");
gsmSerial.println("AT+CIFSR\r");
delay(5000);
//在串口监视器上打印响应。
while (gsmSerial.available() > 0) {
Serial.write(gsmSerial.read());
}
Serial.println("Ping to Google");
gsmSerial.println("AT+CIPPING=\"www.google.com\"\r");
delay(5000);
//在串口监视器上打印响应。
while (gsmSerial.available() > 0) {
Serial.write(gsmSerial.read());
}
}
将 YourAPN 替换为您的实际 APN 值(通常情况下,"www" 即可,但请咨询您的网络服务提供商)。在串口监视器中,您应该首先看到 AT+CIFSR 命令返回的本地 IP 地址。如果一切顺利,AT+CIPPING 命令返回的响应可能如下所示:
+CIPPING: 1,"203.208.37.99",68,234 +CIPPING: 2,"203.208.37.99",75,232 +CIPPING: 3,"203.208.37.99",54,233 +CIPPING: 4,"203.208.37.99",66,236
请注意 AT+CIICR、AT+CIFSR 和 AT+CIPPING 之后的延迟时间较长。这是因为 建立无线连接、获取本地 IP 地址和 ping 响应可能需要比平时更长的时间。您可以尝试调整这些值。
如果您的代码由于某种原因无法按预期工作,您可以参考应用说明获取帮助。

