any mbed board with 1 Harware uart for SIM800 and SIM900 MQTT

Dependents:   Nucleo_mqtt_sim800_final _serial_farfan

GSM_MQTT.h

Committer:
rcele_85
Date:
2018-04-17
Revision:
0:e7957e1745cb

File content as of revision 0:e7957e1745cb:

/* =========================================================================================
*                     GSM_MQTT == MQTT CLIENT LIBRARY FOR GPRS MODEM
* SUPPORTED GPRS MODEM ==> SIM800, SIM900, SIM300
* SUPPORTED MBED HARDWARE ==> Any hardware with two Hardware Serial port and 1 timer
*
* Developed By : Ravi Butani
* Prof. Marwadi University, Rajkkot-INDIA
* Contact: ravi_butani@yahoo.com
*
* License : This library released under CC-BY-SA 4.0 license
* https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt
*
* This library is derived from Arduino MQTT Client for SIM800 at 
* https://github.com/elementzonline/SIM800_MQTT
*============================================================================================*/
#ifndef GSM_MQTT_H_
#define GSM_MQTT_H_
#include <stdint.h>
#include <string>
#define UART_BUFFER_LENGTH 300     //Maximum length allowed for UART data
#define TOPIC_BUFFER_LENGTH 50     //Maximum length allowed Topic
#define MESSAGE_BUFFER_LENGTH 250  //Maximum length allowed data

// ######################################################################################################################
#define CONNECT     1   //Client request to connect to Server                Client          Server
#define CONNACK     2   //Connect Acknowledgment                             Server/Client   Server/Client
#define PUBLISH     3   //Publish message                                    Server/Client   Server/Client
#define PUBACK      4   //Publish Acknowledgment                             Server/Client   Server/Client
#define PUBREC      5   //Publish Received (assured delivery part 1)         Server/Client   Server/Client
#define PUBREL      6   //Publish Release (assured delivery part 2)          Server/Client   Server/Client
#define PUBCOMP     7   //Publish Complete (assured delivery part 3)         Server/Client   Server/Client
#define SUBSCRIBE   8   //Client Subscribe request                           Client          Server
#define SUBACK      9   //Subscribe Acknowledgment                           Server          Client
#define UNSUBSCRIBE 10  //Client Unsubscribe request                         Client          Server
#define UNSUBACK    11  //Unsubscribe Acknowledgment                         Server          Client
#define PINGREQ     12  //PING Request                                       Client          Server
#define PINGRESP    13  //PING Response                                      Server          Client
#define DISCONNECT  14  //Client is Disconnecting                            Client          Server

// QoS value bit 2 bit 1 Description
//   0       0       0   At most once    Fire and Forget         <=1
//   1       0       1   At least once   Acknowledged delivery   >=1
//   2       1       0   Exactly once    Assured delivery        =1
//   3       1       1   Reserved
#define DUP_Mask      8   // Duplicate delivery   Only for QoS>0
#define QoS_Mask      6   // Quality of Service
#define QoS_Scale     2   // (()&QoS)/QoS_Scale
#define RETAIN_Mask   1   // RETAIN flag

#define User_Name_Flag_Mask  128
#define Password_Flag_Mask   64
#define Will_Retain_Mask     32
#define Will_QoS_Mask        24
#define Will_QoS_Scale       8
#define Will_Flag_Mask       4
#define Clean_Session_Mask   2

#define DISCONNECTED          0
#define CONNECTED             1
#define NO_ACKNOWLEDGEMENT  255

class GSM_MQTT
{
  public:
    volatile bool TCP_Flag;// = false;
    volatile char GSM_ReplyFlag;
    char reply[10];
    volatile bool pingFlag ;//= false;
    volatile char tcpATerrorcount;// = 0;
    volatile bool MQTT_Flag ;//= false;
    volatile int ConnectionAcknowledgement;// = NO_ACKNOWLEDGEMENT ;
    volatile int PublishIndex;// = 0;
    char Topic[TOPIC_BUFFER_LENGTH];
    volatile int TopicLength;// = 0;
    char Message[MESSAGE_BUFFER_LENGTH];
    volatile int MessageLength ;//= 0;
    volatile int MessageFlag ;//= false;
    volatile char modemStatus ;//= 0;
    volatile uint32_t index ;//= 0;
    volatile uint32_t length , lengthLocal;

    char inputString[UART_BUFFER_LENGTH]; 

    GSM_MQTT(unsigned long KeepAlive);
    void begin(void);
    void connect(char *ClientIdentifier, char UserNameFlag = 0, char PasswordFlag = 0, char *UserName = "", char *Password = "", char CleanSession = 1, char WillFlag = 0, char WillQoS = 0, char WillRetain = 0, char *WillTopic = "", char *WillMessage = "");
    void publish(char *Topic, char *Message, char DUP = 0, char Qos = 0, char RETAIN = 0, unsigned int MessageID = 0);
    void subscribe(char *SubTopic, char DUP = 0, unsigned int MessageID = 0, char SubQoS = 0);
    void unsubscribe(char *SubTopic, char DUP = 0, unsigned int MessageID = 0);
    void disconnect(void);
    void processing(void);
    bool available(void);
   

    void AutoConnect(void);
    void OnConnect(void);
    void OnMessage(char *Topic, int TopicLength, char *Message, int MessageLength);

    void publishACK(unsigned int MessageID);
    void publishREC(unsigned int MessageID);
    void publishREL(char DUP, unsigned int MessageID);
    void publishCOMP(unsigned int MessageID);

    void printMessageType(uint8_t Message);
    void printConnectAck(uint8_t Ack);
    
    char sendATreply(char *command, char *replystr, unsigned long waitms);

  private:
    volatile unsigned int _LastMessaseID;// = 0;
    volatile char _ProtocolVersion;// = 3;
    volatile unsigned long _PingPrevMillis;// = 0;
    volatile char _tcpStatus;// = 0;
    volatile char _tcpStatusPrev;// = 0;
    volatile unsigned long _KeepAliveTimeOut;

    void _sendUTFString(char *string);
    void _sendLength(int len);
    void _ping(void);
    void _tcpInit(void);
    char _sendAT(char *command, unsigned long waitms);
    unsigned int _generateMessageID(void);
};
#endif /* GSM_MQTT_H_ */