jehoon song
/
WIZnet-IoTShield-BG96-ThingPlug
SKT Cat.M1(BG96) ThingPlug Example
main.cpp@4:d6f14b70d8aa, 2019-03-27 (annotated)
- Committer:
- jehoon
- Date:
- Wed Mar 27 07:28:00 2019 +0000
- Revision:
- 4:d6f14b70d8aa
- Parent:
- 3:98c9694fec26
SKT Cat.M1 BG96 ThingPlug Example
Who changed what in which revision?
User | Revision | Line number | New 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 | */ |
jehoon | 4:d6f14b70d8aa | 5 | |
jehoon | 4:d6f14b70d8aa | 6 | /* |
jehoon | 4:d6f14b70d8aa | 7 | * Licensed under the Apache License, Version 2.0 (the "License"); |
jehoon | 4:d6f14b70d8aa | 8 | * you may not use this file except in compliance with the License. |
jehoon | 4:d6f14b70d8aa | 9 | * You may obtain a copy of the License at |
jehoon | 4:d6f14b70d8aa | 10 | * |
jehoon | 4:d6f14b70d8aa | 11 | * http://www.apache.org/licenses/LICENSE-2.0 |
jehoon | 4:d6f14b70d8aa | 12 | * |
jehoon | 4:d6f14b70d8aa | 13 | * Unless required by applicable law or agreed to in writing, software |
jehoon | 4:d6f14b70d8aa | 14 | * distributed under the License is distributed on an "AS IS" BASIS, |
jehoon | 4:d6f14b70d8aa | 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
jehoon | 4:d6f14b70d8aa | 16 | * |
jehoon | 4:d6f14b70d8aa | 17 | * See the License for the specific language governing permissions and |
jehoon | 4:d6f14b70d8aa | 18 | * limitations under the License. |
jehoon | 4:d6f14b70d8aa | 19 | * |
jehoon | 4:d6f14b70d8aa | 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:0d7ba45f12b1 | 58 | #define MBED_CONF_IOTSHIELD_CATM1_RESET D7 |
hkjung | 0:5cd6077e0a8e | 59 | #define MBED_CONF_IOTSHIELD_CATM1_PWRKEY D9 |
hkjung | 1:0d7ba45f12b1 | 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 | 3:98c9694fec26 | 66 | #define BG96_PARSER_DEBUG DEBUG_DISABLE |
jehoon | 4:d6f14b70d8aa | 67 | #define CATM1_DEVICE_DEBUG DEBUG_ENABLE |
jehoon | 4:d6f14b70d8aa | 68 | |
jehoon | 4:d6f14b70d8aa | 69 | /* THINGPLUG */ |
jehoon | 4:d6f14b70d8aa | 70 | #define THINGPLUG_PROTOCOL "MQTTS" |
jehoon | 4:d6f14b70d8aa | 71 | #define THINGPLUG_HOST "test.sktiot.com" |
jehoon | 4:d6f14b70d8aa | 72 | #define THINGPLUG_PORT 8883 |
jehoon | 4:d6f14b70d8aa | 73 | #define THINGPLUG_KEEPALIVE 300 |
jehoon | 4:d6f14b70d8aa | 74 | #define THINGPLUG_CLEANSESSION 1 |
jehoon | 4:d6f14b70d8aa | 75 | |
jehoon | 4:d6f14b70d8aa | 76 | #define THINGPLUG_DATA_FORMAT_JSON 0 |
jehoon | 4:d6f14b70d8aa | 77 | #define THINGPLUG_DATA_TYPE_TELEMETRY "telemetry" |
jehoon | 4:d6f14b70d8aa | 78 | #define THINGPLUG_DATA_TYPE_ATTRIBUTE "attribute" |
hkjung | 0:5cd6077e0a8e | 79 | |
jehoon | 4:d6f14b70d8aa | 80 | #define THINGPLUG_CMD_RES_OK 0 |
jehoon | 4:d6f14b70d8aa | 81 | #define THINGPLUG_CMD_RES_NOK 1 |
jehoon | 4:d6f14b70d8aa | 82 | #define ESPCAPE_SEQ 0x1A |
hkjung | 1:0d7ba45f12b1 | 83 | |
jehoon | 4:d6f14b70d8aa | 84 | /* THINGPLUG PRIVATE*/ |
jehoon | 4:d6f14b70d8aa | 85 | #define THINGPLUG_SVC_NAME "svc01" |
jehoon | 4:d6f14b70d8aa | 86 | #define THINGPLUG_DEV_ID "dev02" |
jehoon | 4:d6f14b70d8aa | 87 | #define THINGPLUG_DEV_TOKEN "a0149f60b*********" |
jehoon | 4:d6f14b70d8aa | 88 | |
jehoon | 4:d6f14b70d8aa | 89 | #define THINGPLUG_TELEMETRY1 "temperature" |
jehoon | 4:d6f14b70d8aa | 90 | #define THINGPLUG_TELEMETRY2 "humidity" |
jehoon | 4:d6f14b70d8aa | 91 | #define THINGPLUG_ATTRIBUTE "LED" |
hkjung | 1:0d7ba45f12b1 | 92 | |
hkjung | 1:0d7ba45f12b1 | 93 | |
hkjung | 0:5cd6077e0a8e | 94 | // Functions: Module Status |
hkjung | 0:5cd6077e0a8e | 95 | void waitCatM1Ready(void); |
hkjung | 0:5cd6077e0a8e | 96 | int8_t setEchoStatus_BG96(bool onoff); |
hkjung | 0:5cd6077e0a8e | 97 | int8_t getUsimStatus_BG96(void); |
hkjung | 0:5cd6077e0a8e | 98 | int8_t getNetworkStatus_BG96(void); |
hkjung | 0:5cd6077e0a8e | 99 | int8_t checknSetApn_BG96(const char * apn); |
hkjung | 0:5cd6077e0a8e | 100 | int8_t getFirmwareVersion_BG96(char * version); |
hkjung | 0:5cd6077e0a8e | 101 | |
jehoon | 4:d6f14b70d8aa | 102 | // Functions: ThingPlug send & recv |
jehoon | 4:d6f14b70d8aa | 103 | int8_t connectThingPlug_BG96(char* svc_id, char* dev_id, char* dev_token); |
jehoon | 4:d6f14b70d8aa | 104 | int8_t sendThingPlugData_Json_BG96(char* type, char * data, int len); |
jehoon | 4:d6f14b70d8aa | 105 | int8_t recvThingPlugCmd_BG96(char* cmd_type, unsigned int* rpc_id, char* msg); |
jehoon | 4:d6f14b70d8aa | 106 | int8_t sendThingPlugResp_BG96(char* cmd_type, unsigned int rpc_id, int result, char* result_data, int result_len); |
hkjung | 0:5cd6077e0a8e | 107 | |
hkjung | 0:5cd6077e0a8e | 108 | Serial pc(USBTX, USBRX); // USB debug |
hkjung | 0:5cd6077e0a8e | 109 | |
jehoon | 4:d6f14b70d8aa | 110 | UARTSerial *_serial; // Cat.M1 module |
hkjung | 0:5cd6077e0a8e | 111 | ATCmdParser *_parser; |
hkjung | 0:5cd6077e0a8e | 112 | |
hkjung | 1:0d7ba45f12b1 | 113 | DigitalOut _RESET_BG96(MBED_CONF_IOTSHIELD_CATM1_RESET); |
hkjung | 1:0d7ba45f12b1 | 114 | DigitalOut _PWRKEY_BG96(MBED_CONF_IOTSHIELD_CATM1_PWRKEY); |
hkjung | 0:5cd6077e0a8e | 115 | |
hkjung | 0:5cd6077e0a8e | 116 | void serialPcInit(void) |
hkjung | 0:5cd6077e0a8e | 117 | { |
hkjung | 0:5cd6077e0a8e | 118 | pc.baud(115200); |
hkjung | 0:5cd6077e0a8e | 119 | pc.format(8, Serial::None, 1); |
hkjung | 0:5cd6077e0a8e | 120 | } |
hkjung | 0:5cd6077e0a8e | 121 | |
jehoon | 4:d6f14b70d8aa | 122 | void serialDeviceInit(PinName tx, PinName rx, int baudrate) |
jehoon | 4:d6f14b70d8aa | 123 | { |
jehoon | 4:d6f14b70d8aa | 124 | _serial = new UARTSerial(tx, rx, baudrate); |
hkjung | 0:5cd6077e0a8e | 125 | } |
hkjung | 0:5cd6077e0a8e | 126 | |
hkjung | 0:5cd6077e0a8e | 127 | void serialAtParserInit(const char *delimiter, bool debug_en) |
hkjung | 0:5cd6077e0a8e | 128 | { |
jehoon | 4:d6f14b70d8aa | 129 | _parser = new ATCmdParser(_serial); |
hkjung | 0:5cd6077e0a8e | 130 | _parser->debug_on(debug_en); |
jehoon | 4:d6f14b70d8aa | 131 | _parser->set_delimiter(delimiter); |
hkjung | 0:5cd6077e0a8e | 132 | _parser->set_timeout(BG96_DEFAULT_TIMEOUT); |
hkjung | 0:5cd6077e0a8e | 133 | } |
hkjung | 0:5cd6077e0a8e | 134 | |
hkjung | 0:5cd6077e0a8e | 135 | void catm1DeviceInit(void) |
hkjung | 0:5cd6077e0a8e | 136 | { |
jehoon | 4:d6f14b70d8aa | 137 | serialDeviceInit( MBED_CONF_IOTSHIELD_CATM1_TX, |
jehoon | 4:d6f14b70d8aa | 138 | MBED_CONF_IOTSHIELD_CATM1_RX, |
hkjung | 0:5cd6077e0a8e | 139 | BG96_DEFAULT_BAUD_RATE); |
jehoon | 4:d6f14b70d8aa | 140 | |
jehoon | 4:d6f14b70d8aa | 141 | serialAtParserInit( BG96_PARSER_DELIMITER, |
hkjung | 0:5cd6077e0a8e | 142 | BG96_PARSER_DEBUG); |
hkjung | 0:5cd6077e0a8e | 143 | } |
hkjung | 0:5cd6077e0a8e | 144 | |
hkjung | 1:0d7ba45f12b1 | 145 | void catm1DeviceReset_BG96(void) |
hkjung | 1:0d7ba45f12b1 | 146 | { |
hkjung | 1:0d7ba45f12b1 | 147 | _RESET_BG96 = 1; |
hkjung | 1:0d7ba45f12b1 | 148 | _PWRKEY_BG96 = 1; |
hkjung | 1:0d7ba45f12b1 | 149 | wait_ms(300); |
jehoon | 4:d6f14b70d8aa | 150 | |
hkjung | 1:0d7ba45f12b1 | 151 | _RESET_BG96 = 0; |
hkjung | 1:0d7ba45f12b1 | 152 | _PWRKEY_BG96 = 0; |
hkjung | 1:0d7ba45f12b1 | 153 | wait_ms(400); |
jehoon | 4:d6f14b70d8aa | 154 | |
jehoon | 4:d6f14b70d8aa | 155 | _RESET_BG96 = 1; |
hkjung | 1:0d7ba45f12b1 | 156 | wait_ms(1000); |
hkjung | 0:5cd6077e0a8e | 157 | } |
hkjung | 0:5cd6077e0a8e | 158 | |
hkjung | 1:0d7ba45f12b1 | 159 | |
hkjung | 1:0d7ba45f12b1 | 160 | // ---------------------------------------------------------------- |
hkjung | 1:0d7ba45f12b1 | 161 | // Main routine |
hkjung | 1:0d7ba45f12b1 | 162 | // ---------------------------------------------------------------- |
hkjung | 1:0d7ba45f12b1 | 163 | |
hkjung | 0:5cd6077e0a8e | 164 | int main() |
hkjung | 0:5cd6077e0a8e | 165 | { |
jehoon | 4:d6f14b70d8aa | 166 | serialPcInit(); |
hkjung | 0:5cd6077e0a8e | 167 | catm1DeviceInit(); |
jehoon | 4:d6f14b70d8aa | 168 | |
hkjung | 0:5cd6077e0a8e | 169 | myprintf("Waiting for Cat.M1 Module Ready...\r\n"); |
jehoon | 4:d6f14b70d8aa | 170 | |
hkjung | 1:0d7ba45f12b1 | 171 | catm1DeviceReset_BG96(); |
jehoon | 4:d6f14b70d8aa | 172 | |
hkjung | 0:5cd6077e0a8e | 173 | waitCatM1Ready(); |
jehoon | 4:d6f14b70d8aa | 174 | |
hkjung | 1:0d7ba45f12b1 | 175 | wait_ms(5000); |
jehoon | 4:d6f14b70d8aa | 176 | |
hkjung | 0:5cd6077e0a8e | 177 | myprintf("System Init Complete\r\n"); |
jehoon | 4:d6f14b70d8aa | 178 | |
hkjung | 0:5cd6077e0a8e | 179 | myprintf("WIZnet IoT Shield for Arm MBED"); |
hkjung | 0:5cd6077e0a8e | 180 | myprintf("LTE Cat.M1 Version"); |
hkjung | 0:5cd6077e0a8e | 181 | myprintf("================================================="); |
hkjung | 0:5cd6077e0a8e | 182 | myprintf(">> Target Board: WIoT-QC01 (Quectel BG96)"); |
jehoon | 4:d6f14b70d8aa | 183 | myprintf(">> Sample Code: ThingPlug Send & Recv"); |
hkjung | 0:5cd6077e0a8e | 184 | myprintf("=================================================\r\n"); |
jehoon | 4:d6f14b70d8aa | 185 | |
hkjung | 0:5cd6077e0a8e | 186 | setEchoStatus_BG96(OFF); |
jehoon | 4:d6f14b70d8aa | 187 | |
hkjung | 0:5cd6077e0a8e | 188 | getUsimStatus_BG96(); |
jehoon | 4:d6f14b70d8aa | 189 | |
hkjung | 0:5cd6077e0a8e | 190 | getNetworkStatus_BG96(); |
jehoon | 4:d6f14b70d8aa | 191 | |
hkjung | 0:5cd6077e0a8e | 192 | checknSetApn_BG96(CATM1_APN_SKT); |
jehoon | 4:d6f14b70d8aa | 193 | |
jehoon | 4:d6f14b70d8aa | 194 | // Connect to ThingPlug |
jehoon | 4:d6f14b70d8aa | 195 | |
jehoon | 4:d6f14b70d8aa | 196 | |
jehoon | 4:d6f14b70d8aa | 197 | if(connectThingPlug_BG96(THINGPLUG_SVC_NAME, THINGPLUG_DEV_ID, THINGPLUG_DEV_TOKEN) != RET_OK) { |
jehoon | 4:d6f14b70d8aa | 198 | myprintf("[ThingPlug] Connection failed\r\n"); |
jehoon | 4:d6f14b70d8aa | 199 | while(1) {;} |
jehoon | 4:d6f14b70d8aa | 200 | } |
jehoon | 4:d6f14b70d8aa | 201 | |
jehoon | 4:d6f14b70d8aa | 202 | char thingplug_telemetry[128] ={0,}; |
jehoon | 4:d6f14b70d8aa | 203 | sprintf(thingplug_telemetry, "{\"%s\":%d, \"%s\":%d}", THINGPLUG_TELEMETRY1, 12, THINGPLUG_TELEMETRY2, 34); |
jehoon | 4:d6f14b70d8aa | 204 | // Send ThingPlug Telemetry test |
jehoon | 4:d6f14b70d8aa | 205 | if(sendThingPlugData_Json_BG96(THINGPLUG_DATA_TYPE_TELEMETRY, thingplug_telemetry, strlen(thingplug_telemetry)) == RET_OK) { |
jehoon | 4:d6f14b70d8aa | 206 | myprintf("[ThingPlug] Send telemetry: \"%s\"\r\n", thingplug_telemetry); |
jehoon | 4:d6f14b70d8aa | 207 | } |
jehoon | 4:d6f14b70d8aa | 208 | |
jehoon | 4:d6f14b70d8aa | 209 | // wait_ms(400); |
jehoon | 4:d6f14b70d8aa | 210 | // |
jehoon | 4:d6f14b70d8aa | 211 | // char thingplug_attribute[128] ={0,}; |
jehoon | 4:d6f14b70d8aa | 212 | // sprintf(thingplug_attribute, "{\"%s\":\"%s\"}", THINGPLUG_ATTRIBUTE, "ON"); |
jehoon | 4:d6f14b70d8aa | 213 | // if(sendThingPlugData_Json_BG96(THINGPLUG_DATA_TYPE_ATTRIBUTE, thingplug_attribute, strlen(thingplug_attribute)) == RET_OK) { |
jehoon | 4:d6f14b70d8aa | 214 | // myprintf("[ThingPlug] Send attribute: \"%s\"\r\n", thingplug_attribute); |
jehoon | 4:d6f14b70d8aa | 215 | // } |
hkjung | 0:5cd6077e0a8e | 216 | |
jehoon | 4:d6f14b70d8aa | 217 | char recved_cmd_type[32] = {0,}; |
jehoon | 4:d6f14b70d8aa | 218 | char recved_rpc_msg[128] = {0,}; |
jehoon | 4:d6f14b70d8aa | 219 | unsigned int recved_rpc_id = 0; |
jehoon | 4:d6f14b70d8aa | 220 | |
jehoon | 4:d6f14b70d8aa | 221 | // Recv ThingPlug RPC message test |
jehoon | 4:d6f14b70d8aa | 222 | while(1) { |
jehoon | 4:d6f14b70d8aa | 223 | // ThingPlug RPC received |
jehoon | 4:d6f14b70d8aa | 224 | if(recvThingPlugCmd_BG96(recved_cmd_type, &recved_rpc_id, recved_rpc_msg) == RET_OK) { |
jehoon | 4:d6f14b70d8aa | 225 | myprintf("[ThingPlug] Recieved RPC Type: \"%s\" ID: %d, Message: \"%s\"\r\n", recved_cmd_type, recved_rpc_id, recved_rpc_msg); |
jehoon | 4:d6f14b70d8aa | 226 | |
jehoon | 4:d6f14b70d8aa | 227 | { |
jehoon | 4:d6f14b70d8aa | 228 | wait_ms(400); |
jehoon | 4:d6f14b70d8aa | 229 | //RPC Process |
hkjung | 1:0d7ba45f12b1 | 230 | } |
hkjung | 1:0d7ba45f12b1 | 231 | |
jehoon | 4:d6f14b70d8aa | 232 | // Send ThingPlug RPC Result |
jehoon | 4:d6f14b70d8aa | 233 | if(sendThingPlugResp_BG96(recved_cmd_type, recved_rpc_id, THINGPLUG_CMD_RES_OK, recved_rpc_msg, strlen(recved_rpc_msg)) == RET_OK) { |
jehoon | 4:d6f14b70d8aa | 234 | myprintf("[ThingPlug] Send RPC Result, Type: \"%s\" ID: %d, Result: %d\r\n", recved_cmd_type, recved_rpc_id, THINGPLUG_CMD_RES_OK); |
jehoon | 4:d6f14b70d8aa | 235 | } |
hkjung | 1:0d7ba45f12b1 | 236 | } |
hkjung | 1:0d7ba45f12b1 | 237 | } |
hkjung | 0:5cd6077e0a8e | 238 | } |
hkjung | 0:5cd6077e0a8e | 239 | |
hkjung | 1:0d7ba45f12b1 | 240 | |
hkjung | 1:0d7ba45f12b1 | 241 | // ---------------------------------------------------------------- |
hkjung | 1:0d7ba45f12b1 | 242 | // Functions: Cat.M1 Status |
hkjung | 1:0d7ba45f12b1 | 243 | // ---------------------------------------------------------------- |
hkjung | 1:0d7ba45f12b1 | 244 | |
hkjung | 0:5cd6077e0a8e | 245 | void waitCatM1Ready(void) |
hkjung | 0:5cd6077e0a8e | 246 | { |
jehoon | 4:d6f14b70d8aa | 247 | while(1) { |
jehoon | 4:d6f14b70d8aa | 248 | if(_parser->recv("RDY")) { |
hkjung | 0:5cd6077e0a8e | 249 | myprintf("BG96 ready\r\n"); |
hkjung | 0:5cd6077e0a8e | 250 | return ; |
jehoon | 4:d6f14b70d8aa | 251 | } else if(_parser->send("AT") && _parser->recv("OK")) { |
jehoon | 4:d6f14b70d8aa | 252 | myprintf("BG96 already available\r\n"); |
jehoon | 4:d6f14b70d8aa | 253 | return ; |
hkjung | 0:5cd6077e0a8e | 254 | } |
jehoon | 4:d6f14b70d8aa | 255 | } |
hkjung | 0:5cd6077e0a8e | 256 | } |
hkjung | 0:5cd6077e0a8e | 257 | |
hkjung | 0:5cd6077e0a8e | 258 | int8_t setEchoStatus_BG96(bool onoff) |
hkjung | 0:5cd6077e0a8e | 259 | { |
hkjung | 0:5cd6077e0a8e | 260 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 261 | char _buf[10]; |
jehoon | 4:d6f14b70d8aa | 262 | |
jehoon | 4:d6f14b70d8aa | 263 | sprintf((char *)_buf, "ATE%d", onoff); |
jehoon | 4:d6f14b70d8aa | 264 | |
jehoon | 4:d6f14b70d8aa | 265 | if(_parser->send(_buf) && _parser->recv("OK")) { |
hkjung | 0:5cd6077e0a8e | 266 | devlog("Turn Echo %s success\r\n", onoff?"ON":"OFF"); |
hkjung | 0:5cd6077e0a8e | 267 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 268 | } else { |
hkjung | 0:5cd6077e0a8e | 269 | devlog("Turn Echo %s failed\r\n", onoff?"ON":"OFF"); |
jehoon | 4:d6f14b70d8aa | 270 | } |
hkjung | 0:5cd6077e0a8e | 271 | return ret; |
hkjung | 0:5cd6077e0a8e | 272 | } |
jehoon | 4:d6f14b70d8aa | 273 | |
hkjung | 0:5cd6077e0a8e | 274 | int8_t getUsimStatus_BG96(void) |
hkjung | 0:5cd6077e0a8e | 275 | { |
hkjung | 0:5cd6077e0a8e | 276 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 277 | |
jehoon | 4:d6f14b70d8aa | 278 | _parser->send("AT+CPIN?"); |
hkjung | 0:5cd6077e0a8e | 279 | if(_parser->recv("+CPIN: READY") && _parser->recv("OK")) { |
hkjung | 0:5cd6077e0a8e | 280 | devlog("USIM Status: READY\r\n"); |
hkjung | 0:5cd6077e0a8e | 281 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 282 | } else { |
jehoon | 4:d6f14b70d8aa | 283 | devlog("Retrieving USIM Status failed\r\n"); |
hkjung | 0:5cd6077e0a8e | 284 | } |
hkjung | 0:5cd6077e0a8e | 285 | return ret; |
hkjung | 0:5cd6077e0a8e | 286 | } |
hkjung | 0:5cd6077e0a8e | 287 | |
hkjung | 0:5cd6077e0a8e | 288 | int8_t getNetworkStatus_BG96(void) |
hkjung | 0:5cd6077e0a8e | 289 | { |
jehoon | 4:d6f14b70d8aa | 290 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 291 | |
hkjung | 0:5cd6077e0a8e | 292 | if(_parser->send("AT+QCDS") && _parser->recv("+QCDS: \"SRV\"") && _parser->recv("OK")) { |
hkjung | 0:5cd6077e0a8e | 293 | devlog("Network Status: attached\r\n"); |
hkjung | 0:5cd6077e0a8e | 294 | ret = RET_OK; |
hkjung | 0:5cd6077e0a8e | 295 | } else if (_parser->send("AT+QCDS") && _parser->recv("+QCDS: \"LIMITED\"") && _parser->recv("OK")) { |
hkjung | 0:5cd6077e0a8e | 296 | devlog("Network Status: limited\r\n"); |
jehoon | 4:d6f14b70d8aa | 297 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 298 | } else { |
jehoon | 4:d6f14b70d8aa | 299 | devlog("Network Status: Error\r\n"); |
hkjung | 0:5cd6077e0a8e | 300 | } |
hkjung | 0:5cd6077e0a8e | 301 | return ret; |
hkjung | 0:5cd6077e0a8e | 302 | } |
hkjung | 0:5cd6077e0a8e | 303 | |
hkjung | 0:5cd6077e0a8e | 304 | int8_t checknSetApn_BG96(const char * apn) // Configure Parameters of a TCP/IP Context |
jehoon | 4:d6f14b70d8aa | 305 | { |
hkjung | 0:5cd6077e0a8e | 306 | char resp_str[100]; |
jehoon | 4:d6f14b70d8aa | 307 | |
hkjung | 0:5cd6077e0a8e | 308 | uint16_t i = 0; |
hkjung | 0:5cd6077e0a8e | 309 | char * search_pt; |
jehoon | 4:d6f14b70d8aa | 310 | |
hkjung | 0:5cd6077e0a8e | 311 | memset(resp_str, 0, sizeof(resp_str)); |
jehoon | 4:d6f14b70d8aa | 312 | |
hkjung | 0:5cd6077e0a8e | 313 | devlog("Checking APN...\r\n"); |
jehoon | 4:d6f14b70d8aa | 314 | |
hkjung | 0:5cd6077e0a8e | 315 | _parser->send("AT+QICSGP=1"); |
jehoon | 4:d6f14b70d8aa | 316 | |
jehoon | 4:d6f14b70d8aa | 317 | while(1) { |
jehoon | 4:d6f14b70d8aa | 318 | _parser->read(&resp_str[i++], 1); |
hkjung | 0:5cd6077e0a8e | 319 | search_pt = strstr(resp_str, "OK\r\n"); |
jehoon | 4:d6f14b70d8aa | 320 | if (search_pt != 0) { |
hkjung | 0:5cd6077e0a8e | 321 | break; |
hkjung | 0:5cd6077e0a8e | 322 | } |
hkjung | 0:5cd6077e0a8e | 323 | } |
jehoon | 4:d6f14b70d8aa | 324 | |
hkjung | 0:5cd6077e0a8e | 325 | search_pt = strstr(resp_str, apn); |
jehoon | 4:d6f14b70d8aa | 326 | if (search_pt == 0) { |
hkjung | 0:5cd6077e0a8e | 327 | devlog("Mismatched APN: %s\r\n", resp_str); |
hkjung | 0:5cd6077e0a8e | 328 | devlog("Storing APN %s...\r\n", apn); |
jehoon | 4:d6f14b70d8aa | 329 | if(!(_parser->send("AT+QICSGP=1,%d,\"%s\",\"\",\"\",0", BG96_APN_PROTOCOL, apn) && _parser->recv("OK"))) { |
hkjung | 0:5cd6077e0a8e | 330 | return RET_NOK; // failed |
hkjung | 0:5cd6077e0a8e | 331 | } |
jehoon | 4:d6f14b70d8aa | 332 | } |
hkjung | 1:0d7ba45f12b1 | 333 | devlog("APN Check Done\r\n"); |
jehoon | 4:d6f14b70d8aa | 334 | |
hkjung | 0:5cd6077e0a8e | 335 | return RET_OK; |
hkjung | 0:5cd6077e0a8e | 336 | } |
hkjung | 0:5cd6077e0a8e | 337 | |
hkjung | 0:5cd6077e0a8e | 338 | int8_t getFirmwareVersion_BG96(char * version) |
hkjung | 0:5cd6077e0a8e | 339 | { |
hkjung | 0:5cd6077e0a8e | 340 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 341 | |
jehoon | 4:d6f14b70d8aa | 342 | if(_parser->send("AT+QGMR") && _parser->recv("%s\n", version) && _parser->recv("OK")) { |
hkjung | 0:5cd6077e0a8e | 343 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 344 | } |
hkjung | 0:5cd6077e0a8e | 345 | return ret; |
hkjung | 0:5cd6077e0a8e | 346 | } |
hkjung | 0:5cd6077e0a8e | 347 | |
hkjung | 0:5cd6077e0a8e | 348 | int8_t getImeiNumber_BG96(char * imei) |
hkjung | 0:5cd6077e0a8e | 349 | { |
jehoon | 4:d6f14b70d8aa | 350 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 351 | |
jehoon | 4:d6f14b70d8aa | 352 | if(_parser->send("AT+CGSN") && _parser->recv("%s\n", imei) && _parser->recv("OK")) { |
hkjung | 0:5cd6077e0a8e | 353 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 354 | } |
hkjung | 0:5cd6077e0a8e | 355 | return ret; |
hkjung | 0:5cd6077e0a8e | 356 | } |
hkjung | 0:5cd6077e0a8e | 357 | |
hkjung | 1:0d7ba45f12b1 | 358 | // ---------------------------------------------------------------- |
jehoon | 4:d6f14b70d8aa | 359 | // Functions: Cat.M1 ThingPlug send & recv |
hkjung | 1:0d7ba45f12b1 | 360 | // ---------------------------------------------------------------- |
hkjung | 0:5cd6077e0a8e | 361 | |
jehoon | 4:d6f14b70d8aa | 362 | int8_t connectThingPlug_BG96(char* svc_id, char* dev_id, char* dev_token) |
hkjung | 0:5cd6077e0a8e | 363 | { |
jehoon | 4:d6f14b70d8aa | 364 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 365 | |
hkjung | 0:5cd6077e0a8e | 366 | _parser->set_timeout(BG96_CONNECT_TIMEOUT); |
jehoon | 4:d6f14b70d8aa | 367 | |
jehoon | 4:d6f14b70d8aa | 368 | if( _parser->send("AT+SKTPCON=1,\"%s\",\"%s\",%d,%d,%d,\"simple_v1\",\"%s\",\"%s\",\"%s\"",\ |
jehoon | 4:d6f14b70d8aa | 369 | THINGPLUG_PROTOCOL, THINGPLUG_HOST, THINGPLUG_PORT, THINGPLUG_KEEPALIVE, THINGPLUG_CLEANSESSION,\ |
jehoon | 4:d6f14b70d8aa | 370 | dev_token, svc_id, dev_id) |
jehoon | 4:d6f14b70d8aa | 371 | && _parser->recv("OK") |
jehoon | 4:d6f14b70d8aa | 372 | && _parser->recv("+SKTPCON: 0")) { |
jehoon | 4:d6f14b70d8aa | 373 | devlog("BG96 Device is connected to ThingPlug successfully\r\n"); |
jehoon | 4:d6f14b70d8aa | 374 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 375 | } |
jehoon | 4:d6f14b70d8aa | 376 | _parser->set_timeout(BG96_DEFAULT_TIMEOUT); |
jehoon | 4:d6f14b70d8aa | 377 | |
jehoon | 4:d6f14b70d8aa | 378 | return ret; |
jehoon | 4:d6f14b70d8aa | 379 | } |
jehoon | 4:d6f14b70d8aa | 380 | |
jehoon | 4:d6f14b70d8aa | 381 | int8_t sendThingPlugData_Json_BG96(char* type, char * data, int len) |
jehoon | 4:d6f14b70d8aa | 382 | { |
jehoon | 4:d6f14b70d8aa | 383 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 384 | bool done = false; |
jehoon | 4:d6f14b70d8aa | 385 | |
jehoon | 4:d6f14b70d8aa | 386 | if( _parser->send("AT+SKTPDAT=1,\"%s\",%d", type, THINGPLUG_DATA_FORMAT_JSON)); |
jehoon | 4:d6f14b70d8aa | 387 | |
jehoon | 4:d6f14b70d8aa | 388 | if( !done && _parser->recv(">") ) |
jehoon | 4:d6f14b70d8aa | 389 | done = !(_parser->write(data, len) <= 0) & _parser->send("%c", ESPCAPE_SEQ); |
jehoon | 4:d6f14b70d8aa | 390 | |
jehoon | 4:d6f14b70d8aa | 391 | if( _parser->recv("OK") ) { |
jehoon | 4:d6f14b70d8aa | 392 | devlog("send ThingPlug Data successfully: %s\r\n", data); |
hkjung | 1:0d7ba45f12b1 | 393 | if(done) { |
hkjung | 1:0d7ba45f12b1 | 394 | ret = RET_OK; |
hkjung | 1:0d7ba45f12b1 | 395 | } |
hkjung | 0:5cd6077e0a8e | 396 | } |
jehoon | 4:d6f14b70d8aa | 397 | |
jehoon | 4:d6f14b70d8aa | 398 | _parser->flush(); |
jehoon | 4:d6f14b70d8aa | 399 | |
jehoon | 4:d6f14b70d8aa | 400 | return ret; |
jehoon | 4:d6f14b70d8aa | 401 | } |
jehoon | 4:d6f14b70d8aa | 402 | |
jehoon | 4:d6f14b70d8aa | 403 | int8_t sendThingPlugResp_BG96(char* cmd_type, unsigned int rpc_id, int result, char* result_data, int result_len) |
jehoon | 4:d6f14b70d8aa | 404 | { |
jehoon | 4:d6f14b70d8aa | 405 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 406 | bool done = false; |
jehoon | 4:d6f14b70d8aa | 407 | |
jehoon | 4:d6f14b70d8aa | 408 | if( _parser->send("AT+SKTPRES=1,\"%s\",%d,%d", cmd_type, rpc_id, result)); |
jehoon | 4:d6f14b70d8aa | 409 | |
jehoon | 4:d6f14b70d8aa | 410 | if( !done && _parser->recv(">") ) |
jehoon | 4:d6f14b70d8aa | 411 | done = !(_parser->write(result_data, result_len) <= 0) & _parser->send("%c", ESPCAPE_SEQ); |
jehoon | 4:d6f14b70d8aa | 412 | |
jehoon | 4:d6f14b70d8aa | 413 | if( _parser->recv("OK") ) { |
jehoon | 4:d6f14b70d8aa | 414 | devlog("send Command result successfully %d\r\n", rpc_id); |
jehoon | 4:d6f14b70d8aa | 415 | |
jehoon | 4:d6f14b70d8aa | 416 | if(done) { |
jehoon | 4:d6f14b70d8aa | 417 | ret = RET_OK; |
jehoon | 4:d6f14b70d8aa | 418 | } |
jehoon | 4:d6f14b70d8aa | 419 | } |
jehoon | 4:d6f14b70d8aa | 420 | _parser->flush(); |
hkjung | 0:5cd6077e0a8e | 421 | |
hkjung | 0:5cd6077e0a8e | 422 | return ret; |
hkjung | 0:5cd6077e0a8e | 423 | } |
hkjung | 0:5cd6077e0a8e | 424 | |
jehoon | 4:d6f14b70d8aa | 425 | int8_t recvThingPlugCmd_BG96(char* cmd_type, unsigned int* rpc_id, char* msg) |
hkjung | 0:5cd6077e0a8e | 426 | { |
hkjung | 0:5cd6077e0a8e | 427 | int8_t ret = RET_NOK; |
jehoon | 4:d6f14b70d8aa | 428 | unsigned int status; |
jehoon | 4:d6f14b70d8aa | 429 | bool received = false; |
hkjung | 0:5cd6077e0a8e | 430 | |
jehoon | 4:d6f14b70d8aa | 431 | _parser->set_timeout(1); |
hkjung | 1:0d7ba45f12b1 | 432 | |
jehoon | 4:d6f14b70d8aa | 433 | received = _parser->recv("+SKTPCMD: %[^\\,],%u,%u,%s\r\n", cmd_type, rpc_id, &status, msg); |
jehoon | 4:d6f14b70d8aa | 434 | // received = _parser->recv("+SKTPCMD: %[^\,],%u,%u,%s\r\n", cmd_type, rpc_id, &status, msg); |
jehoon | 4:d6f14b70d8aa | 435 | _parser->set_timeout(BG96_DEFAULT_TIMEOUT); |
jehoon | 4:d6f14b70d8aa | 436 | |
jehoon | 4:d6f14b70d8aa | 437 | if(received) ret = RET_OK; |
hkjung | 0:5cd6077e0a8e | 438 | return ret; |
jehoon | 4:d6f14b70d8aa | 439 | } |