如何将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_手册

要ping到网站,主要关注的AT命令是AT+CIPPING。其**语法**如下:

AT+CIPPING = <IPAddr or Domain
Name>[,<retryNum>[,<dataLen>[,<timeout>[,<ttl>]]]]

从方括号可以看出,除了第一个参数之外,所有参数都是可选的。

参数说明如下:

  • **IP地址或域名** - “abc.xyz.lmn.pqr”格式的IP地址或像"www.google.com"这样的域名

  • **retryNum** - 要发送的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是发送回复的远程主机的IpAddress

  • 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); // Setting the baud rate of GSM Module
   Serial.begin(9600); // Setting the baud rate of Serial Monitor (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);
   //Print the response on the Serial Monitor
   while (gsmSerial.available() > 0) {
   Serial.write(gsmSerial.read());
}
   Serial.println("Ping to Google");
   gsmSerial.println("AT+CIPPING=\"www.google.com\"\r");
   delay(5000);
   //Print the response on the Serial Monitor
   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响应可能比平时花费更长的时间。您可以尝试调整这些值。

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

更新于:2021年7月24日

1K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

立即开始
广告