Skip to content

Commit f5682aa

Browse files
committed
Adding setAPN function and adding it to 00 example.
1 parent 79bf2b9 commit f5682aa

File tree

3 files changed

+81
-43
lines changed

3 files changed

+81
-43
lines changed

examples/00_Network_Connect/00_Network_Connect.ino

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ String registrationString[] = {
4141
"Searching for operator", // 2
4242
"Registration denied", // 3
4343
"Registration unknown", // 4
44-
"Registrered, roaming", // 5
44+
"Registered, roaming", // 5
4545
"Registered, home (SMS only)", // 6
4646
"Registered, roaming (SMS only)", // 7
4747
"Registered, home, CSFB not preferred", // 8
@@ -55,6 +55,10 @@ String registrationString[] = {
5555
// MNO_TMO -- T-Mobile
5656
const mobile_network_operator_t MOBILE_NETWORK_OPERATOR = MNO_VERIZON;
5757

58+
// APN -- Access Point Name. Gateway between GPRS MNO
59+
// and another computer network. E.g. "hologram
60+
const String APN = "hologram";
61+
5862
void setup() {
5963
Serial.begin(9600);
6064

@@ -66,6 +70,7 @@ void setup() {
6670
// communicate with the LTE Shield.
6771
// Note: If you're using an Arduino with a dedicated hardware serial
6872
// poert, you may instead slide "Serial" into this begin call.
73+
6974
if ( lte.begin(lteSerial) ) {
7075
Serial.println(F("LTE Shield connected!"));
7176
} else {
@@ -76,37 +81,15 @@ void setup() {
7681
}
7782
Serial.println();
7883

79-
Serial.println(F("Getting device/SIM info:"));
80-
// Print device information:
81-
String imei, imsi, ccid;
82-
// IMEI: International Mobile Equipment Identity -- Unique number to identify phone
83-
imei = lte.imei();
84-
Serial.println("IMEI: " + imei);
85-
// IMSI: International Mobile Subscriber Identity -- Unique number to identify
86-
// user of a cellular network.
87-
imsi = lte.imsi();
88-
if (imsi.length() < 10) {
89-
Serial.println(F("Unable to read the IMSI -- there may be an error."));
90-
Serial.println(F("Is your SIM card inserted?"));
91-
} else {
92-
Serial.println("IMSI: " + imsi);
93-
}
94-
// ICCID: Integrated circuit card identifier -- Unique SIM card serial number.
95-
ccid = lte.ccid();
96-
if (imsi.length() < 10) {
97-
Serial.println(F("Unable to read the CCID -- there may be an error."));
98-
Serial.println(F("Is your SIM card inserted?"));
99-
} else {
100-
Serial.println("ICCID: " + ccid);
101-
}
102-
Serial.println();
103-
10484
if (!lte.setNetwork(MOBILE_NETWORK_OPERATOR)) {
10585
Serial.println(F("Error setting network. Try cycling power on your Arduino/shield."));
10686
while (1) ;
10787
}
108-
88+
if (lte.setAPN(APN) == LTE_SHIELD_SUCCESS) {
89+
Serial.println(F("APN successfully set."));
90+
}
10991
Serial.println(F("Network set. Ready to go!"));
92+
11093
// RSSI: Received signal strength:
11194
Serial.println("RSSI: " + String(lte.rssi()));
11295
// Registration Status

src/SparkFun_LTE_Shield_Arduino_Library.cpp

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const char LTE_SHIELD_COMMAND_AUTO_TZ[] = "+CTZU"; // Automatic time zone update
5151
const char LTE_SHIELD_COMMAND_MNO[] = "+UMNOPROF"; // MNO (mobile network operator) Profile
5252
const char LTE_SHIELD_SIGNAL_QUALITY[] = "+CSQ";
5353
const char LTE_SHIELD_REGISTRATION_STATUS[] = "+CREG";
54+
const char LTE_SHIELD_MESSAGE_PDP_DEF[] = "+CGDCONT";
5455
// V24 control and V25ter (UART interface)
5556
const char LTE_SHIELD_COMMAND_BAUD[] = "+IPR"; // Baud rate
5657
// ### GPIO
@@ -313,9 +314,7 @@ LTE_Shield_error_t LTE_Shield::at(void)
313314
LTE_Shield_error_t err;
314315
char * command;
315316

316-
// Construct command
317-
command = NULL;
318-
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, NULL,
317+
err = sendCommandWithResponse(NULL, LTE_SHIELD_RESPONSE_OK, NULL,
319318
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
320319

321320
return err;
@@ -360,6 +359,7 @@ String LTE_Shield::imei(void)
360359
memset(imeiResponse, 0, 16);
361360
}
362361
}
362+
free(response);
363363
return String(imeiResponse);;
364364
}
365365

@@ -380,6 +380,7 @@ String LTE_Shield::imsi(void)
380380
memset(imsiResponse, 0, 16);
381381
}
382382
}
383+
free(response);
383384
return String(imsiResponse);
384385
}
385386

@@ -575,22 +576,28 @@ boolean LTE_Shield::setNetwork(mobile_network_operator_t mno)
575576
mobile_network_operator_t currentMno;
576577

577578
// Check currently set MNO
578-
if (getMno(&currentMno) != LTE_SHIELD_ERROR_SUCCESS) return false;
579+
if (getMno(&currentMno) != LTE_SHIELD_ERROR_SUCCESS) {
580+
Serial.println("Error getting MNO");
581+
return false;
582+
}
579583
if (currentMno == mno)
580584
{
581585
return true;
582586
}
583587

584588
if (functionality(MINIMUM_FUNCTIONALITY) != LTE_SHIELD_ERROR_SUCCESS) {
589+
Serial.println("Error setting functionality");
585590
return false;
586591
}
587592

588593
if (setMno(mno) != LTE_SHIELD_ERROR_SUCCESS) {
594+
Serial.println("Error setting MNO");
589595
return false;
590596
}
591597

592598
if (reset() != LTE_SHIELD_ERROR_SUCCESS)
593599
{
600+
Serial.println("Error resetting");
594601
return false;
595602
}
596603

@@ -610,6 +617,46 @@ mobile_network_operator_t LTE_Shield::getNetwork(void)
610617
return mno;
611618
}
612619

620+
LTE_Shield_error_t LTE_Shield::setAPN(String apn, uint8_t cid, LTE_Shield_pdp_type pdpType)
621+
{
622+
LTE_Shield_error_t err;
623+
char * command;
624+
char pdpStr[8];
625+
626+
memset(pdpStr, 0, 8);
627+
628+
if (cid >= 8) return LTE_SHIELD_ERROR_UNEXPECTED_PARAM;
629+
630+
command = lte_calloc_char(strlen(LTE_SHIELD_MESSAGE_PDP_DEF) + strlen(apn.c_str()) + 16);
631+
if (command == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
632+
switch (pdpType) {
633+
case PDP_TYPE_INVALID:
634+
return LTE_SHIELD_ERROR_UNEXPECTED_PARAM;
635+
break;
636+
case PDP_TYPE_IP:
637+
memcpy(pdpStr, "IP", 2);
638+
break;
639+
case PDP_TYPE_NONIP:
640+
memcpy(pdpStr, "NONIP", 2);
641+
break;
642+
case PDP_TYPE_IPV4V6:
643+
memcpy(pdpStr, "IPV4V6", 2);
644+
break;
645+
case PDP_TYPE_IPV6:
646+
memcpy(pdpStr, "IPV6", 2);
647+
break;
648+
}
649+
sprintf(command, "%s=%d,\"%s\",\"%s\"", LTE_SHIELD_MESSAGE_PDP_DEF,
650+
cid, pdpStr, apn.c_str());
651+
652+
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, NULL,
653+
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
654+
//Serial.println("Set APN: " + String(command));
655+
656+
return err;
657+
}
658+
659+
613660
LTE_Shield_error_t LTE_Shield::setSMSMessageFormat(lte_shield_message_format_t textMode)
614661
{
615662
char * command;
@@ -632,7 +679,6 @@ LTE_Shield_error_t LTE_Shield::sendSMS(String number, String message)
632679
char * command;
633680
char * messageCStr;
634681
char * numberCStr;
635-
char * response;
636682
int messageIndex;
637683
LTE_Shield_error_t err;
638684

@@ -641,37 +687,34 @@ LTE_Shield_error_t LTE_Shield::sendSMS(String number, String message)
641687
number.toCharArray(numberCStr, number.length() + 1);
642688

643689
command = lte_calloc_char(strlen(LTE_SHIELD_SEND_TEXT) + strlen(numberCStr) + 8);
644-
if (command == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
690+
if (command != NULL)
691+
{
645692
sprintf(command, "%s=\"%s\"", LTE_SHIELD_SEND_TEXT, numberCStr);
646693

647694
err = sendCommandWithResponse(command, ">", NULL,
648695
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
649696
free(command);
697+
free(numberCStr);
650698
if (err != LTE_SHIELD_ERROR_SUCCESS) return err;
651699

652700
messageCStr = lte_calloc_char(message.length() + 1);
653-
response = lte_calloc_char(24);
654-
if ((messageCStr == NULL) || (response == NULL))
701+
if (messageCStr == NULL)
655702
{
656703
hwPrint(ASCII_ESC);
657704
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
658705
}
659706
message.toCharArray(messageCStr, message.length() + 1);
660707
messageCStr[message.length()] = ASCII_CTRL_Z;
661708

662-
sendCommandWithResponse(messageCStr, LTE_SHIELD_RESPONSE_OK,
663-
response, 180000, NOT_AT_COMMAND);
664-
if (sscanf(response, "\r\n+CMGS: %d", &messageIndex) == 1)
665-
{
666-
// TODO? Return a message index?
709+
err = sendCommandWithResponse(messageCStr, LTE_SHIELD_RESPONSE_OK,
710+
NULL, 180000, NOT_AT_COMMAND);
667711
}
668712
else
669713
{
670-
return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
714+
err = LTE_SHIELD_ERROR_OUT_OF_MEMORY;
671715
}
672716

673717
free(messageCStr);
674-
free(numberCStr);
675718

676719
return err;
677720
}
@@ -1286,14 +1329,17 @@ LTE_Shield_error_t LTE_Shield::sendCommandWithResponse(
12861329
int destIndex = 0;
12871330
unsigned int charsRead = 0;
12881331

1332+
//Serial.print("Command: ");
1333+
//Serial.println(String(command));
12891334
sendCommand(command, at);
1290-
1335+
//Serial.print("Response: ");
12911336
timeIn = millis();
12921337
while ((!found) && (timeIn + commandTimeout > millis()))
12931338
{
12941339
if (hwAvailable())
12951340
{
12961341
char c = readChar();
1342+
//Serial.write(c);
12971343
if (responseDest != NULL)
12981344
{
12991345
responseDest[destIndex++] = c;
@@ -1312,6 +1358,7 @@ LTE_Shield_error_t LTE_Shield::sendCommandWithResponse(
13121358
}
13131359
}
13141360
}
1361+
//Serial.println();
13151362

13161363
if (found)
13171364
{

src/SparkFun_LTE_Shield_Arduino_Library.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,14 @@ class LTE_Shield : public Print {
180180
LTE_Shield_registration_status_t registration(void);
181181
boolean setNetwork(mobile_network_operator_t mno);
182182
mobile_network_operator_t getNetwork(void);
183+
typedef enum {
184+
PDP_TYPE_INVALID = -1,
185+
PDP_TYPE_IP = 0,
186+
PDP_TYPE_NONIP = 1,
187+
PDP_TYPE_IPV4V6 = 2,
188+
PDP_TYPE_IPV6 = 3
189+
} LTE_Shield_pdp_type;
190+
LTE_Shield_error_t setAPN(String apn, uint8_t cid = 1, LTE_Shield_pdp_type pdpType = PDP_TYPE_IP);
183191

184192
// SMS -- Short Messages Service
185193
LTE_Shield_error_t setSMSMessageFormat(lte_shield_message_format_t textMode

0 commit comments

Comments
 (0)