Eric Jung / Mbed OS WIZnet-IoTShield-BG96-TCP
Committer:
hkjung
Date:
Sat Mar 16 09:04:43 2019 +0000
Revision:
1:35abb05061e0
Parent:
0:8f339a252825
Child:
2:46cc35700e0e
Added the variables for destination IP address and port

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hkjung 0:8f339a252825 1 /* WIZnet IoT Shield Cat.M1 Sample code for Arm MBED
hkjung 0:8f339a252825 2 * Copyright (c) 2019 WIZnet Co., Ltd.
hkjung 0:8f339a252825 3 * SPDX-License-Identifier: Apache-2.0
hkjung 0:8f339a252825 4 */
hkjung 0:8f339a252825 5
hkjung 0:8f339a252825 6 #include <string>
hkjung 0:8f339a252825 7 #include "mbed.h"
hkjung 0:8f339a252825 8
hkjung 0:8f339a252825 9
hkjung 0:8f339a252825 10 #define RET_OK 1
hkjung 0:8f339a252825 11 #define RET_NOK -1
hkjung 0:8f339a252825 12 #define DEBUG_ENABLE 1
hkjung 0:8f339a252825 13 #define DEBUG_DISABLE 0
hkjung 0:8f339a252825 14 #define ON 1
hkjung 0:8f339a252825 15 #define OFF 0
hkjung 0:8f339a252825 16
hkjung 0:8f339a252825 17 #define MAX_BUF_SIZE 1024
hkjung 0:8f339a252825 18
hkjung 0:8f339a252825 19 #define BG96_APN_PROTOCOL_IPv4 1
hkjung 0:8f339a252825 20 #define BG96_APN_PROTOCOL_IPv6 2
hkjung 0:8f339a252825 21 #define BG96_DEFAULT_TIMEOUT 1000
hkjung 0:8f339a252825 22 #define BG96_CONNECT_TIMEOUT 15000
hkjung 0:8f339a252825 23 #define BG96_SEND_TIMEOUT 500
hkjung 0:8f339a252825 24 #define BG96_RECV_TIMEOUT 500
hkjung 0:8f339a252825 25
hkjung 0:8f339a252825 26 #define BG96_APN_PROTOCOL BG96_APN_PROTOCOL_IPv6
hkjung 0:8f339a252825 27 #define BG96_DEFAULT_BAUD_RATE 115200
hkjung 0:8f339a252825 28 #define BG96_PARSER_DELIMITER "\r\n"
hkjung 0:8f339a252825 29
hkjung 0:8f339a252825 30 #define CATM1_APN_SKT "lte-internet.sktelecom.com"
hkjung 0:8f339a252825 31
hkjung 0:8f339a252825 32 #define CATM1_DEVICE_NAME_BG96 "BG96"
hkjung 0:8f339a252825 33 #define DEVNAME CATM1_DEVICE_NAME_BG96
hkjung 0:8f339a252825 34
hkjung 0:8f339a252825 35 #define devlog(f_, ...) if(CATM1_DEVICE_DEBUG == DEBUG_ENABLE) { pc.printf("\r\n[%s] ", DEVNAME); pc.printf((f_), ##__VA_ARGS__); }
hkjung 0:8f339a252825 36 #define myprintf(f_, ...) {pc.printf("\r\n[MAIN] "); pc.printf((f_), ##__VA_ARGS__);}
hkjung 0:8f339a252825 37
hkjung 0:8f339a252825 38 /* Pin configuraiton */
hkjung 0:8f339a252825 39 // Cat.M1
hkjung 0:8f339a252825 40 #define MBED_CONF_IOTSHIELD_CATM1_TX D8
hkjung 0:8f339a252825 41 #define MBED_CONF_IOTSHIELD_CATM1_RX D2
hkjung 0:8f339a252825 42 #define MBED_CONF_IOTSHIELD_CATM1_RESET D6
hkjung 0:8f339a252825 43 #define MBED_CONF_IOTSHIELD_CATM1_PWRKEY D9
hkjung 0:8f339a252825 44 #define MBED_CONF_IOTSHIELD_CATM1_WAKE NC
hkjung 0:8f339a252825 45 // Sensors
hkjung 0:8f339a252825 46 #define MBED_CONF_IOTSHIELD_SENSOR_CDS A0
hkjung 0:8f339a252825 47 #define MBED_CONF_IOTSHIELD_SENSOR_TEMP A1
hkjung 0:8f339a252825 48
hkjung 0:8f339a252825 49 /* Debug message settings */
hkjung 0:8f339a252825 50 #define BG96_PARSER_DEBUG DEBUG_DISABLE
hkjung 0:8f339a252825 51 #define CATM1_DEVICE_DEBUG DEBUG_ENABLE
hkjung 0:8f339a252825 52
hkjung 0:8f339a252825 53
hkjung 0:8f339a252825 54 int8_t setEchoStatus_BG96(bool onoff);
hkjung 0:8f339a252825 55 int8_t getUsimStatus_BG96(void);
hkjung 0:8f339a252825 56 int8_t getNetworkStatus_BG96(void);
hkjung 0:8f339a252825 57 int8_t checknSetApn_BG96(const char * apn);
hkjung 0:8f339a252825 58 int8_t getFirmwareVersion_BG96(char * version);
hkjung 0:8f339a252825 59 int8_t getImeiNumber_BG96(char * imei);
hkjung 0:8f339a252825 60 int8_t getIpAddressByName_BG96(const char * name, char * ipstr); // DNS
hkjung 0:8f339a252825 61
hkjung 0:8f339a252825 62 int8_t setContextActivate_BG96(void); // Activate a PDP Context
hkjung 0:8f339a252825 63 int8_t setContextDeactivate_BG96(void); // Deactivate a PDP Context
hkjung 0:8f339a252825 64 int8_t getIpAddress_BG96(char * ipstr);
hkjung 0:8f339a252825 65 int8_t sockOpenConnect_BG96(const char * type, const char * addr, int port);
hkjung 0:8f339a252825 66 int8_t sockClose_BG96(void);
hkjung 0:8f339a252825 67 int8_t dataSend_BG96(char * data, int len);
hkjung 0:8f339a252825 68 int8_t checkDataRecv_BG96(void);
hkjung 0:8f339a252825 69 int8_t dataRecv_BG96(char * data, int * len);
hkjung 0:8f339a252825 70
hkjung 0:8f339a252825 71
hkjung 0:8f339a252825 72 Serial pc(USBTX, USBRX); // tx, rx
hkjung 0:8f339a252825 73
hkjung 0:8f339a252825 74 UARTSerial *_serial;
hkjung 0:8f339a252825 75 ATCmdParser *_parser;
hkjung 0:8f339a252825 76
hkjung 0:8f339a252825 77
hkjung 1:35abb05061e0 78 // Destination (Remote Host)
hkjung 1:35abb05061e0 79 // IP address and Port number
hkjung 1:35abb05061e0 80 char dest_ip[] = "222.98.173.214";
hkjung 1:35abb05061e0 81 int dest_port = 50001;
hkjung 1:35abb05061e0 82
hkjung 1:35abb05061e0 83
hkjung 0:8f339a252825 84 void serialPcInit(void)
hkjung 0:8f339a252825 85 {
hkjung 0:8f339a252825 86 pc.baud(115200);
hkjung 0:8f339a252825 87 pc.format(8, Serial::None, 1);
hkjung 0:8f339a252825 88 }
hkjung 0:8f339a252825 89
hkjung 0:8f339a252825 90 void serialDeviceInit(PinName tx, PinName rx, int baudrate)
hkjung 0:8f339a252825 91 {
hkjung 0:8f339a252825 92 _serial = new UARTSerial(tx, rx, baudrate);
hkjung 0:8f339a252825 93 }
hkjung 0:8f339a252825 94
hkjung 0:8f339a252825 95 void serialAtParserInit(const char *delimiter, bool debug_en)
hkjung 0:8f339a252825 96 {
hkjung 0:8f339a252825 97 _parser = new ATCmdParser(_serial);
hkjung 0:8f339a252825 98 _parser->debug_on(debug_en);
hkjung 0:8f339a252825 99 _parser->set_delimiter(delimiter);
hkjung 0:8f339a252825 100 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:8f339a252825 101 }
hkjung 0:8f339a252825 102
hkjung 0:8f339a252825 103 void catm1DeviceInit(void)
hkjung 0:8f339a252825 104 {
hkjung 0:8f339a252825 105 serialDeviceInit( MBED_CONF_IOTSHIELD_CATM1_TX,
hkjung 0:8f339a252825 106 MBED_CONF_IOTSHIELD_CATM1_RX,
hkjung 0:8f339a252825 107 BG96_DEFAULT_BAUD_RATE);
hkjung 0:8f339a252825 108
hkjung 0:8f339a252825 109 serialAtParserInit( BG96_PARSER_DELIMITER,
hkjung 0:8f339a252825 110 BG96_PARSER_DEBUG);
hkjung 0:8f339a252825 111 }
hkjung 0:8f339a252825 112
hkjung 0:8f339a252825 113 void waitCatM1Ready(void)
hkjung 0:8f339a252825 114 {
hkjung 0:8f339a252825 115 while(1)
hkjung 0:8f339a252825 116 {
hkjung 0:8f339a252825 117 if(_parser->recv("RDY"))
hkjung 0:8f339a252825 118 {
hkjung 0:8f339a252825 119 myprintf("BG96 ready\r\n");
hkjung 0:8f339a252825 120 return ;
hkjung 0:8f339a252825 121 }
hkjung 0:8f339a252825 122 else if(_parser->send("AT") && _parser->recv("OK"))
hkjung 0:8f339a252825 123 {
hkjung 0:8f339a252825 124 myprintf("BG96 already available\r\n");
hkjung 0:8f339a252825 125 return ;
hkjung 0:8f339a252825 126 }
hkjung 0:8f339a252825 127 }
hkjung 0:8f339a252825 128 }
hkjung 0:8f339a252825 129
hkjung 0:8f339a252825 130
hkjung 0:8f339a252825 131 int main()
hkjung 0:8f339a252825 132 {
hkjung 0:8f339a252825 133 serialPcInit();
hkjung 0:8f339a252825 134 catm1DeviceInit();
hkjung 0:8f339a252825 135
hkjung 0:8f339a252825 136 myprintf("Waiting for Cat.M1 Module Ready...\r\n");
hkjung 0:8f339a252825 137
hkjung 0:8f339a252825 138 // Todo: BG96 Hardware Init (hardware reset & pwrkey act)
hkjung 0:8f339a252825 139
hkjung 0:8f339a252825 140 waitCatM1Ready();
hkjung 0:8f339a252825 141
hkjung 0:8f339a252825 142 myprintf("System Init Complete\r\n");
hkjung 0:8f339a252825 143
hkjung 0:8f339a252825 144 myprintf("WIZnet IoT Shield for Arm MBED");
hkjung 0:8f339a252825 145 myprintf("LTE Cat.M1 Version");
hkjung 0:8f339a252825 146 myprintf("=================================================");
hkjung 0:8f339a252825 147 myprintf(">> Target Board: WIoT-QC01 (Quectel BG96)");
hkjung 0:8f339a252825 148 myprintf(">> Sample Code: TCP Client Send & Recv");
hkjung 0:8f339a252825 149 myprintf("=================================================\r\n");
hkjung 0:8f339a252825 150
hkjung 0:8f339a252825 151 setEchoStatus_BG96(OFF);
hkjung 0:8f339a252825 152
hkjung 0:8f339a252825 153 getUsimStatus_BG96();
hkjung 0:8f339a252825 154
hkjung 0:8f339a252825 155 getNetworkStatus_BG96();
hkjung 0:8f339a252825 156
hkjung 0:8f339a252825 157 checknSetApn_BG96(CATM1_APN_SKT);
hkjung 0:8f339a252825 158
hkjung 0:8f339a252825 159 setContextActivate_BG96();
hkjung 0:8f339a252825 160
hkjung 0:8f339a252825 161 // TCP Client: Send and Receive
hkjung 1:35abb05061e0 162 myprintf("TCP Client Start - Connect to %s:%d\r\n", dest_ip, dest_port);
hkjung 0:8f339a252825 163
hkjung 1:35abb05061e0 164 if(sockOpenConnect_BG96("TCP", dest_ip, dest_port) == RET_OK) {
hkjung 0:8f339a252825 165 myprintf("sockOpenConnect: success\r\n");
hkjung 0:8f339a252825 166
hkjung 0:8f339a252825 167 char sendbuf[] = "Hello Cat.M1\r\n";
hkjung 0:8f339a252825 168 if(dataSend_BG96(sendbuf, sizeof(sendbuf))) {
hkjung 0:8f339a252825 169 myprintf("dataSend [%d] %s\r\n", sizeof(sendbuf), sendbuf);
hkjung 0:8f339a252825 170 }
hkjung 0:8f339a252825 171
hkjung 0:8f339a252825 172 } else {
hkjung 0:8f339a252825 173 myprintf("sockOpen: failed\r\n");
hkjung 0:8f339a252825 174
hkjung 0:8f339a252825 175 if(sockClose_BG96() == RET_OK) {
hkjung 0:8f339a252825 176 myprintf("sockClose: success\r\n");
hkjung 0:8f339a252825 177 }
hkjung 0:8f339a252825 178 }
hkjung 0:8f339a252825 179
hkjung 0:8f339a252825 180 _parser->debug_on(DEBUG_DISABLE);
hkjung 0:8f339a252825 181
hkjung 0:8f339a252825 182 while(1)
hkjung 0:8f339a252825 183 {
hkjung 0:8f339a252825 184 if(checkDataRecv_BG96() == RET_OK) {
hkjung 0:8f339a252825 185 // Data received
hkjung 0:8f339a252825 186 char recvbuf[100] = {0, };
hkjung 0:8f339a252825 187 int recvlen = 0;
hkjung 0:8f339a252825 188
hkjung 0:8f339a252825 189 if(dataRecv_BG96(recvbuf, &recvlen) == RET_OK) {
hkjung 0:8f339a252825 190 myprintf("dataRecv [%d] %s\r\n", recvlen, recvbuf);
hkjung 0:8f339a252825 191
hkjung 0:8f339a252825 192 char * ptr = strstr(recvbuf, "exit");
hkjung 0:8f339a252825 193 if(ptr != 0) break;
hkjung 0:8f339a252825 194 }
hkjung 0:8f339a252825 195 }
hkjung 0:8f339a252825 196
hkjung 0:8f339a252825 197 }
hkjung 0:8f339a252825 198
hkjung 0:8f339a252825 199 if(sockClose_BG96() == RET_OK) {
hkjung 0:8f339a252825 200 myprintf("sockClose: success\r\n");
hkjung 0:8f339a252825 201 }
hkjung 0:8f339a252825 202 setContextDeactivate_BG96();
hkjung 0:8f339a252825 203 }
hkjung 0:8f339a252825 204
hkjung 0:8f339a252825 205
hkjung 0:8f339a252825 206
hkjung 0:8f339a252825 207 int8_t setEchoStatus_BG96(bool onoff)
hkjung 0:8f339a252825 208 {
hkjung 0:8f339a252825 209 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 210 char _buf[10];
hkjung 0:8f339a252825 211
hkjung 0:8f339a252825 212 sprintf((char *)_buf, "ATE%d", onoff);
hkjung 0:8f339a252825 213
hkjung 0:8f339a252825 214 if(_parser->send(_buf) && _parser->recv("OK")) {
hkjung 0:8f339a252825 215 devlog("Turn Echo %s success\r\n", onoff?"ON":"OFF");
hkjung 0:8f339a252825 216 ret = RET_OK;
hkjung 0:8f339a252825 217 } else {
hkjung 0:8f339a252825 218 devlog("Turn Echo %s failed\r\n", onoff?"ON":"OFF");
hkjung 0:8f339a252825 219 }
hkjung 0:8f339a252825 220 return ret;
hkjung 0:8f339a252825 221 }
hkjung 0:8f339a252825 222
hkjung 0:8f339a252825 223 int8_t getUsimStatus_BG96(void)
hkjung 0:8f339a252825 224 {
hkjung 0:8f339a252825 225 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 226
hkjung 0:8f339a252825 227 _parser->send("AT+CPIN?");
hkjung 0:8f339a252825 228 if(_parser->recv("+CPIN: READY") && _parser->recv("OK")) {
hkjung 0:8f339a252825 229 devlog("USIM Status: READY\r\n");
hkjung 0:8f339a252825 230 ret = RET_OK;
hkjung 0:8f339a252825 231 } else {
hkjung 0:8f339a252825 232 devlog("Retrieving USIM Status failed\r\n");
hkjung 0:8f339a252825 233 }
hkjung 0:8f339a252825 234 return ret;
hkjung 0:8f339a252825 235 }
hkjung 0:8f339a252825 236
hkjung 0:8f339a252825 237 int8_t getNetworkStatus_BG96(void)
hkjung 0:8f339a252825 238 {
hkjung 0:8f339a252825 239 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 240
hkjung 0:8f339a252825 241 if(_parser->send("AT+QCDS") && _parser->recv("+QCDS: \"SRV\"") && _parser->recv("OK")) {
hkjung 0:8f339a252825 242 devlog("Network Status: attached\r\n");
hkjung 0:8f339a252825 243 ret = RET_OK;
hkjung 0:8f339a252825 244 } else if (_parser->send("AT+QCDS") && _parser->recv("+QCDS: \"LIMITED\"") && _parser->recv("OK")) {
hkjung 0:8f339a252825 245 devlog("Network Status: limited\r\n");
hkjung 0:8f339a252825 246 ret = RET_OK;
hkjung 0:8f339a252825 247 } else {
hkjung 0:8f339a252825 248 devlog("Network Status: Error\r\n");
hkjung 0:8f339a252825 249 }
hkjung 0:8f339a252825 250 return ret;
hkjung 0:8f339a252825 251 }
hkjung 0:8f339a252825 252
hkjung 0:8f339a252825 253 int8_t checknSetApn_BG96(const char * apn) // Configure Parameters of a TCP/IP Context
hkjung 0:8f339a252825 254 {
hkjung 0:8f339a252825 255 char resp_str[100];
hkjung 0:8f339a252825 256
hkjung 0:8f339a252825 257 uint16_t i = 0;
hkjung 0:8f339a252825 258 char * search_pt;
hkjung 0:8f339a252825 259
hkjung 0:8f339a252825 260 memset(resp_str, 0, sizeof(resp_str));
hkjung 0:8f339a252825 261
hkjung 0:8f339a252825 262 devlog("Checking APN...\r\n");
hkjung 0:8f339a252825 263
hkjung 0:8f339a252825 264 _parser->send("AT+QICSGP=1");
hkjung 0:8f339a252825 265
hkjung 0:8f339a252825 266 while(1)
hkjung 0:8f339a252825 267 {
hkjung 0:8f339a252825 268 _parser->read(&resp_str[i++], 1);
hkjung 0:8f339a252825 269 search_pt = strstr(resp_str, "OK\r\n");
hkjung 0:8f339a252825 270 if (search_pt != 0)
hkjung 0:8f339a252825 271 {
hkjung 0:8f339a252825 272 break;
hkjung 0:8f339a252825 273 }
hkjung 0:8f339a252825 274 }
hkjung 0:8f339a252825 275
hkjung 0:8f339a252825 276 search_pt = strstr(resp_str, apn);
hkjung 0:8f339a252825 277 if (search_pt == 0)
hkjung 0:8f339a252825 278 {
hkjung 0:8f339a252825 279 devlog("Mismatched APN: %s\r\n", resp_str);
hkjung 0:8f339a252825 280 devlog("Storing APN %s...\r\n", apn);
hkjung 0:8f339a252825 281 if(!(_parser->send("AT+QICSGP=1,%d,\"%s\",\"\",\"\",0", BG96_APN_PROTOCOL, apn) && _parser->recv("OK")))
hkjung 0:8f339a252825 282 {
hkjung 0:8f339a252825 283 return RET_NOK; // failed
hkjung 0:8f339a252825 284 }
hkjung 0:8f339a252825 285 }
hkjung 0:8f339a252825 286 devlog("APN Check Done\r\n");
hkjung 0:8f339a252825 287
hkjung 0:8f339a252825 288 return RET_OK;
hkjung 0:8f339a252825 289 }
hkjung 0:8f339a252825 290
hkjung 0:8f339a252825 291 int8_t getFirmwareVersion_BG96(char * version)
hkjung 0:8f339a252825 292 {
hkjung 0:8f339a252825 293 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 294 if(_parser->send("AT+QGMR") && _parser->recv("%s\n", version) && _parser->recv("OK"))
hkjung 0:8f339a252825 295 {
hkjung 0:8f339a252825 296 ret = RET_OK;
hkjung 0:8f339a252825 297 }
hkjung 0:8f339a252825 298 return ret;
hkjung 0:8f339a252825 299 }
hkjung 0:8f339a252825 300
hkjung 0:8f339a252825 301 int8_t getImeiNumber_BG96(char * imei)
hkjung 0:8f339a252825 302 {
hkjung 0:8f339a252825 303 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 304
hkjung 0:8f339a252825 305 if(_parser->send("AT+CGSN") && _parser->recv("%s\n", imei) && _parser->recv("OK"))
hkjung 0:8f339a252825 306 {
hkjung 0:8f339a252825 307 ret = RET_OK;
hkjung 0:8f339a252825 308 }
hkjung 0:8f339a252825 309 return ret;
hkjung 0:8f339a252825 310 }
hkjung 0:8f339a252825 311
hkjung 0:8f339a252825 312 int8_t getIpAddressByName_BG96(const char * name, char * ipstr)
hkjung 0:8f339a252825 313 {
hkjung 0:8f339a252825 314 char buf2[50];
hkjung 0:8f339a252825 315 bool ok;
hkjung 0:8f339a252825 316 int err, ipcount, dnsttl;
hkjung 0:8f339a252825 317
hkjung 0:8f339a252825 318 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 319
hkjung 0:8f339a252825 320 ok = ( _parser->send("AT+QIDNSGIP=1,\"%s\"", name)
hkjung 0:8f339a252825 321 && _parser->recv("OK")
hkjung 0:8f339a252825 322 && _parser->recv("+QIURC: \"dnsgip\",%d,%d,%d", &err, &ipcount, &dnsttl)
hkjung 0:8f339a252825 323 && err==0
hkjung 0:8f339a252825 324 && ipcount > 0
hkjung 0:8f339a252825 325 );
hkjung 0:8f339a252825 326
hkjung 0:8f339a252825 327 if( ok ) {
hkjung 0:8f339a252825 328 _parser->recv("+QIURC: \"dnsgip\",\"%[^\"]\"", ipstr); //use the first DNS value
hkjung 0:8f339a252825 329 for( int i=0; i<ipcount-1; i++ )
hkjung 0:8f339a252825 330 _parser->recv("+QIURC: \"dnsgip\",\"%[^\"]\"", buf2); //and discrard the rest if >1
hkjung 0:8f339a252825 331
hkjung 0:8f339a252825 332 ret = RET_OK;
hkjung 0:8f339a252825 333 }
hkjung 0:8f339a252825 334 return ret;
hkjung 0:8f339a252825 335 }
hkjung 0:8f339a252825 336
hkjung 0:8f339a252825 337 int8_t getIpAddress_BG96(char * ipstr) // IPv4 or IPv6
hkjung 0:8f339a252825 338 {
hkjung 0:8f339a252825 339 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 340 int id, state, type; // not used
hkjung 0:8f339a252825 341
hkjung 0:8f339a252825 342 _parser->send("AT+QIACT?");
hkjung 0:8f339a252825 343 if(_parser->recv("+QIACT: %d,%d,%d,\"%[^\"]\"", &id, &state, &type, ipstr)
hkjung 0:8f339a252825 344 && _parser->recv("OK")) {
hkjung 0:8f339a252825 345 ret = RET_OK;
hkjung 0:8f339a252825 346 }
hkjung 0:8f339a252825 347 return ret;
hkjung 0:8f339a252825 348 }
hkjung 0:8f339a252825 349
hkjung 0:8f339a252825 350 int8_t setContextActivate_BG96(void) // Activate a PDP Context
hkjung 0:8f339a252825 351 {
hkjung 0:8f339a252825 352 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 353
hkjung 0:8f339a252825 354 _parser->send("AT+QIACT=1");
hkjung 0:8f339a252825 355 if(_parser->recv("OK")) {
hkjung 0:8f339a252825 356 devlog("Activate a PDP Context\r\n");
hkjung 0:8f339a252825 357 ret = RET_OK;
hkjung 0:8f339a252825 358 } else {
hkjung 0:8f339a252825 359 devlog("PDP Context Activation failed\r\n");
hkjung 0:8f339a252825 360 }
hkjung 0:8f339a252825 361 return ret;
hkjung 0:8f339a252825 362 }
hkjung 0:8f339a252825 363
hkjung 0:8f339a252825 364 int8_t setContextDeactivate_BG96(void) // Deactivate a PDP Context
hkjung 0:8f339a252825 365 {
hkjung 0:8f339a252825 366 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 367
hkjung 0:8f339a252825 368 _parser->send("AT+QIDEACT=1");
hkjung 0:8f339a252825 369 if(_parser->recv("OK")) {
hkjung 0:8f339a252825 370 devlog("Deactivate a PDP Context\r\n");
hkjung 0:8f339a252825 371 ret = RET_OK;
hkjung 0:8f339a252825 372 } else {
hkjung 0:8f339a252825 373 devlog("PDP Context Deactivation failed\r\n");
hkjung 0:8f339a252825 374 }
hkjung 0:8f339a252825 375 return ret;
hkjung 0:8f339a252825 376 }
hkjung 0:8f339a252825 377
hkjung 0:8f339a252825 378 int8_t sockOpenConnect_BG96(const char * type, const char * addr, int port)
hkjung 0:8f339a252825 379 {
hkjung 0:8f339a252825 380 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 381 int err = 1;
hkjung 0:8f339a252825 382 int id = 0;
hkjung 0:8f339a252825 383
hkjung 0:8f339a252825 384 bool done = false;
hkjung 0:8f339a252825 385 Timer t;
hkjung 0:8f339a252825 386
hkjung 0:8f339a252825 387 _parser->set_timeout(BG96_CONNECT_TIMEOUT);
hkjung 0:8f339a252825 388
hkjung 0:8f339a252825 389 if((strcmp(type, "TCP") != 0) && (strcmp(type, "UDP") != 0)) {
hkjung 0:8f339a252825 390 return RET_NOK;
hkjung 0:8f339a252825 391 }
hkjung 0:8f339a252825 392
hkjung 0:8f339a252825 393 t.start();
hkjung 0:8f339a252825 394
hkjung 0:8f339a252825 395 _parser->send("AT+QIOPEN=1,%d,\"%s\",\"%s\",%d", id, type, addr, port);
hkjung 0:8f339a252825 396 do {
hkjung 0:8f339a252825 397 done = (_parser->recv("+QIOPEN: %d,%d", &id, &err) && (err == 0));
hkjung 0:8f339a252825 398 } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT);
hkjung 0:8f339a252825 399
hkjung 0:8f339a252825 400 if(done) ret = RET_OK;
hkjung 0:8f339a252825 401
hkjung 0:8f339a252825 402 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:8f339a252825 403 _parser->flush();
hkjung 0:8f339a252825 404
hkjung 0:8f339a252825 405 return ret;
hkjung 0:8f339a252825 406 }
hkjung 0:8f339a252825 407
hkjung 0:8f339a252825 408 int8_t sockClose_BG96(void)
hkjung 0:8f339a252825 409 {
hkjung 0:8f339a252825 410 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 411 int id = 0;
hkjung 0:8f339a252825 412
hkjung 0:8f339a252825 413 _parser->set_timeout(BG96_CONNECT_TIMEOUT);
hkjung 0:8f339a252825 414
hkjung 0:8f339a252825 415 if(_parser->send("AT+QICLOSE=%d", id) && _parser->recv("OK")) {
hkjung 0:8f339a252825 416 ret = RET_OK;
hkjung 0:8f339a252825 417 }
hkjung 0:8f339a252825 418 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:8f339a252825 419
hkjung 0:8f339a252825 420 return ret;
hkjung 0:8f339a252825 421 }
hkjung 0:8f339a252825 422
hkjung 0:8f339a252825 423 int8_t dataSend_BG96(char * data, int len)
hkjung 0:8f339a252825 424 {
hkjung 0:8f339a252825 425 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 426 int id = 0;
hkjung 0:8f339a252825 427 bool done = false;
hkjung 0:8f339a252825 428
hkjung 0:8f339a252825 429 _parser->set_timeout(BG96_SEND_TIMEOUT);
hkjung 0:8f339a252825 430
hkjung 0:8f339a252825 431 _parser->send("AT+QISEND=%d,%ld", id, len);
hkjung 0:8f339a252825 432 if( !done && _parser->recv(">") )
hkjung 0:8f339a252825 433 done = (_parser->write(data, len) <= 0);
hkjung 0:8f339a252825 434
hkjung 0:8f339a252825 435 if( !done )
hkjung 0:8f339a252825 436 done = _parser->recv("SEND OK");
hkjung 0:8f339a252825 437
hkjung 0:8f339a252825 438 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:8f339a252825 439
hkjung 0:8f339a252825 440 return ret;
hkjung 0:8f339a252825 441 }
hkjung 0:8f339a252825 442
hkjung 0:8f339a252825 443 int8_t checkDataRecv_BG96(void)
hkjung 0:8f339a252825 444 {
hkjung 0:8f339a252825 445 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 446 int id = 0;
hkjung 0:8f339a252825 447 char cmd[20];
hkjung 0:8f339a252825 448
hkjung 0:8f339a252825 449 bool received = false;
hkjung 0:8f339a252825 450
hkjung 0:8f339a252825 451 sprintf(cmd, "+QIURC: \"recv\",%d", id);
hkjung 0:8f339a252825 452 _parser->set_timeout(1);
hkjung 0:8f339a252825 453 received = _parser->recv(cmd);
hkjung 0:8f339a252825 454 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:8f339a252825 455
hkjung 0:8f339a252825 456 if(received) ret = RET_OK;
hkjung 0:8f339a252825 457 return ret;
hkjung 0:8f339a252825 458 }
hkjung 0:8f339a252825 459
hkjung 0:8f339a252825 460 int8_t dataRecv_BG96(char * data, int * len)
hkjung 0:8f339a252825 461 {
hkjung 0:8f339a252825 462 int8_t ret = RET_NOK;
hkjung 0:8f339a252825 463 int id = 0;
hkjung 0:8f339a252825 464 int recvCount = 0;
hkjung 0:8f339a252825 465
hkjung 0:8f339a252825 466 _parser->set_timeout(BG96_RECV_TIMEOUT);
hkjung 0:8f339a252825 467
hkjung 0:8f339a252825 468 if( _parser->send("AT+QIRD=%d", id) && _parser->recv("+QIRD:%d\r\n",&recvCount) ) {
hkjung 0:8f339a252825 469 if(recvCount > 0) {
hkjung 0:8f339a252825 470 _parser->getc();
hkjung 0:8f339a252825 471 _parser->read(data, recvCount);
hkjung 0:8f339a252825 472 if(_parser->recv("OK")) {
hkjung 0:8f339a252825 473 ret = RET_OK;
hkjung 0:8f339a252825 474 } else {
hkjung 0:8f339a252825 475 recvCount = 0;
hkjung 0:8f339a252825 476 }
hkjung 0:8f339a252825 477 }
hkjung 0:8f339a252825 478 }
hkjung 0:8f339a252825 479 _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
hkjung 0:8f339a252825 480 _parser->flush();
hkjung 0:8f339a252825 481
hkjung 0:8f339a252825 482 *len = recvCount;
hkjung 0:8f339a252825 483
hkjung 0:8f339a252825 484 return ret;
hkjung 0:8f339a252825 485 }