Code Monkey home page Code Monkey logo

sim800_mqtt's Introduction

SIM800_MQTT

#AutoConnect CallBack function

  • Use this function if you want to use autoconnect(and auto reconnect) facility
  • This function is called whenever TCP connection is established (or re-established).

#connect function

  • This function can be used to connect your client to MQTT broker.
  • Use only if you do not use Auto connect functionality.
  • Optionally you can use username, password, WILL topic and WILL Message.

#OnConnect CallBack function

  • This call back function is called when MQTT connection is established.
  • You can call subscription and publish functions inside it (according to your need).

Publish function

  • This function can be used to publish messages to different topics.
  • You can select QoS levels and RETAIN flag according to your need.

Subscribe function

  • This function can be used to subscribe messages from different topics.

OnMessage CallBack function

  • This callback function is called when messages are received from subscribed topics
  • Topic, TopicLength, Message, MessageLength are the arguments of OnMessage callback function.
  • Inside this, you can write your custom code.

#unsubscribe function

  • This function can be used to unsubscribe from a previously subscribed topic.

#disconnect function

  • This function can be used to disconnect your client from MQTT broker.

#available function

  • return true when connection with mqtt brocker is existing

Other Features :

  • You can specify your KeepAlive duration while initializing.
  • Ping requests are sent and received automatically.
  • QoS 0,1,2

Note:

Use the examples as a template.

To Do:

  • Move the functions Autoconnect, OnConnect and OnMessage to the source code
  • Implement a generic way to include external functions and their parameters to the funtions AutoConnect and OnConnect
  • Change the function OnMessage to be a callback

sim800_mqtt's People

Contributors

elementzonline avatar jaimealbq avatar marcosdepo avatar nithinkurian avatar tanuj1234567 avatar yashwanthkotla avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sim800_mqtt's Issues

Not being able to subscribe...

I'm using your code directly into ArduinoMega.
Publish is OK, but, and i'm not being able to subscribe.
Also OnConnect is never called.
Could you grant an example?

Stuck at +++AT output. [Using SIM808]

I am using arduino nano and SIM808. I tired the publish example but the serial monitor output is stucked at +++AT. Please tell me the solution. Also tell me how to attach SIM808 to software serial instead of default serial pins.

error when compiling

hi I get this erro when i compile the for arduino uno
In function 'void serialEvent()':
error: 'class GSM_MQTT' has no member named 'MQTT_flag'; did you mean 'MQTT_Flag'?
MQTT.MQTT_flag = false;
^~~~~~~~~
MQTT_Flag
should I change the MQTT_flag to MQTT_Flag ??

Simple Doubt

How you have been able to send data without the "AT+CIPSEND" command.
Thanks for the great library. Working very well. Can you just clarify this?

Subsribing to the topic is not working

Hi everyone,
I am trying to work with this library to provide MQTT to SIM800 module. I am using Arduino UNO board. I am successfully able to publish the message on the topic but when I am subscribing to the topic and in the callback function, I am controlling the LED based on the message received:
Subscription function:

void GSM_MQTT::OnConnect(void)
{
subscribe(0, "qewhrquwkfh", "GPRSLED", 1);;
}

Callback function:

void GSM_MQTT::OnMessage(char *Topic, int TopicLength, char *Message, int MessageLength)
{
mySerial.println(TopicLength);
mySerial.println(Topic);
mySerial.println(MessageLength);
mySerial.println(Message);

if (message[0] == '1')
{
digitalWrite(2, HIGH);
} }

it seems like the callback function is not getting executed. It would be great for me, if anyone can guide me to resolve this issue.
Please help me!
Thanks & Regards,
Priya

Not compiled

C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino: In member function 'void GSM_MQTT::AutoConnect()':
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:23:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
connect("qwertyuiop", 0, 0, "", "", 1, 0, 0, 0, "", "");
^
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:23:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:23:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:23:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:23:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino: In member function 'void GSM_MQTT::OnConnect()':
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:83:64: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
publish(0, 0, 0, _generateMessageID(), "SampleTopic", "Hello");
^
C:\temp\222\temp\sketch_jul04a\sketch_jul04a.ino:83:64: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp: In member function 'void GSM_MQTT::_tcpInit()':
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:81:35: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
if (_sendAT("AT\r\n", 5000) == 1)
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:93:37: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
if (_sendAT("ATE1\r\n", 2000) == 1)
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:105:52: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
if (sendATreply("AT+CREG?\r\n", "0,1", 5000) == 1)
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:105:52: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:107:42: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
_sendAT("AT+CIPMUX=0\r\n", 2000);
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:108:43: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
_sendAT("AT+CIPMODE=1\r\n", 2000);
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:109:55: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
if (sendATreply("AT+CGATT?\r\n", ": 1", 4000) != 1)
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:109:55: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:111:43: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
_sendAT("AT+CGATT=1\r\n", 2000);
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:126:69: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
_tcpStatus = sendATreply("AT+CIPSTATUS\r\n", "STATE", 4000);
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:126:69: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:149:61: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
_sendAT("AT+CSTT="AIRTELGPRS.COM"\r\n", 5000);
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:154:43: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
_sendAT("AT+CIICR\r\n", 5000) ;
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:159:52: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sendATreply("AT+CIFSR\r\n", ".", 4000) ;
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:159:52: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:168:41: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
if (_sendAT(""\r\n", 5000) == 1)
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:195:55: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
sendATreply("AT+CIPSHUT\r\n", "OK", 4000) ;
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:195:55: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp: In member function 'void GSM_MQTT::_ping()':
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:222:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
MQTT.sendATreply("AT+CIPSHUT\r\n", ".", 4000);
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:222:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp: In function 'void serialEvent()':
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:879:18: error: 'class GSM_MQTT' has no member named 'MQTT_flag'; did you mean 'MQTT_Flag'?
MQTT.MQTT_flag = false;
^~~~~~~~~
MQTT_Flag
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:882:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
MQTT.sendATreply("AT+CIPSHUT\r\n", ".", 4000) ;
^
C:\Users\�����\Documents\Arduino\libraries\MQTT_SIM800\GSM_MQTT.cpp:882:57: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
exit status 1

Support to websockets

Hi, this is a great job. I'm currently using this librarie in a smart meter project. However, I have a doubt: does this librarie support websockets?

SIM ROAMING not supported

I am trying to use this SIM800_MQTT library for connecting on our SIM800 module. The SIM gets connected immediately to our server when the SIM is a local SIM. When ever we use a SIM in roaming i.e. with CREG as 0,5 then the library gets stuck in CREG and doesn't move forward. I have already tried changin the command as below but still it doesn't help.

if(sendATreply("AT+CREG?\r\n", "0,5", 5000) == 1)

+++AT loop, SIM800L, Arduino UNO

Hello,
I have a problem connecting because I get +++ AT all the time. I saw a similar problem on this page:
#15
but it doesn't really help.

  1. I tried this program: https://github.com/chandankumar1/temperature_logger/blob/master/thingspeak.ino ,and all commend give me feedback OK - so i thing SIM800L and Arduino UNO it's ok.

  2. I tried connect SIM800L to SERIAL PIN (0, 1) and SOFTWARE PIN (10, 11) - with no result.

  3. @livzz said:

If you are using SoftwareSerial interface with the GSM MODULE replace all mySerial with Serial and vice versa
GSM_MQTT.cpp
except for the extern SoftwareSerial mySerial; at line no 13

I tried this also, but same result... but maybe i made some mistake in code? I would be grateful if you could send the correct code...

Anyway i tried this with another module SIM800L and with Arduino nano... Same situation...

What i can do next?

Best regards.

Library hangs after some iteration of Publish and Recieveing

Hi
Great library but it is causing some issues

this library hangs after some iterations of publishing and recieveing messages. The hang state looks something like this

Topic : 'BIOT_GW1' Message :'DATA,C01,123456789        ,19:21:22:22:85,001,35'
58
Publish message

Topic : '       BIOT_Osm2SUCCESSFULLY UPDATED DATA IN DB !Iµ    ¹       ½       Á       Å       É       Í       Ñ       Õ       Ù       Ý       á       å       é       í       ±       ­       ©       ¥       Vè
                                                  # %k½                 ï       ®ï½üë§]ÚÅýïÊý>??îæÿu?þoÞùW¿mmúÅûÎÑÏïîwt?y¦üöþ¸­$?ÿjÊ;}?~ûß{ó§ý>¾÷55u}nþSÖç«ì¿u­¼_ÿm7{÷úÿú«>ÿÆÖÔï¹ÌÞÖò­Aìz·ß#hn£ÙÛöLíý`ßؾwf«e9(o¸°ßüå¼-Zÿû,;/®ï׿ÿíÿ¸í×
CLOSED

As u can see the data is there but after that it goies into hang state and reboots it self after the keepalive time.

Kindly help us with the issue.

Thanks and regards.
Siddharth

Using library with itead GBOARD

Hi:

I have a GBOARD, which is a arduino+sim900 integrated in the same card.

It works ok with other libraries, but I would love to use this because of its simplicity.

However, I suppose that because of different pin numbers and connections, I'm not getting it to connect.

I see the log via Serial Monitor, but it hangs on "+++AT".

Where should I look in order to change the serial port for communication between the arduino and the sim900 module?

Thanks in advance

Guillermo

inchar == 13 what is it mean

hi, this is a great library and thanks for sharing this
I have a problem whit hivemq broker. when i connect publish or any thing, after a time about 10 seconds or 15 seconds, broker send 0x0D or same 0x00001101 binary format data. in library there is an else if called for this type data and nothing write in it.
what is this data means? and why broker send it every time after particular time?
best regards , kamran

+CMT

Is there any SMS Reading fragment available to add?
I've added a fragment myself inside SerialEvent(), using inChar. but, when TCP_Flag=true, the code reads incoming sms no more.
Suggestions?

Question : AT+CIPSEND GSM

Without AT+CIPSEND can we send data to GSM ? I didn't find AT+CIPSEND on your code ?

Thanks,
Siva

doesn't work with broker.hivemq.com broker

Dear Elementzonline, we used your latest code to connect to the MQTT broker "broker.hivemq.com" the code connects however immediately after connecting it gives "disconnecting mqtt" error.

This code works with aREST server "45.55.196.201" but some how disconnects everytime a standard MQTT broker server line "broker.hivemq.com" is used.

Please suggest what might be the issue?

Working with Sim 808

Hello
I am using this library with sim808 (GSM+GPS), I am able to send data when i send any constant string but when i want to send GPS data, library doesn't publish GPS data. It probably disconnects TCP connection on running (CGNSINF=0) command. I tried to make TCP connection again but it doesn't work. Sometimes i am unable to get the GPS data when TCP connection enables. Is there any way i am able to send GPS data when TCP connection alive, I don't want to disconnect TCP connection to get GPS info and then again re-establishes TCP connection again. to send GPS data.

secure MQTT pub?

Hi,

thank you very much for your great work. It works really good for me.
Do you have plan to secure the communication between the arduino and the MQTT server with TLS?

Best regards

Holger Koch

Doesn't work if the Serial ports are changed

Hi,
First of all, a wonderful job for creating such library.
Issue: When i look into the source, "Serial" (Hardware Serial) has been used to communicate with the SIM800 modem and mySerial has been used to print the output.

I am using MEGA, where i need to use "Serial1" to communicate with SIM800 and "Serial" to print the output. So i replaced the occurrence of "Serial" with "Serial1" and "mySerial" with "Serial".
I didn't change any other code.
The library is not working anymore.. Can you please help to make it little flexible with respect to choosing the serial ports.

Can't publish and subscribe

I get the message:

AT+CREG?

+CREG: 0,5

OK
AT+CIPMUX=0

OK
AT+CIPMODE=1

OK
AT+CGATT?

+CGATT: 1

OK
AT+CIPSTATUS

OK

STATE: IP INITIAL
�AT+CSTT="wm"

OK
AT+CIPSTATUS

OK

STATE: IP START
�AT+CIICR

OK
AT+CIPSTATUS

OK

STATE: IP GPRSACT
�AT+CIFSR

xxx.xxx.x.x (ip address)
AT+CIPSTATUS

OK

STATE: IP STATUS
�AT+CIPSTART="TCP","my_broker_ip","1883"

OK

CONNECT
MQTT.TCP_Flag = True

But i cant publish and subscribe.
if (MQTT.available()) { Serial.println("MQTT available..."); }
also this is not working, i never get the message "MQTT available..." on my serial.
Please can anyone help me?
(SIM800L with ESP32 via HardwareSerial UART2)

KeepAlive not attempting to reconnect

If somehow gsm signal goes keep alive not reattempting to connect tcp and mqtt. It's stuck in tcpflag true state. Please advice.

Arduino nano
Sim800c

Problem with autoconnect

Hello!

In some random cases, I see that the connection is closed, but the MQTT.TCP_Flag is still True and the mqtt.available is true. I think that for this reason, the auto-connect function is not called again until the arduino is manually restarted.

As I tell I do not know exactly when it is happen, but if someone likes to reproduce the error, it is possible to reproduce the error cutting off the power of the SIM900 and turn it on again.

Any help is really appreciated.

AutoConnect bug..

why stop just can see the print AutoConnect, but can't go on..

this is my debug log...

`76
Disconnecting
0
CLOSED
at GSM_ReplyFlag !=燾oming begin...
AT

OK
+++
AT

OK
ATE1

OK
AT+CREG?

+CREG: 0,1

OK
AT+CIPMUX=0

OK
AT+CIPMODE=1

OK
AT+CGATT?

+CGATT: 1

OK
modemStatus = 3
_tcpStatus = 2
at GSM_ReplyFlag != 7
AT+CIPSTATUS

OK

STATE: IP INITIAL
else _tcpStatusPrev == _tcpStatus
mySerial.print(_tcpStatus); is ->>>> :
� <<<<<<<<<<<------
AT+CSTT="CMNET"

OK
at GSM_ReplyFlag != 7
AT+CIPSTATUS

OK

STATE: IP START
else _tcpStatusPrev == _tcpStatus
mySerial.print(_tcpStatus); is ->>>> :
� <<<<<<<<<<<------
AT+CIICR

OK
at GSM_ReplyFlag != 7
AT+CIPSTATUS

OK

STATE: IP GPRSACT
else _tcpStatusPrev == _tcpStatus
mySerial.print(_tcpStatus); is ->>>> :
� <<<<<<<<<<<------
AT+CIFSR

10.40.77.11
at GSM_ReplyFlag != 7
AT+CIPSTATUS

OK

STATE: IP STATUS
else _tcpStatusPrev == _tcpStatus
mySerial.print(_tcpStatus); is ->>>> :
� <<<<<<<<<<<------
AT+CIPSTART="TCP","test.mosquitto.org","1883"

OK

CONNECT
MQTT.TCP_Flag = True
AutoConnect`

UART gets stuck after publishing once.

Hi,

We have the data coming on the UART which has to receieved and send to the MQTT broker. The issue is when ever I send the first publish message, the UART data is either lost or incomplete.

I am using the following routine to do so.

if (MQTT.available())
{
 
   digitalWrite(7, LOW);
   delay(200);
   digitalWrite(7, HIGH);  
   if(Serial1.available()>0)
   {
     str1 =Serial1.readString();
   }
    . . . . .
}

I have tried reading character by character but having the same issue.

Thanks and regards.
Siddharth Taunk

Stuck at MQTT.TCP_Flag = True ( Sim 800 with atmega328)

I am using Sim800 with atmega328 and using software serial for communication. I tried subscribe example , first i struck at +++AT output . After i read issues , i change Serial and mySerial vice versa. i got below response

`AT

+CGATT: 1

OK

OK
AT
ATE1

OK
AT+CREG?

OK

+CREG: 0,1

OK
AT+CIPMUX=0
AT+CIPMODE=1

OK
AT+CGATT?

OK
AT+CGATT=1

+CGATT: 1

OK
AT+CIPSTATUS

OK

OK

STATE: IP INITIAL
�AT+CSTT="AIRTELGPRS.COM"

OK
AT+CIPSTATUS

OK

STATE: IP START
�AT+CIICR

OK
AT+CIPSTATUS

OK

STATE: IP GPRSACT
�AT+CIFSR

100.64.189.225
AT+CIPSTATUS

OK

STATE: IP STATUS
�AT+CIPSTART="TCP","52.205.105.7","5555"

OK

CONNECT
MQTT.TCP_Flag = True`

Then after i changed serialEvent to serialEvent1 and serialEvent2 also , but same response coming now . Here , I am sending my code and circuit diagram.

`#include "GSM_MQTT.h"
#include <SoftwareSerial.h>
String MQTT_HOST = "52.205.105.7";
/*
MQTT host address
/
String MQTT_PORT = "5555";
/

MQTT port
/
SoftwareSerial mySerial(3, 2); // RX, TX
/

Software Serial through which mqtt events log is printed at 9600 baud rate
*/
void GSM_MQTT::AutoConnect(void)
{

connect("qwertyuiop", 0, 0, "", "", 1, 0, 0, 0, "", "");

}
void GSM_MQTT::OnConnect(void)
{
/*
This function is called when mqqt connection is established.
put your subscription publish codes here.
*/
subscribe(0, _generateMessageID(), "/DEVICE_STATUS_TO_DEVICE", 1);

}
void GSM_MQTT::OnMessage(char *Topic, int TopicLength, char *Message, int MessageLength)
{

//mySerial.println(TopicLength);
// mySerial.println(Topic);
// mySerial.println(MessageLength);
Serial.println(Message);

}
GSM_MQTT MQTT(20);
/*
20 is the keepalive duration in seconds
*/

void setup()
{
// initialize mqtt:
// GSM modem should be connected to Harware Serial
// index =0;
MQTT.begin();

/*
You can write your code here
*/

}
void loop()
{

/*
You can write your code here
/
if (MQTT.available())
{
/

if you want to do something when mqtt connection is live.
You can write your code here
*/
}

MQTT.processing();
}
**Here GSM_MQTT.cpp**/*
MQTT.h - Library for GSM MQTT Client.
Created by Nithin K. Kurian, Dhanish Vijayan, Elementz Engineers Guild Pvt. Ltd, July 2, 2016.
Released into the public domain.
*/

#include "GSM_MQTT.h"
#include "Arduino.h"
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>
extern uint8_t GSM_Response;

extern SoftwareSerial mySerial;
extern String MQTT_HOST;
extern String MQTT_PORT;

extern GSM_MQTT MQTT;
uint8_t GSM_Response = 0;
unsigned long previousMillis = 0;
//char inputString[UART_BUFFER_LENGTH]; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
void serialEvent2();
GSM_MQTT::GSM_MQTT(unsigned long KeepAlive)
{
_KeepAliveTimeOut = KeepAlive;
}

void GSM_MQTT::begin(void)
{
Serial.begin(9600);
mySerial.begin(9600);
mySerial.write("AT\r\n");
delay(1000);
_tcpInit();
}
char GSM_MQTT::_sendAT(char *command, unsigned long waitms)
{

unsigned long PrevMillis = millis();
strcpy(reply, "none");
GSM_Response = 0;
mySerial.write(command);
unsigned long currentMillis = millis();
// Serial.println(PrevMillis);
// Serial.println(currentMillis);
while ( (GSM_Response == 0) && ((currentMillis - PrevMillis) < waitms) )
{
// delay(1);
serialEvent2();
currentMillis = millis();
}
return GSM_Response;
}
char GSM_MQTT::sendATreply(char *command, char *replystr, unsigned long waitms)
{
strcpy(reply, replystr);
unsigned long PrevMillis = millis();
GSM_ReplyFlag = 0;
mySerial.write(command);
unsigned long currentMillis = millis();

// Serial.println(PrevMillis);
// Serial.println(currentMillis);
while ( (GSM_ReplyFlag == 0) && ((currentMillis - PrevMillis) < waitms) )
{
// delay(1);
serialEvent2();
currentMillis = millis();
}
return GSM_ReplyFlag;
}
void GSM_MQTT::_tcpInit(void)
{
switch (modemStatus)
{
case 0:
{
delay(1000);
// mySerial.print("+++");
delay(500);
if (_sendAT("AT\r\n", 5000) == 1)
{
modemStatus = 1;
}
else
{
modemStatus = 0;
break;
}
}
case 1:
{
if (_sendAT("ATE1\r\n", 2000) == 1)
{
modemStatus = 2;
}
else
{
modemStatus = 1;
break;
}
}
case 2:
{
if (sendATreply("AT+CREG?\r\n", "0,1", 5000) == 1)
{
_sendAT("AT+CIPMUX=0\r\n", 2000);
_sendAT("AT+CIPMODE=1\r\n", 2000);
if (sendATreply("AT+CGATT?\r\n", ": 1", 4000) != 1)
{
_sendAT("AT+CGATT=1\r\n", 2000);
}
modemStatus = 3;
_tcpStatus = 2;
}
else
{
modemStatus = 2;
break;
}
}
case 3:
{
if (GSM_ReplyFlag != 7)
{
_tcpStatus = sendATreply("AT+CIPSTATUS\r\n", "STATE", 4000);
if (_tcpStatusPrev == _tcpStatus)
{
tcpATerrorcount++;
if (tcpATerrorcount >= 10)
{
tcpATerrorcount = 0;
_tcpStatus = 7;
}

      }
      else
      {
        _tcpStatusPrev = _tcpStatus;
        tcpATerrorcount = 0;
      }
    }
    _tcpStatusPrev = _tcpStatus;
    Serial.print(_tcpStatus);
    switch (_tcpStatus)
    {
      case 2:
        {
          _sendAT("AT+CSTT=\"AIRTELGPRS.COM\"\r\n", 5000);
          break;
        }
      case 3:
        {
          _sendAT("AT+CIICR\r\n", 5000)  ;
          break;
        }
      case 4:
        {
          sendATreply("AT+CIFSR\r\n", ".", 4000) ;
          break;
        }
      case 5:
        {
          mySerial.print("AT+CIPSTART=\"TCP\",\"");
          mySerial.print(MQTT_HOST);
          mySerial.print("\",\"");
          mySerial.print(MQTT_PORT);
          if (_sendAT("\"\r\n", 5000) == 1)
          {
            unsigned long PrevMillis = millis();
            unsigned long currentMillis = millis();
            while ( (GSM_Response != 4) && ((currentMillis - PrevMillis) < 20000) )
            {
              //    delay(1);
              serialEvent2();
              currentMillis = millis();
            }
          }
          break;
        }
      case 6:
        {
          unsigned long PrevMillis = millis();
          unsigned long currentMillis = millis();
          while ( (GSM_Response != 4) && ((currentMillis - PrevMillis) < 20000) )
          {
            //    delay(1);
            serialEvent2();
            currentMillis = millis();
          }
          break;
        }
      case 7:
        {
          sendATreply("AT+CIPSHUT\r\n", "OK", 4000) ;
          modemStatus = 0;
          _tcpStatus = 2;
          break;
        }
    }
  }

}

}

void GSM_MQTT::_ping(void)
{

if (pingFlag == true)
{
unsigned long currentMillis = millis();
if ((currentMillis - _PingPrevMillis ) >= _KeepAliveTimeOut * 1000)
{
// save the last time you blinked the LED
_PingPrevMillis = currentMillis;
mySerial.print(char(PINGREQ * 16));
_sendLength(0);
}
}
}
void GSM_MQTT::_sendUTFString(char *string)
{
int localLength = strlen(string);
mySerial.print(char(localLength / 256));
mySerial.print(char(localLength % 256));
mySerial.print(string);
}
void GSM_MQTT::_sendLength(int len)
{
bool length_flag = false;
while (length_flag == false)
{
if ((len / 128) > 0)
{
mySerial.print(char(len % 128 + 128));
len /= 128;
}
else
{
length_flag = true;
mySerial.print(char(len));
}
}
}
void GSM_MQTT::connect(char *ClientIdentifier, char UserNameFlag, char PasswordFlag, char *UserName, char *Password, char CleanSession, char WillFlag, char WillQoS, char WillRetain, char *WillTopic, char *WillMessage)
{
ConnectionAcknowledgement = NO_ACKNOWLEDGEMENT ;
mySerial.print(char(CONNECT * 16 ));
char ProtocolName[7] = "MQIsdp";
int localLength = (2 + strlen(ProtocolName)) + 1 + 3 + (2 + strlen(ClientIdentifier));
if (WillFlag != 0)
{
localLength = localLength + 2 + strlen(WillTopic) + 2 + strlen(WillMessage);
}
if (UserNameFlag != 0)
{
localLength = localLength + 2 + strlen(UserName);

if (PasswordFlag != 0)
{
  localLength = localLength + 2 + strlen(Password);
}

}
_sendLength(localLength);
_sendUTFString(ProtocolName);
mySerial.print(char(_ProtocolVersion));
mySerial.print(char(UserNameFlag * User_Name_Flag_Mask + PasswordFlag * Password_Flag_Mask + WillRetain * Will_Retain_Mask + WillQoS * Will_QoS_Scale + WillFlag * Will_Flag_Mask + CleanSession * Clean_Session_Mask));
mySerial.print(char(_KeepAliveTimeOut / 256));
mySerial.print(char(_KeepAliveTimeOut % 256));
_sendUTFString(ClientIdentifier);
if (WillFlag != 0)
{
_sendUTFString(WillTopic);
_sendUTFString(WillMessage);
}
if (UserNameFlag != 0)
{
_sendUTFString(UserName);
if (PasswordFlag != 0)
{
_sendUTFString(Password);
}
}
}
void GSM_MQTT::publish(char DUP, char Qos, char RETAIN, unsigned int MessageID, char *Topic, char *Message)
{
mySerial.print(char(PUBLISH * 16 + DUP * DUP_Mask + Qos * QoS_Scale + RETAIN));
int localLength = (2 + strlen(Topic));
if (Qos > 0)
{
localLength += 2;
}
localLength += strlen(Message);
_sendLength(localLength);
_sendUTFString(Topic);
if (Qos > 0)
{
mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));
}
mySerial.print(Message);
}
void GSM_MQTT::publishACK(unsigned int MessageID)
{
mySerial.print(char(PUBACK * 16));
_sendLength(2);
mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));
}
void GSM_MQTT::publishREC(unsigned int MessageID)
{
mySerial.print(char(PUBREC * 16));
_sendLength(2);
mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));
}
void GSM_MQTT::publishREL(char DUP, unsigned int MessageID)
{
mySerial.print(char(PUBREL * 16 + DUP * DUP_Mask + 1 * QoS_Scale));
_sendLength(2);
mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));
}

void GSM_MQTT::publishCOMP(unsigned int MessageID)
{
mySerial.print(char(PUBCOMP * 16));
_sendLength(2);
mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));
}
void GSM_MQTT::subscribe(char DUP, unsigned int MessageID, char *SubTopic, char SubQoS)
{
mySerial.print(char(SUBSCRIBE * 16 + DUP * DUP_Mask + 1 * QoS_Scale));
int localLength = 2 + (2 + strlen(SubTopic)) + 1;
_sendLength(localLength);
mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));
_sendUTFString(SubTopic);
mySerial.print(SubQoS);

}
void GSM_MQTT::unsubscribe(char DUP, unsigned int MessageID, char *SubTopic)
{
mySerial.print(char(UNSUBSCRIBE * 16 + DUP * DUP_Mask + 1 * QoS_Scale));
int localLength = (2 + strlen(SubTopic)) + 2;
_sendLength(localLength);

mySerial.print(char(MessageID / 256));
mySerial.print(char(MessageID % 256));

_sendUTFString(SubTopic);
}
void GSM_MQTT::disconnect(void)
{
mySerial.print(char(DISCONNECT * 16));
_sendLength(0);
pingFlag = false;
}
//Messages
const char CONNECTMessage[] PROGMEM = {"Client request to connect to Server\r\n"};
const char CONNACKMessage[] PROGMEM = {"Connect Acknowledgment\r\n"};
const char PUBLISHMessage[] PROGMEM = {"Publish message\r\n"};
const char PUBACKMessage[] PROGMEM = {"Publish Acknowledgment\r\n"};
const char PUBRECMessage[] PROGMEM = {"Publish Received (assured delivery part 1)\r\n"};
const char PUBRELMessage[] PROGMEM = {"Publish Release (assured delivery part 2)\r\n"};
const char PUBCOMPMessage[] PROGMEM = {"Publish Complete (assured delivery part 3)\r\n"};
const char SUBSCRIBEMessage[] PROGMEM = {"Client Subscribe request\r\n"};
const char SUBACKMessage[] PROGMEM = {"Subscribe Acknowledgment\r\n"};
const char UNSUBSCRIBEMessage[] PROGMEM = {"Client Unsubscribe request\r\n"};
const char UNSUBACKMessage[] PROGMEM = {"Unsubscribe Acknowledgment\r\n"};
const char PINGREQMessage[] PROGMEM = {"PING Request\r\n"};
const char PINGRESPMessage[] PROGMEM = {"PING Response\r\n"};
const char DISCONNECTMessage[] PROGMEM = {"Client is Disconnecting\r\n"};

void GSM_MQTT::printMessageType(uint8_t Message)
{
switch (Message)
{
case CONNECT:
{
int k, len = strlen_P(CONNECTMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(CONNECTMessage + k);
Serial.print(myChar);
}
break;
}
case CONNACK:
{
int k, len = strlen_P(CONNACKMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(CONNACKMessage + k);
Serial.print(myChar);
}
break;
}
case PUBLISH:
{
int k, len = strlen_P(PUBLISHMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PUBLISHMessage + k);
Serial.print(myChar);
}
break;
}
case PUBACK:
{
int k, len = strlen_P(PUBACKMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PUBACKMessage + k);
Serial.print(myChar);
}
break;
}
case PUBREC:
{
int k, len = strlen_P(PUBRECMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PUBRECMessage + k);
Serial.print(myChar);
}
break;
}
case PUBREL:
{
int k, len = strlen_P(PUBRELMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PUBRELMessage + k);
Serial.print(myChar);
}
break;
}
case PUBCOMP:
{
int k, len = strlen_P(PUBCOMPMessage );
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PUBCOMPMessage + k);
Serial.print(myChar);
}
break;
}
case SUBSCRIBE:
{
int k, len = strlen_P(SUBSCRIBEMessage );
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(SUBSCRIBEMessage + k);
Serial.print(myChar);
}
break;
}
case SUBACK:
{
int k, len = strlen_P(SUBACKMessage );
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(SUBACKMessage + k);
Serial.print(myChar);
}
break;
}
case UNSUBSCRIBE:
{
int k, len = strlen_P(UNSUBSCRIBEMessage );
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(UNSUBSCRIBEMessage + k);
Serial.print(myChar);
}
break;
}
case UNSUBACK:
{
int k, len = strlen_P(UNSUBACKMessage );
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(UNSUBACKMessage + k);
Serial.print(myChar);
}
break;
}
case PINGREQ:
{
int k, len = strlen_P(PINGREQMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PINGREQMessage + k);
Serial.print(myChar);
}
break;
}
case PINGRESP:
{
int k, len = strlen_P(PINGRESPMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(PINGRESPMessage + k);
Serial.print(myChar);
}
break;
}
case DISCONNECT:
{
int k, len = strlen_P(DISCONNECTMessage);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(DISCONNECTMessage + k);
Serial.print(myChar);
}
break;
}
}
}

//Connect Ack
const char ConnectAck0[] PROGMEM = {"Connection Accepted\r\n"};
const char ConnectAck1[] PROGMEM = {"Connection Refused: unacceptable protocol version\r\n"};
const char ConnectAck2[] PROGMEM = {"Connection Refused: identifier rejected\r\n"};
const char ConnectAck3[] PROGMEM = {"Connection Refused: server unavailable\r\n"};
const char ConnectAck4[] PROGMEM = {"Connection Refused: bad user name or password\r\n"};
const char ConnectAck5[] PROGMEM = {"Connection Refused: not authorized\r\n"};
void GSM_MQTT::printConnectAck(uint8_t Ack)
{
switch (Ack)
{
case 0:
{
int k, len = strlen_P(ConnectAck0);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(ConnectAck0 + k);
Serial.print(myChar);
}
break;
}
case 1:
{
int k, len = strlen_P(ConnectAck1);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(ConnectAck1 + k);
Serial.print(myChar);
}
break;
}
case 2:
{
int k, len = strlen_P(ConnectAck2);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(ConnectAck2 + k);
Serial.print(myChar);
}
break;
}
case 3:
{
int k, len = strlen_P(ConnectAck3);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(ConnectAck3 + k);
Serial.print(myChar);
}
break;
}
case 4:
{
int k, len = strlen_P(ConnectAck4);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(ConnectAck4 + k);
Serial.print(myChar);
}
break;
}
case 5:
{
int k, len = strlen_P(ConnectAck5);
char myChar;
for (k = 0; k < len; k++)
{
myChar = pgm_read_byte_near(ConnectAck5 + k);
Serial.print(myChar);
}
break;
}
}
}
unsigned int GSM_MQTT::_generateMessageID(void)
{
if (_LastMessaseID < 65535)
{
return ++_LastMessaseID;
}
else
{
_LastMessaseID = 0;
return _LastMessaseID;
}
}
void GSM_MQTT::processing(void)
{
if (TCP_Flag == false)
{
MQTT_Flag = false;
_tcpInit();
}
_ping();
}
bool GSM_MQTT::available(void)
{
return MQTT_Flag;
}
void serialEvent2()
{

while (mySerial.available())
{
char inChar = (char)mySerial.read();
if (MQTT.TCP_Flag == false)
{
if (MQTT.index < 200)
{
MQTT.inputString[MQTT.index++] = inChar;
}
if (inChar == '\n')
{
MQTT.inputString[MQTT.index] = 0;
stringComplete = true;
Serial.print(MQTT.inputString);
if (strstr(MQTT.inputString, MQTT.reply) != NULL)
{
MQTT.GSM_ReplyFlag = 1;
if (strstr(MQTT.inputString, " INITIAL") != 0)
{
MQTT.GSM_ReplyFlag = 2; //
}
else if (strstr(MQTT.inputString, " START") != 0)
{
MQTT.GSM_ReplyFlag = 3; //
}
else if (strstr(MQTT.inputString, "IP CONFIG") != 0)
{
_delay_us(10);
MQTT.GSM_ReplyFlag = 4;
}
else if (strstr(MQTT.inputString, " GPRSACT") != 0)
{
MQTT.GSM_ReplyFlag = 4; //
}
else if ((strstr(MQTT.inputString, " STATUS") != 0) || (strstr(MQTT.inputString, "TCP CLOSED") != 0))
{
MQTT.GSM_ReplyFlag = 5; //
}
else if (strstr(MQTT.inputString, " TCP CONNECTING") != 0)
{
MQTT.GSM_ReplyFlag = 6; //
}
else if ((strstr(MQTT.inputString, " CONNECT OK") != 0) || (strstr(MQTT.inputString, "CONNECT FAIL") != NULL) || (strstr(MQTT.inputString, "PDP DEACT") != 0))
{
MQTT.GSM_ReplyFlag = 7;
}
}
else if (strstr(MQTT.inputString, "OK") != NULL)
{
GSM_Response = 1;
}
else if (strstr(MQTT.inputString, "ERROR") != NULL)
{
GSM_Response = 2;
}
else if (strstr(MQTT.inputString, ".") != NULL)
{
GSM_Response = 3;
}
else if (strstr(MQTT.inputString, "CONNECT FAIL") != NULL)
{
GSM_Response = 5;
}
else if (strstr(MQTT.inputString, "CONNECT") != NULL)
{
GSM_Response = 4;
MQTT.TCP_Flag = true;
Serial.println("MQTT.TCP_Flag = True");
MQTT.AutoConnect();
MQTT.pingFlag = true;
MQTT.tcpATerrorcount = 0;
}
else if (strstr(MQTT.inputString, "CLOSED") != NULL)
{
GSM_Response = 4;
MQTT.TCP_Flag = false;
MQTT.MQTT_Flag = false;
}
MQTT.index = 0;
MQTT.inputString[0] = 0;
}
}
else
{
uint8_t ReceivedMessageType = (inChar / 16) & 0x0F;
uint8_t DUP = (inChar & DUP_Mask) / DUP_Mask;
uint8_t QoS = (inChar & QoS_Mask) / QoS_Scale;
uint8_t RETAIN = (inChar & RETAIN_Mask);
if ((ReceivedMessageType >= CONNECT) && (ReceivedMessageType <= DISCONNECT))
{
bool NextLengthByte = true;
MQTT.length = 0;
MQTT.lengthLocal = 0;
uint32_t multiplier=1;
delay(2);
char Cchar = inChar;
while ( (NextLengthByte == true) && (MQTT.TCP_Flag == true))
{
if (mySerial.available())
{
inChar = (char)mySerial.read();
Serial.println(inChar, DEC);
if ((((Cchar & 0xFF) == 'C') && ((inChar & 0xFF) == 'L') && (MQTT.length == 0)) || (((Cchar & 0xFF) == '+') && ((inChar & 0xFF) == 'P') && (MQTT.length == 0)))
{
MQTT.index = 0;
MQTT.inputString[MQTT.index++] = Cchar;
MQTT.inputString[MQTT.index++] = inChar;
MQTT.TCP_Flag = false;
MQTT.MQTT_Flag = false;
MQTT.pingFlag = false;
Serial.println("Disconnecting");
}
else
{
if ((inChar & 128) == 128)
{
MQTT.length += (inChar & 127) * multiplier;
multiplier *= 128;
Serial.println("More");
}
else
{
NextLengthByte = false;
MQTT.length += (inChar & 127) * multiplier;
multiplier *= 128;
}
}
}
}
MQTT.lengthLocal = MQTT.length;
Serial.println(MQTT.length);
if (MQTT.TCP_Flag == true)
{
MQTT.printMessageType(ReceivedMessageType);
MQTT.index = 0L;
uint32_t a = 0;
while ((MQTT.length-- > 0) && (mySerial.available()))
{
MQTT.inputString[uint32_t(MQTT.index++)] = (char)mySerial.read();

        delay(1);

      }
      Serial.println(" ");
      if (ReceivedMessageType == CONNACK)
      {
        MQTT.ConnectionAcknowledgement = MQTT.inputString[0] * 256 + MQTT.inputString[1];
        if (MQTT.ConnectionAcknowledgement == 0)
        {
          MQTT.MQTT_Flag = true;
          MQTT.OnConnect();

        }

        MQTT.printConnectAck(MQTT.ConnectionAcknowledgement);
        // MQTT.OnConnect();
      }
      else if (ReceivedMessageType == PUBLISH)
      {
        uint32_t TopicLength = (MQTT.inputString[0]) * 256 + (MQTT.inputString[1]);
        Serial.print("Topic : '");
        MQTT.PublishIndex = 0;
        for (uint32_t iter = 2; iter < TopicLength + 2; iter++)
        {
          Serial.print(MQTT.inputString[iter]);
          MQTT.Topic[MQTT.PublishIndex++] = MQTT.inputString[iter];
        }
        MQTT.Topic[MQTT.PublishIndex] = 0;
        Serial.print("' Message :'");
        MQTT.TopicLength = MQTT.PublishIndex;

        MQTT.PublishIndex = 0;
        uint32_t MessageSTART = TopicLength + 2UL;
        int MessageID = 0;
        if (QoS != 0)
        {
          MessageSTART += 2;
          MessageID = MQTT.inputString[TopicLength + 2UL] * 256 + MQTT.inputString[TopicLength + 3UL];
        }
        for (uint32_t iter = (MessageSTART); iter < (MQTT.lengthLocal); iter++)
        {
          Serial.print(MQTT.inputString[iter]);
          MQTT.Message[MQTT.PublishIndex++] = MQTT.inputString[iter];
        }
        MQTT.Message[MQTT.PublishIndex] = 0;
        Serial.println("'");
        MQTT.MessageLength = MQTT.PublishIndex;
        if (QoS == 1)
        {
          MQTT.publishACK(MessageID);
        }
        else if (QoS == 2)
        {
          MQTT.publishREC(MessageID);
        }
        MQTT.OnMessage(MQTT.Topic, MQTT.TopicLength, MQTT.Message, MQTT.MessageLength);
        MQTT.MessageFlag = true;
      }
      else if (ReceivedMessageType == PUBREC)
      {
        Serial.print("Message ID :");
        MQTT.publishREL(0, MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
        Serial.println(MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;

      }
      else if (ReceivedMessageType == PUBREL)
      {
        Serial.print("Message ID :");
        MQTT.publishCOMP(MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
        Serial.println(MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;

      }
      else if ((ReceivedMessageType == PUBACK) || (ReceivedMessageType == PUBCOMP) || (ReceivedMessageType == SUBACK) || (ReceivedMessageType == UNSUBACK))
      {
        Serial.print("Message ID :");
        Serial.println(MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
      }
      else if (ReceivedMessageType == PINGREQ)
      {
        MQTT.TCP_Flag = false;
        MQTT.pingFlag = false;
        Serial.println("Disconnecting");
        MQTT.sendATreply("AT+CIPSHUT\r\n", ".", 4000) ;
        MQTT.modemStatus = 0;
      }
    }
  }
  else if ((inChar = 13) || (inChar == 10))
  {
  }
  else
  {
    Serial.print("Received :Unknown Message Type :");
    Serial.println(inChar);
  }
}

}
}`

img_20180528_184558

Could you please help me out , i am trying it from one week.

MQTT Ping failed

STATE: IP STATUS
�AT+CIPSTART="TCP","v1b82961.ala.us-east-1.emqxsl.com","8883"

OK
AT+CIPSTATUS

OK

STATE: TCP CONNECTING

CONNECT
MQTT.TCP_Flag = True
pingSent = true
Ping failed

cany you please help me to connect EMQX MQTT sever using CA certification

long messages not arriving complete

When subscribe to a topic, is the message is long, just receive the first 35 or 40 characters

Example:
Message: 17.51,38.12,72.83,23.74,0.22,-39.99,1.13,13.73,39.95,1684179429968
Arrived: 17.51,38.12,72.83,23.74,0.22,-39.98

I am using arduino nano every and SIM800L
I changed Serial for Serial1 in the cpp file

millis() issue?

How to published message after specified time interval using millis() ?
facing problem in this

Help in Publish continuous data

Thanks for making library available for us !

I started with the library examples. I am able to connect to Adaruits.io but not able to publish data continuously... In fact i don't know where to and how add publish routine.. if could any sample simple code which sending data to broker then it would be very helpful for me.

Worried about millis() timer overflow?

Hi.
`void GSM_MQTT::_ping(void)
{

if (pingFlag == true)
{
unsigned long currentMillis = millis();
if ((currentMillis - _PingPrevMillis ) >= _KeepAliveTimeOut * 1000)
{
// save the last time you blinked the LED
_PingPrevMillis = currentMillis;
Serial.print(char(PINGREQ * 16));
_sendLength(0);
}
}
}`

when millis() over 49days and millis() = 0 again ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.