Miroslav Simudvarac
/
example-reading-imei-imsi
changed at for testing
Fork of example-reading-imei-imsi by
main.cpp@3:103f58fac4cf, 2018-10-12 (annotated)
- Committer:
- simudvarac
- Date:
- Fri Oct 12 11:38:49 2018 +0000
- Revision:
- 3:103f58fac4cf
- Parent:
- 2:c845f4f6c2b6
new;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
euygun | 0:b51700dcba34 | 1 | /* mbed Microcontroller Library |
euygun | 0:b51700dcba34 | 2 | * Copyright (c) 2017 u-blox |
euygun | 0:b51700dcba34 | 3 | * |
euygun | 0:b51700dcba34 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
euygun | 0:b51700dcba34 | 5 | * you may not use this file except in compliance with the License. |
euygun | 0:b51700dcba34 | 6 | * You may obtain a copy of the License at |
euygun | 0:b51700dcba34 | 7 | * |
euygun | 0:b51700dcba34 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
euygun | 0:b51700dcba34 | 9 | * |
euygun | 0:b51700dcba34 | 10 | * Unless required by applicable law or agreed to in writing, software |
euygun | 0:b51700dcba34 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
euygun | 0:b51700dcba34 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
euygun | 0:b51700dcba34 | 13 | * See the License for the specific language governing permissions and |
euygun | 0:b51700dcba34 | 14 | * limitations under the License. |
euygun | 0:b51700dcba34 | 15 | */ |
euygun | 0:b51700dcba34 | 16 | |
euygun | 0:b51700dcba34 | 17 | #include "mbed.h" |
euygun | 0:b51700dcba34 | 18 | #include "ATCmdParser.h" |
euygun | 0:b51700dcba34 | 19 | #include "FileHandle.h" |
euygun | 0:b51700dcba34 | 20 | #include "onboard_modem_api.h" |
simudvarac | 3:103f58fac4cf | 21 | #include "stdlib.h" |
euygun | 0:b51700dcba34 | 22 | |
euygun | 0:b51700dcba34 | 23 | /* Definitions */ |
euygun | 0:b51700dcba34 | 24 | #define OUTPUT_ENTER_KEY "\r" |
euygun | 0:b51700dcba34 | 25 | #define AT_PARSER_BUFFER_SIZE 256 |
euygun | 0:b51700dcba34 | 26 | #define AT_PARSER_TIMEOUT 8*1000 // Milliseconds |
euygun | 0:b51700dcba34 | 27 | |
simudvarac | 3:103f58fac4cf | 28 | /* The example program for the u-blox C030 boards. It sets up the Cellular Module then read out the IMSI of the eUICC/SIM. |
euygun | 0:b51700dcba34 | 29 | * The Uer LEDs (RGB) and User Button are utilised to show the activity on the board. |
simudvarac | 3:103f58fac4cf | 30 | * When GNSS has a location fix, the Red Timepulse LED, next to the User LEDs, blinks every 1 second. |
euygun | 0:b51700dcba34 | 31 | */ |
euygun | 0:b51700dcba34 | 32 | |
euygun | 0:b51700dcba34 | 33 | /* File handler */ |
euygun | 0:b51700dcba34 | 34 | FileHandle *fh; |
euygun | 0:b51700dcba34 | 35 | |
euygun | 0:b51700dcba34 | 36 | /* AT Command Parser handle */ |
euygun | 0:b51700dcba34 | 37 | ATCmdParser *at; |
euygun | 0:b51700dcba34 | 38 | |
euygun | 0:b51700dcba34 | 39 | // User LEDs |
euygun | 0:b51700dcba34 | 40 | DigitalOut ledRed(LED1, 1); |
euygun | 0:b51700dcba34 | 41 | DigitalOut ledGreen(LED2, 1); |
euygun | 0:b51700dcba34 | 42 | DigitalOut ledBlue(LED3, 1); |
euygun | 0:b51700dcba34 | 43 | |
simudvarac | 3:103f58fac4cf | 44 | // Ethernet socket LED |
euygun | 0:b51700dcba34 | 45 | DigitalOut ledYellow(LED4,1); |
euygun | 0:b51700dcba34 | 46 | |
euygun | 0:b51700dcba34 | 47 | // User Button |
euygun | 0:b51700dcba34 | 48 | #ifdef TARGET_UBLOX_C027 |
simudvarac | 3:103f58fac4cf | 49 | // No user button on C027 |
simudvarac | 3:103f58fac4cf | 50 | InterruptIn userButton(NC); |
euygun | 0:b51700dcba34 | 51 | #else |
simudvarac | 3:103f58fac4cf | 52 | InterruptIn userButton(SW0); |
euygun | 0:b51700dcba34 | 53 | #endif |
simudvarac | 3:103f58fac4cf | 54 | |
euygun | 0:b51700dcba34 | 55 | // Delay between LED changes in second |
euygun | 0:b51700dcba34 | 56 | volatile float delay = 0.5; |
euygun | 0:b51700dcba34 | 57 | |
euygun | 0:b51700dcba34 | 58 | // To check if the user pressed the User Button or not |
simudvarac | 3:103f58fac4cf | 59 | void threadBodyUserButtonCheck(void const *args) |
simudvarac | 3:103f58fac4cf | 60 | { |
euygun | 0:b51700dcba34 | 61 | float delayToggle = delay; |
simudvarac | 3:103f58fac4cf | 62 | while (1) { |
euygun | 0:b51700dcba34 | 63 | if (userButton.read() == 1 ) { |
simudvarac | 3:103f58fac4cf | 64 | // User Button is pressed |
euygun | 0:b51700dcba34 | 65 | delay = 0.1; |
simudvarac | 3:103f58fac4cf | 66 | // Indicate with the Yellow LED on Ethernet socket |
euygun | 0:b51700dcba34 | 67 | ledYellow = 0; |
simudvarac | 3:103f58fac4cf | 68 | } else { |
simudvarac | 3:103f58fac4cf | 69 | // User button is released |
euygun | 0:b51700dcba34 | 70 | delay = 0.5; |
euygun | 0:b51700dcba34 | 71 | // Turn off the Yellow LED on Ethernet socket |
euygun | 0:b51700dcba34 | 72 | ledYellow = 1; |
euygun | 0:b51700dcba34 | 73 | } |
euygun | 0:b51700dcba34 | 74 | } |
euygun | 0:b51700dcba34 | 75 | } |
simudvarac | 3:103f58fac4cf | 76 | |
simudvarac | 3:103f58fac4cf | 77 | void sendATCommandAndPrintResponse(char* command) |
simudvarac | 3:103f58fac4cf | 78 | { |
simudvarac | 3:103f58fac4cf | 79 | char buffer[505];//sa crtom |
simudvarac | 3:103f58fac4cf | 80 | for (int i=0; i<505; i++)buffer[i]=0; |
simudvarac | 3:103f58fac4cf | 81 | printf ("Sending following command:"); |
simudvarac | 3:103f58fac4cf | 82 | printf(command); |
simudvarac | 3:103f58fac4cf | 83 | printf ("\r\n"); |
euygun | 0:b51700dcba34 | 84 | |
simudvarac | 3:103f58fac4cf | 85 | if (!at->send(command)) { |
simudvarac | 3:103f58fac4cf | 86 | printf("failed!!!!\r\n"); |
simudvarac | 3:103f58fac4cf | 87 | return; |
simudvarac | 3:103f58fac4cf | 88 | } |
simudvarac | 3:103f58fac4cf | 89 | printf ("RESPONSE:\r\n"); |
simudvarac | 3:103f58fac4cf | 90 | at->read(buffer,500); |
simudvarac | 3:103f58fac4cf | 91 | printf(buffer); |
simudvarac | 3:103f58fac4cf | 92 | printf ("\r\n"); |
simudvarac | 2:c845f4f6c2b6 | 93 | } |
euygun | 0:b51700dcba34 | 94 | // Setup the modem |
simudvarac | 3:103f58fac4cf | 95 | bool setup_modem() |
simudvarac | 3:103f58fac4cf | 96 | { |
euygun | 0:b51700dcba34 | 97 | |
euygun | 0:b51700dcba34 | 98 | bool success = false; |
simudvarac | 3:103f58fac4cf | 99 | |
euygun | 0:b51700dcba34 | 100 | /* Initialize GPIO lines */ |
euygun | 0:b51700dcba34 | 101 | onboard_modem_init(); |
simudvarac | 3:103f58fac4cf | 102 | |
euygun | 0:b51700dcba34 | 103 | /* Give modem a little time to settle down */ |
euygun | 0:b51700dcba34 | 104 | wait_ms(250); |
euygun | 0:b51700dcba34 | 105 | |
RobMeades | 1:63483ec4d0ff | 106 | printf("Powering up the modem\r\n"); |
RobMeades | 1:63483ec4d0ff | 107 | onboard_modem_power_up(); |
RobMeades | 1:63483ec4d0ff | 108 | #ifdef TARGET_UBLOX_C030_N211 |
RobMeades | 1:63483ec4d0ff | 109 | wait_ms(5000); |
simudvarac | 3:103f58fac4cf | 110 | sendATCommandAndPrintResponse("AT+CFUN=1"); |
RobMeades | 1:63483ec4d0ff | 111 | #else |
RobMeades | 1:63483ec4d0ff | 112 | wait_ms(500); |
RobMeades | 1:63483ec4d0ff | 113 | #endif |
RobMeades | 1:63483ec4d0ff | 114 | |
RobMeades | 1:63483ec4d0ff | 115 | // Set AT parser timeout to 1sec for AT OK check |
RobMeades | 1:63483ec4d0ff | 116 | at->set_timeout(1000); |
simudvarac | 3:103f58fac4cf | 117 | |
RobMeades | 1:63483ec4d0ff | 118 | printf("Checking for AT response from the modem\r\n"); |
euygun | 0:b51700dcba34 | 119 | for (int retry_count = 0; !success && (retry_count < 20); retry_count++) { |
euygun | 0:b51700dcba34 | 120 | printf("...wait\r\n"); |
RobMeades | 1:63483ec4d0ff | 121 | // The modem tends to sends out some garbage during power up. |
euygun | 0:b51700dcba34 | 122 | at->flush(); |
simudvarac | 3:103f58fac4cf | 123 | |
euygun | 0:b51700dcba34 | 124 | // AT OK talk to the modem |
euygun | 0:b51700dcba34 | 125 | if (at->send("AT")) { |
euygun | 0:b51700dcba34 | 126 | wait_ms(100); |
euygun | 0:b51700dcba34 | 127 | if (at->recv("OK")) { |
euygun | 0:b51700dcba34 | 128 | success = true; |
euygun | 0:b51700dcba34 | 129 | } |
euygun | 0:b51700dcba34 | 130 | } |
euygun | 0:b51700dcba34 | 131 | } |
simudvarac | 3:103f58fac4cf | 132 | |
RobMeades | 1:63483ec4d0ff | 133 | // Increase the parser time to 8 sec |
RobMeades | 1:63483ec4d0ff | 134 | at->set_timeout(8000); |
simudvarac | 3:103f58fac4cf | 135 | |
euygun | 0:b51700dcba34 | 136 | if (success) { |
RobMeades | 1:63483ec4d0ff | 137 | printf("Configuring the modem\r\n"); |
RobMeades | 1:63483ec4d0ff | 138 | |
RobMeades | 1:63483ec4d0ff | 139 | #ifdef TARGET_UBLOX_C030_N211 |
simudvarac | 2:c845f4f6c2b6 | 140 | printf("TARGET IS N211"); |
RobMeades | 1:63483ec4d0ff | 141 | // Turn off modem echoing and turn on verbose responses |
RobMeades | 1:63483ec4d0ff | 142 | success = at->send("AT+CMEE=1"); |
RobMeades | 1:63483ec4d0ff | 143 | #else |
simudvarac | 2:c845f4f6c2b6 | 144 | printf("TARGET IS NOT N211"); |
euygun | 0:b51700dcba34 | 145 | // Set the final baud rate |
euygun | 0:b51700dcba34 | 146 | if (at->send("AT+IPR=%d", 115200) && at->recv("OK")) { |
euygun | 0:b51700dcba34 | 147 | // Need to wait for things to be sorted out on the modem side |
euygun | 0:b51700dcba34 | 148 | wait_ms(100); |
euygun | 0:b51700dcba34 | 149 | ((UARTSerial *)fh)->set_baud(115200); |
euygun | 0:b51700dcba34 | 150 | } |
simudvarac | 3:103f58fac4cf | 151 | |
euygun | 0:b51700dcba34 | 152 | // Turn off modem echoing and turn on verbose responses |
euygun | 0:b51700dcba34 | 153 | success = at->send("ATE0;+CMEE=2") && at->recv("OK") && |
euygun | 0:b51700dcba34 | 154 | // The following commands are best sent separately |
euygun | 0:b51700dcba34 | 155 | // Turn off RTC/CTS handshaking |
RobMeades | 1:63483ec4d0ff | 156 | at->send("AT&K0") && at->recv("OK") && |
simudvarac | 3:103f58fac4cf | 157 | // Set DCD circuit(109), changes in accordance with |
euygun | 0:b51700dcba34 | 158 | // the carrier detect status |
euygun | 0:b51700dcba34 | 159 | at->send("AT&C1") && at->recv("OK") && |
simudvarac | 3:103f58fac4cf | 160 | // Set DTR circuit, we ignore the state change of DTR |
simudvarac | 3:103f58fac4cf | 161 | at->send("AT&D0") && at->recv("OK"); |
simudvarac | 3:103f58fac4cf | 162 | #endif |
euygun | 0:b51700dcba34 | 163 | } |
simudvarac | 3:103f58fac4cf | 164 | |
euygun | 0:b51700dcba34 | 165 | return success; |
euygun | 0:b51700dcba34 | 166 | } |
euygun | 0:b51700dcba34 | 167 | /* |
euygun | 0:b51700dcba34 | 168 | ** Reading the modem IMEI and eUICC/SIM IMSI |
simudvarac | 3:103f58fac4cf | 169 | ** |
euygun | 0:b51700dcba34 | 170 | */ |
simudvarac | 3:103f58fac4cf | 171 | void connectNB(){ |
simudvarac | 3:103f58fac4cf | 172 | |
simudvarac | 3:103f58fac4cf | 173 | |
simudvarac | 3:103f58fac4cf | 174 | sendATCommandAndPrintResponse("at+NCONFIG=\"AUTOCONNECT\",\"FALSE\""); |
simudvarac | 3:103f58fac4cf | 175 | sendATCommandAndPrintResponse("at+NCONFIG=\"CR_0354_0338_SCRAMBLING\",\"TRUE\""); |
simudvarac | 3:103f58fac4cf | 176 | |
simudvarac | 3:103f58fac4cf | 177 | |
simudvarac | 3:103f58fac4cf | 178 | sendATCommandAndPrintResponse("at+NCONFIG=\"CR_0859_SI_AVOID\",\"TRUE\""); |
simudvarac | 3:103f58fac4cf | 179 | sendATCommandAndPrintResponse("at+NCONFIG?"); |
simudvarac | 3:103f58fac4cf | 180 | sendATCommandAndPrintResponse("at+cfun=0"); |
simudvarac | 3:103f58fac4cf | 181 | sendATCommandAndPrintResponse("AT+CGDCONT=1, \"IP\",\"nb.inetd.gdsp\""); |
simudvarac | 3:103f58fac4cf | 182 | sendATCommandAndPrintResponse("at+cfun=1"); |
simudvarac | 3:103f58fac4cf | 183 | |
simudvarac | 3:103f58fac4cf | 184 | sendATCommandAndPrintResponse("at+cimi"); |
simudvarac | 3:103f58fac4cf | 185 | |
simudvarac | 3:103f58fac4cf | 186 | |
simudvarac | 3:103f58fac4cf | 187 | sendATCommandAndPrintResponse("at+cgatt=1"); |
simudvarac | 3:103f58fac4cf | 188 | |
simudvarac | 3:103f58fac4cf | 189 | |
simudvarac | 3:103f58fac4cf | 190 | |
simudvarac | 3:103f58fac4cf | 191 | sendATCommandAndPrintResponse("at+cops=1,2,\"26202\""); |
simudvarac | 3:103f58fac4cf | 192 | wait_ms(5000); |
simudvarac | 3:103f58fac4cf | 193 | sendATCommandAndPrintResponse("at+cereg?"); |
simudvarac | 3:103f58fac4cf | 194 | wait_ms(5000); |
simudvarac | 3:103f58fac4cf | 195 | sendATCommandAndPrintResponse("AT+CSQ"); |
simudvarac | 3:103f58fac4cf | 196 | wait_ms(5000); |
simudvarac | 3:103f58fac4cf | 197 | sendATCommandAndPrintResponse("AT+COPS?"); |
simudvarac | 3:103f58fac4cf | 198 | sendATCommandAndPrintResponse("AT+NBAND?"); |
simudvarac | 3:103f58fac4cf | 199 | sendATCommandAndPrintResponse("AT+NBAND=20"); |
simudvarac | 3:103f58fac4cf | 200 | sendATCommandAndPrintResponse("AT+NUESTATS"); |
simudvarac | 3:103f58fac4cf | 201 | |
simudvarac | 3:103f58fac4cf | 202 | sendATCommandAndPrintResponse("AT+CGATT?"); |
simudvarac | 3:103f58fac4cf | 203 | wait_ms(5000); |
simudvarac | 3:103f58fac4cf | 204 | sendATCommandAndPrintResponse("AT+CGPADDR"); |
simudvarac | 3:103f58fac4cf | 205 | |
simudvarac | 3:103f58fac4cf | 206 | } |
simudvarac | 3:103f58fac4cf | 207 | void reverse(char *str) |
simudvarac | 3:103f58fac4cf | 208 | { |
simudvarac | 3:103f58fac4cf | 209 | /* skip null */ |
simudvarac | 3:103f58fac4cf | 210 | if (str == 0) |
simudvarac | 3:103f58fac4cf | 211 | { |
simudvarac | 3:103f58fac4cf | 212 | return; |
simudvarac | 3:103f58fac4cf | 213 | } |
simudvarac | 3:103f58fac4cf | 214 | |
simudvarac | 3:103f58fac4cf | 215 | /* skip empty string */ |
simudvarac | 3:103f58fac4cf | 216 | if (*str == 0) |
simudvarac | 3:103f58fac4cf | 217 | { |
simudvarac | 3:103f58fac4cf | 218 | return; |
simudvarac | 3:103f58fac4cf | 219 | } |
simudvarac | 3:103f58fac4cf | 220 | |
simudvarac | 3:103f58fac4cf | 221 | /* get range */ |
simudvarac | 3:103f58fac4cf | 222 | char *start = str; |
simudvarac | 3:103f58fac4cf | 223 | char *end = start + strlen(str) - 1; /* -1 for \0 */ |
simudvarac | 3:103f58fac4cf | 224 | char temp; |
simudvarac | 3:103f58fac4cf | 225 | |
simudvarac | 3:103f58fac4cf | 226 | /* reverse */ |
simudvarac | 3:103f58fac4cf | 227 | while (end > start) |
simudvarac | 3:103f58fac4cf | 228 | { |
simudvarac | 3:103f58fac4cf | 229 | /* swap */ |
simudvarac | 3:103f58fac4cf | 230 | temp = *start; |
simudvarac | 3:103f58fac4cf | 231 | *start = *end; |
simudvarac | 3:103f58fac4cf | 232 | *end = temp; |
simudvarac | 3:103f58fac4cf | 233 | |
simudvarac | 3:103f58fac4cf | 234 | /* move */ |
simudvarac | 3:103f58fac4cf | 235 | ++start; |
simudvarac | 3:103f58fac4cf | 236 | --end; |
simudvarac | 3:103f58fac4cf | 237 | } |
simudvarac | 3:103f58fac4cf | 238 | } |
simudvarac | 3:103f58fac4cf | 239 | char* itoa(int num, char* str, int base) |
simudvarac | 3:103f58fac4cf | 240 | { |
simudvarac | 3:103f58fac4cf | 241 | int i = 0; |
simudvarac | 3:103f58fac4cf | 242 | bool isNegative = false; |
simudvarac | 3:103f58fac4cf | 243 | |
simudvarac | 3:103f58fac4cf | 244 | /* Handle 0 explicitely, otherwise empty string is printed for 0 */ |
simudvarac | 3:103f58fac4cf | 245 | if (num == 0) |
simudvarac | 3:103f58fac4cf | 246 | { |
simudvarac | 3:103f58fac4cf | 247 | str[i++] = '0'; |
simudvarac | 3:103f58fac4cf | 248 | str[i] = '\0'; |
simudvarac | 3:103f58fac4cf | 249 | return str; |
simudvarac | 3:103f58fac4cf | 250 | } |
simudvarac | 3:103f58fac4cf | 251 | |
simudvarac | 3:103f58fac4cf | 252 | // In standard itoa(), negative numbers are handled only with |
simudvarac | 3:103f58fac4cf | 253 | // base 10. Otherwise numbers are considered unsigned. |
simudvarac | 3:103f58fac4cf | 254 | if (num < 0 && base == 10) |
simudvarac | 3:103f58fac4cf | 255 | { |
simudvarac | 3:103f58fac4cf | 256 | isNegative = true; |
simudvarac | 3:103f58fac4cf | 257 | num = -num; |
simudvarac | 3:103f58fac4cf | 258 | } |
simudvarac | 3:103f58fac4cf | 259 | |
simudvarac | 3:103f58fac4cf | 260 | // Process individual digits |
simudvarac | 3:103f58fac4cf | 261 | while (num != 0) |
simudvarac | 3:103f58fac4cf | 262 | { |
simudvarac | 3:103f58fac4cf | 263 | int rem = num % base; |
simudvarac | 3:103f58fac4cf | 264 | str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0'; |
simudvarac | 3:103f58fac4cf | 265 | num = num/base; |
simudvarac | 3:103f58fac4cf | 266 | } |
simudvarac | 3:103f58fac4cf | 267 | |
simudvarac | 3:103f58fac4cf | 268 | // If number is negative, append '-' |
simudvarac | 3:103f58fac4cf | 269 | if (isNegative) |
simudvarac | 3:103f58fac4cf | 270 | str[i++] = '-'; |
simudvarac | 3:103f58fac4cf | 271 | |
simudvarac | 3:103f58fac4cf | 272 | str[i] = '\0'; // Append string terminator |
simudvarac | 3:103f58fac4cf | 273 | |
simudvarac | 3:103f58fac4cf | 274 | // Reverse the string |
simudvarac | 3:103f58fac4cf | 275 | reverse(str); |
simudvarac | 3:103f58fac4cf | 276 | |
simudvarac | 3:103f58fac4cf | 277 | return str; |
simudvarac | 3:103f58fac4cf | 278 | } |
simudvarac | 3:103f58fac4cf | 279 | |
simudvarac | 3:103f58fac4cf | 280 | void sendUDPMessage(char* ip, int port, char* message){ |
simudvarac | 3:103f58fac4cf | 281 | |
simudvarac | 3:103f58fac4cf | 282 | char commandbuffer[100]; |
simudvarac | 3:103f58fac4cf | 283 | sprintf(commandbuffer,"AT+NSOCR=\"DGRAM\",17,%d",port); |
simudvarac | 3:103f58fac4cf | 284 | sendATCommandAndPrintResponse(commandbuffer); |
simudvarac | 3:103f58fac4cf | 285 | int ret=strlen(message); |
simudvarac | 3:103f58fac4cf | 286 | char data[ret*2]; |
simudvarac | 3:103f58fac4cf | 287 | for (int i=0,j=0; i<ret; i++,j+=2){ |
simudvarac | 3:103f58fac4cf | 288 | char res[2]; |
simudvarac | 3:103f58fac4cf | 289 | itoa((message[i] & 0xFF), res, 16); |
simudvarac | 3:103f58fac4cf | 290 | if (res[1] == 0) { |
simudvarac | 3:103f58fac4cf | 291 | data[j] = 0x30; data[j+1] = res[0]; |
simudvarac | 3:103f58fac4cf | 292 | }else { |
simudvarac | 3:103f58fac4cf | 293 | data[j] = res[0]; data[j + 1] = res[1]; |
simudvarac | 3:103f58fac4cf | 294 | } |
simudvarac | 3:103f58fac4cf | 295 | } |
simudvarac | 3:103f58fac4cf | 296 | |
simudvarac | 3:103f58fac4cf | 297 | data[(ret * 2)] = 0; |
simudvarac | 3:103f58fac4cf | 298 | |
simudvarac | 3:103f58fac4cf | 299 | sprintf(commandbuffer,"AT+NSOST=0,\"%s\",%d,%d,\"%s\"",ip,port,ret,data); |
simudvarac | 3:103f58fac4cf | 300 | sendATCommandAndPrintResponse(commandbuffer); |
simudvarac | 3:103f58fac4cf | 301 | |
simudvarac | 3:103f58fac4cf | 302 | } |
euygun | 0:b51700dcba34 | 303 | |
euygun | 0:b51700dcba34 | 304 | int main() |
euygun | 0:b51700dcba34 | 305 | { |
RobMeades | 1:63483ec4d0ff | 306 | bool success = false; |
simudvarac | 3:103f58fac4cf | 307 | |
RobMeades | 1:63483ec4d0ff | 308 | printf("\n\r\n\ru-blox C030 reading the modem IMEI and eUICC/SIM IMSI\n\r"); |
euygun | 0:b51700dcba34 | 309 | printf("Initialising UART for modem communication"); |
RobMeades | 1:63483ec4d0ff | 310 | fh = new UARTSerial(MDMTXD, MDMRXD, 9600); |
euygun | 0:b51700dcba34 | 311 | printf("...DONE\r\n"); |
simudvarac | 3:103f58fac4cf | 312 | |
RobMeades | 1:63483ec4d0ff | 313 | // NOTE: if you are experiencing problems with the AT command |
RobMeades | 1:63483ec4d0ff | 314 | // exchange, change the "false" below to "true" to get debug output |
RobMeades | 1:63483ec4d0ff | 315 | // from the AT command parser |
RobMeades | 1:63483ec4d0ff | 316 | printf("Initialising the modem AT command parser"); |
euygun | 0:b51700dcba34 | 317 | at = new ATCmdParser(fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE, |
simudvarac | 3:103f58fac4cf | 318 | AT_PARSER_TIMEOUT, false); |
euygun | 0:b51700dcba34 | 319 | printf("...DONE\r\n"); |
simudvarac | 3:103f58fac4cf | 320 | |
euygun | 0:b51700dcba34 | 321 | printf("Initializing the modem\r\n"); |
RobMeades | 1:63483ec4d0ff | 322 | if (setup_modem()) { |
euygun | 0:b51700dcba34 | 323 | printf("...DONE\r\nThe modem powered up\r\n"); |
RobMeades | 1:63483ec4d0ff | 324 | char imei[25+1]; |
euygun | 0:b51700dcba34 | 325 | char imsi[15+1]; |
simudvarac | 2:c845f4f6c2b6 | 326 | char buffer[512]; |
euygun | 0:b51700dcba34 | 327 | printf("Reading IMEI and IMSI\r\n"); |
simudvarac | 3:103f58fac4cf | 328 | |
RobMeades | 1:63483ec4d0ff | 329 | #ifdef TARGET_UBLOX_C030_N211 |
simudvarac | 3:103f58fac4cf | 330 | if (at->send("AT+CGSN=1") && at->recv("\nOK\n%25[^\n]\nOK\n", imei)) { |
RobMeades | 1:63483ec4d0ff | 331 | printf("IMEI: %s\r\n",imei + 6); // Avoid the "+CGSN:" prefix |
RobMeades | 1:63483ec4d0ff | 332 | } |
simudvarac | 3:103f58fac4cf | 333 | |
RobMeades | 1:63483ec4d0ff | 334 | #else |
simudvarac | 3:103f58fac4cf | 335 | if (at->send("AT+CGSN") && at->recv("%15[^\n]\nOK\n", imei)) { |
euygun | 0:b51700dcba34 | 336 | printf("IMEI: %s\r\n",imei); |
euygun | 0:b51700dcba34 | 337 | } |
RobMeades | 1:63483ec4d0ff | 338 | #endif |
RobMeades | 1:63483ec4d0ff | 339 | // Sometimes it takes a little while for the SIM to be initialised, |
RobMeades | 1:63483ec4d0ff | 340 | // so retry this until done |
RobMeades | 1:63483ec4d0ff | 341 | at->set_timeout(1000); |
RobMeades | 1:63483ec4d0ff | 342 | for (int retry_count = 0; !success && (retry_count < 10); retry_count++) { |
simudvarac | 3:103f58fac4cf | 343 | if (at->send("AT+CIMI") && at->recv("%15[^\n]\nOK\n", imsi)) { |
RobMeades | 1:63483ec4d0ff | 344 | printf("IMSI: %s\r\n",imsi); |
RobMeades | 1:63483ec4d0ff | 345 | success = true; |
RobMeades | 1:63483ec4d0ff | 346 | } |
simudvarac | 3:103f58fac4cf | 347 | |
simudvarac | 3:103f58fac4cf | 348 | } |
RobMeades | 1:63483ec4d0ff | 349 | if (!success) { |
RobMeades | 1:63483ec4d0ff | 350 | printf("Unable to read IMSI: has a SIM been inserted?\r\n"); |
euygun | 0:b51700dcba34 | 351 | } |
RobMeades | 1:63483ec4d0ff | 352 | } else { |
RobMeades | 1:63483ec4d0ff | 353 | printf("Unable to intialize modem\r\n"); |
euygun | 0:b51700dcba34 | 354 | } |
simudvarac | 2:c845f4f6c2b6 | 355 | char buffer[500+5]; |
RobMeades | 1:63483ec4d0ff | 356 | printf("FINISHED...\r\n"); |
simudvarac | 3:103f58fac4cf | 357 | printf ("sending nconfig"); |
simudvarac | 3:103f58fac4cf | 358 | printf ("\r\n"); |
simudvarac | 3:103f58fac4cf | 359 | |
simudvarac | 3:103f58fac4cf | 360 | |
simudvarac | 3:103f58fac4cf | 361 | connectNB(); |
simudvarac | 3:103f58fac4cf | 362 | sendUDPMessage("52.215.10.12",3333,"HAUS"); |
simudvarac | 3:103f58fac4cf | 363 | |
simudvarac | 2:c845f4f6c2b6 | 364 | |
euygun | 0:b51700dcba34 | 365 | // Create threadUserButtonCheck thread |
euygun | 0:b51700dcba34 | 366 | Thread threadUserButtonCheck(threadBodyUserButtonCheck); |
euygun | 0:b51700dcba34 | 367 | |
euygun | 0:b51700dcba34 | 368 | // Set the LED states |
euygun | 0:b51700dcba34 | 369 | ledRed = 0; |
euygun | 0:b51700dcba34 | 370 | ledGreen = 1; |
euygun | 0:b51700dcba34 | 371 | ledBlue = 1; |
simudvarac | 3:103f58fac4cf | 372 | |
euygun | 0:b51700dcba34 | 373 | // Main loop |
euygun | 0:b51700dcba34 | 374 | while(1) { |
euygun | 0:b51700dcba34 | 375 | wait(delay); |
euygun | 0:b51700dcba34 | 376 | // Shift the LED states |
euygun | 0:b51700dcba34 | 377 | int carry = ledBlue; |
euygun | 0:b51700dcba34 | 378 | ledBlue = ledRed; |
euygun | 0:b51700dcba34 | 379 | ledRed = ledGreen; |
euygun | 0:b51700dcba34 | 380 | ledGreen = carry; |
euygun | 0:b51700dcba34 | 381 | } |
euygun | 0:b51700dcba34 | 382 | } |
euygun | 0:b51700dcba34 | 383 | |
euygun | 0:b51700dcba34 | 384 | // End Of File |