WIZnet-IoTShield-AMM592-TCP example

Committer:
hkjung
Date:
Sat Mar 16 07:38:26 2019 +0000
Revision:
0:8f339a252825
Child:
1:35abb05061e0
initial release

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