< >
Home » Arduino库教程 » Arduino库教程-GSM-Test GPRS

Arduino库教程-GSM-Test GPRS

GSM Test GPRS

  • 这个程序测试在GSM shield上的GPRS数据连接。它试图连接到arduino.cc。

  • 使用一个和GSM shield的数据连接,你会需要你的服务提供者的接入点名称(APN)、登录和密码。要获得此信息,联系网络提供者,以获得最新的信息。此页有一些关于各种载波设置的信息,但它可能不是最新的。

硬件要求

  • Arduino or Genuino Board
  • Arduino + Telefonica GSM/GPRS Shield
  • SIM card enable for Data

电路

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

样例代码

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

[Get Code]

  • 创建一些状态消息发送到串口监视器:
String oktext = "OK";
String errortext = "ERROR";

[Get Code]

  • 创建一些变量来保持服务器、路径和您希望连接到的代理服务器。
char url[] = "arduino.cc";
char path[] = "/";
char urlproxy[] = "http://arduino.cc";

[Get Code]

  • 创建一个变量来保存来自服务器的反馈,并用一个标志来表示您是否将使用一个代理服务器。
String response = "";

boolean use_proxy = false;

[Get Code]

  • 在 setup 里, 打开一个到计算机的串口连接。
void setup(){
  Serial.begin(9600); 
}

[Get Code]

  • 您将创建一个自定义函数来处理来自串口监视器的串行输入。制作一个命名好的函数,来接收一个字符数组作为一个参数。
int readSerial(char result[])
{

[Get Code]

  • 使一个变量作为一个计数器使用。当有可用的串口信息时,将其读到字符数组中。如果遇到一个换行符,终止数组并返回主程序。
int i = 0;
  while(1)
  {
    while (Serial.available() > 0)
    {
      char inChar = Serial.read();
      if (inChar == '\n')
      {
        result[i] = '\0';
        return 0;
      }
      if(inChar!='\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}

[Get Code]

  • 在loop()里, 把代理的标志设置为false
void loop()
{
  use_proxy = false;

[Get Code]

  • 通过输入PIN号码(如果合适)到gsmAccess.begin(),来开始GSM网络的连接。
Serial.print("Connecting GSM network...");
  if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
  {
    Serial.println(errortext);
    while(true);
  }
  Serial.println(oktext);

[Get Code]

  • 创建一个数组来保存APN。用你创建的readSerial()函数来从串口监视器得到字节。
char apn[50];
  Serial.print("Enter your APN: ");
  readSerial(apn);
  Serial.println(apn);

[Get Code]

  • 创建一个字符数组来保存APN登录。用你创建的readSerial()函数来从串口监视器得到字节。
char login[50];
  Serial.print("Now, enter your login: ");
  readSerial(login);
  Serial.println(login);

[Get Code]

  • 创建一个字符数组保存APN密码。用你创建的readSerial()函数来从串口监视器得到字节。
char password[20];
  Serial.print("Finally, enter your password: ");
  readSerial(password);

[Get Code]

  • 通过 gprs.attachGPRS()连接到GPRS网络。这个要求你要进入的APN、登录和密码。

  • 当调制解调器连接到GPRS网络,gsmAccess()将返回GSM_READY。

Serial.println("Attaching to GPRS with your APN...");
  if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
  {
    Serial.println(errortext);
  }
  else{

    Serial.println(oktext);

[Get Code]

  • 创建一个字符数组来保存您可能需要的代理信息。使用readserial()函数来从串口监测器得到的字节。
char proxy[100];
    Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");
    readSerial(proxy);
    Serial.println(proxy);

[Get Code]

  • 如果用了代理,询问端口号,并将代理标志设置为true
int pport;
    if(proxy[0] != '\0'){
      // read proxy port introduced by user
      char proxyport[10];
      Serial.print("Enter the proxy port: ");
      readSerial(proxyport);
      // cast proxy port introduced to integer
      pport = (int) proxyport;
      use_proxy = true;
      Serial.println(proxyport);
    }

[Get Code]

  • 创建一个变量,以指示是否连接到服务器上。通过client.connect()连接到服务器。你如何连接将取决于是否使用代理。
Serial.print("Connecting and sending GET request to arduino.cc...");
    int res_connect;

    if(use_proxy)
      res_connect = client.connect(proxy, pport);
    else
      res_connect = client.connect(url, 80);

[Get Code]

  • 如果你已经连接,用client.print()来制作一个HTTP GET请求。
if (res_connect)
    {
      client.print("GET ");

      if(use_proxy)
        client.print(urlproxy);
      else
        client.print(path);

      client.println(" HTTP/1.0");
      client.println();
      Serial.println(oktext);
    }

[Get Code]

  • 如果没有连接上,打印一个 error
else
    {
      // if you didn't get a connection to the server
      Serial.println(errortext);
    }

[Get Code]

  • 通过client.available()查看是否服务器返回的任何字节。如果有,将它们读到响应字符串中,然后将它们转换成一个字符数组。检查含有子串“200 OK”的阵列,这表明是从arduino.cc发来的有效响应。
Serial.print("Receiving response...");

    boolean test = true;
    while(test)
    {
      if (client.available())
      {
        char c = client.read();
        response += c;

        char responsechar[response.length()+1];
        response.toCharArray(responsechar, response.length()+1);

        if(strstr(responsechar, "200 OK") != NULL){
          Serial.println(oktext);
          Serial.println("TEST COMPLETE!");
          test = false;
        }
      }

[Get Code]

  • 如果服务器已断开,停止客户端并关闭loop()
if (!client.connected())
      {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        test = false;
      }
    }
  }
}

[Get Code]

  • 一旦你的代码被上传,打开串口监视器来查看连接的状态。

  • 完整程序如下。

/*

 This sketch test the GSM shield's ability to connect to a
 GPERS network. It asks for APN information through the
 serial monitor and tries to connect to arduino.cc.

 Circuit:
 * GSM shield attached
 * SIM card with data plan

 Created 18 Jun 2012
 by David del Peral

 This example code is part of the public domain

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

 */

// libraries
#include <GSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;        // GSM access: include a 'true' parameter for debug enabled
GPRS gprsAccess;  // GPRS access
GSMClient client;  // Client service for TCP connection

// messages for serial monitor response
String oktext = "OK";
String errortext = "ERROR";

// URL and path (for example: arduino.cc)
char url[] = "arduino.cc";
char urlproxy[] = "http://www.arduino.cc";
char path[] = "/";

// variable for save response obtained
String response = "";

// use a proxy
boolean use_proxy = false;

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

void loop() {
  use_proxy = false;

  // start GSM shield
  // if your SIM has PIN, pass it as a parameter of begin() in quotes
  Serial.print("Connecting GSM network...");
  if (gsmAccess.begin(PINNUMBER) != GSM_READY) {
    Serial.println(errortext);
    while (true);
  }
  Serial.println(oktext);

  // read APN introduced by user
  char apn[50];
  Serial.print("Enter your APN: ");
  readSerial(apn);
  Serial.println(apn);

  // Read APN login introduced by user
  char login[50];
  Serial.print("Now, enter your login: ");
  readSerial(login);
  Serial.println(login);

  // read APN password introduced by user
  char password[20];
  Serial.print("Finally, enter your password: ");
  readSerial(password);

  // attach GPRS
  Serial.println("Attaching to GPRS with your APN...");
  if (gprsAccess.attachGPRS(apn, login, password) != GPRS_READY) {
    Serial.println(errortext);
  } else {

    Serial.println(oktext);

    // read proxy introduced by user
    char proxy[100];
    Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");
    readSerial(proxy);
    Serial.println(proxy);

    // if user introduced a proxy, asks him for proxy port
    int pport;
    if (proxy[0] != '\0') {
      // read proxy port introduced by user
      char proxyport[10];
      Serial.print("Enter the proxy port: ");
      readSerial(proxyport);
      // cast proxy port introduced to integer
      pport = (int) proxyport;
      use_proxy = true;
      Serial.println(proxyport);
    }

    // connection with arduino.cc and realize HTTP request
    Serial.print("Connecting and sending GET request to arduino.cc...");
    int res_connect;

    // if use a proxy, connect with it
    if (use_proxy) {
      res_connect = client.connect(proxy, pport);
    } else {
      res_connect = client.connect(url, 80);
    }

    if (res_connect) {
      // make a HTTP 1.0 GET request (client sends the request)
      client.print("GET ");

      // if use a proxy, the path is arduino.cc URL
      if (use_proxy) {
        client.print(urlproxy);
      } else {
        client.print(path);
      }

      client.println(" HTTP/1.0");
      client.println();
      Serial.println(oktext);
    } else {
      // if you didn't get a connection to the server
      Serial.println(errortext);
    }
    Serial.print("Receiving response...");

    boolean test = true;
    while (test) {
      // if there are incoming bytes available
      // from the server, read and check them
      if (client.available()) {
        char c = client.read();
        response += c;

        // cast response obtained from string to char array
        char responsechar[response.length() + 1];
        response.toCharArray(responsechar, response.length() + 1);

        // if response includes a "200 OK" substring
        if (strstr(responsechar, "200 OK") != NULL) {
          Serial.println(oktext);
          Serial.println("TEST COMPLETE!");
          test = false;
        }
      }

      // if the server's disconnected, stop the client:
      if (!client.connected()) {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        test = false;
      }
    }
  }
}

/*
  Read input serial
 */
int readSerial(char result[]) {
  int i = 0;
  while (1) {
    while (Serial.available() > 0) {
      char inChar = Serial.read();
      if (inChar == '\n') {
        result[i] = '\0';
        return 0;
      }
      if (inChar != '\r') {
        result[i] = inChar;
        i++;
      }
    }
  }
}

[Get Code]
更多

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

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

  • GSM library – GSM 库的参考网页

  • GPRS Constructor

  • GSMClient Constructor

  • attachGPRS()

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

  • GSMToolsGsmScanNetworks - 扫描可用网络和打印关于IMEI和SIM卡号码的信息。

  • GSMToolsPinManagement - 如何更改或删除引脚数。

  • GSMToolsTestModem - 测试看看GSM shield的调制解调器是否正确工作。

  • GSMToolsTestWebServer - 一个简单的Web服务器,没有任何答复,只打印客户端的请求和服务器IP地址。

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

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

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


标签: arduino库教程, arduino test gprs