HI there,
ive used MQtt library for Esp8266 it works perfect. its superb easy to understand and easy to implement. so now i
m trying to use ARDUINO NANO+SIM800L GSM module and i make it work with several other MQTT libraries but i have no idea how to implement it to ubidots. as i have to login ubidots Token to be able to publish something i couldnt make it work in my mind. i`m hoping that Ubidots team can end up with GPRS library implementation for MQTT.
Hello @MertG,
First, I recommend you test the official Arduino GPRS example in order to discard some kind of hardware problem and verify that everything’s okay!
/*
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++;
}
}
}
}
Once you already tested you can use the PubSubClient library for the MQTT communication. At the moment I don’t have an example using GPRS+MQTT, but I’m going to provide you one using a MQTT client and Wi-fi client, you can follow the same structure and integrate the GPRS client instead of the Wi-Fi one.
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#define WIFISSID "...."
#define PASSWORD "...."
#define TOKEN "...."
#define VARIABLE_LABEL "...."
#define DEVICE_LABEL "...."
char mqttBroker[] = "things.ubidots.com";
char payload[100];
char topic[150];
ESP8266WiFiMulti WiFiMulti;
WiFiClient ubidots;
PubSubClient client(ubidots);
void callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
String message(p);
if (message == "0") {
//digitalWrite(PIN, LOW);
} else {
//digitalWrite(PIN, HIGH);
}
Serial.write(payload, length);
Serial.println(topic);
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("linkit-one", TOKEN,"")) {
Serial.println("connected");
client.subscribe(TOPIC1);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 2 seconds");
// Wait 2 seconds before retrying
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
delay(10);
WiFiMulti.addAP(WIFISSID, PASSWORD);
Serial.println();
Serial.println();
Serial.print("Wait for WiFi... ");
while(WiFiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqttBroker, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
sprintf(payload, "{\"%s\": %s}", VARIABLE_LABEL, "1");
client.publish(topic, payload);
client.loop();
delay(1000);
}
I hope my information would help you!
Regards
Maria C,
Thanks Maria. i`ve used MQTT WIFI Library and iot works spotless. but i dont know how to replace WIFI with GPRS options. so if you can arrange an example or be more specific in terms of guidence it would be appreciated.
Hi @MertG,
You should declare a GPRS client instead of a WifiClient and then use the pubsubclient library.
Regards
Hi, I know it has been two years from this. But it’s there any example now on how to do this?
Hey @Daniel28,
So far we don’t have an example of this. However, following the comments provided in the thread you should have no problem starting with the project.
Greetings,
Maria H.
Hola, sé este hilo tiene bastante tiempo, sin embargo al seguir las instrucciones del ejemplo puedo publicar datos pero no logro suscribirme a una variable. Al intentarlo el metodo subscribe siempre retorna ‘0’.
// MQTT Broker setup
mqtt.setServer(broker, 1883);
mqtt.setCallback(mqttCallback);
sprintf(topicSubscribe, “%s”, “”); // Cleans the content of the char
sprintf(topicSubscribe, “%s%s”, “/v1.6/devices/”, DEVICE_LABEL);
sprintf(topicSubscribe, “%s/%s/lv”, topicSubscribe, VARIABLE_LABEL_SUBSCRIBE);
if(mqtt.subscribe(topicSubscribe)){
Serial.println("suscripcion exitosa");
}else{
Serial.println("suscripcion fallida");
}
Hello @Alejandro,
Can you please make sure that you’re using the appropriate MQTT broker URL. For your reference:
- If you have an Industrial (trial or licensed) or STEM account, the URL is
industrial.api.ubidots.com
- If you have an account in Ubidots for Education, then the URL is
things.ubidots.com
I’ll be attentive to your results once you make the changes.
–David