BG96 Cat.M1 MQTT Pub/Sub client sample for WIZnet IoT Shield

Committer:
hkjung
Date:
Wed Mar 27 11:43:49 2019 +0000
Revision:
3:e5d7640ce142
Parent:
2:b766209b5cff
bug fixed: function checkRecvMqttMessage_BG96()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hkjung 0:5cd6077e0a8e 1 /* WIZnet IoT Shield Cat.M1 Sample code for Arm MBED
hkjung 0:5cd6077e0a8e 2 * Copyright (c) 2019 WIZnet Co., Ltd.
hkjung 0:5cd6077e0a8e 3 * SPDX-License-Identifier: Apache-2.0
hkjung 0:5cd6077e0a8e 4 */
hkjung 0:5cd6077e0a8e 5
hkjung 0:5cd6077e0a8e 6 /*
hkjung 0:5cd6077e0a8e 7 * Licensed under the Apache License, Version 2.0 (the "License");
hkjung 0:5cd6077e0a8e 8 * you may not use this file except in compliance with the License.
hkjung 0:5cd6077e0a8e 9 * You may obtain a copy of the License at
hkjung 0:5cd6077e0a8e 10 *
hkjung 0:5cd6077e0a8e 11 * http://www.apache.org/licenses/LICENSE-2.0
hkjung 0:5cd6077e0a8e 12 *
hkjung 0:5cd6077e0a8e 13 * Unless required by applicable law or agreed to in writing, software
hkjung 0:5cd6077e0a8e 14 * distributed under the License is distributed on an "AS IS" BASIS,
hkjung 0:5cd6077e0a8e 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
hkjung 0:5cd6077e0a8e 16 *
hkjung 0:5cd6077e0a8e 17 * See the License for the specific language governing permissions and
hkjung 0:5cd6077e0a8e 18 * limitations under the License.
hkjung 0:5cd6077e0a8e 19 *
hkjung 0:5cd6077e0a8e 20 */
hkjung 0:5cd6077e0a8e 21
hkjung 0:5cd6077e0a8e 22
hkjung 0:5cd6077e0a8e 23 #include <string>
hkjung 0:5cd6077e0a8e 24 #include "mbed.h"
hkjung 0:5cd6077e0a8e 25
hkjung 0:5cd6077e0a8e 26 #define RET_OK 1
hkjung 0:5cd6077e0a8e 27 #define RET_NOK -1
hkjung 0:5cd6077e0a8e 28 #define DEBUG_ENABLE 1
hkjung 0:5cd6077e0a8e 29 #define DEBUG_DISABLE 0
hkjung 0:5cd6077e0a8e 30 #define ON 1
hkjung 0:5cd6077e0a8e 31 #define OFF 0
hkjung 0:5cd6077e0a8e 32
hkjung 0:5cd6077e0a8e 33 #define MAX_BUF_SIZE 1024
hkjung 0:5cd6077e0a8e 34
hkjung 0:5cd6077e0a8e 35 #define BG96_APN_PROTOCOL_IPv4 1
hkjung 0:5cd6077e0a8e 36 #define BG96_APN_PROTOCOL_IPv6 2
hkjung 0:5cd6077e0a8e 37 #define BG96_DEFAULT_TIMEOUT 1000
hkjung 0:5cd6077e0a8e 38 #define BG96_CONNECT_TIMEOUT 15000
hkjung 0:5cd6077e0a8e 39 #define BG96_SEND_TIMEOUT 500
hkjung 0:5cd6077e0a8e 40 #define BG96_RECV_TIMEOUT 500
hkjung 0:5cd6077e0a8e 41
hkjung 0:5cd6077e0a8e 42 #define BG96_APN_PROTOCOL BG96_APN_PROTOCOL_IPv6
hkjung 0:5cd6077e0a8e 43 #define BG96_DEFAULT_BAUD_RATE 115200
hkjung 0:5cd6077e0a8e 44 #define BG96_PARSER_DELIMITER "\r\n"
hkjung 0:5cd6077e0a8e 45
hkjung 0:5cd6077e0a8e 46 #define CATM1_APN_SKT "lte-internet.sktelecom.com"
hkjung 0:5cd6077e0a8e 47
hkjung 0:5cd6077e0a8e 48 #define CATM1_DEVICE_NAME_BG96 "BG96"
hkjung 0:5cd6077e0a8e 49 #define DEVNAME CATM1_DEVICE_NAME_BG96
hkjung 0:5cd6077e0a8e 50
hkjung 0:5cd6077e0a8e 51 #define devlog(f_, ...) if(CATM1_DEVICE_DEBUG == DEBUG_ENABLE) { pc.printf("\r\n[%s] ", DEVNAME); pc.printf((f_), ##__VA_ARGS__); }
hkjung 0:5cd6077e0a8e 52 #define myprintf(f_, ...) {pc.printf("\r\n[MAIN] "); pc.printf((f_), ##__VA_ARGS__);}
hkjung 0:5cd6077e0a8e 53
hkjung 0:5cd6077e0a8e 54 /* Pin configuraiton */
hkjung 0:5cd6077e0a8e 55 // Cat.M1
hkjung 0:5cd6077e0a8e 56 #define MBED_CONF_IOTSHIELD_CATM1_TX D8
hkjung 0:5cd6077e0a8e 57 #define MBED_CONF_IOTSHIELD_CATM1_RX D2
hkjung 1:3e0042d02907 58 #define MBED_CONF_IOTSHIELD_CATM1_RESET D7
hkjung 0:5cd6077e0a8e 59 #define MBED_CONF_IOTSHIELD_CATM1_PWRKEY D9
hkjung 1:3e0042d02907 60
hkjung 0:5cd6077e0a8e 61 // Sensors
hkjung 0:5cd6077e0a8e 62 #define MBED_CONF_IOTSHIELD_SENSOR_CDS A0
hkjung 0:5cd6077e0a8e 63 #define MBED_CONF_IOTSHIELD_SENSOR_TEMP A1
hkjung 0:5cd6077e0a8e 64
hkjung 0:5cd6077e0a8e 65 /* Debug message settings */
hkjung 0:5cd6077e0a8e 66 #define BG96_PARSER_DEBUG DEBUG_DISABLE
hkjung 0:5cd6077e0a8e 67 #define CATM1_DEVICE_DEBUG DEBUG_ENABLE
hkjung 0:5cd6077e0a8e 68
hkjung 1:3e0042d02907 69 /* MQTT */
hkjung 1:3e0042d02907 70 #define MQTT_EOF 0x1A
hkjung 1:3e0042d02907 71
hkjung 1:3e0042d02907 72 // Connection info:
hkjung 1:3e0042d02907 73 // HiveMQ Websocket client(http://www.hivemq.com/demos/websocket-client/)
hkjung 1:3e0042d02907 74 #define MQTT_CLIENTID "clientExample"
hkjung 1:3e0042d02907 75 #define MQTT_USERID "testid"
hkjung 1:3e0042d02907 76 #define MQTT_PASSWORD "testpassword"
hkjung 1:3e0042d02907 77 #define MQTT_QOS0 0
hkjung 1:3e0042d02907 78 #define MQTT_QOS1 1
hkjung 1:3e0042d02907 79 #define MQTT_QOS2 2
hkjung 1:3e0042d02907 80 #define MQTT_RETAIN 0
hkjung 1:3e0042d02907 81
hkjung 1:3e0042d02907 82 #define MQTT_SAMPLE_TOPIC_A "topic/openhouse-A"
hkjung 1:3e0042d02907 83 #define MQTT_SAMPLE_TOPIC_B "topic/openhouse-B"
hkjung 1:3e0042d02907 84 #define MQTT_SAMPLE_TOPIC_C "topic/openhouse-C"
hkjung 1:3e0042d02907 85 #define MQTT_SAMPLE_TOPIC_D "topic/openhouse-D"
hkjung 1:3e0042d02907 86
hkjung 1:3e0042d02907 87 /* MQTT Sample */
hkjung 1:3e0042d02907 88 // MQTT connection state
hkjung 1:3e0042d02907 89 enum {
hkjung 1:3e0042d02907 90 MQTT_STATE_OPEN = 0,
hkjung 1:3e0042d02907 91 MQTT_STATE_CONNECT,
hkjung 1:3e0042d02907 92 MQTT_STATE_CONNECTED,
hkjung 1:3e0042d02907 93 MQTT_STATE_DISCON
hkjung 1:3e0042d02907 94 };
hkjung 1:3e0042d02907 95
hkjung 1:3e0042d02907 96 char mqtt_broker_url[] = "broker.hivemq.com";
hkjung 1:3e0042d02907 97 int mqtt_broker_port = 1883;
hkjung 1:3e0042d02907 98 int mqtt_socket_id = 0;
hkjung 1:3e0042d02907 99
hkjung 0:5cd6077e0a8e 100 // Functions: Module Status
hkjung 0:5cd6077e0a8e 101 void waitCatM1Ready(void);
hkjung 0:5cd6077e0a8e 102 int8_t setEchoStatus_BG96(bool onoff);
hkjung 0:5cd6077e0a8e 103 int8_t getUsimStatus_BG96(void);
hkjung 0:5cd6077e0a8e 104 int8_t getNetworkStatus_BG96(void);
hkjung 0:5cd6077e0a8e 105 int8_t checknSetApn_BG96(const char * apn);
hkjung 0:5cd6077e0a8e 106 int8_t getFirmwareVersion_BG96(char * version);
hkjung 1:3e0042d02907 107 int8_t rebootCatm1_BG96(void);
hkjung 0:5cd6077e0a8e 108
hkjung 0:5cd6077e0a8e 109 // Functions: PDP context
hkjung 0:5cd6077e0a8e 110 int8_t setContextActivate_BG96(void); // Activate a PDP Context
hkjung 0:5cd6077e0a8e 111 int8_t setContextDeactivate_BG96(void); // Deactivate a PDP Context
hkjung 1:3e0042d02907 112 int8_t getIpAddress_BG96(char * ipstr);
hkjung 0:5cd6077e0a8e 113
hkjung 1:3e0042d02907 114 // Functions: MQTT
hkjung 1:3e0042d02907 115 int8_t openMqttBroker_BG96(char * url, int port);
hkjung 1:3e0042d02907 116 int8_t connectMqttBroker_BG96(char * clientid, char * userid, char * password);
hkjung 1:3e0042d02907 117 int8_t closeMqttBroker_BG96(void);
hkjung 1:3e0042d02907 118 int8_t sendMqttPublishMessage_BG96(char * topic, int qos, int retain, char * msg, int len);
hkjung 1:3e0042d02907 119 int8_t setMqttSubscribeTopic_BG96(char * topic, int msgid, int qos);
hkjung 1:3e0042d02907 120 int8_t checkRecvMqttMessage_BG96(char * topic, int * msgid, char * msg);
hkjung 2:b766209b5cff 121
hkjung 0:5cd6077e0a8e 122
hkjung 0:5cd6077e0a8e 123 Serial pc(USBTX, USBRX); // USB debug
hkjung 0:5cd6077e0a8e 124
hkjung 0:5cd6077e0a8e 125 UARTSerial *_serial; // Cat.M1 module
hkjung 0:5cd6077e0a8e 126 ATCmdParser *_parser;
hkjung 0:5cd6077e0a8e 127
hkjung 1:3e0042d02907 128 DigitalOut _RESET_BG96(MBED_CONF_IOTSHIELD_CATM1_RESET);
hkjung 1:3e0042d02907 129 DigitalOut _PWRKEY_BG96(MBED_CONF_IOTSHIELD_CATM1_PWRKEY);
hkjung 1:3e0042d02907 130
hkjung 1:3e0042d02907 131 AnalogIn SENSOR_CDS(MBED_CONF_IOTSHIELD_SENSOR_CDS); // light
hkjung 1:3e0042d02907 132 AnalogIn SENSOR_LM35(MBED_CONF_IOTSHIELD_SENSOR_TEMP); // temperature
hkjung 0:5cd6077e0a8e 133
hkjung 0:5cd6077e0a8e 134 void serialPcInit(void)
hkjung 0:5cd6077e0a8e 135 {
hkjung 0:5cd6077e0a8e 136 pc.baud(115200);
hkjung 0:5cd6077e0a8e 137 pc.format(8, Serial::None, 1);
hkjung 0:5cd6077e0a8e 138 }
hkjung 0:5cd6077e0a8e 139
hkjung 0:5cd6077e0a8e 140 void serialDeviceInit(PinName tx, PinName rx, int baudrate)
hkjung 0:5cd6077e0a8e 141 {
hkjung 0:5cd6077e0a8e 142 _serial = new UARTSerial(tx, rx, baudrate);
hkjung 0:5cd6077e0a8e 143 }
hkjung 0:5cd6077e0a8e 144
hkjung 0:5cd6077e0a8e 145 void serialAtParserInit(const char *delimiter, bool debug_en)
hkjung 0:5cd6077e0a8e 146 {
hkjung 0:5cd6077e0a8e 147 _parser = new ATCmdParser(_serial);
hkjung 0:5cd6077e0a8e 148 _parser->debug_on(debug_en);
hkjung 0:5cd6077e0a8e 149 _parser->set_delimiter(delimiter);
hkjung 0:5cd6077e0a8e 150 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:5cd6077e0a8e 151 }
hkjung 0:5cd6077e0a8e 152
hkjung 0:5cd6077e0a8e 153 void catm1DeviceInit(void)
hkjung 0:5cd6077e0a8e 154 {
hkjung 0:5cd6077e0a8e 155 serialDeviceInit( MBED_CONF_IOTSHIELD_CATM1_TX,
hkjung 0:5cd6077e0a8e 156 MBED_CONF_IOTSHIELD_CATM1_RX,
hkjung 0:5cd6077e0a8e 157 BG96_DEFAULT_BAUD_RATE);
hkjung 0:5cd6077e0a8e 158
hkjung 0:5cd6077e0a8e 159 serialAtParserInit( BG96_PARSER_DELIMITER,
hkjung 0:5cd6077e0a8e 160 BG96_PARSER_DEBUG);
hkjung 0:5cd6077e0a8e 161 }
hkjung 0:5cd6077e0a8e 162
hkjung 1:3e0042d02907 163 void catm1DeviceReset_BG96(void)
hkjung 1:3e0042d02907 164 {
hkjung 1:3e0042d02907 165 _RESET_BG96 = 1;
hkjung 1:3e0042d02907 166 _PWRKEY_BG96 = 1;
hkjung 1:3e0042d02907 167 wait_ms(300);
hkjung 0:5cd6077e0a8e 168
hkjung 1:3e0042d02907 169 _RESET_BG96 = 0;
hkjung 1:3e0042d02907 170 _PWRKEY_BG96 = 0;
hkjung 1:3e0042d02907 171 wait_ms(400);
hkjung 0:5cd6077e0a8e 172
hkjung 1:3e0042d02907 173 _RESET_BG96 = 1;
hkjung 1:3e0042d02907 174 wait_ms(1000);
hkjung 0:5cd6077e0a8e 175 }
hkjung 0:5cd6077e0a8e 176
hkjung 1:3e0042d02907 177
hkjung 1:3e0042d02907 178 // ----------------------------------------------------------------
hkjung 1:3e0042d02907 179 // Main routine
hkjung 1:3e0042d02907 180 // ----------------------------------------------------------------
hkjung 1:3e0042d02907 181
hkjung 0:5cd6077e0a8e 182 int main()
hkjung 0:5cd6077e0a8e 183 {
hkjung 0:5cd6077e0a8e 184 serialPcInit();
hkjung 0:5cd6077e0a8e 185 catm1DeviceInit();
hkjung 0:5cd6077e0a8e 186
hkjung 0:5cd6077e0a8e 187 myprintf("Waiting for Cat.M1 Module Ready...\r\n");
hkjung 0:5cd6077e0a8e 188
hkjung 1:3e0042d02907 189 catm1DeviceReset_BG96();
hkjung 0:5cd6077e0a8e 190
hkjung 0:5cd6077e0a8e 191 waitCatM1Ready();
hkjung 1:3e0042d02907 192
hkjung 1:3e0042d02907 193 wait_ms(5000);
hkjung 0:5cd6077e0a8e 194
hkjung 0:5cd6077e0a8e 195 myprintf("System Init Complete\r\n");
hkjung 0:5cd6077e0a8e 196
hkjung 0:5cd6077e0a8e 197 myprintf("WIZnet IoT Shield for Arm MBED");
hkjung 0:5cd6077e0a8e 198 myprintf("LTE Cat.M1 Version");
hkjung 0:5cd6077e0a8e 199 myprintf("=================================================");
hkjung 0:5cd6077e0a8e 200 myprintf(">> Target Board: WIoT-QC01 (Quectel BG96)");
hkjung 1:3e0042d02907 201 myprintf(">> Sample Code: MQTT Publish & Subscribe");
hkjung 0:5cd6077e0a8e 202 myprintf("=================================================\r\n");
hkjung 1:3e0042d02907 203
hkjung 0:5cd6077e0a8e 204 setEchoStatus_BG96(OFF);
hkjung 0:5cd6077e0a8e 205
hkjung 0:5cd6077e0a8e 206 getUsimStatus_BG96();
hkjung 0:5cd6077e0a8e 207
hkjung 0:5cd6077e0a8e 208 getNetworkStatus_BG96();
hkjung 0:5cd6077e0a8e 209
hkjung 0:5cd6077e0a8e 210 checknSetApn_BG96(CATM1_APN_SKT);
hkjung 0:5cd6077e0a8e 211
hkjung 1:3e0042d02907 212 int mqtt_state = MQTT_STATE_OPEN;
hkjung 0:5cd6077e0a8e 213
hkjung 1:3e0042d02907 214 // MQTT Connect phase
hkjung 1:3e0042d02907 215 //----------------------------------------
hkjung 1:3e0042d02907 216 myprintf("[MQTT] Try to connect to broker \"%s:%d\"\r\n", mqtt_broker_url, mqtt_broker_port);
hkjung 0:5cd6077e0a8e 217
hkjung 1:3e0042d02907 218 do {
hkjung 1:3e0042d02907 219 switch(mqtt_state) {
hkjung 1:3e0042d02907 220 case MQTT_STATE_OPEN:
hkjung 1:3e0042d02907 221 if(openMqttBroker_BG96(mqtt_broker_url, mqtt_broker_port) == RET_OK) {
hkjung 1:3e0042d02907 222 myprintf("[MQTT] Socket open success\r\n");
hkjung 1:3e0042d02907 223 mqtt_state = MQTT_STATE_CONNECT;
hkjung 1:3e0042d02907 224 } else {
hkjung 1:3e0042d02907 225 myprintf("[MQTT] Socket open failed\r\n");
hkjung 1:3e0042d02907 226 }
hkjung 1:3e0042d02907 227 break;
hkjung 1:3e0042d02907 228
hkjung 1:3e0042d02907 229 case MQTT_STATE_CONNECT:
hkjung 1:3e0042d02907 230 if(connectMqttBroker_BG96(MQTT_CLIENTID, MQTT_USERID, MQTT_PASSWORD) == RET_OK) {
hkjung 1:3e0042d02907 231 myprintf("[MQTT] Connected, ClientID: \"%s\"\r\n", MQTT_CLIENTID);
hkjung 1:3e0042d02907 232 mqtt_state = MQTT_STATE_CONNECTED;
hkjung 1:3e0042d02907 233 } else {
hkjung 1:3e0042d02907 234 myprintf("[MQTT] Connect failed\r\n");
hkjung 1:3e0042d02907 235 mqtt_state = MQTT_STATE_DISCON;
hkjung 1:3e0042d02907 236 }
hkjung 1:3e0042d02907 237 break;
hkjung 1:3e0042d02907 238
hkjung 1:3e0042d02907 239 case MQTT_STATE_DISCON:
hkjung 1:3e0042d02907 240 if(closeMqttBroker_BG96() == RET_OK) {
hkjung 1:3e0042d02907 241 myprintf("[MQTT] Disconnected\r\n");
hkjung 1:3e0042d02907 242 }
hkjung 1:3e0042d02907 243 mqtt_state = MQTT_STATE_OPEN;
hkjung 1:3e0042d02907 244 break;
hkjung 1:3e0042d02907 245
hkjung 1:3e0042d02907 246 default:
hkjung 1:3e0042d02907 247 mqtt_state = MQTT_STATE_OPEN;
hkjung 1:3e0042d02907 248 break;
hkjung 1:3e0042d02907 249 }
hkjung 1:3e0042d02907 250 } while(mqtt_state != MQTT_STATE_CONNECTED);
hkjung 1:3e0042d02907 251
hkjung 1:3e0042d02907 252 // MQTT Publish & Subscribe phase
hkjung 1:3e0042d02907 253 //----------------------------------------
hkjung 1:3e0042d02907 254 if(mqtt_state == MQTT_STATE_CONNECTED) {
hkjung 1:3e0042d02907 255 char mqtt_message_b[] = "Hello IoT Open House B";
hkjung 1:3e0042d02907 256 char mqtt_message_c[] = "Hello IoT Open House C";
hkjung 0:5cd6077e0a8e 257
hkjung 1:3e0042d02907 258 // MQTT Subscribe
hkjung 1:3e0042d02907 259 if(setMqttSubscribeTopic_BG96(MQTT_SAMPLE_TOPIC_A, 1, MQTT_QOS0) == RET_OK) {
hkjung 1:3e0042d02907 260 myprintf("[MQTT] Subscribe Topic: \"%s\", ID: %d, QoS: %d\r\n", MQTT_SAMPLE_TOPIC_A, 1, MQTT_QOS0);
hkjung 1:3e0042d02907 261 }
hkjung 1:3e0042d02907 262 #if 0
hkjung 1:3e0042d02907 263 if(setMqttSubscribeTopic_BG96(MQTT_SAMPLE_TOPIC_D, 2, MQTT_QOS2) == RET_OK) {
hkjung 1:3e0042d02907 264 myprintf("[MQTT] Subscribe Topic: \"%s\", ID: %d, QoS: %d\r\n", MQTT_SAMPLE_TOPIC_D, 2, MQTT_QOS0);
hkjung 1:3e0042d02907 265 }
hkjung 1:3e0042d02907 266 #endif
hkjung 1:3e0042d02907 267 // MQTT Publish test
hkjung 1:3e0042d02907 268 if(sendMqttPublishMessage_BG96(MQTT_SAMPLE_TOPIC_B, MQTT_QOS1, MQTT_RETAIN, mqtt_message_b, strlen(mqtt_message_b)) == RET_OK) {
hkjung 1:3e0042d02907 269 myprintf("[MQTT] Published Topic: \"%s\", Message: \"%s\"\r\n", MQTT_SAMPLE_TOPIC_B, mqtt_message_b);
hkjung 1:3e0042d02907 270 }
hkjung 0:5cd6077e0a8e 271
hkjung 1:3e0042d02907 272 if(sendMqttPublishMessage_BG96(MQTT_SAMPLE_TOPIC_C, MQTT_QOS1, MQTT_RETAIN, mqtt_message_c, strlen(mqtt_message_c)) == RET_OK) {
hkjung 1:3e0042d02907 273 myprintf("[MQTT] Published Topic: \"%s\", Message: \"%s\"\r\n", MQTT_SAMPLE_TOPIC_C, mqtt_message_c);
hkjung 1:3e0042d02907 274 }
hkjung 1:3e0042d02907 275 }
hkjung 1:3e0042d02907 276
hkjung 1:3e0042d02907 277 char buf_mqtt_topic[100] = {0, };
hkjung 1:3e0042d02907 278 char buf_mqtt_msg[200] = {0, };
hkjung 1:3e0042d02907 279 int mqtt_msgid = 0;
hkjung 1:3e0042d02907 280
hkjung 1:3e0042d02907 281 // MQTT Subscribe test
hkjung 1:3e0042d02907 282 while(1)
hkjung 1:3e0042d02907 283 {
hkjung 1:3e0042d02907 284 // MQTT message received
hkjung 1:3e0042d02907 285 if(checkRecvMqttMessage_BG96(buf_mqtt_topic, &mqtt_msgid, buf_mqtt_msg) == RET_OK) {
hkjung 1:3e0042d02907 286 myprintf("[MQTT] Subscribed Topic: \"%s\" ID: %d, Message: \"%s\"\r\n", buf_mqtt_topic, mqtt_msgid, buf_mqtt_msg);
hkjung 1:3e0042d02907 287 }
hkjung 1:3e0042d02907 288 }
hkjung 0:5cd6077e0a8e 289 }
hkjung 0:5cd6077e0a8e 290
hkjung 1:3e0042d02907 291
hkjung 1:3e0042d02907 292 // ----------------------------------------------------------------
hkjung 1:3e0042d02907 293 // Functions: Cat.M1 Status
hkjung 1:3e0042d02907 294 // ----------------------------------------------------------------
hkjung 1:3e0042d02907 295
hkjung 0:5cd6077e0a8e 296 void waitCatM1Ready(void)
hkjung 0:5cd6077e0a8e 297 {
hkjung 0:5cd6077e0a8e 298 while(1)
hkjung 0:5cd6077e0a8e 299 {
hkjung 0:5cd6077e0a8e 300 if(_parser->recv("RDY"))
hkjung 0:5cd6077e0a8e 301 {
hkjung 0:5cd6077e0a8e 302 myprintf("BG96 ready\r\n");
hkjung 0:5cd6077e0a8e 303 return ;
hkjung 0:5cd6077e0a8e 304 }
hkjung 0:5cd6077e0a8e 305 else if(_parser->send("AT") && _parser->recv("OK"))
hkjung 0:5cd6077e0a8e 306 {
hkjung 0:5cd6077e0a8e 307 myprintf("BG96 already available\r\n");
hkjung 0:5cd6077e0a8e 308 return ;
hkjung 0:5cd6077e0a8e 309 }
hkjung 0:5cd6077e0a8e 310 }
hkjung 0:5cd6077e0a8e 311 }
hkjung 0:5cd6077e0a8e 312
hkjung 0:5cd6077e0a8e 313 int8_t setEchoStatus_BG96(bool onoff)
hkjung 0:5cd6077e0a8e 314 {
hkjung 0:5cd6077e0a8e 315 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 316 char _buf[10];
hkjung 0:5cd6077e0a8e 317
hkjung 0:5cd6077e0a8e 318 sprintf((char *)_buf, "ATE%d", onoff);
hkjung 0:5cd6077e0a8e 319
hkjung 0:5cd6077e0a8e 320 if(_parser->send(_buf) && _parser->recv("OK")) {
hkjung 0:5cd6077e0a8e 321 devlog("Turn Echo %s success\r\n", onoff?"ON":"OFF");
hkjung 0:5cd6077e0a8e 322 ret = RET_OK;
hkjung 0:5cd6077e0a8e 323 } else {
hkjung 0:5cd6077e0a8e 324 devlog("Turn Echo %s failed\r\n", onoff?"ON":"OFF");
hkjung 0:5cd6077e0a8e 325 }
hkjung 0:5cd6077e0a8e 326 return ret;
hkjung 0:5cd6077e0a8e 327 }
hkjung 0:5cd6077e0a8e 328
hkjung 0:5cd6077e0a8e 329 int8_t getUsimStatus_BG96(void)
hkjung 0:5cd6077e0a8e 330 {
hkjung 0:5cd6077e0a8e 331 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 332
hkjung 0:5cd6077e0a8e 333 _parser->send("AT+CPIN?");
hkjung 0:5cd6077e0a8e 334 if(_parser->recv("+CPIN: READY") && _parser->recv("OK")) {
hkjung 0:5cd6077e0a8e 335 devlog("USIM Status: READY\r\n");
hkjung 0:5cd6077e0a8e 336 ret = RET_OK;
hkjung 0:5cd6077e0a8e 337 } else {
hkjung 0:5cd6077e0a8e 338 devlog("Retrieving USIM Status failed\r\n");
hkjung 0:5cd6077e0a8e 339 }
hkjung 0:5cd6077e0a8e 340 return ret;
hkjung 0:5cd6077e0a8e 341 }
hkjung 0:5cd6077e0a8e 342
hkjung 0:5cd6077e0a8e 343 int8_t getNetworkStatus_BG96(void)
hkjung 0:5cd6077e0a8e 344 {
hkjung 0:5cd6077e0a8e 345 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 346
hkjung 0:5cd6077e0a8e 347 if(_parser->send("AT+QCDS") && _parser->recv("+QCDS: \"SRV\"") && _parser->recv("OK")) {
hkjung 0:5cd6077e0a8e 348 devlog("Network Status: attached\r\n");
hkjung 0:5cd6077e0a8e 349 ret = RET_OK;
hkjung 0:5cd6077e0a8e 350 } else if (_parser->send("AT+QCDS") && _parser->recv("+QCDS: \"LIMITED\"") && _parser->recv("OK")) {
hkjung 0:5cd6077e0a8e 351 devlog("Network Status: limited\r\n");
hkjung 0:5cd6077e0a8e 352 ret = RET_OK;
hkjung 0:5cd6077e0a8e 353 } else {
hkjung 0:5cd6077e0a8e 354 devlog("Network Status: Error\r\n");
hkjung 0:5cd6077e0a8e 355 }
hkjung 0:5cd6077e0a8e 356 return ret;
hkjung 0:5cd6077e0a8e 357 }
hkjung 0:5cd6077e0a8e 358
hkjung 0:5cd6077e0a8e 359 int8_t checknSetApn_BG96(const char * apn) // Configure Parameters of a TCP/IP Context
hkjung 0:5cd6077e0a8e 360 {
hkjung 0:5cd6077e0a8e 361 char resp_str[100];
hkjung 0:5cd6077e0a8e 362
hkjung 0:5cd6077e0a8e 363 uint16_t i = 0;
hkjung 0:5cd6077e0a8e 364 char * search_pt;
hkjung 0:5cd6077e0a8e 365
hkjung 0:5cd6077e0a8e 366 memset(resp_str, 0, sizeof(resp_str));
hkjung 0:5cd6077e0a8e 367
hkjung 0:5cd6077e0a8e 368 devlog("Checking APN...\r\n");
hkjung 0:5cd6077e0a8e 369
hkjung 0:5cd6077e0a8e 370 _parser->send("AT+QICSGP=1");
hkjung 0:5cd6077e0a8e 371
hkjung 0:5cd6077e0a8e 372 while(1)
hkjung 0:5cd6077e0a8e 373 {
hkjung 0:5cd6077e0a8e 374 _parser->read(&resp_str[i++], 1);
hkjung 0:5cd6077e0a8e 375 search_pt = strstr(resp_str, "OK\r\n");
hkjung 0:5cd6077e0a8e 376 if (search_pt != 0)
hkjung 0:5cd6077e0a8e 377 {
hkjung 0:5cd6077e0a8e 378 break;
hkjung 0:5cd6077e0a8e 379 }
hkjung 0:5cd6077e0a8e 380 }
hkjung 0:5cd6077e0a8e 381
hkjung 0:5cd6077e0a8e 382 search_pt = strstr(resp_str, apn);
hkjung 0:5cd6077e0a8e 383 if (search_pt == 0)
hkjung 0:5cd6077e0a8e 384 {
hkjung 0:5cd6077e0a8e 385 devlog("Mismatched APN: %s\r\n", resp_str);
hkjung 0:5cd6077e0a8e 386 devlog("Storing APN %s...\r\n", apn);
hkjung 0:5cd6077e0a8e 387 if(!(_parser->send("AT+QICSGP=1,%d,\"%s\",\"\",\"\",0", BG96_APN_PROTOCOL, apn) && _parser->recv("OK")))
hkjung 0:5cd6077e0a8e 388 {
hkjung 0:5cd6077e0a8e 389 return RET_NOK; // failed
hkjung 0:5cd6077e0a8e 390 }
hkjung 0:5cd6077e0a8e 391 }
hkjung 1:3e0042d02907 392 devlog("APN Check Done\r\n");
hkjung 1:3e0042d02907 393
hkjung 0:5cd6077e0a8e 394 return RET_OK;
hkjung 0:5cd6077e0a8e 395 }
hkjung 0:5cd6077e0a8e 396
hkjung 0:5cd6077e0a8e 397 int8_t getFirmwareVersion_BG96(char * version)
hkjung 0:5cd6077e0a8e 398 {
hkjung 0:5cd6077e0a8e 399 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 400
hkjung 0:5cd6077e0a8e 401 if(_parser->send("AT+QGMR") && _parser->recv("%s\n", version) && _parser->recv("OK"))
hkjung 0:5cd6077e0a8e 402 {
hkjung 0:5cd6077e0a8e 403 ret = RET_OK;
hkjung 0:5cd6077e0a8e 404 }
hkjung 0:5cd6077e0a8e 405 return ret;
hkjung 0:5cd6077e0a8e 406 }
hkjung 0:5cd6077e0a8e 407
hkjung 0:5cd6077e0a8e 408 int8_t getImeiNumber_BG96(char * imei)
hkjung 0:5cd6077e0a8e 409 {
hkjung 0:5cd6077e0a8e 410 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 411
hkjung 0:5cd6077e0a8e 412 if(_parser->send("AT+CGSN") && _parser->recv("%s\n", imei) && _parser->recv("OK"))
hkjung 0:5cd6077e0a8e 413 {
hkjung 0:5cd6077e0a8e 414 ret = RET_OK;
hkjung 0:5cd6077e0a8e 415 }
hkjung 0:5cd6077e0a8e 416 return ret;
hkjung 0:5cd6077e0a8e 417 }
hkjung 0:5cd6077e0a8e 418
hkjung 1:3e0042d02907 419 int8_t rebootCatm1_BG96(void)
hkjung 0:5cd6077e0a8e 420 {
hkjung 0:5cd6077e0a8e 421 int8_t ret = RET_NOK;
hkjung 1:3e0042d02907 422 if(_parser->send("AT+CFUN=1,1") && _parser->recv("OK")) {
hkjung 1:3e0042d02907 423 devlog("Cat.M1 module reboot\r\n");
hkjung 0:5cd6077e0a8e 424 ret = RET_OK;
hkjung 0:5cd6077e0a8e 425 }
hkjung 0:5cd6077e0a8e 426 return ret;
hkjung 0:5cd6077e0a8e 427 }
hkjung 0:5cd6077e0a8e 428
hkjung 1:3e0042d02907 429 // ----------------------------------------------------------------
hkjung 1:3e0042d02907 430 // Functions: Cat.M1 MQTT Publish & Subscribe
hkjung 1:3e0042d02907 431 // ----------------------------------------------------------------
hkjung 1:3e0042d02907 432
hkjung 1:3e0042d02907 433 int8_t openMqttBroker_BG96(char * url, int port)
hkjung 0:5cd6077e0a8e 434 {
hkjung 1:3e0042d02907 435 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 436 int id = 0;
hkjung 1:3e0042d02907 437 int result = 0;
hkjung 0:5cd6077e0a8e 438
hkjung 0:5cd6077e0a8e 439 bool done = false;
hkjung 0:5cd6077e0a8e 440 Timer t;
hkjung 0:5cd6077e0a8e 441
hkjung 1:3e0042d02907 442 t.start();
hkjung 1:3e0042d02907 443 if(_parser->send("AT+QMTOPEN=%d,\"%s\",%d", id, url, port) && _parser->recv("OK")) {
hkjung 1:3e0042d02907 444 do {
hkjung 1:3e0042d02907 445 done = (_parser->recv("+QMTOPEN: %d,%d", &id, &result) && (result == 0));
hkjung 1:3e0042d02907 446
hkjung 1:3e0042d02907 447 // MQTT Open: result code sample, refer to BG96_MQTT_Application_Note
hkjung 1:3e0042d02907 448 if(result == 1) {
hkjung 1:3e0042d02907 449 devlog("AT+QMTOPEN result[%d]: %s", 1, "Wrong parameter");
hkjung 1:3e0042d02907 450 } else if (result == 2) {
hkjung 1:3e0042d02907 451 devlog("AT+QMTOPEN result[%d]: %s", 2, "MQTT identifier is occupied");
hkjung 1:3e0042d02907 452 } else if (result == 3) {
hkjung 1:3e0042d02907 453 devlog("AT+QMTOPEN result[%d]: %s", 3, "Failed to activate PDP");
hkjung 1:3e0042d02907 454 } else if (result == 4) {
hkjung 1:3e0042d02907 455 devlog("AT+QMTOPEN result[%d]: %s", 4, "Failed to parse domain name");
hkjung 1:3e0042d02907 456 } else if (result == 5) {
hkjung 1:3e0042d02907 457 devlog("AT+QMTOPEN result[%d]: %s", 5, "Network disconnection error");
hkjung 1:3e0042d02907 458 }
hkjung 1:3e0042d02907 459 } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT);
hkjung 1:3e0042d02907 460
hkjung 1:3e0042d02907 461 if(done) {
hkjung 1:3e0042d02907 462 ret = RET_OK;
hkjung 1:3e0042d02907 463 }
hkjung 1:3e0042d02907 464 }
hkjung 1:3e0042d02907 465 _parser->flush();
hkjung 0:5cd6077e0a8e 466
hkjung 1:3e0042d02907 467 return ret;
hkjung 1:3e0042d02907 468 }
hkjung 0:5cd6077e0a8e 469
hkjung 1:3e0042d02907 470 int8_t connectMqttBroker_BG96(char * clientid, char * userid, char * password)
hkjung 1:3e0042d02907 471 {
hkjung 1:3e0042d02907 472 int8_t ret = RET_NOK;
hkjung 1:3e0042d02907 473 int id = 0;
hkjung 1:3e0042d02907 474 int result = 0;
hkjung 1:3e0042d02907 475 int ret_code = 0;
hkjung 1:3e0042d02907 476
hkjung 1:3e0042d02907 477 bool done = false;
hkjung 1:3e0042d02907 478 Timer t;
hkjung 0:5cd6077e0a8e 479
hkjung 1:3e0042d02907 480 if((userid != NULL) && (password != NULL)) {
hkjung 1:3e0042d02907 481 _parser->send("AT+QMTCONN=%d,\"%s\",\"%s\",\"%s\"", id, clientid, userid, password);
hkjung 1:3e0042d02907 482 } else {
hkjung 1:3e0042d02907 483 _parser->send("AT+QMTCONN=%d,\"%s\"", id, clientid);
hkjung 1:3e0042d02907 484 }
hkjung 1:3e0042d02907 485
hkjung 1:3e0042d02907 486 t.start();
hkjung 1:3e0042d02907 487 if(_parser->recv("OK"))
hkjung 1:3e0042d02907 488 {
hkjung 1:3e0042d02907 489 do {
hkjung 1:3e0042d02907 490 done = (_parser->recv("+QMTCONN: %d,%d,%d", &id, &result, &ret_code)
hkjung 1:3e0042d02907 491 && (result == 0) && (ret_code == 0));
hkjung 1:3e0042d02907 492
hkjung 1:3e0042d02907 493 // MQTT Connect: result sample, refer to BG96_MQTT_Application_Note
hkjung 1:3e0042d02907 494 if(result == 1) {
hkjung 1:3e0042d02907 495 devlog("AT+QMTCONN result[%d]: %s", 1, "Packet retransmission");
hkjung 1:3e0042d02907 496 } else if (result == 2) {
hkjung 1:3e0042d02907 497 devlog("AT+QMTCONN result[%d]: %s", 2, "Failed to send packet");
hkjung 1:3e0042d02907 498 }
hkjung 1:3e0042d02907 499
hkjung 1:3e0042d02907 500 // MQTT Connect: ret_code sample, refer to BG96_MQTT_Application_Note
hkjung 1:3e0042d02907 501 if(result == 1) {
hkjung 1:3e0042d02907 502 devlog("AT+QMTCONN ret_code[%d]: %s", 1, "Connection Refused: Unacceptable Protocol Version");
hkjung 1:3e0042d02907 503 } else if (result == 2) {
hkjung 1:3e0042d02907 504 devlog("AT+QMTCONN ret_code[%d]: %s", 2, "Connection Refused: Identifier Rejected");
hkjung 1:3e0042d02907 505 } else if (result == 3) {
hkjung 1:3e0042d02907 506 devlog("AT+QMTCONN ret_code[%d]: %s", 3, "Connection Refused: Server Unavailable");
hkjung 1:3e0042d02907 507 } else if (result == 4) {
hkjung 1:3e0042d02907 508 devlog("AT+QMTCONN ret_code[%d]: %s", 4, "Connection Refused: Bad User Name or Password");
hkjung 1:3e0042d02907 509 } else if (result == 5) {
hkjung 1:3e0042d02907 510 devlog("AT+QMTCONN ret_code[%d]: %s", 5, "Connection Refused: Not Authorized");
hkjung 1:3e0042d02907 511 }
hkjung 1:3e0042d02907 512 } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT*2);
hkjung 1:3e0042d02907 513
hkjung 1:3e0042d02907 514 if(done) {
hkjung 1:3e0042d02907 515 ret = RET_OK;
hkjung 1:3e0042d02907 516 }
hkjung 1:3e0042d02907 517 }
hkjung 1:3e0042d02907 518 _parser->flush();
hkjung 1:3e0042d02907 519
hkjung 1:3e0042d02907 520 return ret;
hkjung 1:3e0042d02907 521 }
hkjung 0:5cd6077e0a8e 522
hkjung 1:3e0042d02907 523 int8_t closeMqttBroker_BG96(void)
hkjung 1:3e0042d02907 524 {
hkjung 1:3e0042d02907 525 int8_t ret = RET_NOK;
hkjung 1:3e0042d02907 526 int id = 0;
hkjung 1:3e0042d02907 527 int result = 0;
hkjung 1:3e0042d02907 528
hkjung 1:3e0042d02907 529 bool done = false;
hkjung 1:3e0042d02907 530 Timer t;
hkjung 1:3e0042d02907 531
hkjung 1:3e0042d02907 532 t.start();
hkjung 1:3e0042d02907 533 if(_parser->send("AT+QMTDISC=%d", id) && _parser->recv("OK")) {
hkjung 1:3e0042d02907 534 do {
hkjung 1:3e0042d02907 535 done = (_parser->recv("+QMTDISC: %d,%d", &id, &result));
hkjung 1:3e0042d02907 536 } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT*2);
hkjung 1:3e0042d02907 537
hkjung 1:3e0042d02907 538 if(done) {
hkjung 1:3e0042d02907 539 ret = RET_OK;
hkjung 1:3e0042d02907 540 }
hkjung 1:3e0042d02907 541 }
hkjung 0:5cd6077e0a8e 542 _parser->flush();
hkjung 0:5cd6077e0a8e 543
hkjung 0:5cd6077e0a8e 544 return ret;
hkjung 0:5cd6077e0a8e 545 }
hkjung 0:5cd6077e0a8e 546
hkjung 1:3e0042d02907 547
hkjung 1:3e0042d02907 548 int8_t sendMqttPublishMessage_BG96(char * topic, int qos, int retain, char * msg, int len)
hkjung 0:5cd6077e0a8e 549 {
hkjung 0:5cd6077e0a8e 550 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 551 int id = 0;
hkjung 1:3e0042d02907 552 int result = 0;
hkjung 1:3e0042d02907 553 int sent_msgid = 0;
hkjung 1:3e0042d02907 554 static int msgid = 0;
hkjung 0:5cd6077e0a8e 555
hkjung 1:3e0042d02907 556 bool done = false;
hkjung 1:3e0042d02907 557 Timer t;
hkjung 0:5cd6077e0a8e 558
hkjung 1:3e0042d02907 559 if(qos != 0) {
hkjung 1:3e0042d02907 560 if(msgid < 0xffff)
hkjung 1:3e0042d02907 561 msgid++;
hkjung 1:3e0042d02907 562 else
hkjung 1:3e0042d02907 563 msgid = 0;
hkjung 0:5cd6077e0a8e 564 }
hkjung 0:5cd6077e0a8e 565
hkjung 1:3e0042d02907 566 t.start();
hkjung 1:3e0042d02907 567 _parser->send("AT+QMTPUB=%d,%d,%d,%d,\"%s\"", id, qos?msgid:0, qos, retain, topic);
hkjung 1:3e0042d02907 568
hkjung 1:3e0042d02907 569 if( !done && _parser->recv(">") )
hkjung 1:3e0042d02907 570 done = (_parser->write(msg, len) <= 0) & _parser->send("%c", MQTT_EOF);
hkjung 0:5cd6077e0a8e 571
hkjung 1:3e0042d02907 572 if(_parser->recv("OK")) {
hkjung 1:3e0042d02907 573 do {
hkjung 1:3e0042d02907 574 done = (_parser->recv("+QMTPUB: %d,%d,%d", &id, &sent_msgid, &result));
hkjung 1:3e0042d02907 575 } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT*2);
hkjung 1:3e0042d02907 576
hkjung 1:3e0042d02907 577 if(done) {
hkjung 1:3e0042d02907 578 ret = RET_OK;
hkjung 1:3e0042d02907 579 }
hkjung 1:3e0042d02907 580 }
hkjung 1:3e0042d02907 581 _parser->flush();
hkjung 0:5cd6077e0a8e 582
hkjung 0:5cd6077e0a8e 583 return ret;
hkjung 0:5cd6077e0a8e 584 }
hkjung 0:5cd6077e0a8e 585
hkjung 1:3e0042d02907 586 int8_t setMqttSubscribeTopic_BG96(char * topic, int msgid, int qos)
hkjung 0:5cd6077e0a8e 587 {
hkjung 0:5cd6077e0a8e 588 int8_t ret = RET_NOK;
hkjung 0:5cd6077e0a8e 589 int id = 0;
hkjung 1:3e0042d02907 590 int result = 0;
hkjung 1:3e0042d02907 591
hkjung 1:3e0042d02907 592 int sent_msgid = 0;
hkjung 1:3e0042d02907 593 int qos_level = 0;
hkjung 0:5cd6077e0a8e 594
hkjung 1:3e0042d02907 595 bool done = false;
hkjung 1:3e0042d02907 596 Timer t;
hkjung 1:3e0042d02907 597
hkjung 1:3e0042d02907 598 _parser->set_timeout(BG96_CONNECT_TIMEOUT);
hkjung 1:3e0042d02907 599
hkjung 1:3e0042d02907 600 t.start();
hkjung 1:3e0042d02907 601 if(_parser->send("AT+QMTSUB=%d,%d,\"%s\",%d", id, msgid, topic, qos) && _parser->recv("OK")) {
hkjung 1:3e0042d02907 602 do {
hkjung 1:3e0042d02907 603 done = (_parser->recv("+QMTSUB: %d,%d,%d,%d", &id, &sent_msgid, &result, &qos_level));
hkjung 1:3e0042d02907 604 } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT);
hkjung 1:3e0042d02907 605
hkjung 1:3e0042d02907 606 if(done) {
hkjung 1:3e0042d02907 607 ret = RET_OK;
hkjung 1:3e0042d02907 608 }
hkjung 1:3e0042d02907 609 }
hkjung 1:3e0042d02907 610 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:5cd6077e0a8e 611 _parser->flush();
hkjung 0:5cd6077e0a8e 612
hkjung 0:5cd6077e0a8e 613 return ret;
hkjung 0:5cd6077e0a8e 614 }
hkjung 1:3e0042d02907 615
hkjung 1:3e0042d02907 616 int8_t checkRecvMqttMessage_BG96(char * topic, int * msgid, char * msg)
hkjung 1:3e0042d02907 617 {
hkjung 1:3e0042d02907 618 int8_t ret = RET_NOK;
hkjung 1:3e0042d02907 619 int id = 0;
hkjung 3:e5d7640ce142 620 int idx = 0;
hkjung 3:e5d7640ce142 621 char * search_pt;
hkjung 3:e5d7640ce142 622 bool done = false;
hkjung 3:e5d7640ce142 623 bool received = false;
hkjung 3:e5d7640ce142 624 Timer t;
hkjung 3:e5d7640ce142 625
hkjung 3:e5d7640ce142 626 _parser->set_timeout(1);
hkjung 3:e5d7640ce142 627 received = _parser->recv("+QMTRECV: %d,%d,\"%[^\"]\",", &id, msgid, topic);
hkjung 3:e5d7640ce142 628 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 3:e5d7640ce142 629
hkjung 3:e5d7640ce142 630 if(received) {
hkjung 3:e5d7640ce142 631 idx = 0;
hkjung 3:e5d7640ce142 632 t.start();
hkjung 3:e5d7640ce142 633 do {
hkjung 3:e5d7640ce142 634 _parser->read(&msg[idx++], 1);
hkjung 3:e5d7640ce142 635 search_pt = strstr(msg, "\r\n");
hkjung 3:e5d7640ce142 636 if (search_pt != 0) {
hkjung 3:e5d7640ce142 637 done = true; // break;
hkjung 3:e5d7640ce142 638 ret = RET_OK;
hkjung 3:e5d7640ce142 639 }
hkjung 3:e5d7640ce142 640 } while(!done && (t.read_ms() < BG96_DEFAULT_TIMEOUT));
hkjung 3:e5d7640ce142 641 t.stop();
hkjung 3:e5d7640ce142 642 }
hkjung 3:e5d7640ce142 643 return ret;
hkjung 3:e5d7640ce142 644
hkjung 3:e5d7640ce142 645 /*
hkjung 3:e5d7640ce142 646 // Simple ver.
hkjung 3:e5d7640ce142 647 int8_t ret = RET_NOK;
hkjung 3:e5d7640ce142 648 int id = 0;
hkjung 1:3e0042d02907 649 bool received = false;
hkjung 1:3e0042d02907 650
hkjung 1:3e0042d02907 651 _parser->set_timeout(1);
hkjung 1:3e0042d02907 652 received = _parser->recv("+QMTRECV: %d,%d,\"%[^\"]\",\"%[^\"]\"", &id, msgid, topic, msg);
hkjung 3:e5d7640ce142 653 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 3:e5d7640ce142 654
hkjung 3:e5d7640ce142 655 if(received) ret = RET_OK;
hkjung 1:3e0042d02907 656 return ret;
hkjung 3:e5d7640ce142 657 */
hkjung 1:3e0042d02907 658 }