any mbed board with 1 Harware uart for SIM800 and SIM900 MQTT
Dependents: Nucleo_mqtt_sim800_final _serial_farfan
GSM_MQTT.h@0:e7957e1745cb, 2018-04-17 (annotated)
- 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?
User | Revision | Line number | New 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_ */ |