如何将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响应可能比平时花费更长的时间。您可以尝试调整这些值。
如果由于某种原因,您的代码无法按预期工作,您可以参考应用笔记以获取帮助。