NB Test GPRS

This sketch tests the GPRS data connection on the Arduino MKR NB 1500. It tries to connect to arduino.cc.

To use a data connection with the MKR NB 1500, you'll need your provider's Access Point Name (APN), login, and password. To obtain this information, contact the network provider for the most up to date information. This page has some information about various carrier settings, but it may not be current.

Hardware Required

Circuit

Code

First, import the MKRNB library

#include <MKRNB.h>

SIM cards may have a PIN number that enables their functionality. Define the PIN for your SIM. If your SIM has no PIN, you can leave it blank :

#define PINNUMBER ""

Initialize instances of the classes you're going to use. You're going to need the GSM, GPRS, and GSMClient classes.

GSMClient client;
GPRS gprsAccess;
GSM gsmAccess;

Create some status messages to send to the serial monitor:

String oktext = "OK";
String errortext = "ERROR";

Create some variables to hold the server, path, and proxy you wish to connect to.

char url[] = "arduino.cc";
char path[] = "/";
char urlproxy[] = "http://arduino.cc";

Create a variable to hold a response from the server, and a flag to indicate f you wil be using a proxy or not.

String response = "";

boolean use_proxy = false;

In setup, open a serial connection to the computer.

void setup(){
  Serial.begin(9600);
}

You're going to create a custom function to handle serial input from the serial monitor. make a named function that accepts a char array as an argument.

int readSerial(char result[])
{

make a variable to act as a counter. While there is serial information available, read it into the char array. If a newline character is encountered, terminate the array and return to the main program.

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++;
      }
    }
  }
}

In loop(), set the proxy flag to false

void loop()
{
  use_proxy = false;

Start the connection to the GSM network by passing the PIN number (if applicable) to gsmAccess.begin().

Serial.print("Connecting GSM network...");
  if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
  {
    Serial.println(errortext);
    while(true);
  }
  Serial.println(oktext);

Create a char array to hold the APN. Use the readSerial() function you created to get the bytes from the serial monitor

char apn[50];
  Serial.print("Enter your APN: ");
  readSerial(apn);
  Serial.println(apn);

Create a char array to hold the APN login. Use the readSerial() function you created to get the bytes from the serial monitor

char login[50];
  Serial.print("Now, enter your login: ");
  readSerial(login);
  Serial.println(login);

Create a char array to hold the APN password. Use the readSerial() function you created to get the bytes from the serial monitor

char password[20];
  Serial.print("Finally, enter your password: ");
  readSerial(password);

Connect to the GPRS network using gprs.attachGPRS(). This requires the APN, login, and password you just entered.

When the modem has attached itself to the GPRS network, gsmAccess() will return 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);

Create a char array to hold any proxy information you may need. Use the readSerial() function you created to get the bytes from the serial monitor.

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

If a proxy was indicated, ask for the port number, and set the proxy flag to 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);
    }

Create a variable to indicate if you are connected to the server or not. With client.connect(), make a connection to the server. How you make the connection will depend on if you are using a proxy or not.

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);

if you have connected, make a HTTP GET request using client.print().

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);
    }

If no connection was made, print out an error

else
    {
      // if you didn't get a connection to the server
      Serial.println(errortext);
    }

Check to see if the server returned any bytes using client.available(). If there are, read them into the response String, then cast them into a char array. Check the array for the substring "200 OK", which indicates a valid response from 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;
        }
      }

If the server has disconnected, stop the client and close loop()

if (!client.connected())
      {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        test = false;
      }
    }
  }
}

Once your code is uploaded, open the serial monitor to see the status of the connection.

The complete sketch is below.

/*

 This sketch test the MKR NB 1500 board's ability to connect to a
 GPRS network. It asks for APN information through the
 serial monitor and tries to connect to example.org.

 Circuit:
 * MKR NB 1500 board
 * Antenna
 * SIM card with data plan

 Created 18 Jun 2012
 by David del Peral
*/


// libraries
#include <MKRNB.h>

#include "arduino_secrets.h"
// Please enter your sensitive data in the Secret tab or arduino_secrets.h
// PIN Number
const char PINNUMBER[] = SECRET_PINNUMBER;

// initialize the library instance
NB nbAccess;        // NB access: include a 'true' parameter for debug enabled
GPRS gprsAccess;  // GPRS access
NBClient client;  // Client service for TCP connection

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

// URL and path (for example: example.org)
char url[] = "example.org";
char urlproxy[] = "http://example.org";
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 module
  // if your SIM has PIN, pass it as a parameter of begin() in quotes
  Serial.print("Connecting NB IoT / LTE Cat M1 network...");
  if (nbAccess.begin(PINNUMBER) != NB_READY) {
    Serial.println(errortext);
    while (true);
  }
  Serial.println(oktext);

  // attach GPRS
  Serial.println("Attaching to GPRS...");
  if (gprsAccess.attachGPRS() != 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 example.org and realize HTTP request
    Serial.print("Connecting and sending GET request to example.org...");
    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 example.org 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++;
      }
    }
  }
}

See Also




Last revision 2018/11/28 by SM