如何将 Arduino 与 GSM 模块连接并 ping 通网站?

arduinohardwaresoftware & coding

本文将介绍如何将 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 响应可能需要比平时更长的时间。您可以尝试调整这些值。

如果您的代码由于某种原因无法按预期工作,您可以参考应用说明获取帮助。


相关文章