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
rcele_85 0:e7957e1745cb 17
rcele_85 0:e7957e1745cb 18 #include "GSM_MQTT.h"
rcele_85 0:e7957e1745cb 19 #include "mbed.h"
rcele_85 0:e7957e1745cb 20 #include <stdint.h>
rcele_85 0:e7957e1745cb 21 #include <string>
rcele_85 0:e7957e1745cb 22 #define ESP_RXBUF_LEN 300
rcele_85 0:e7957e1745cb 23
rcele_85 0:e7957e1745cb 24 volatile char esp_buf[ESP_RXBUF_LEN]; // Circular Buffer for Serial Receive As MODSERIAL not supported in GRPeach
rcele_85 0:e7957e1745cb 25 volatile uint32_t esp_pos = 0, esp_por = 0, esp_ok = 0, esp_head = 0; // Variable used for hold head and tail of Circular Buffer
rcele_85 0:e7957e1745cb 26
rcele_85 0:e7957e1745cb 27 Timer timer800;
rcele_85 0:e7957e1745cb 28 extern uint8_t GSM_Response;
rcele_85 0:e7957e1745cb 29
rcele_85 0:e7957e1745cb 30 extern string MQTT_HOST;// = "test.mosquitto.org";
rcele_85 0:e7957e1745cb 31 extern string MQTT_PORT;// = "1883";
rcele_85 0:e7957e1745cb 32 extern Serial SerialDBG;
rcele_85 0:e7957e1745cb 33 extern Serial Serial800;
rcele_85 0:e7957e1745cb 34 extern GSM_MQTT MQTT;
rcele_85 0:e7957e1745cb 35 uint8_t GSM_Response = 0;
rcele_85 0:e7957e1745cb 36 unsigned long previousMillis = 0;
rcele_85 0:e7957e1745cb 37 //char inputString[UART_BUFFER_LENGTH]; // a string to hold incoming data
rcele_85 0:e7957e1745cb 38 bool stringComplete = false; // whether the string is complete
rcele_85 0:e7957e1745cb 39
rcele_85 0:e7957e1745cb 40
rcele_85 0:e7957e1745cb 41
rcele_85 0:e7957e1745cb 42 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ESP8266 UART returns how many chars available to read <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
rcele_85 0:e7957e1745cb 43 int Serial800_available(void)
rcele_85 0:e7957e1745cb 44 {
rcele_85 0:e7957e1745cb 45 return ((ESP_RXBUF_LEN + esp_pos - esp_por) % ESP_RXBUF_LEN);
rcele_85 0:e7957e1745cb 46 }
rcele_85 0:e7957e1745cb 47
rcele_85 0:e7957e1745cb 48
rcele_85 0:e7957e1745cb 49 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ESP8266 UART returns read one char <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
rcele_85 0:e7957e1745cb 50 char Serial800_read(void)
rcele_85 0:e7957e1745cb 51 {
rcele_85 0:e7957e1745cb 52 char c = esp_buf[esp_por];
rcele_85 0:e7957e1745cb 53 esp_por = (esp_por + 1)% ESP_RXBUF_LEN;
rcele_85 0:e7957e1745cb 54 return(c);
rcele_85 0:e7957e1745cb 55 }
rcele_85 0:e7957e1745cb 56
rcele_85 0:e7957e1745cb 57 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ESP8266 UART Flush receive Buffer <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
rcele_85 0:e7957e1745cb 58 void Serial800_flush(void)
rcele_85 0:e7957e1745cb 59 {
rcele_85 0:e7957e1745cb 60 esp_pos = 0;
rcele_85 0:e7957e1745cb 61 esp_por = 0;
rcele_85 0:e7957e1745cb 62 }
rcele_85 0:e7957e1745cb 63 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ESP8266 UART Receive CallBack(ISR) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
rcele_85 0:e7957e1745cb 64 void Serial800_callback() {
rcele_85 0:e7957e1745cb 65 esp_buf[esp_pos] = Serial800.getc();
rcele_85 0:e7957e1745cb 66 esp_pos = (esp_pos+1)% ESP_RXBUF_LEN;
rcele_85 0:e7957e1745cb 67 }
rcele_85 0:e7957e1745cb 68 void serialEvent();
rcele_85 0:e7957e1745cb 69
rcele_85 0:e7957e1745cb 70 GSM_MQTT::GSM_MQTT(unsigned long KeepAlive)
rcele_85 0:e7957e1745cb 71 {
rcele_85 0:e7957e1745cb 72 _KeepAliveTimeOut = KeepAlive;
rcele_85 0:e7957e1745cb 73 }
rcele_85 0:e7957e1745cb 74
rcele_85 0:e7957e1745cb 75 void GSM_MQTT::begin(void)
rcele_85 0:e7957e1745cb 76 {
rcele_85 0:e7957e1745cb 77 TCP_Flag = false;
rcele_85 0:e7957e1745cb 78 GSM_ReplyFlag;
rcele_85 0:e7957e1745cb 79 pingFlag = false;
rcele_85 0:e7957e1745cb 80 tcpATerrorcount = 0;
rcele_85 0:e7957e1745cb 81 MQTT_Flag = false;
rcele_85 0:e7957e1745cb 82 ConnectionAcknowledgement = NO_ACKNOWLEDGEMENT ;
rcele_85 0:e7957e1745cb 83 PublishIndex = 0;
rcele_85 0:e7957e1745cb 84 TopicLength = 0;
rcele_85 0:e7957e1745cb 85 MessageLength = 0;
rcele_85 0:e7957e1745cb 86 MessageFlag = false;
rcele_85 0:e7957e1745cb 87 modemStatus = 0;
rcele_85 0:e7957e1745cb 88 index = 0;
rcele_85 0:e7957e1745cb 89 length = 0;
rcele_85 0:e7957e1745cb 90 lengthLocal = 0;
rcele_85 0:e7957e1745cb 91 _LastMessaseID = 0;
rcele_85 0:e7957e1745cb 92 _ProtocolVersion = 3;
rcele_85 0:e7957e1745cb 93 _PingPrevMillis = 0;
rcele_85 0:e7957e1745cb 94 _tcpStatus = 0;
rcele_85 0:e7957e1745cb 95 _tcpStatusPrev = 0;
rcele_85 0:e7957e1745cb 96 _KeepAliveTimeOut;
rcele_85 0:e7957e1745cb 97 SerialDBG.baud(9600);
rcele_85 0:e7957e1745cb 98 Serial800.baud(9600);
rcele_85 0:e7957e1745cb 99 Serial800.attach(&Serial800_callback);
rcele_85 0:e7957e1745cb 100 Serial800.printf("AT\r\n");
rcele_85 0:e7957e1745cb 101 timer800.start();
rcele_85 0:e7957e1745cb 102 wait(1);
rcele_85 0:e7957e1745cb 103 _tcpInit();
rcele_85 0:e7957e1745cb 104 }
rcele_85 0:e7957e1745cb 105 char GSM_MQTT::_sendAT(char *command, unsigned long waitms)
rcele_85 0:e7957e1745cb 106 {
rcele_85 0:e7957e1745cb 107
rcele_85 0:e7957e1745cb 108 unsigned long PrevMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 109 strcpy(reply, "none");
rcele_85 0:e7957e1745cb 110 GSM_Response = 0;
rcele_85 0:e7957e1745cb 111 Serial800.printf("%s",command);
rcele_85 0:e7957e1745cb 112 unsigned long currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 113 // SerialDBG.println(PrevMillis);
rcele_85 0:e7957e1745cb 114 // SerialDBG.println(currentMillis);
rcele_85 0:e7957e1745cb 115 while ( (GSM_Response == 0) && ((currentMillis - PrevMillis) < waitms) )
rcele_85 0:e7957e1745cb 116 {
rcele_85 0:e7957e1745cb 117 // delay(1);
rcele_85 0:e7957e1745cb 118 serialEvent();
rcele_85 0:e7957e1745cb 119 currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 120 }
rcele_85 0:e7957e1745cb 121 return GSM_Response;
rcele_85 0:e7957e1745cb 122 }
rcele_85 0:e7957e1745cb 123 char GSM_MQTT::sendATreply(char *command, char *replystr, unsigned long waitms)
rcele_85 0:e7957e1745cb 124 {
rcele_85 0:e7957e1745cb 125 strcpy(reply, replystr);
rcele_85 0:e7957e1745cb 126 unsigned long PrevMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 127 GSM_ReplyFlag = 0;
rcele_85 0:e7957e1745cb 128 Serial800.printf("%s",command);
rcele_85 0:e7957e1745cb 129 unsigned long currentMillis =timer800.read_ms();
rcele_85 0:e7957e1745cb 130
rcele_85 0:e7957e1745cb 131 // SerialDBG.println(PrevMillis);
rcele_85 0:e7957e1745cb 132 // SerialDBG.println(currentMillis);
rcele_85 0:e7957e1745cb 133 while ( (GSM_ReplyFlag == 0) && ((currentMillis - PrevMillis) < waitms) )
rcele_85 0:e7957e1745cb 134 {
rcele_85 0:e7957e1745cb 135 // delay(1);
rcele_85 0:e7957e1745cb 136 serialEvent();
rcele_85 0:e7957e1745cb 137 currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 138 }
rcele_85 0:e7957e1745cb 139 return GSM_ReplyFlag;
rcele_85 0:e7957e1745cb 140 }
rcele_85 0:e7957e1745cb 141 void GSM_MQTT::_tcpInit(void)
rcele_85 0:e7957e1745cb 142 {
rcele_85 0:e7957e1745cb 143 switch (modemStatus)
rcele_85 0:e7957e1745cb 144 {
rcele_85 0:e7957e1745cb 145 case 0:
rcele_85 0:e7957e1745cb 146 {
rcele_85 0:e7957e1745cb 147 wait(1);
rcele_85 0:e7957e1745cb 148 Serial800.printf("+++");
rcele_85 0:e7957e1745cb 149 wait(0.5);
rcele_85 0:e7957e1745cb 150 if (_sendAT("AT\r\n", 5000) == 1)
rcele_85 0:e7957e1745cb 151 {
rcele_85 0:e7957e1745cb 152 modemStatus = 1;
rcele_85 0:e7957e1745cb 153 }
rcele_85 0:e7957e1745cb 154 else
rcele_85 0:e7957e1745cb 155 {
rcele_85 0:e7957e1745cb 156 modemStatus = 0;
rcele_85 0:e7957e1745cb 157 break;
rcele_85 0:e7957e1745cb 158 }
rcele_85 0:e7957e1745cb 159 }
rcele_85 0:e7957e1745cb 160 case 1:
rcele_85 0:e7957e1745cb 161 {
rcele_85 0:e7957e1745cb 162 if (_sendAT("ATE1\r\n", 2000) == 1)
rcele_85 0:e7957e1745cb 163 {
rcele_85 0:e7957e1745cb 164 modemStatus = 2;
rcele_85 0:e7957e1745cb 165 }
rcele_85 0:e7957e1745cb 166 else
rcele_85 0:e7957e1745cb 167 {
rcele_85 0:e7957e1745cb 168 modemStatus = 1;
rcele_85 0:e7957e1745cb 169 break;
rcele_85 0:e7957e1745cb 170 }
rcele_85 0:e7957e1745cb 171 }
rcele_85 0:e7957e1745cb 172 case 2:
rcele_85 0:e7957e1745cb 173 {
rcele_85 0:e7957e1745cb 174 if (sendATreply("AT+CREG?\r\n", "0,1", 5000) == 1)
rcele_85 0:e7957e1745cb 175 {
rcele_85 0:e7957e1745cb 176 _sendAT("AT+CIPMUX=0\r\n", 2000);
rcele_85 0:e7957e1745cb 177 _sendAT("AT+CIPMODE=1\r\n", 2000);
rcele_85 0:e7957e1745cb 178 if (sendATreply("AT+CGATT?\r\n", ": 1", 4000) != 1)
rcele_85 0:e7957e1745cb 179 {
rcele_85 0:e7957e1745cb 180 _sendAT("AT+CGATT=1\r\n", 2000);
rcele_85 0:e7957e1745cb 181 }
rcele_85 0:e7957e1745cb 182 modemStatus = 3;
rcele_85 0:e7957e1745cb 183 _tcpStatus = 2;
rcele_85 0:e7957e1745cb 184 }
rcele_85 0:e7957e1745cb 185 else
rcele_85 0:e7957e1745cb 186 {
rcele_85 0:e7957e1745cb 187 modemStatus = 2;
rcele_85 0:e7957e1745cb 188 break;
rcele_85 0:e7957e1745cb 189 }
rcele_85 0:e7957e1745cb 190 }
rcele_85 0:e7957e1745cb 191 case 3:
rcele_85 0:e7957e1745cb 192 {
rcele_85 0:e7957e1745cb 193 if (GSM_ReplyFlag != 7)
rcele_85 0:e7957e1745cb 194 {
rcele_85 0:e7957e1745cb 195 _tcpStatus = sendATreply("AT+CIPSTATUS\r\n", "STATE", 4000);
rcele_85 0:e7957e1745cb 196 if (_tcpStatusPrev == _tcpStatus)
rcele_85 0:e7957e1745cb 197 {
rcele_85 0:e7957e1745cb 198 tcpATerrorcount++;
rcele_85 0:e7957e1745cb 199 if (tcpATerrorcount >= 10)
rcele_85 0:e7957e1745cb 200 {
rcele_85 0:e7957e1745cb 201 tcpATerrorcount = 0;
rcele_85 0:e7957e1745cb 202 _tcpStatus = 7;
rcele_85 0:e7957e1745cb 203 }
rcele_85 0:e7957e1745cb 204
rcele_85 0:e7957e1745cb 205 }
rcele_85 0:e7957e1745cb 206 else
rcele_85 0:e7957e1745cb 207 {
rcele_85 0:e7957e1745cb 208 _tcpStatusPrev = _tcpStatus;
rcele_85 0:e7957e1745cb 209 tcpATerrorcount = 0;
rcele_85 0:e7957e1745cb 210 }
rcele_85 0:e7957e1745cb 211 }
rcele_85 0:e7957e1745cb 212 _tcpStatusPrev = _tcpStatus;
rcele_85 0:e7957e1745cb 213 SerialDBG.printf("%d",_tcpStatus);
rcele_85 0:e7957e1745cb 214 switch (_tcpStatus)
rcele_85 0:e7957e1745cb 215 {
rcele_85 0:e7957e1745cb 216 case 2:
rcele_85 0:e7957e1745cb 217 {
rcele_85 0:e7957e1745cb 218 _sendAT("AT+CSTT=\"www\"\r\n", 5000);
rcele_85 0:e7957e1745cb 219 break;
rcele_85 0:e7957e1745cb 220 }
rcele_85 0:e7957e1745cb 221 case 3:
rcele_85 0:e7957e1745cb 222 {
rcele_85 0:e7957e1745cb 223 _sendAT("AT+CIICR\r\n", 5000) ;
rcele_85 0:e7957e1745cb 224 break;
rcele_85 0:e7957e1745cb 225 }
rcele_85 0:e7957e1745cb 226 case 4:
rcele_85 0:e7957e1745cb 227 {
rcele_85 0:e7957e1745cb 228 sendATreply("AT+CIFSR\r\n", ".", 4000) ;
rcele_85 0:e7957e1745cb 229 break;
rcele_85 0:e7957e1745cb 230 }
rcele_85 0:e7957e1745cb 231 case 5:
rcele_85 0:e7957e1745cb 232 {
rcele_85 0:e7957e1745cb 233 Serial800.printf("AT+CIPSTART=\"TCP\",\"");
rcele_85 0:e7957e1745cb 234 Serial800.printf("%s",MQTT_HOST);
rcele_85 0:e7957e1745cb 235 Serial800.printf("\",\"");
rcele_85 0:e7957e1745cb 236 Serial800.printf("%s",MQTT_PORT);
rcele_85 0:e7957e1745cb 237 if (_sendAT("\"\r\n", 5000) == 1)
rcele_85 0:e7957e1745cb 238 {
rcele_85 0:e7957e1745cb 239 unsigned long PrevMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 240 unsigned long currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 241 while ( (GSM_Response != 4) && ((currentMillis - PrevMillis) < 20000) )
rcele_85 0:e7957e1745cb 242 {
rcele_85 0:e7957e1745cb 243 // delay(1);
rcele_85 0:e7957e1745cb 244 serialEvent();
rcele_85 0:e7957e1745cb 245 currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 246 }
rcele_85 0:e7957e1745cb 247 }
rcele_85 0:e7957e1745cb 248 break;
rcele_85 0:e7957e1745cb 249 }
rcele_85 0:e7957e1745cb 250 case 6:
rcele_85 0:e7957e1745cb 251 {
rcele_85 0:e7957e1745cb 252 unsigned long PrevMillis =timer800.read_ms();
rcele_85 0:e7957e1745cb 253 unsigned long currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 254 while ( (GSM_Response != 4) && ((currentMillis - PrevMillis) < 20000) )
rcele_85 0:e7957e1745cb 255 {
rcele_85 0:e7957e1745cb 256 // delay(1);
rcele_85 0:e7957e1745cb 257 serialEvent();
rcele_85 0:e7957e1745cb 258 currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 259 }
rcele_85 0:e7957e1745cb 260 break;
rcele_85 0:e7957e1745cb 261 }
rcele_85 0:e7957e1745cb 262 case 7:
rcele_85 0:e7957e1745cb 263 {
rcele_85 0:e7957e1745cb 264 sendATreply("AT+CIPSHUT\r\n", "OK", 4000) ;
rcele_85 0:e7957e1745cb 265 modemStatus = 0;
rcele_85 0:e7957e1745cb 266 _tcpStatus = 2;
rcele_85 0:e7957e1745cb 267 break;
rcele_85 0:e7957e1745cb 268 }
rcele_85 0:e7957e1745cb 269 }
rcele_85 0:e7957e1745cb 270 }
rcele_85 0:e7957e1745cb 271 }
rcele_85 0:e7957e1745cb 272
rcele_85 0:e7957e1745cb 273 }
rcele_85 0:e7957e1745cb 274
rcele_85 0:e7957e1745cb 275 void GSM_MQTT::_ping(void)
rcele_85 0:e7957e1745cb 276 {
rcele_85 0:e7957e1745cb 277
rcele_85 0:e7957e1745cb 278 if (pingFlag == true)
rcele_85 0:e7957e1745cb 279 {
rcele_85 0:e7957e1745cb 280 unsigned long currentMillis = timer800.read_ms();
rcele_85 0:e7957e1745cb 281 if ((currentMillis - _PingPrevMillis ) >= _KeepAliveTimeOut * 1000)
rcele_85 0:e7957e1745cb 282 {
rcele_85 0:e7957e1745cb 283 // save the last time you blinked the LED
rcele_85 0:e7957e1745cb 284 _PingPrevMillis = currentMillis;
rcele_85 0:e7957e1745cb 285 Serial800.putc(char(PINGREQ * 16));
rcele_85 0:e7957e1745cb 286 _sendLength(0);
rcele_85 0:e7957e1745cb 287 }
rcele_85 0:e7957e1745cb 288 }
rcele_85 0:e7957e1745cb 289 }
rcele_85 0:e7957e1745cb 290 void GSM_MQTT::_sendUTFString(char *string1)
rcele_85 0:e7957e1745cb 291 {
rcele_85 0:e7957e1745cb 292 int localLength = strlen(string1);
rcele_85 0:e7957e1745cb 293 Serial800.putc(char(localLength / 256));
rcele_85 0:e7957e1745cb 294 Serial800.putc(char(localLength % 256));
rcele_85 0:e7957e1745cb 295 Serial800.printf("%s",string1);
rcele_85 0:e7957e1745cb 296 }
rcele_85 0:e7957e1745cb 297 void GSM_MQTT::_sendLength(int len)
rcele_85 0:e7957e1745cb 298 {
rcele_85 0:e7957e1745cb 299 bool length_flag = false;
rcele_85 0:e7957e1745cb 300 while (length_flag == false)
rcele_85 0:e7957e1745cb 301 {
rcele_85 0:e7957e1745cb 302 if ((len / 128) > 0)
rcele_85 0:e7957e1745cb 303 {
rcele_85 0:e7957e1745cb 304 Serial800.putc(char(len % 128 + 128));
rcele_85 0:e7957e1745cb 305 len /= 128;
rcele_85 0:e7957e1745cb 306 }
rcele_85 0:e7957e1745cb 307 else
rcele_85 0:e7957e1745cb 308 {
rcele_85 0:e7957e1745cb 309 length_flag = true;
rcele_85 0:e7957e1745cb 310 Serial800.putc(char(len));
rcele_85 0:e7957e1745cb 311 }
rcele_85 0:e7957e1745cb 312 }
rcele_85 0:e7957e1745cb 313 }
rcele_85 0:e7957e1745cb 314 //void GSM_MQTT::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 315 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)
rcele_85 0:e7957e1745cb 316 {
rcele_85 0:e7957e1745cb 317 //SerialDBG.printf("in connect\r\n");
rcele_85 0:e7957e1745cb 318 ConnectionAcknowledgement = NO_ACKNOWLEDGEMENT ;
rcele_85 0:e7957e1745cb 319 Serial800.putc(char(CONNECT * 16 ));
rcele_85 0:e7957e1745cb 320 char ProtocolName[7] = "MQIsdp";
rcele_85 0:e7957e1745cb 321 int localLength = (2 + strlen(ProtocolName)) + 1 + 3 + (2 + strlen(ClientIdentifier));
rcele_85 0:e7957e1745cb 322 if (WillFlag != 0)
rcele_85 0:e7957e1745cb 323 {
rcele_85 0:e7957e1745cb 324 localLength = localLength + 2 + strlen(WillTopic) + 2 + strlen(WillMessage);
rcele_85 0:e7957e1745cb 325 }
rcele_85 0:e7957e1745cb 326 if (UserNameFlag != 0)
rcele_85 0:e7957e1745cb 327 {
rcele_85 0:e7957e1745cb 328 localLength = localLength + 2 + strlen(UserName);
rcele_85 0:e7957e1745cb 329
rcele_85 0:e7957e1745cb 330 if (PasswordFlag != 0)
rcele_85 0:e7957e1745cb 331 {
rcele_85 0:e7957e1745cb 332 localLength = localLength + 2 + strlen(Password);
rcele_85 0:e7957e1745cb 333 }
rcele_85 0:e7957e1745cb 334 }
rcele_85 0:e7957e1745cb 335 _sendLength(localLength);
rcele_85 0:e7957e1745cb 336 _sendUTFString(ProtocolName);
rcele_85 0:e7957e1745cb 337 Serial800.putc(char(_ProtocolVersion));
rcele_85 0:e7957e1745cb 338 Serial800.putc(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));
rcele_85 0:e7957e1745cb 339 Serial800.putc(char(_KeepAliveTimeOut / 256));
rcele_85 0:e7957e1745cb 340 Serial800.putc(char(_KeepAliveTimeOut % 256));
rcele_85 0:e7957e1745cb 341 _sendUTFString(ClientIdentifier);
rcele_85 0:e7957e1745cb 342 if (WillFlag != 0)
rcele_85 0:e7957e1745cb 343 {
rcele_85 0:e7957e1745cb 344 _sendUTFString(WillTopic);
rcele_85 0:e7957e1745cb 345 _sendUTFString(WillMessage);
rcele_85 0:e7957e1745cb 346 }
rcele_85 0:e7957e1745cb 347 if (UserNameFlag != 0)
rcele_85 0:e7957e1745cb 348 {
rcele_85 0:e7957e1745cb 349 _sendUTFString(UserName);
rcele_85 0:e7957e1745cb 350 if (PasswordFlag != 0)
rcele_85 0:e7957e1745cb 351 {
rcele_85 0:e7957e1745cb 352 _sendUTFString(Password);
rcele_85 0:e7957e1745cb 353 }
rcele_85 0:e7957e1745cb 354 }
rcele_85 0:e7957e1745cb 355 }
rcele_85 0:e7957e1745cb 356 void GSM_MQTT::publish( char *Topic, char *Message, char DUP, char Qos, char RETAIN, unsigned int MessageID)
rcele_85 0:e7957e1745cb 357 {
rcele_85 0:e7957e1745cb 358 Serial800.putc(char(PUBLISH * 16 + DUP * DUP_Mask + Qos * QoS_Scale + RETAIN));
rcele_85 0:e7957e1745cb 359 int localLength = (2 + strlen(Topic));
rcele_85 0:e7957e1745cb 360 if (Qos > 0)
rcele_85 0:e7957e1745cb 361 {
rcele_85 0:e7957e1745cb 362 localLength += 2;
rcele_85 0:e7957e1745cb 363 }
rcele_85 0:e7957e1745cb 364 localLength += strlen(Message);
rcele_85 0:e7957e1745cb 365 _sendLength(localLength);
rcele_85 0:e7957e1745cb 366 _sendUTFString(Topic);
rcele_85 0:e7957e1745cb 367 if (Qos > 0)
rcele_85 0:e7957e1745cb 368 {
rcele_85 0:e7957e1745cb 369 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 370 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 371 }
rcele_85 0:e7957e1745cb 372 Serial800.printf("%s",Message);
rcele_85 0:e7957e1745cb 373 }
rcele_85 0:e7957e1745cb 374 void GSM_MQTT::publishACK(unsigned int MessageID)
rcele_85 0:e7957e1745cb 375 {
rcele_85 0:e7957e1745cb 376 Serial800.putc(char(PUBACK * 16));
rcele_85 0:e7957e1745cb 377 _sendLength(2);
rcele_85 0:e7957e1745cb 378 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 379 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 380 }
rcele_85 0:e7957e1745cb 381 void GSM_MQTT::publishREC(unsigned int MessageID)
rcele_85 0:e7957e1745cb 382 {
rcele_85 0:e7957e1745cb 383 Serial800.putc(char(PUBREC * 16));
rcele_85 0:e7957e1745cb 384 _sendLength(2);
rcele_85 0:e7957e1745cb 385 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 386 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 387 }
rcele_85 0:e7957e1745cb 388 void GSM_MQTT::publishREL(char DUP, unsigned int MessageID)
rcele_85 0:e7957e1745cb 389 {
rcele_85 0:e7957e1745cb 390 Serial800.putc(char(PUBREL * 16 + DUP * DUP_Mask + 1 * QoS_Scale));
rcele_85 0:e7957e1745cb 391 _sendLength(2);
rcele_85 0:e7957e1745cb 392 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 393 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 394 }
rcele_85 0:e7957e1745cb 395
rcele_85 0:e7957e1745cb 396 void GSM_MQTT::publishCOMP(unsigned int MessageID)
rcele_85 0:e7957e1745cb 397 {
rcele_85 0:e7957e1745cb 398 Serial800.putc(char(PUBCOMP * 16));
rcele_85 0:e7957e1745cb 399 _sendLength(2);
rcele_85 0:e7957e1745cb 400 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 401 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 402 }
rcele_85 0:e7957e1745cb 403 void GSM_MQTT::subscribe(char *SubTopic, char DUP, unsigned int MessageID, char SubQoS)
rcele_85 0:e7957e1745cb 404 {
rcele_85 0:e7957e1745cb 405 Serial800.putc(char(SUBSCRIBE * 16 + DUP * DUP_Mask + 1 * QoS_Scale));
rcele_85 0:e7957e1745cb 406 int localLength = 2 + (2 + strlen(SubTopic)) + 1;
rcele_85 0:e7957e1745cb 407 _sendLength(localLength);
rcele_85 0:e7957e1745cb 408 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 409 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 410 _sendUTFString(SubTopic);
rcele_85 0:e7957e1745cb 411 Serial800.putc(SubQoS);
rcele_85 0:e7957e1745cb 412
rcele_85 0:e7957e1745cb 413 }
rcele_85 0:e7957e1745cb 414 void GSM_MQTT::unsubscribe( char *SubTopic, char DUP, unsigned int MessageID)
rcele_85 0:e7957e1745cb 415 {
rcele_85 0:e7957e1745cb 416 Serial800.putc(char(UNSUBSCRIBE * 16 + DUP * DUP_Mask + 1 * QoS_Scale));
rcele_85 0:e7957e1745cb 417 int localLength = (2 + strlen(SubTopic)) + 2;
rcele_85 0:e7957e1745cb 418 _sendLength(localLength);
rcele_85 0:e7957e1745cb 419
rcele_85 0:e7957e1745cb 420 Serial800.putc(char(MessageID / 256));
rcele_85 0:e7957e1745cb 421 Serial800.putc(char(MessageID % 256));
rcele_85 0:e7957e1745cb 422
rcele_85 0:e7957e1745cb 423 _sendUTFString(SubTopic);
rcele_85 0:e7957e1745cb 424 }
rcele_85 0:e7957e1745cb 425 void GSM_MQTT::disconnect(void)
rcele_85 0:e7957e1745cb 426 {
rcele_85 0:e7957e1745cb 427 Serial800.putc(char(DISCONNECT * 16));
rcele_85 0:e7957e1745cb 428 _sendLength(0);
rcele_85 0:e7957e1745cb 429 pingFlag = false;
rcele_85 0:e7957e1745cb 430 }
rcele_85 0:e7957e1745cb 431 //Messages
rcele_85 0:e7957e1745cb 432 const char CONNECTMessage[] = "Client request to connect to Server\r\n";
rcele_85 0:e7957e1745cb 433 const char CONNACKMessage[] = "Connect Acknowledgment\r\n";
rcele_85 0:e7957e1745cb 434 const char PUBLISHMessage[] = "Publish message\r\n";
rcele_85 0:e7957e1745cb 435 const char PUBACKMessage[] = "Publish Acknowledgment\r\n";
rcele_85 0:e7957e1745cb 436 const char PUBRECMessage[] = "Publish Received (assured delivery part 1)\r\n";
rcele_85 0:e7957e1745cb 437 const char PUBRELMessage[] = "Publish Release (assured delivery part 2)\r\n";
rcele_85 0:e7957e1745cb 438 const char PUBCOMPMessage[] = "Publish Complete (assured delivery part 3)\r\n";
rcele_85 0:e7957e1745cb 439 const char SUBSCRIBEMessage[] = "Client Subscribe request\r\n";
rcele_85 0:e7957e1745cb 440 const char SUBACKMessage[] = "Subscribe Acknowledgment\r\n";
rcele_85 0:e7957e1745cb 441 const char UNSUBSCRIBEMessage[] = "Client Unsubscribe request\r\n";
rcele_85 0:e7957e1745cb 442 const char UNSUBACKMessage[] = "Unsubscribe Acknowledgment\r\n";
rcele_85 0:e7957e1745cb 443 const char PINGREQMessage[] = "PING Request\r\n";
rcele_85 0:e7957e1745cb 444 const char PINGRESPMessage[] = "PING Response\r\n";
rcele_85 0:e7957e1745cb 445 const char DISCONNECTMessage[] = "Client is Disconnecting\r\n";
rcele_85 0:e7957e1745cb 446
rcele_85 0:e7957e1745cb 447 void GSM_MQTT::printMessageType(uint8_t Message)
rcele_85 0:e7957e1745cb 448 {
rcele_85 0:e7957e1745cb 449 switch (Message)
rcele_85 0:e7957e1745cb 450 {
rcele_85 0:e7957e1745cb 451 case CONNECT:
rcele_85 0:e7957e1745cb 452 {
rcele_85 0:e7957e1745cb 453 SerialDBG.printf("%s",CONNECTMessage);
rcele_85 0:e7957e1745cb 454 break;
rcele_85 0:e7957e1745cb 455 }
rcele_85 0:e7957e1745cb 456 case CONNACK:
rcele_85 0:e7957e1745cb 457 {
rcele_85 0:e7957e1745cb 458 SerialDBG.printf("%s",CONNACKMessage);
rcele_85 0:e7957e1745cb 459 break;
rcele_85 0:e7957e1745cb 460 }
rcele_85 0:e7957e1745cb 461 case PUBLISH:
rcele_85 0:e7957e1745cb 462 {
rcele_85 0:e7957e1745cb 463 SerialDBG.printf("%s",PUBLISHMessage);
rcele_85 0:e7957e1745cb 464 break;
rcele_85 0:e7957e1745cb 465 }
rcele_85 0:e7957e1745cb 466 case PUBACK:
rcele_85 0:e7957e1745cb 467 {
rcele_85 0:e7957e1745cb 468 SerialDBG.printf("%s",PUBACKMessage);
rcele_85 0:e7957e1745cb 469 break;
rcele_85 0:e7957e1745cb 470 }
rcele_85 0:e7957e1745cb 471 case PUBREC:
rcele_85 0:e7957e1745cb 472 {
rcele_85 0:e7957e1745cb 473 SerialDBG.printf("%s",PUBRECMessage);
rcele_85 0:e7957e1745cb 474 break;
rcele_85 0:e7957e1745cb 475 }
rcele_85 0:e7957e1745cb 476 case PUBREL:
rcele_85 0:e7957e1745cb 477 {
rcele_85 0:e7957e1745cb 478 SerialDBG.printf("%s",PUBRELMessage);
rcele_85 0:e7957e1745cb 479 break;
rcele_85 0:e7957e1745cb 480 }
rcele_85 0:e7957e1745cb 481 case PUBCOMP:
rcele_85 0:e7957e1745cb 482 {
rcele_85 0:e7957e1745cb 483 SerialDBG.printf("%s",PUBCOMPMessage);
rcele_85 0:e7957e1745cb 484 break;
rcele_85 0:e7957e1745cb 485 }
rcele_85 0:e7957e1745cb 486 case SUBSCRIBE:
rcele_85 0:e7957e1745cb 487 {
rcele_85 0:e7957e1745cb 488 SerialDBG.printf("%s",SUBSCRIBEMessage);
rcele_85 0:e7957e1745cb 489 break;
rcele_85 0:e7957e1745cb 490 }
rcele_85 0:e7957e1745cb 491 case SUBACK:
rcele_85 0:e7957e1745cb 492 {
rcele_85 0:e7957e1745cb 493 SerialDBG.printf("%s",SUBACKMessage);
rcele_85 0:e7957e1745cb 494 break;
rcele_85 0:e7957e1745cb 495 }
rcele_85 0:e7957e1745cb 496 case UNSUBSCRIBE:
rcele_85 0:e7957e1745cb 497 {
rcele_85 0:e7957e1745cb 498 SerialDBG.printf("%s",UNSUBSCRIBEMessage);
rcele_85 0:e7957e1745cb 499 break;
rcele_85 0:e7957e1745cb 500 }
rcele_85 0:e7957e1745cb 501 case UNSUBACK:
rcele_85 0:e7957e1745cb 502 {
rcele_85 0:e7957e1745cb 503 SerialDBG.printf("%s",UNSUBACKMessage);
rcele_85 0:e7957e1745cb 504 break;
rcele_85 0:e7957e1745cb 505 }
rcele_85 0:e7957e1745cb 506 case PINGREQ:
rcele_85 0:e7957e1745cb 507 {
rcele_85 0:e7957e1745cb 508 SerialDBG.printf("%s",PINGREQMessage);
rcele_85 0:e7957e1745cb 509 break;
rcele_85 0:e7957e1745cb 510 }
rcele_85 0:e7957e1745cb 511 case PINGRESP:
rcele_85 0:e7957e1745cb 512 {
rcele_85 0:e7957e1745cb 513 SerialDBG.printf("%s",PINGRESPMessage);
rcele_85 0:e7957e1745cb 514 break;
rcele_85 0:e7957e1745cb 515 }
rcele_85 0:e7957e1745cb 516 case DISCONNECT:
rcele_85 0:e7957e1745cb 517 {
rcele_85 0:e7957e1745cb 518 SerialDBG.printf("%s",DISCONNECTMessage);
rcele_85 0:e7957e1745cb 519 break;
rcele_85 0:e7957e1745cb 520 }
rcele_85 0:e7957e1745cb 521 }
rcele_85 0:e7957e1745cb 522 }
rcele_85 0:e7957e1745cb 523
rcele_85 0:e7957e1745cb 524 //Connect Ack
rcele_85 0:e7957e1745cb 525 const char ConnectAck0[] = "Connection Accepted\r\n";
rcele_85 0:e7957e1745cb 526 const char ConnectAck1[] = "Connection Refused: unacceptable protocol version\r\n";
rcele_85 0:e7957e1745cb 527 const char ConnectAck2[] = "Connection Refused: identifier rejected\r\n";
rcele_85 0:e7957e1745cb 528 const char ConnectAck3[] = "Connection Refused: server unavailable\r\n";
rcele_85 0:e7957e1745cb 529 const char ConnectAck4[] = "Connection Refused: bad user name or password\r\n";
rcele_85 0:e7957e1745cb 530 const char ConnectAck5[] = "Connection Refused: not authorized\r\n";
rcele_85 0:e7957e1745cb 531 void GSM_MQTT::printConnectAck(uint8_t Ack)
rcele_85 0:e7957e1745cb 532 {
rcele_85 0:e7957e1745cb 533 switch (Ack)
rcele_85 0:e7957e1745cb 534 {
rcele_85 0:e7957e1745cb 535 case 0:
rcele_85 0:e7957e1745cb 536 {
rcele_85 0:e7957e1745cb 537 SerialDBG.printf("%s",ConnectAck0);
rcele_85 0:e7957e1745cb 538 break;
rcele_85 0:e7957e1745cb 539 }
rcele_85 0:e7957e1745cb 540 case 1:
rcele_85 0:e7957e1745cb 541 {
rcele_85 0:e7957e1745cb 542 SerialDBG.printf("%s",ConnectAck1);
rcele_85 0:e7957e1745cb 543 break;
rcele_85 0:e7957e1745cb 544 }
rcele_85 0:e7957e1745cb 545 case 2:
rcele_85 0:e7957e1745cb 546 {
rcele_85 0:e7957e1745cb 547 SerialDBG.printf("%s",ConnectAck2);
rcele_85 0:e7957e1745cb 548 break;
rcele_85 0:e7957e1745cb 549 }
rcele_85 0:e7957e1745cb 550 case 3:
rcele_85 0:e7957e1745cb 551 {
rcele_85 0:e7957e1745cb 552 SerialDBG.printf("%s",ConnectAck3);
rcele_85 0:e7957e1745cb 553 break;
rcele_85 0:e7957e1745cb 554 }
rcele_85 0:e7957e1745cb 555 case 4:
rcele_85 0:e7957e1745cb 556 {
rcele_85 0:e7957e1745cb 557 SerialDBG.printf("%s",ConnectAck4);
rcele_85 0:e7957e1745cb 558 break;
rcele_85 0:e7957e1745cb 559 }
rcele_85 0:e7957e1745cb 560 case 5:
rcele_85 0:e7957e1745cb 561 {
rcele_85 0:e7957e1745cb 562 SerialDBG.printf("%s",ConnectAck5);
rcele_85 0:e7957e1745cb 563 break;
rcele_85 0:e7957e1745cb 564 }
rcele_85 0:e7957e1745cb 565 }
rcele_85 0:e7957e1745cb 566 }
rcele_85 0:e7957e1745cb 567 unsigned int GSM_MQTT::_generateMessageID(void)
rcele_85 0:e7957e1745cb 568 {
rcele_85 0:e7957e1745cb 569 if (_LastMessaseID < 65535)
rcele_85 0:e7957e1745cb 570 {
rcele_85 0:e7957e1745cb 571 return ++_LastMessaseID;
rcele_85 0:e7957e1745cb 572 }
rcele_85 0:e7957e1745cb 573 else
rcele_85 0:e7957e1745cb 574 {
rcele_85 0:e7957e1745cb 575 _LastMessaseID = 0;
rcele_85 0:e7957e1745cb 576 return _LastMessaseID;
rcele_85 0:e7957e1745cb 577 }
rcele_85 0:e7957e1745cb 578 }
rcele_85 0:e7957e1745cb 579 void GSM_MQTT::processing(void)
rcele_85 0:e7957e1745cb 580 {
rcele_85 0:e7957e1745cb 581 serialEvent();
rcele_85 0:e7957e1745cb 582 if (TCP_Flag == false)
rcele_85 0:e7957e1745cb 583 {
rcele_85 0:e7957e1745cb 584 MQTT_Flag = false;
rcele_85 0:e7957e1745cb 585 _tcpInit();
rcele_85 0:e7957e1745cb 586 }
rcele_85 0:e7957e1745cb 587 _ping();
rcele_85 0:e7957e1745cb 588 }
rcele_85 0:e7957e1745cb 589 bool GSM_MQTT::available(void)
rcele_85 0:e7957e1745cb 590 {
rcele_85 0:e7957e1745cb 591 return MQTT_Flag;
rcele_85 0:e7957e1745cb 592 }
rcele_85 0:e7957e1745cb 593 void serialEvent()
rcele_85 0:e7957e1745cb 594 {
rcele_85 0:e7957e1745cb 595 //SerialDBG.printf("in serevent\r\n");
rcele_85 0:e7957e1745cb 596 while (Serial800_available())
rcele_85 0:e7957e1745cb 597 {
rcele_85 0:e7957e1745cb 598 char inChar = (char)Serial800_read();
rcele_85 0:e7957e1745cb 599 if (MQTT.TCP_Flag == false)
rcele_85 0:e7957e1745cb 600 {
rcele_85 0:e7957e1745cb 601 if (MQTT.index < 200)
rcele_85 0:e7957e1745cb 602 {
rcele_85 0:e7957e1745cb 603 MQTT.inputString[MQTT.index++] = inChar;
rcele_85 0:e7957e1745cb 604 }
rcele_85 0:e7957e1745cb 605 if (inChar == '\n')
rcele_85 0:e7957e1745cb 606 {
rcele_85 0:e7957e1745cb 607 MQTT.inputString[MQTT.index] = 0;
rcele_85 0:e7957e1745cb 608 stringComplete = true;
rcele_85 0:e7957e1745cb 609 SerialDBG.printf("%s",MQTT.inputString);
rcele_85 0:e7957e1745cb 610 if (strstr(MQTT.inputString, MQTT.reply) != NULL)
rcele_85 0:e7957e1745cb 611 {
rcele_85 0:e7957e1745cb 612 MQTT.GSM_ReplyFlag = 1;
rcele_85 0:e7957e1745cb 613 if (strstr(MQTT.inputString, " INITIAL") != 0)
rcele_85 0:e7957e1745cb 614 {
rcele_85 0:e7957e1745cb 615 MQTT.GSM_ReplyFlag = 2; //
rcele_85 0:e7957e1745cb 616 }
rcele_85 0:e7957e1745cb 617 else if (strstr(MQTT.inputString, " START") != 0)
rcele_85 0:e7957e1745cb 618 {
rcele_85 0:e7957e1745cb 619 MQTT.GSM_ReplyFlag = 3; //
rcele_85 0:e7957e1745cb 620 }
rcele_85 0:e7957e1745cb 621 else if (strstr(MQTT.inputString, "IP CONFIG") != 0)
rcele_85 0:e7957e1745cb 622 {
rcele_85 0:e7957e1745cb 623 wait(0.0000010);
rcele_85 0:e7957e1745cb 624 MQTT.GSM_ReplyFlag = 4;
rcele_85 0:e7957e1745cb 625 }
rcele_85 0:e7957e1745cb 626 else if (strstr(MQTT.inputString, " GPRSACT") != 0)
rcele_85 0:e7957e1745cb 627 {
rcele_85 0:e7957e1745cb 628 MQTT.GSM_ReplyFlag = 4; //
rcele_85 0:e7957e1745cb 629 }
rcele_85 0:e7957e1745cb 630 else if ((strstr(MQTT.inputString, " STATUS") != 0) || (strstr(MQTT.inputString, "TCP CLOSED") != 0))
rcele_85 0:e7957e1745cb 631 {
rcele_85 0:e7957e1745cb 632 MQTT.GSM_ReplyFlag = 5; //
rcele_85 0:e7957e1745cb 633 }
rcele_85 0:e7957e1745cb 634 else if (strstr(MQTT.inputString, " TCP CONNECTING") != 0)
rcele_85 0:e7957e1745cb 635 {
rcele_85 0:e7957e1745cb 636 MQTT.GSM_ReplyFlag = 6; //
rcele_85 0:e7957e1745cb 637 }
rcele_85 0:e7957e1745cb 638 else if ((strstr(MQTT.inputString, " CONNECT OK") != 0) || (strstr(MQTT.inputString, "CONNECT FAIL") != NULL) || (strstr(MQTT.inputString, "PDP DEACT") != 0))
rcele_85 0:e7957e1745cb 639 {
rcele_85 0:e7957e1745cb 640 MQTT.GSM_ReplyFlag = 7;
rcele_85 0:e7957e1745cb 641 }
rcele_85 0:e7957e1745cb 642 }
rcele_85 0:e7957e1745cb 643 else if (strstr(MQTT.inputString, "OK") != NULL)
rcele_85 0:e7957e1745cb 644 {
rcele_85 0:e7957e1745cb 645 GSM_Response = 1;
rcele_85 0:e7957e1745cb 646 }
rcele_85 0:e7957e1745cb 647 else if (strstr(MQTT.inputString, "ERROR") != NULL)
rcele_85 0:e7957e1745cb 648 {
rcele_85 0:e7957e1745cb 649 GSM_Response = 2;
rcele_85 0:e7957e1745cb 650 }
rcele_85 0:e7957e1745cb 651 else if (strstr(MQTT.inputString, ".") != NULL)
rcele_85 0:e7957e1745cb 652 {
rcele_85 0:e7957e1745cb 653 GSM_Response = 3;
rcele_85 0:e7957e1745cb 654 }
rcele_85 0:e7957e1745cb 655 else if (strstr(MQTT.inputString, "CONNECT FAIL") != NULL)
rcele_85 0:e7957e1745cb 656 {
rcele_85 0:e7957e1745cb 657 GSM_Response = 5;
rcele_85 0:e7957e1745cb 658 }
rcele_85 0:e7957e1745cb 659 else if (strstr(MQTT.inputString, "CONNECT") != NULL)
rcele_85 0:e7957e1745cb 660 {
rcele_85 0:e7957e1745cb 661 GSM_Response = 4;
rcele_85 0:e7957e1745cb 662 MQTT.TCP_Flag = true;
rcele_85 0:e7957e1745cb 663 SerialDBG.printf("MQTT.TCP_Flag = True\r\n");
rcele_85 0:e7957e1745cb 664 //SerialDBG.printf("going to auto connect\r\n");
rcele_85 0:e7957e1745cb 665 MQTT.AutoConnect();
rcele_85 0:e7957e1745cb 666 //SerialDBG.printf("out of auto connect\r\n");
rcele_85 0:e7957e1745cb 667 MQTT.pingFlag = true;
rcele_85 0:e7957e1745cb 668 MQTT.tcpATerrorcount = 0;
rcele_85 0:e7957e1745cb 669 }
rcele_85 0:e7957e1745cb 670 else if (strstr(MQTT.inputString, "CLOSED") != NULL)
rcele_85 0:e7957e1745cb 671 {
rcele_85 0:e7957e1745cb 672 GSM_Response = 4;
rcele_85 0:e7957e1745cb 673 MQTT.TCP_Flag = false;
rcele_85 0:e7957e1745cb 674 MQTT.MQTT_Flag = false;
rcele_85 0:e7957e1745cb 675 }
rcele_85 0:e7957e1745cb 676 MQTT.index = 0;
rcele_85 0:e7957e1745cb 677 MQTT.inputString[0] = 0;
rcele_85 0:e7957e1745cb 678 }
rcele_85 0:e7957e1745cb 679 }
rcele_85 0:e7957e1745cb 680 else
rcele_85 0:e7957e1745cb 681 {
rcele_85 0:e7957e1745cb 682 uint8_t ReceivedMessageType = (inChar / 16) & 0x0F;
rcele_85 0:e7957e1745cb 683 uint8_t DUP = (inChar & DUP_Mask) / DUP_Mask;
rcele_85 0:e7957e1745cb 684 uint8_t QoS = (inChar & QoS_Mask) / QoS_Scale;
rcele_85 0:e7957e1745cb 685 uint8_t RETAIN = (inChar & RETAIN_Mask);
rcele_85 0:e7957e1745cb 686 if ((ReceivedMessageType >= CONNECT) && (ReceivedMessageType <= DISCONNECT))
rcele_85 0:e7957e1745cb 687 {
rcele_85 0:e7957e1745cb 688 bool NextLengthByte = true;
rcele_85 0:e7957e1745cb 689 MQTT.length = 0;
rcele_85 0:e7957e1745cb 690 MQTT.lengthLocal = 0;
rcele_85 0:e7957e1745cb 691 uint32_t multiplier=1;
rcele_85 0:e7957e1745cb 692 wait(0.002);
rcele_85 0:e7957e1745cb 693 char Cchar = inChar;
rcele_85 0:e7957e1745cb 694 while ( (NextLengthByte == true) && (MQTT.TCP_Flag == true))
rcele_85 0:e7957e1745cb 695 {
rcele_85 0:e7957e1745cb 696 if (Serial800_available()>0)
rcele_85 0:e7957e1745cb 697 {
rcele_85 0:e7957e1745cb 698 inChar = (char)Serial800_read();
rcele_85 0:e7957e1745cb 699 SerialDBG.printf("%d\r\n",inChar);
rcele_85 0:e7957e1745cb 700 if ((((Cchar & 0xFF) == 'C') && ((inChar & 0xFF) == 'L') && (MQTT.length == 0)) || (((Cchar & 0xFF) == '+') && ((inChar & 0xFF) == 'P') && (MQTT.length == 0)))
rcele_85 0:e7957e1745cb 701 {
rcele_85 0:e7957e1745cb 702 MQTT.index = 0;
rcele_85 0:e7957e1745cb 703 MQTT.inputString[MQTT.index++] = Cchar;
rcele_85 0:e7957e1745cb 704 MQTT.inputString[MQTT.index++] = inChar;
rcele_85 0:e7957e1745cb 705 MQTT.TCP_Flag = false;
rcele_85 0:e7957e1745cb 706 MQTT.MQTT_Flag = false;
rcele_85 0:e7957e1745cb 707 MQTT.pingFlag = false;
rcele_85 0:e7957e1745cb 708 SerialDBG.printf("Disconnecting\r\n");
rcele_85 0:e7957e1745cb 709 }
rcele_85 0:e7957e1745cb 710 else
rcele_85 0:e7957e1745cb 711 {
rcele_85 0:e7957e1745cb 712 if ((inChar & 128) == 128)
rcele_85 0:e7957e1745cb 713 {
rcele_85 0:e7957e1745cb 714 MQTT.length += (inChar & 127) * multiplier;
rcele_85 0:e7957e1745cb 715 multiplier *= 128;
rcele_85 0:e7957e1745cb 716 SerialDBG.printf("More\r\n");
rcele_85 0:e7957e1745cb 717 }
rcele_85 0:e7957e1745cb 718 else
rcele_85 0:e7957e1745cb 719 {
rcele_85 0:e7957e1745cb 720 NextLengthByte = false;
rcele_85 0:e7957e1745cb 721 MQTT.length += (inChar & 127) * multiplier;
rcele_85 0:e7957e1745cb 722 multiplier *= 128;
rcele_85 0:e7957e1745cb 723 }
rcele_85 0:e7957e1745cb 724 }
rcele_85 0:e7957e1745cb 725 }
rcele_85 0:e7957e1745cb 726 }
rcele_85 0:e7957e1745cb 727 MQTT.lengthLocal = MQTT.length;
rcele_85 0:e7957e1745cb 728 SerialDBG.printf("%d\r\n",MQTT.length);
rcele_85 0:e7957e1745cb 729 if (MQTT.TCP_Flag == true)
rcele_85 0:e7957e1745cb 730 {
rcele_85 0:e7957e1745cb 731 MQTT.printMessageType(ReceivedMessageType);
rcele_85 0:e7957e1745cb 732 MQTT.index = 0L;
rcele_85 0:e7957e1745cb 733 uint32_t a = 0;
rcele_85 0:e7957e1745cb 734 while ((MQTT.length-- > 0) && (Serial800_available()>0))
rcele_85 0:e7957e1745cb 735 {
rcele_85 0:e7957e1745cb 736 MQTT.inputString[uint32_t(MQTT.index++)] = (char)Serial800_read();
rcele_85 0:e7957e1745cb 737
rcele_85 0:e7957e1745cb 738 wait(0.001);
rcele_85 0:e7957e1745cb 739
rcele_85 0:e7957e1745cb 740 }
rcele_85 0:e7957e1745cb 741 SerialDBG.printf("\r\n");
rcele_85 0:e7957e1745cb 742 if (ReceivedMessageType == CONNACK)
rcele_85 0:e7957e1745cb 743 {
rcele_85 0:e7957e1745cb 744 MQTT.ConnectionAcknowledgement = MQTT.inputString[0] * 256 + MQTT.inputString[1];
rcele_85 0:e7957e1745cb 745 if (MQTT.ConnectionAcknowledgement == 0)
rcele_85 0:e7957e1745cb 746 {
rcele_85 0:e7957e1745cb 747 MQTT.MQTT_Flag = true;
rcele_85 0:e7957e1745cb 748 MQTT.OnConnect();
rcele_85 0:e7957e1745cb 749
rcele_85 0:e7957e1745cb 750 }
rcele_85 0:e7957e1745cb 751
rcele_85 0:e7957e1745cb 752 MQTT.printConnectAck(MQTT.ConnectionAcknowledgement);
rcele_85 0:e7957e1745cb 753 // MQTT.OnConnect();
rcele_85 0:e7957e1745cb 754 }
rcele_85 0:e7957e1745cb 755 else if (ReceivedMessageType == PUBLISH)
rcele_85 0:e7957e1745cb 756 {
rcele_85 0:e7957e1745cb 757 uint32_t TopicLength = (MQTT.inputString[0]) * 256 + (MQTT.inputString[1]);
rcele_85 0:e7957e1745cb 758 SerialDBG.printf("Topic : '");
rcele_85 0:e7957e1745cb 759 MQTT.PublishIndex = 0;
rcele_85 0:e7957e1745cb 760 for (uint32_t iter = 2; iter < TopicLength + 2; iter++)
rcele_85 0:e7957e1745cb 761 {
rcele_85 0:e7957e1745cb 762 SerialDBG.putc(MQTT.inputString[iter]);
rcele_85 0:e7957e1745cb 763 MQTT.Topic[MQTT.PublishIndex++] = MQTT.inputString[iter];
rcele_85 0:e7957e1745cb 764 }
rcele_85 0:e7957e1745cb 765 MQTT.Topic[MQTT.PublishIndex] = 0;
rcele_85 0:e7957e1745cb 766 SerialDBG.printf("' Message :'");
rcele_85 0:e7957e1745cb 767 MQTT.TopicLength = MQTT.PublishIndex;
rcele_85 0:e7957e1745cb 768
rcele_85 0:e7957e1745cb 769 MQTT.PublishIndex = 0;
rcele_85 0:e7957e1745cb 770 uint32_t MessageSTART = TopicLength + 2UL;
rcele_85 0:e7957e1745cb 771 int MessageID = 0;
rcele_85 0:e7957e1745cb 772 if (QoS != 0)
rcele_85 0:e7957e1745cb 773 {
rcele_85 0:e7957e1745cb 774 MessageSTART += 2;
rcele_85 0:e7957e1745cb 775 MessageID = MQTT.inputString[TopicLength + 2UL] * 256 + MQTT.inputString[TopicLength + 3UL];
rcele_85 0:e7957e1745cb 776 }
rcele_85 0:e7957e1745cb 777 for (uint32_t iter = (MessageSTART); iter < (MQTT.lengthLocal); iter++)
rcele_85 0:e7957e1745cb 778 {
rcele_85 0:e7957e1745cb 779 SerialDBG.putc(MQTT.inputString[iter]);
rcele_85 0:e7957e1745cb 780 MQTT.Message[MQTT.PublishIndex++] = MQTT.inputString[iter];
rcele_85 0:e7957e1745cb 781 }
rcele_85 0:e7957e1745cb 782 MQTT.Message[MQTT.PublishIndex] = 0;
rcele_85 0:e7957e1745cb 783 SerialDBG.printf("'\r\n");
rcele_85 0:e7957e1745cb 784 MQTT.MessageLength = MQTT.PublishIndex;
rcele_85 0:e7957e1745cb 785 if (QoS == 1)
rcele_85 0:e7957e1745cb 786 {
rcele_85 0:e7957e1745cb 787 MQTT.publishACK(MessageID);
rcele_85 0:e7957e1745cb 788 }
rcele_85 0:e7957e1745cb 789 else if (QoS == 2)
rcele_85 0:e7957e1745cb 790 {
rcele_85 0:e7957e1745cb 791 MQTT.publishREC(MessageID);
rcele_85 0:e7957e1745cb 792 }
rcele_85 0:e7957e1745cb 793 MQTT.OnMessage(MQTT.Topic, MQTT.TopicLength, MQTT.Message, MQTT.MessageLength);
rcele_85 0:e7957e1745cb 794 MQTT.MessageFlag = true;
rcele_85 0:e7957e1745cb 795 }
rcele_85 0:e7957e1745cb 796 else if (ReceivedMessageType == PUBREC)
rcele_85 0:e7957e1745cb 797 {
rcele_85 0:e7957e1745cb 798 SerialDBG.printf("Message ID :");
rcele_85 0:e7957e1745cb 799 MQTT.publishREL(0, MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
rcele_85 0:e7957e1745cb 800 SerialDBG.printf("%d",MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
rcele_85 0:e7957e1745cb 801
rcele_85 0:e7957e1745cb 802 }
rcele_85 0:e7957e1745cb 803 else if (ReceivedMessageType == PUBREL)
rcele_85 0:e7957e1745cb 804 {
rcele_85 0:e7957e1745cb 805 SerialDBG.printf("Message ID :");
rcele_85 0:e7957e1745cb 806 MQTT.publishCOMP(MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
rcele_85 0:e7957e1745cb 807 SerialDBG.printf("%d\r\n",MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
rcele_85 0:e7957e1745cb 808
rcele_85 0:e7957e1745cb 809 }
rcele_85 0:e7957e1745cb 810 else if ((ReceivedMessageType == PUBACK) || (ReceivedMessageType == PUBCOMP) || (ReceivedMessageType == SUBACK) || (ReceivedMessageType == UNSUBACK))
rcele_85 0:e7957e1745cb 811 {
rcele_85 0:e7957e1745cb 812 SerialDBG.printf("Message ID :");
rcele_85 0:e7957e1745cb 813 SerialDBG.printf("%d\r\n",MQTT.inputString[0] * 256 + MQTT.inputString[1]) ;
rcele_85 0:e7957e1745cb 814 }
rcele_85 0:e7957e1745cb 815 else if (ReceivedMessageType == PINGREQ)
rcele_85 0:e7957e1745cb 816 {
rcele_85 0:e7957e1745cb 817 MQTT.TCP_Flag = false;
rcele_85 0:e7957e1745cb 818 MQTT.pingFlag = false;
rcele_85 0:e7957e1745cb 819 SerialDBG.printf("Disconnecting\r\n");
rcele_85 0:e7957e1745cb 820 MQTT.sendATreply("AT+CIPSHUT\r\n", ".", 4000) ;
rcele_85 0:e7957e1745cb 821 MQTT.modemStatus = 0;
rcele_85 0:e7957e1745cb 822 }
rcele_85 0:e7957e1745cb 823 }
rcele_85 0:e7957e1745cb 824 }
rcele_85 0:e7957e1745cb 825 else if ((inChar == 13) || (inChar == 10))
rcele_85 0:e7957e1745cb 826 {
rcele_85 0:e7957e1745cb 827 }
rcele_85 0:e7957e1745cb 828 else
rcele_85 0:e7957e1745cb 829 {
rcele_85 0:e7957e1745cb 830 SerialDBG.printf("Received :Unknown Message Type :");
rcele_85 0:e7957e1745cb 831 SerialDBG.printf("%d",inChar);
rcele_85 0:e7957e1745cb 832 }
rcele_85 0:e7957e1745cb 833 }
rcele_85 0:e7957e1745cb 834 }
rcele_85 0:e7957e1745cb 835 }