Para implementaciones globales de IoT que requieren una tarjeta SIM en múltiples países, Soracom tiene lo que necesitas. La tarjeta SIM de Soracom puede transmitir datos hacia y desde tu dispositivo a través de redes celulares, ya sea con 2G, 3G, 4G LTE o Cat-M1. Además, la SIM tiene un alcance global y proporciona conectividad IoT a dispositivos M2M en más de 300 países.
En este artículo, aprenderás cómo usar una SIM de Soracom junto con un Arduino MKR GSM 1400 para enviar y recuperar datos de Ubidots. Puedes comprar un Kit de Inicio IoT directamente de Soracom, para más información sobre cómo comenzar con este Kit, por favor consulta esta guía.
Requisitos
Arduino MKR GSM 1400 y antena o cualquier otro módulo GSM
1. Registrar la SIM IoT en una cuenta de Soracom
Si compraste un Kit de Inicio IoT de Soracom, puedes omitir este paso, ya que tu SIM habrá sido enviada pre-registrada.
Si obtuviste tu tarjeta IoT por separado, por favor sigue estos pasos para registrar tu SIM IoT en tu cuenta de Soracom.
2. Configuración del Hardware
Conecta la antena al Arduino MKR GSM 1400.
Aunque es posible usar el puerto USB de la PC como fuente de alimentación, no se recomienda ya que el módulo GSM puede consumir picos de hasta 2A, lo que puede exceder el límite de corriente del puerto USB. Por esa razón, recomendamos usar una fuente de alimentación externa como una batería LiPo o una fuente de alimentación a través de Vin con un límite de corriente más alto.
3. Configuración del Arduino IDE
Una vez que se ha descargado el Arduino IDE, hay dos cosas principales que instalar antes de usar un Arduino MKR GSM 1400: la definición de la placa y su biblioteca. Por favor sigue estos pasos en la guía de Soracom para configurar el Arduino IDE.
4. Registro IMEI
Algunos países requieren que el módulo GSM esté registrado de acuerdo con sus regulaciones para evitar que sea bloqueado. Por favor verifica si tu país requiere este proceso y cómo debe hacerse.
5. Enviar Datos a Ubidots
Para enviar datos a Ubidots, simplemente copia el siguiente código en tu IDE, asigna el Token y la etiqueta del Dispositivo, luego súbelo a la placa:
#include <Arduino.h>#include <MKRGSM.h>#define SERIAL_SPEED 9600#define PINNUMBER ""#define GPRS_APN "soracom.io"#define GPRS_LOGIN "sora"#define GPRS_PASSWORD "sora"#define UBIDOTS_TOKEN "<YOUR_UBIDOTS_TOKEN>"#define DEVICE_LABEL "<DEVICE_LABEL>"#define UBIDOTS_SERVER "industrial.api.ubidots.com"#define UBIDOTS_PORT 80GSMModem modem;GSM gsmAccess(false); // set true to see and debug modem AT commands on the Serial portGPRS gprs;GSMClient client;boolean notConnected = true;void setup(){ Serial.begin(SERIAL_SPEED); SerialGSM.begin(115200); delay(1000); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); delay(250); for (int loopCount = 0; loopCount <= 60; loopCount++) while (!Serial) // Wait for a serial connection, timeout after 60 loops (close to 1 min) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(1000); } Serial.println(); Serial.println(F("Iniciando prueba de Soracom Ubidots.. ")); while (!SerialGSM) delay(1000); Serial.println(F("Iniciando conexión de Modem, GSM, GPRS y Ubidots Cloud")); while (notConnected) { digitalWrite(LED_BUILTIN, LOW); if (gsmAccess.begin(PINNUMBER, true, true) == GSM_READY) { //delay(1000); Serial.print(F("\t[1/3] GSM_READY ")); Serial.print(F(" IMEI del Modem : ")); Serial.print(modem.getIMEI()); Serial.print(F(" ICCID de la SIM : ")); Serial.println(modem.getICCID()); if (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD, true) == GPRS_READY) { //delay(1000); Serial.println(F("\t[2/3] GPRS_READY ")); if (client.connect(UBIDOTS_SERVER, UBIDOTS_PORT) == true) { //delay(1000); Serial.println(F("\t[3/3] Conexión a Ubidots lista ")); notConnected = false; } else { Serial.println("Conexión fallida"); client.stop(); } } else { gprs.detachGPRS(); } } else { gsmAccess.shutdown(); } Serial.print(F(".")); delay(1000); }}void loop(){ if (client.connected()) { float value1 = random(0, 9) * 10; float value2 = random(0, 9) * 100; float value3 = random(0, 9) * 1000; String payload = "{\"var1\":"+String(value1)+",\"var2\":"+String(value2)+",\"var3\":"+String(value3)+"}"; int payloadSize = payload.length(); Serial.println(F("\t Enviando mensaje a Ubidots")); digitalWrite(LED_BUILTIN, HIGH); Serial.print(F("La conexión a Ubidots está ACTIVA, enviando '")); Serial.print(payload); client.print(F("POST /api/v1.6/devices/")); client.print(DEVICE_LABEL); client.println(F(" HTTP/1.1")); client.print(F("Host: ")); client.println(UBIDOTS_SERVER); client.println(F("User-Agent: Soracom/1.0")); client.println(F("Content-type: application/json")); client.print(F("X-Auth-Token: ")); client.println(F(UBIDOTS_TOKEN)); client.print(F("Content-Length: ")); client.println(payloadSize); client.println(); client.println(payload); while(!client.available()); if (client.ready() == 0) { Serial.print(F(".")); delay(500); } while (client.available()) { char c = client.read(); Serial.print(c); } digitalWrite(LED_BUILTIN, LOW); } else { Serial.println("No conectado, entrando en el bucle else"); client.connect(UBIDOTS_SERVER, UBIDOTS_PORT); } delay(5000);}
NOTA: Este código se basa en el código encontrado aquí.
En este caso, usamos la etiqueta del Dispositivo "soracom-test"
Una vez que el código ha sido subido, puedes comenzar a ver el flujo de datos en tu cuenta de Ubidots.
6. Obtener Datos de Variables de Ubidots
Para recuperar el último Dot de una variable de Ubidots, simplemente copia el siguiente código en tu IDE, asigna el Token, la etiqueta del Dispositivo y la etiqueta de la Variable, luego súbelo a la placa:
#include <Arduino.h>#include <MKRGSM.h>#define SERIAL_SPEED 9600#define PINNUMBER ""#define GPRS_APN "soracom.io"#define GPRS_LOGIN "sora"#define GPRS_PASSWORD "sora"#define UBIDOTS_TOKEN "<YOUR_UBIDOTS_TOKEN>"#define DEVICE_LABEL "<DEVICE_LABEl>"#define VARIABLE_LABEL "<VARIABLE_LABEL>"#define UBIDOTS_SERVER "industrial.api.ubidots.com"#define UBIDOTS_PORT 80GSMModem modem;GSM gsmAccess(false); // set true to see and debug modem AT commands on the Serial portGPRS gprs;GSMClient client;boolean notConnected = true;void setup(){ Serial.begin(SERIAL_SPEED); SerialGSM.begin(115200); delay(1000); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); delay(250); for (int loopCount = 0; loopCount <= 60; loopCount++) while (!Serial) // Wait for a serial connection, timeout after 60 loops (close to 1 min) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(1000); } Serial.println(); Serial.println(F("Iniciando prueba de Soracom Ubidots.. ")); while (!SerialGSM) delay(1000); Serial.println(F("Iniciando conexión de Modem, GSM, GPRS y Ubidots Cloud")); while (notConnected) { digitalWrite(LED_BUILTIN, LOW); if (gsmAccess.begin(PINNUMBER, true, true) == GSM_READY) { //delay(1000); Serial.print(F("\t[1/3] GSM_READY ")); Serial.print(F(" IMEI del Modem : ")); Serial.print(modem.getIMEI()); Serial.print(F(" ICCID de la SIM : ")); Serial.println(modem.getICCID()); if (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD, true) == GPRS_READY) { //delay(1000); Serial.println(F("\t[2/3] GPRS_READY ")); if (client.connect(UBIDOTS_SERVER, UBIDOTS_PORT) == true) { //delay(1000); Serial.println(F("\t[3/3] Conexión a Ubidots lista ")); notConnected = false; } else { Serial.println("Conexión fallida"); client.stop(); } } else { gprs.detachGPRS(); } } else { gsmAccess.shutdown(); } Serial.print(F(".")); delay(1000); }}void loop(){ if (client.connected()) { Serial.println(F("\t Recuperando último Dot de Ubidots")); digitalWrite(LED_BUILTIN, HIGH); Serial.println(F("La conexión a Ubidots está ACTIVA, obteniendo último Dot '")); client.print(F("GET /api/v1.6/devices/")); client.print(DEVICE_LABEL); client.print("/"); client.print(VARIABLE_LABEL); client.print("/values/?page_size=1"); client.println(F(" HTTP/1.1")); client.print(F("Host: ")); client.println(UBIDOTS_SERVER); client.println(F("User-Agent: Soracom/1.0")); //client.println(F("Connection: close")); client.println(F("Content-type: application/json")); client.print(F("X-Auth-Token: ")); client.println(F(UBIDOTS_TOKEN)); client.println(); while(!client.available()); if (client.ready() == 0) { Serial.print(F(".")); delay(500); } while (client.available()) { char c = client.read(); Serial.print(c); } digitalWrite(LED_BUILTIN, LOW); } else { Serial.println("No conectado, entrando en el bucle else"); client.connect(UBIDOTS_SERVER, UBIDOTS_PORT); } delay(5000);}
NOTA: Este código se basa en el código encontrado aquí.
En este caso, usamos la etiqueta del Dispositivo "soracom-test"
y la etiqueta de la Variable "var1"
Una vez que el código esté en ejecución, puedes ver el valor recuperado en el monitor serial del Arduino IDE:
Resumen
En este artículo, hemos revisado el proceso de usar una SIM IoT de Soracom para enviar y recuperar datos a Ubidots. Ahora es tu turno de desarrollar y desplegar tu aplicación IoT utilizando la SIM IoT de Soracom en todo el mundo.