< >
Home » Arduino库教程 » Arduino库教程-GSM-Receive SMS

Arduino库教程-GSM-Receive SMS

Receive SMS

  • 该程序等待一个短信,并打印到串口监视器。它采用 Arduino GSM Shield的GSM库和一个活动的SIM卡。为了操作,SIM卡不需要一个数据计划。

硬件要求

  • Arduino 或者 Genuino 开发板
  • Arduino + Telefonica GSM/GPRS Shield
  • SIM 卡

电路

请输入图片描述
这是在一块Arduino或者Genuino开发板上的Arduino GSM Shield图

样例代码

  • 首先,加上GSM库
#include <GSM.h>
  • SIM卡可能有一个引脚数,来使能它们的功能。为您的SIM卡定义引脚。如果你的卡没有引脚,你可以让它空白:
#define PINNUMBER ""
  • 初始化将要使用的类的实例。你同时需要GSM和GSMVoiceCall类。
GSM gsmAccess; 
GSM_SMS sms;

[Get Code]

  • 创建一个字符串数组,以保存发送消息的数字:
char remoteNumber[20];
  • 在setup()里,打开一个到计算机的串口连接。打开连接后,发送一个消息示意程序已经开始了。
void setup(){
  Serial.begin(9600); 
  Serial.println("SMS Messages Receiver");

[Get Code]

  • 创建一个本地变量来跟踪连接状态。直到SIM连接到网络之前,你可以用这个来防止程序开始运行:
boolean notConnected = true;

[Get Code]

  • 通过调用gsmAccess.begin()连接到网络。它以SIM卡的引脚当作一个参数。你也可以用gprs.attachGPRS()连接到GPRS网络。这个要求你前面声明的APN,登录和密码。通过放在while()循环里,你可以不断地检查连接的状态,等到他们都成为真。

  • 当调制解调器连接到GPRS网络,gsmAccess() 将返回GSM_READY。以此为连接与否的标志。一旦连接好,setup()的其余部分将会运行。

while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

[Get Code]

  • 用一些信息发送到串口监视器来结束setup。
Serial.println("GSM initialized.");
  Serial.println("Waiting for messages");
}

[Get Code]

  • 调制解调器接收到的短消息消息。模拟卡有一些存储空间来存储传入的短信。SIM卡可以容纳的短信数量可以为10,或多达200,这取决于SIM卡。你应该检查你的供应商,以确定你的卡可以保存多少在内存中。

  • 在loop(),创建一个变量char类型来暂时保存任何短信接收到的字符。用sms.available()检查对SIM卡上是否存在信息:

void loop() 
{
  char c;
  if (sms.available())
  {

[Get Code]

  • 如果一个SMS可用,通过调用sms.remoteNumber(remoteNumber, 20)来检索远程发射机的数量。在 remoteNumber参数是你在程序开始部分声明的字符数组,它可以不超过20个字符。这个号码发送到串口监视器。
Serial.println("Message received from:");
    sms.remoteNumber(remoteNumber, 20);
    Serial.println(remoteNumber);

[Get Code]

  • 可以调用sms.flush()删除短信。用 sms.peek()可以识别信息索引序号,这个有助于消除。

  • 下面的代码不会删除SIM卡的任何东西,但你可以重复一个for循环,或定义一个特定的索引序号来消除,来代替假#(如下使用)

if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }

[Get Code]
读取消息,用sms.read()。在这里,您把每个字符从信息保存到变量C,并打印出来,因为它可以阅读。

while(c=sms.read())
      Serial.print(c);

[Get Code]

  • 表示消息是完整的,并用sms.flush()把它从内存删掉。。
Serial.println("\nEND OF MESSAGE");    
    sms.flush();
    Serial.println("MESSAGE DELETED");
  }

[Get Code]

  • 增加一个延迟,并关闭loop
delay(1000);
}

[Get Code]

  • 一旦你的代码被上传,打开串口监视器。依靠一个电话或其他短信功能的服务,发送短信到您SIM卡。当接收到的时候,你应该在屏幕上看到消息打印出来。

  • 完整程序如下。

/*
 SMS receiver

 This sketch, for the Arduino GSM shield, waits for a SMS message
 and displays it through the Serial port.

 Circuit:
 * GSM shield attached to and Arduino
 * SIM card that can receive SMS messages

 created 25 Feb 2012
 by Javier Zorzano / TD

 This example is in the public domain.

 http://www.arduino.cc/en/Tutorial/GSMExamplesReceiveSMS

*/

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("SMS Messages Receiver");

  // connection state
  boolean notConnected = true;

  // Start GSM connection
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

void loop() {
  char c;

  // If there are any SMSs available()
  if (sms.available()) {
    Serial.println("Message received from:");

    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);

    // An example of message disposal
    // Any messages starting with # should be discarded
    if (sms.peek() == '#') {
      Serial.println("Discarded SMS");
      sms.flush();
    }

    // Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c);
    }

    Serial.println("\nEND OF MESSAGE");

    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
  }

  delay(1000);

}

[Get Code]
更多

  • GSM Constructor

  • GSM.begin()

  • GSM.shutdown()

  • GSM_SMS Constructor

  • beginSMS()

  • ready()

  • endSMS()

  • available()

  • remoteNumber()

  • read()

  • write()

  • print()

  • peek()

  • flush()

  • Arduino GSM Shield – 完整的产品描述。

  • Getting started with the GSM Shield – 在几分钟内启动所有东西

  • GSM library – GSM 库的参考网页

  • GSMExamplesMakeVoiceCall -如何用麦克风和扬声器进行语音通话。

  • GSMExamplesReceiveVoiceCall - 接收并连接该呼叫,呼叫的号码显示在串口监视器上,然后挂断电话。

  • GSMExamplesReceiveSMS - 如何收到一个SMS信息。

  • GSMExamplesSendSMS - 如何通过串口监视器发送SMS输入号码和文本。

  • GSMExamplesWebServer - 当从客户端获取一个请求时,Web服务器返回模拟输入引脚上的值。

  • GSMToolsTestGPRS – 试图用提供的APN和证书来通过GPRS访问互联网 。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: arduino库教程, arduino receive sms