Pubnub demo for AT&T IoT Starter Kit. Functionally similar to the Flow demo.

Dependencies:   FXOS8700CQ MODSERIAL mbed

http://pubnub.github.io/slides/workshop/pictures/broadcast.png

Pubnub demo for AT&T IoT Starter Kit

This demo is functionally similar to the Flow demo, so you can find general information here: https://developer.mbed.org/users/JMF/code/Avnet_ATT_Cellular_IOT/.

The only difference is that we use Pubnub to publish the measurements and subscribe to receiving the instructions to set the LED.

Settings

Pubnub related settings are:

Pubnub settings in `config_me.h`

PUBNUB_SUBSCRIBE_KEY
PUBNUB_PUBLISH_KEY
PUBNUB_CHANNEL

All are documented in their respective comments.

Pubnub context class

Similar to Pubnub SDKs, we provide a Pubnub context class. It is defined in pubnub.h header file and implemented in pubnub.cpp.

It provides only the fundamental "publish" and "subscribe" methods. They are documented in the header file.

This class is reusable in other code (it is not specific to this demo), it has a very narrow interface to the AT&T IoT cellular modem code. For example of use, you can look at the main() (in main.c).

Sample of published data

Published message w/measurement data

{"serial":"vstarterkit001","temp":89.61,"humidity":35,"accelX":0.97,"accelY":0.013,"accelZ":-0.038}

Don't worry, nobody got burnt, the temperature is in degrees Fahrenheit. :)

Publish a message (from, say, the Pubnub console http://pubnub.com/console) of the form {"LED":<name-of-the-color>} on the channel that this demo listens to (default is hello_world) to turn the LED to that color on the Starter Kit:

Turn LED to red

{"LED":"Red"}

Turn LED to green

{"LED":"Green"}

Turn LED to blue

{"LED":"Blue"}
Committer:
fkellermavnet
Date:
Sat Aug 13 17:46:30 2016 +0000
Revision:
75:8cc98a3b9c62
Parent:
74:3e3ee15584e5
Parent:
73:da723fedfdd2
Child:
77:c65eae5b9958
Re-merged in Stefan's branch with Eaddy branch.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 68:6e311c747045 1 /* ===================================================================
fkellermavnet 74:3e3ee15584e5 2 Copyright c 2016, AVNET Inc.
fkellermavnet 68:6e311c747045 3
fkellermavnet 68:6e311c747045 4 Licensed under the Apache License, Version 2.0 (the "License");
fkellermavnet 68:6e311c747045 5 you may not use this file except in compliance with the License.
fkellermavnet 68:6e311c747045 6 You may obtain a copy of the License at
fkellermavnet 68:6e311c747045 7
fkellermavnet 68:6e311c747045 8 http://www.apache.org/licenses/LICENSE-2.0
fkellermavnet 68:6e311c747045 9
fkellermavnet 68:6e311c747045 10 Unless required by applicable law or agreed to in writing,
fkellermavnet 68:6e311c747045 11 software distributed under the License is distributed on an
fkellermavnet 68:6e311c747045 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
fkellermavnet 68:6e311c747045 13 either express or implied. See the License for the specific
fkellermavnet 68:6e311c747045 14 language governing permissions and limitations under the License.
fkellermavnet 68:6e311c747045 15
fkellermavnet 68:6e311c747045 16 ======================================================================== */
fkellermavnet 68:6e311c747045 17
stefanrousseau 61:f6b93129f954 18 #include "mbed.h"
stefanrousseau 61:f6b93129f954 19 #include <cctype>
stefanrousseau 61:f6b93129f954 20 #include <string>
stefanrousseau 61:f6b93129f954 21
stefanrousseau 61:f6b93129f954 22 #include "config_me.h"
stefanrousseau 61:f6b93129f954 23 #include "wnc_control.h"
stefanrousseau 61:f6b93129f954 24 #include "hardware.h"
stefanrousseau 61:f6b93129f954 25
stefanrousseau 61:f6b93129f954 26 #define MDM_DBG_OFF 0
stefanrousseau 61:f6b93129f954 27 #define MDM_DBG_AT_CMDS (1 << 0)
stefanrousseau 61:f6b93129f954 28 int mdm_dbgmask = MDM_DBG_OFF;
stefanrousseau 61:f6b93129f954 29
stefanrousseau 61:f6b93129f954 30 #define WNC_WAIT_FOR_AT_CMD_MS 40
stefanrousseau 61:f6b93129f954 31
stefanrousseau 61:f6b93129f954 32 DigitalOut mdm_uart2_rx_boot_mode_sel(PTC17); // on powerup, 0 = boot mode, 1 = normal boot
stefanrousseau 61:f6b93129f954 33 DigitalOut mdm_power_on(PTB9); // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
stefanrousseau 61:f6b93129f954 34 DigitalOut mdm_wakeup_in(PTC2); // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
stefanrousseau 61:f6b93129f954 35
stefanrousseau 61:f6b93129f954 36 DigitalOut mdm_reset(PTC12); // active high
stefanrousseau 61:f6b93129f954 37
stefanrousseau 61:f6b93129f954 38 DigitalOut shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
stefanrousseau 61:f6b93129f954 39 DigitalOut mdm_uart1_cts(PTD0);
stefanrousseau 61:f6b93129f954 40
stefanrousseau 61:f6b93129f954 41 #define TOUPPER(a) (a) //toupper(a)
stefanrousseau 61:f6b93129f954 42
stefanrousseau 61:f6b93129f954 43 const char ok_str[] = "OK";
stefanrousseau 61:f6b93129f954 44 const char error_str[] = "ERROR";
stefanrousseau 61:f6b93129f954 45
stefanrousseau 61:f6b93129f954 46 #define MDM_OK 0
stefanrousseau 61:f6b93129f954 47 #define MDM_ERR_TIMEOUT -1
stefanrousseau 61:f6b93129f954 48
stefanrousseau 61:f6b93129f954 49 #define MAX_AT_RSP_LEN 255
stefanrousseau 61:f6b93129f954 50
stefanrousseau 61:f6b93129f954 51 ssize_t mdm_getline(char *buff, size_t size, int timeout_ms) {
stefanrousseau 61:f6b93129f954 52 int cin = -1;
stefanrousseau 61:f6b93129f954 53 int cin_last;
stefanrousseau 61:f6b93129f954 54
stefanrousseau 61:f6b93129f954 55 if (NULL == buff || size == 0) {
stefanrousseau 61:f6b93129f954 56 return -1;
stefanrousseau 61:f6b93129f954 57 }
stefanrousseau 61:f6b93129f954 58
stefanrousseau 61:f6b93129f954 59 size_t len = 0;
stefanrousseau 61:f6b93129f954 60 Timer timer;
stefanrousseau 61:f6b93129f954 61 timer.start();
stefanrousseau 61:f6b93129f954 62 while ((len < (size-1)) && (timer.read_ms() < timeout_ms)) {
stefanrousseau 61:f6b93129f954 63 if (mdm.readable()) {
stefanrousseau 61:f6b93129f954 64 cin_last = cin;
stefanrousseau 61:f6b93129f954 65 cin = mdm.getc();
stefanrousseau 61:f6b93129f954 66 if (isprint(cin)) {
stefanrousseau 61:f6b93129f954 67 buff[len++] = (char)cin;
stefanrousseau 61:f6b93129f954 68 continue;
stefanrousseau 61:f6b93129f954 69 } else if (('\r' == cin_last) && ('\n' == cin)) {
stefanrousseau 61:f6b93129f954 70 break;
stefanrousseau 61:f6b93129f954 71 }
stefanrousseau 61:f6b93129f954 72 }
stefanrousseau 61:f6b93129f954 73 // wait_ms(1);
stefanrousseau 61:f6b93129f954 74 }
stefanrousseau 61:f6b93129f954 75 buff[len] = (char)NULL;
stefanrousseau 61:f6b93129f954 76
stefanrousseau 61:f6b93129f954 77 return len;
stefanrousseau 61:f6b93129f954 78 }
stefanrousseau 61:f6b93129f954 79
stefanrousseau 61:f6b93129f954 80 int mdm_sendAtCmd(const char *cmd, const char **rsp_list, int timeout_ms) {
stefanrousseau 61:f6b93129f954 81 // Per WNC wait:
stefanrousseau 61:f6b93129f954 82 wait_ms(WNC_WAIT_FOR_AT_CMD_MS);
stefanrousseau 61:f6b93129f954 83
stefanrousseau 61:f6b93129f954 84 if (cmd && strlen(cmd) > 0) {
stefanrousseau 61:f6b93129f954 85 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
stefanrousseau 64:09004cd610df 86 PRINTF(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
stefanrousseau 61:f6b93129f954 87 }
stefanrousseau 61:f6b93129f954 88 mdm.puts(cmd);
stefanrousseau 61:f6b93129f954 89 mdm.puts("\r\n");
stefanrousseau 61:f6b93129f954 90 }
stefanrousseau 61:f6b93129f954 91
stefanrousseau 61:f6b93129f954 92 if (rsp_list) {
stefanrousseau 61:f6b93129f954 93 Timer timer;
stefanrousseau 61:f6b93129f954 94 char rsp[MAX_AT_RSP_LEN+1];
stefanrousseau 61:f6b93129f954 95 int len;
stefanrousseau 61:f6b93129f954 96
stefanrousseau 61:f6b93129f954 97 timer.start();
stefanrousseau 61:f6b93129f954 98 while (timer.read_ms() < timeout_ms) {
stefanrousseau 61:f6b93129f954 99 len = mdm_getline(rsp, sizeof(rsp), timeout_ms - timer.read_ms());
stefanrousseau 61:f6b93129f954 100
stefanrousseau 61:f6b93129f954 101 if (len < 0)
stefanrousseau 61:f6b93129f954 102 return MDM_ERR_TIMEOUT;
stefanrousseau 61:f6b93129f954 103
stefanrousseau 61:f6b93129f954 104 if (len == 0)
stefanrousseau 61:f6b93129f954 105 continue;
stefanrousseau 61:f6b93129f954 106
stefanrousseau 61:f6b93129f954 107 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
stefanrousseau 64:09004cd610df 108 PRINTF(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", rsp);
stefanrousseau 61:f6b93129f954 109 }
stefanrousseau 61:f6b93129f954 110
stefanrousseau 61:f6b93129f954 111 if (rsp_list) {
stefanrousseau 61:f6b93129f954 112 int rsp_idx = 0;
stefanrousseau 61:f6b93129f954 113 while (rsp_list[rsp_idx]) {
stefanrousseau 61:f6b93129f954 114 if (strcasecmp(rsp, rsp_list[rsp_idx]) == 0) {
stefanrousseau 61:f6b93129f954 115 return rsp_idx;
fkellermavnet 74:3e3ee15584e5 116 } else if (strncmp(rsp, "@EXTERR", 7) == 0){
fkellermavnet 74:3e3ee15584e5 117 pc.printf("----- We got EXTERR ---\r\n");
fkellermavnet 74:3e3ee15584e5 118 return 2;
fkellermavnet 74:3e3ee15584e5 119 } else if (strncmp(rsp, "+CME", 4) == 0){
fkellermavnet 74:3e3ee15584e5 120 return 3;
fkellermavnet 74:3e3ee15584e5 121 }
stefanrousseau 61:f6b93129f954 122 rsp_idx++;
stefanrousseau 61:f6b93129f954 123 }
stefanrousseau 61:f6b93129f954 124 }
stefanrousseau 61:f6b93129f954 125 }
stefanrousseau 61:f6b93129f954 126 return MDM_ERR_TIMEOUT;
stefanrousseau 61:f6b93129f954 127 }
stefanrousseau 61:f6b93129f954 128 return MDM_OK;
stefanrousseau 61:f6b93129f954 129 }
stefanrousseau 61:f6b93129f954 130
stefanrousseau 61:f6b93129f954 131 int mdm_init(void) {
stefanrousseau 61:f6b93129f954 132 // Hard reset the modem (doesn't go through
stefanrousseau 61:f6b93129f954 133 // the signal level translator)
stefanrousseau 61:f6b93129f954 134 mdm_reset = 0;
stefanrousseau 61:f6b93129f954 135
stefanrousseau 61:f6b93129f954 136 // disable signal level translator (necessary
stefanrousseau 61:f6b93129f954 137 // for the modem to boot properly). All signals
stefanrousseau 61:f6b93129f954 138 // except mdm_reset go through the level translator
stefanrousseau 61:f6b93129f954 139 // and have internal pull-up/down in the module. While
stefanrousseau 61:f6b93129f954 140 // the level translator is disabled, these pins will
stefanrousseau 61:f6b93129f954 141 // be in the correct state.
stefanrousseau 61:f6b93129f954 142 shield_3v3_1v8_sig_trans_ena = 0;
stefanrousseau 61:f6b93129f954 143
stefanrousseau 61:f6b93129f954 144 // While the level translator is disabled and ouptut pins
stefanrousseau 61:f6b93129f954 145 // are tristated, make sure the inputs are in the same state
stefanrousseau 61:f6b93129f954 146 // as the WNC Module pins so that when the level translator is
stefanrousseau 61:f6b93129f954 147 // enabled, there are no differences.
stefanrousseau 61:f6b93129f954 148 mdm_uart2_rx_boot_mode_sel = 1; // UART2_RX should be high
stefanrousseau 61:f6b93129f954 149 mdm_power_on = 0; // powr_on should be low
stefanrousseau 61:f6b93129f954 150 mdm_wakeup_in = 1; // wake-up should be high
stefanrousseau 61:f6b93129f954 151 mdm_uart1_cts = 0; // indicate that it is ok to send
stefanrousseau 61:f6b93129f954 152
stefanrousseau 61:f6b93129f954 153 // Now, wait for the WNC Module to perform its initial boot correctly
stefanrousseau 61:f6b93129f954 154 wait(1.0);
stefanrousseau 61:f6b93129f954 155
stefanrousseau 61:f6b93129f954 156 // The WNC module initializes comms at 115200 8N1 so set it up
stefanrousseau 61:f6b93129f954 157 mdm.baud(115200);
stefanrousseau 61:f6b93129f954 158
stefanrousseau 61:f6b93129f954 159 //Now, enable the level translator, the input pins should now be the
stefanrousseau 61:f6b93129f954 160 //same as how the M14A module is driving them with internal pull ups/downs.
stefanrousseau 61:f6b93129f954 161 //When enabled, there will be no changes in these 4 pins...
stefanrousseau 61:f6b93129f954 162 shield_3v3_1v8_sig_trans_ena = 1;
stefanrousseau 61:f6b93129f954 163
stefanrousseau 61:f6b93129f954 164 // Now, give the modem 60 seconds to start responding by
stefanrousseau 61:f6b93129f954 165 // sending simple 'AT' commands to modem once per second.
stefanrousseau 61:f6b93129f954 166 Timer timer;
stefanrousseau 61:f6b93129f954 167 timer.start();
stefanrousseau 61:f6b93129f954 168 while (timer.read() < 60) {
stefanrousseau 61:f6b93129f954 169 const char * rsp_lst[] = { ok_str, error_str, NULL };
stefanrousseau 61:f6b93129f954 170 int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
stefanrousseau 61:f6b93129f954 171 if (rc == 0)
stefanrousseau 61:f6b93129f954 172 return true; //timer.read();
stefanrousseau 61:f6b93129f954 173 wait_ms(1000 - (timer.read_ms() % 1000));
stefanrousseau 64:09004cd610df 174 PRINTF("\r%d",timer.read_ms()/1000);
stefanrousseau 61:f6b93129f954 175 }
stefanrousseau 61:f6b93129f954 176 return false;
stefanrousseau 61:f6b93129f954 177 }
stefanrousseau 61:f6b93129f954 178
stefanrousseau 61:f6b93129f954 179 int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len) {
stefanrousseau 61:f6b93129f954 180 static char cmd_buf[3200]; // Need enough room for the WNC sockreads (over 3000 chars)
stefanrousseau 61:f6b93129f954 181 size_t n = strlen(cmd);
stefanrousseau 61:f6b93129f954 182
stefanrousseau 61:f6b93129f954 183 // Per WNC wait:
stefanrousseau 61:f6b93129f954 184 wait_ms(WNC_WAIT_FOR_AT_CMD_MS);
stefanrousseau 61:f6b93129f954 185
stefanrousseau 61:f6b93129f954 186 if (cmd && n > 0) {
stefanrousseau 61:f6b93129f954 187 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
stefanrousseau 64:09004cd610df 188 PRINTF(MAG "ATCMD: " DEF "--> " GRN "%s" DEF "\n", cmd);
stefanrousseau 61:f6b93129f954 189 }
stefanrousseau 61:f6b93129f954 190 // mdm.puts(cmd);
stefanrousseau 61:f6b93129f954 191 // mdm.puts("\r\n");
stefanrousseau 61:f6b93129f954 192 while (n--) {
stefanrousseau 61:f6b93129f954 193 mdm.putc(*cmd++);
stefanrousseau 61:f6b93129f954 194 wait_us(1000);
stefanrousseau 61:f6b93129f954 195 };
stefanrousseau 61:f6b93129f954 196 mdm.putc('\r');
stefanrousseau 61:f6b93129f954 197 wait_us(1000);
stefanrousseau 61:f6b93129f954 198 mdm.putc('\n');
stefanrousseau 61:f6b93129f954 199 wait_us(1000);
stefanrousseau 61:f6b93129f954 200 }
stefanrousseau 61:f6b93129f954 201
stefanrousseau 61:f6b93129f954 202 if (rsp_list) {
stefanrousseau 61:f6b93129f954 203 rsp->erase(); // Clean up from prior cmd response
stefanrousseau 61:f6b93129f954 204 *len = 0;
stefanrousseau 61:f6b93129f954 205 Timer timer;
stefanrousseau 61:f6b93129f954 206 timer.start();
stefanrousseau 61:f6b93129f954 207 while (timer.read_ms() < timeout_ms) {
stefanrousseau 61:f6b93129f954 208 int lenCmd = mdm_getline(cmd_buf, sizeof(cmd_buf), timeout_ms - timer.read_ms());
stefanrousseau 61:f6b93129f954 209
stefanrousseau 61:f6b93129f954 210 if (lenCmd == 0)
stefanrousseau 61:f6b93129f954 211 continue;
stefanrousseau 61:f6b93129f954 212
stefanrousseau 61:f6b93129f954 213 if (lenCmd < 0)
stefanrousseau 61:f6b93129f954 214 return MDM_ERR_TIMEOUT;
stefanrousseau 61:f6b93129f954 215 else {
stefanrousseau 61:f6b93129f954 216 *len += lenCmd;
stefanrousseau 61:f6b93129f954 217 *rsp += cmd_buf;
stefanrousseau 61:f6b93129f954 218 }
stefanrousseau 61:f6b93129f954 219
stefanrousseau 61:f6b93129f954 220 if (mdm_dbgmask & MDM_DBG_AT_CMDS) {
stefanrousseau 64:09004cd610df 221 PRINTF(MAG "ATRSP: " DEF "<-- " CYN "%s" DEF "\n", cmd_buf);
stefanrousseau 61:f6b93129f954 222 }
stefanrousseau 61:f6b93129f954 223
stefanrousseau 61:f6b93129f954 224 int rsp_idx = 0;
fkellermavnet 73:da723fedfdd2 225 // TODO: Test if @EXTERR:<code>
stefanrousseau 61:f6b93129f954 226 while (rsp_list[rsp_idx]) {
stefanrousseau 61:f6b93129f954 227 if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) {
stefanrousseau 61:f6b93129f954 228 return rsp_idx;
fkellermavnet 73:da723fedfdd2 229 } else if (strncmp(cmd_buf, "@EXTERR", 7) == 0){
fkellermavnet 75:8cc98a3b9c62 230 PRINTF("----- We got EXTERR ---\r\n");
fkellermavnet 74:3e3ee15584e5 231 return 2;
fkellermavnet 74:3e3ee15584e5 232 } else if (strncmp(cmd_buf, "+CME", 4) == 0){
fkellermavnet 74:3e3ee15584e5 233 return 3;
fkellermavnet 74:3e3ee15584e5 234 }
stefanrousseau 61:f6b93129f954 235 rsp_idx++;
stefanrousseau 61:f6b93129f954 236 }
stefanrousseau 61:f6b93129f954 237 }
stefanrousseau 61:f6b93129f954 238 return MDM_ERR_TIMEOUT;
stefanrousseau 61:f6b93129f954 239 }
stefanrousseau 61:f6b93129f954 240
stefanrousseau 61:f6b93129f954 241 return MDM_OK;
stefanrousseau 61:f6b93129f954 242 }
stefanrousseau 61:f6b93129f954 243
stefanrousseau 61:f6b93129f954 244 void reinitialize_mdm(void)
stefanrousseau 61:f6b93129f954 245 {
stefanrousseau 61:f6b93129f954 246 // Initialize the modem
stefanrousseau 64:09004cd610df 247 PRINTF(GRN "Modem RE-initializing..." DEF "\r\n");
stefanrousseau 61:f6b93129f954 248 if (!mdm_init()) {
stefanrousseau 64:09004cd610df 249 PRINTF(RED "\n\rModem RE-initialization failed!" DEF "\n");
stefanrousseau 61:f6b93129f954 250 }
stefanrousseau 64:09004cd610df 251 PRINTF("\r\n");
stefanrousseau 61:f6b93129f954 252 }
stefanrousseau 61:f6b93129f954 253 // These are built on the fly
stefanrousseau 61:f6b93129f954 254 string MyServerIpAddress;
stefanrousseau 61:f6b93129f954 255 string MySocketData;
stefanrousseau 61:f6b93129f954 256
stefanrousseau 61:f6b93129f954 257 //********************************************************************************************************************************************
stefanrousseau 61:f6b93129f954 258 //* Process JSON response messages
stefanrousseau 61:f6b93129f954 259 //********************************************************************************************************************************************
stefanrousseau 61:f6b93129f954 260 bool extract_JSON(char* search_field, char* found_string)
stefanrousseau 61:f6b93129f954 261 {
stefanrousseau 61:f6b93129f954 262 char* beginquote;
stefanrousseau 61:f6b93129f954 263 char* endquote;
stefanrousseau 61:f6b93129f954 264 beginquote = strchr(search_field, '{'); //start of JSON
stefanrousseau 61:f6b93129f954 265 endquote = strchr(search_field, '}'); //end of JSON
stefanrousseau 61:f6b93129f954 266 if (beginquote)
stefanrousseau 61:f6b93129f954 267 {
stefanrousseau 61:f6b93129f954 268 uint16_t ifoundlen;
stefanrousseau 61:f6b93129f954 269 if (endquote)
stefanrousseau 61:f6b93129f954 270 {
stefanrousseau 61:f6b93129f954 271 ifoundlen = (uint16_t) (endquote - beginquote) + 1;
stefanrousseau 61:f6b93129f954 272 strncpy(found_string, beginquote, ifoundlen );
stefanrousseau 61:f6b93129f954 273 found_string[ifoundlen] = 0; //null terminate
stefanrousseau 61:f6b93129f954 274 return true;
stefanrousseau 61:f6b93129f954 275 }
stefanrousseau 61:f6b93129f954 276 else
stefanrousseau 61:f6b93129f954 277 {
stefanrousseau 61:f6b93129f954 278 endquote = strchr(search_field, '\0'); //end of string... sometimes the end bracket is missing
stefanrousseau 61:f6b93129f954 279 ifoundlen = (uint16_t) (endquote - beginquote) + 1;
stefanrousseau 61:f6b93129f954 280 strncpy(found_string, beginquote, ifoundlen );
stefanrousseau 61:f6b93129f954 281 found_string[ifoundlen] = 0; //null terminate
stefanrousseau 61:f6b93129f954 282 return false;
stefanrousseau 61:f6b93129f954 283 }
stefanrousseau 61:f6b93129f954 284 }
stefanrousseau 61:f6b93129f954 285 else
stefanrousseau 61:f6b93129f954 286 {
stefanrousseau 61:f6b93129f954 287 return false;
stefanrousseau 61:f6b93129f954 288 }
stefanrousseau 61:f6b93129f954 289 } //extract_JSON
stefanrousseau 61:f6b93129f954 290
stefanrousseau 61:f6b93129f954 291 int cell_modem_init()
stefanrousseau 61:f6b93129f954 292 {
stefanrousseau 61:f6b93129f954 293 int i;
stefanrousseau 61:f6b93129f954 294
stefanrousseau 61:f6b93129f954 295 pc.baud(115200);
stefanrousseau 61:f6b93129f954 296 // Initialize the modem
stefanrousseau 64:09004cd610df 297 PRINTF(GRN "Modem initializing... will take up to 60 seconds" DEF "\r\n");
stefanrousseau 61:f6b93129f954 298 do {
stefanrousseau 61:f6b93129f954 299 i=mdm_init();
stefanrousseau 61:f6b93129f954 300 if (!i) {
stefanrousseau 64:09004cd610df 301 PRINTF(RED "Modem initialization failed!" DEF "\n");
stefanrousseau 61:f6b93129f954 302 }
stefanrousseau 61:f6b93129f954 303 } while (!i);
stefanrousseau 61:f6b93129f954 304
stefanrousseau 61:f6b93129f954 305 //Software init
stefanrousseau 61:f6b93129f954 306 software_init_mdm();
stefanrousseau 61:f6b93129f954 307
stefanrousseau 61:f6b93129f954 308 // Resolve URL to IP address to connect to
stefanrousseau 61:f6b93129f954 309 resolve_mdm();
stefanrousseau 61:f6b93129f954 310 // Open the socket (connect to the server)
stefanrousseau 61:f6b93129f954 311 sockopen_mdm();
stefanrousseau 61:f6b93129f954 312 return (0);
stefanrousseau 61:f6b93129f954 313 }
stefanrousseau 61:f6b93129f954 314
stefanrousseau 61:f6b93129f954 315 int cell_modem_Sendreceive(char* tx_string, char* rx_string)
stefanrousseau 61:f6b93129f954 316 {
stefanrousseau 61:f6b93129f954 317 int iStatus = 0; //error by default
stefanrousseau 64:09004cd610df 318 PRINTF(DEF "\r\n");
stefanrousseau 64:09004cd610df 319 PRINTF(BLU "Sending to modem : %s" DEF "\r\n", &tx_string[0]);
stefanrousseau 61:f6b93129f954 320 sockwrite_mdm(&tx_string[0]);
stefanrousseau 61:f6b93129f954 321 if (sockread_mdm(&MySocketData, 1024, 20))
stefanrousseau 61:f6b93129f954 322 {
stefanrousseau 64:09004cd610df 323 PRINTF(DEF "\r\n");
stefanrousseau 64:09004cd610df 324 PRINTF(YEL "Read back : %s" DEF "\r\n", &MySocketData[0]);
stefanrousseau 61:f6b93129f954 325 char stringToCharBuf[BUF_SIZE_FOR_N_MAX_SOCKREAD*MAX_WNC_SOCKREAD_PAYLOAD+1]; // WNC can return max of 1500 (per sockread)
stefanrousseau 61:f6b93129f954 326 if ((MySocketData.length() + 1) < sizeof(stringToCharBuf))
stefanrousseau 61:f6b93129f954 327 {
stefanrousseau 61:f6b93129f954 328 strcpy(stringToCharBuf, MySocketData.c_str());
stefanrousseau 61:f6b93129f954 329 if (extract_JSON(stringToCharBuf, &rx_string[0]))
stefanrousseau 61:f6b93129f954 330 {
stefanrousseau 64:09004cd610df 331 PRINTF(GRN "JSON : %s" DEF "\n", &rx_string[0]);
stefanrousseau 61:f6b93129f954 332 iStatus = 1; //all good
stefanrousseau 61:f6b93129f954 333 }
stefanrousseau 61:f6b93129f954 334 }
stefanrousseau 61:f6b93129f954 335 else
stefanrousseau 61:f6b93129f954 336 {
stefanrousseau 64:09004cd610df 337 PRINTF(RED "BUFFER not big enough for sock data!" DEF "\r\n");
stefanrousseau 61:f6b93129f954 338 }
stefanrousseau 61:f6b93129f954 339 }
stefanrousseau 61:f6b93129f954 340 else
stefanrousseau 61:f6b93129f954 341 {
stefanrousseau 64:09004cd610df 342 PRINTF(RED "No response..." DEF "\r\n");
stefanrousseau 61:f6b93129f954 343 }
stefanrousseau 61:f6b93129f954 344 return iStatus;
stefanrousseau 61:f6b93129f954 345 }