WIZnet-IoTShield-AMM592-TCP example

Committer:
hkjung
Date:
Fri Apr 05 07:32:43 2019 +0000
Revision:
3:4041e2cc0f19
Parent:
2:46cc35700e0e
Child:
4:5638a7186930
Added TCP loopback

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