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

Dependents:   Nucleo_mqtt_sim800_final _serial_farfan

Committer:
rcele_85
Date:
Tue Apr 17 05:02:48 2018 +0000
Revision:
0:e7957e1745cb
MQTT Implementation using sim800 on any Mbed supported board having 1 Hardware UART for SIM800 interfacing and 1 Hardware UART/USB for serial Debug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rcele_85 0:e7957e1745cb 1 /* =========================================================================================
rcele_85 0:e7957e1745cb 2 * GSM_MQTT == MQTT CLIENT LIBRARY FOR GPRS MODEM
rcele_85 0:e7957e1745cb 3 * SUPPORTED GPRS MODEM ==> SIM800, SIM900, SIM300
rcele_85 0:e7957e1745cb 4 * SUPPORTED MBED HARDWARE ==> Any hardware with two Hardware Serial port and 1 timer
rcele_85 0:e7957e1745cb 5 *
rcele_85 0:e7957e1745cb 6 * Developed By : Ravi Butani
rcele_85 0:e7957e1745cb 7 * Prof. Marwadi University, Rajkkot-INDIA
rcele_85 0:e7957e1745cb 8 * Contact: ravi_butani@yahoo.com
rcele_85 0:e7957e1745cb 9 *
rcele_85 0:e7957e1745cb 10 * License : This library released under CC-BY-SA 4.0 license
rcele_85 0:e7957e1745cb 11 * https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt
rcele_85 0:e7957e1745cb 12 *
rcele_85 0:e7957e1745cb 13 * This library is derived from Arduino MQTT Client for SIM800 at
rcele_85 0:e7957e1745cb 14 * https://github.com/elementzonline/SIM800_MQTT
rcele_85 0:e7957e1745cb 15 *============================================================================================*/
rcele_85 0:e7957e1745cb 16 #ifndef GSM_MQTT_H_
rcele_85 0:e7957e1745cb 17 #define GSM_MQTT_H_
rcele_85 0:e7957e1745cb 18 #include <stdint.h>
rcele_85 0:e7957e1745cb 19 #include <string>
rcele_85 0:e7957e1745cb 20 #define UART_BUFFER_LENGTH 300 //Maximum length allowed for UART data
rcele_85 0:e7957e1745cb 21 #define TOPIC_BUFFER_LENGTH 50 //Maximum length allowed Topic
rcele_85 0:e7957e1745cb 22 #define MESSAGE_BUFFER_LENGTH 250 //Maximum length allowed data
rcele_85 0:e7957e1745cb 23
rcele_85 0:e7957e1745cb 24 // ######################################################################################################################
rcele_85 0:e7957e1745cb 25 #define CONNECT 1 //Client request to connect to Server Client Server
rcele_85 0:e7957e1745cb 26 #define CONNACK 2 //Connect Acknowledgment Server/Client Server/Client
rcele_85 0:e7957e1745cb 27 #define PUBLISH 3 //Publish message Server/Client Server/Client
rcele_85 0:e7957e1745cb 28 #define PUBACK 4 //Publish Acknowledgment Server/Client Server/Client
rcele_85 0:e7957e1745cb 29 #define PUBREC 5 //Publish Received (assured delivery part 1) Server/Client Server/Client
rcele_85 0:e7957e1745cb 30 #define PUBREL 6 //Publish Release (assured delivery part 2) Server/Client Server/Client
rcele_85 0:e7957e1745cb 31 #define PUBCOMP 7 //Publish Complete (assured delivery part 3) Server/Client Server/Client
rcele_85 0:e7957e1745cb 32 #define SUBSCRIBE 8 //Client Subscribe request Client Server
rcele_85 0:e7957e1745cb 33 #define SUBACK 9 //Subscribe Acknowledgment Server Client
rcele_85 0:e7957e1745cb 34 #define UNSUBSCRIBE 10 //Client Unsubscribe request Client Server
rcele_85 0:e7957e1745cb 35 #define UNSUBACK 11 //Unsubscribe Acknowledgment Server Client
rcele_85 0:e7957e1745cb 36 #define PINGREQ 12 //PING Request Client Server
rcele_85 0:e7957e1745cb 37 #define PINGRESP 13 //PING Response Server Client
rcele_85 0:e7957e1745cb 38 #define DISCONNECT 14 //Client is Disconnecting Client Server
rcele_85 0:e7957e1745cb 39
rcele_85 0:e7957e1745cb 40 // QoS value bit 2 bit 1 Description
rcele_85 0:e7957e1745cb 41 // 0 0 0 At most once Fire and Forget <=1
rcele_85 0:e7957e1745cb 42 // 1 0 1 At least once Acknowledged delivery >=1
rcele_85 0:e7957e1745cb 43 // 2 1 0 Exactly once Assured delivery =1
rcele_85 0:e7957e1745cb 44 // 3 1 1 Reserved
rcele_85 0:e7957e1745cb 45 #define DUP_Mask 8 // Duplicate delivery Only for QoS>0
rcele_85 0:e7957e1745cb 46 #define QoS_Mask 6 // Quality of Service
rcele_85 0:e7957e1745cb 47 #define QoS_Scale 2 // (()&QoS)/QoS_Scale
rcele_85 0:e7957e1745cb 48 #define RETAIN_Mask 1 // RETAIN flag
rcele_85 0:e7957e1745cb 49
rcele_85 0:e7957e1745cb 50 #define User_Name_Flag_Mask 128
rcele_85 0:e7957e1745cb 51 #define Password_Flag_Mask 64
rcele_85 0:e7957e1745cb 52 #define Will_Retain_Mask 32
rcele_85 0:e7957e1745cb 53 #define Will_QoS_Mask 24
rcele_85 0:e7957e1745cb 54 #define Will_QoS_Scale 8
rcele_85 0:e7957e1745cb 55 #define Will_Flag_Mask 4
rcele_85 0:e7957e1745cb 56 #define Clean_Session_Mask 2
rcele_85 0:e7957e1745cb 57
rcele_85 0:e7957e1745cb 58 #define DISCONNECTED 0
rcele_85 0:e7957e1745cb 59 #define CONNECTED 1
rcele_85 0:e7957e1745cb 60 #define NO_ACKNOWLEDGEMENT 255
rcele_85 0:e7957e1745cb 61
rcele_85 0:e7957e1745cb 62 class GSM_MQTT
rcele_85 0:e7957e1745cb 63 {
rcele_85 0:e7957e1745cb 64 public:
rcele_85 0:e7957e1745cb 65 volatile bool TCP_Flag;// = false;
rcele_85 0:e7957e1745cb 66 volatile char GSM_ReplyFlag;
rcele_85 0:e7957e1745cb 67 char reply[10];
rcele_85 0:e7957e1745cb 68 volatile bool pingFlag ;//= false;
rcele_85 0:e7957e1745cb 69 volatile char tcpATerrorcount;// = 0;
rcele_85 0:e7957e1745cb 70 volatile bool MQTT_Flag ;//= false;
rcele_85 0:e7957e1745cb 71 volatile int ConnectionAcknowledgement;// = NO_ACKNOWLEDGEMENT ;
rcele_85 0:e7957e1745cb 72 volatile int PublishIndex;// = 0;
rcele_85 0:e7957e1745cb 73 char Topic[TOPIC_BUFFER_LENGTH];
rcele_85 0:e7957e1745cb 74 volatile int TopicLength;// = 0;
rcele_85 0:e7957e1745cb 75 char Message[MESSAGE_BUFFER_LENGTH];
rcele_85 0:e7957e1745cb 76 volatile int MessageLength ;//= 0;
rcele_85 0:e7957e1745cb 77 volatile int MessageFlag ;//= false;
rcele_85 0:e7957e1745cb 78 volatile char modemStatus ;//= 0;
rcele_85 0:e7957e1745cb 79 volatile uint32_t index ;//= 0;
rcele_85 0:e7957e1745cb 80 volatile uint32_t length , lengthLocal;
rcele_85 0:e7957e1745cb 81
rcele_85 0:e7957e1745cb 82 char inputString[UART_BUFFER_LENGTH];
rcele_85 0:e7957e1745cb 83
rcele_85 0:e7957e1745cb 84 GSM_MQTT(unsigned long KeepAlive);
rcele_85 0:e7957e1745cb 85 void begin(void);
rcele_85 0:e7957e1745cb 86 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 = "");
rcele_85 0:e7957e1745cb 87 void publish(char *Topic, char *Message, char DUP = 0, char Qos = 0, char RETAIN = 0, unsigned int MessageID = 0);
rcele_85 0:e7957e1745cb 88 void subscribe(char *SubTopic, char DUP = 0, unsigned int MessageID = 0, char SubQoS = 0);
rcele_85 0:e7957e1745cb 89 void unsubscribe(char *SubTopic, char DUP = 0, unsigned int MessageID = 0);
rcele_85 0:e7957e1745cb 90 void disconnect(void);
rcele_85 0:e7957e1745cb 91 void processing(void);
rcele_85 0:e7957e1745cb 92 bool available(void);
rcele_85 0:e7957e1745cb 93
rcele_85 0:e7957e1745cb 94
rcele_85 0:e7957e1745cb 95 void AutoConnect(void);
rcele_85 0:e7957e1745cb 96 void OnConnect(void);
rcele_85 0:e7957e1745cb 97 void OnMessage(char *Topic, int TopicLength, char *Message, int MessageLength);
rcele_85 0:e7957e1745cb 98
rcele_85 0:e7957e1745cb 99 void publishACK(unsigned int MessageID);
rcele_85 0:e7957e1745cb 100 void publishREC(unsigned int MessageID);
rcele_85 0:e7957e1745cb 101 void publishREL(char DUP, unsigned int MessageID);
rcele_85 0:e7957e1745cb 102 void publishCOMP(unsigned int MessageID);
rcele_85 0:e7957e1745cb 103
rcele_85 0:e7957e1745cb 104 void printMessageType(uint8_t Message);
rcele_85 0:e7957e1745cb 105 void printConnectAck(uint8_t Ack);
rcele_85 0:e7957e1745cb 106
rcele_85 0:e7957e1745cb 107 char sendATreply(char *command, char *replystr, unsigned long waitms);
rcele_85 0:e7957e1745cb 108
rcele_85 0:e7957e1745cb 109 private:
rcele_85 0:e7957e1745cb 110 volatile unsigned int _LastMessaseID;// = 0;
rcele_85 0:e7957e1745cb 111 volatile char _ProtocolVersion;// = 3;
rcele_85 0:e7957e1745cb 112 volatile unsigned long _PingPrevMillis;// = 0;
rcele_85 0:e7957e1745cb 113 volatile char _tcpStatus;// = 0;
rcele_85 0:e7957e1745cb 114 volatile char _tcpStatusPrev;// = 0;
rcele_85 0:e7957e1745cb 115 volatile unsigned long _KeepAliveTimeOut;
rcele_85 0:e7957e1745cb 116
rcele_85 0:e7957e1745cb 117 void _sendUTFString(char *string);
rcele_85 0:e7957e1745cb 118 void _sendLength(int len);
rcele_85 0:e7957e1745cb 119 void _ping(void);
rcele_85 0:e7957e1745cb 120 void _tcpInit(void);
rcele_85 0:e7957e1745cb 121 char _sendAT(char *command, unsigned long waitms);
rcele_85 0:e7957e1745cb 122 unsigned int _generateMessageID(void);
rcele_85 0:e7957e1745cb 123 };
rcele_85 0:e7957e1745cb 124 #endif /* GSM_MQTT_H_ */