@@ -51,6 +51,7 @@ const char LTE_SHIELD_COMMAND_AUTO_TZ[] = "+CTZU"; // Automatic time zone update
51
51
const char LTE_SHIELD_COMMAND_MNO[] = " +UMNOPROF" ; // MNO (mobile network operator) Profile
52
52
const char LTE_SHIELD_SIGNAL_QUALITY[] = " +CSQ" ;
53
53
const char LTE_SHIELD_REGISTRATION_STATUS[] = " +CREG" ;
54
+ const char LTE_SHIELD_MESSAGE_PDP_DEF[] = " +CGDCONT" ;
54
55
// V24 control and V25ter (UART interface)
55
56
const char LTE_SHIELD_COMMAND_BAUD[] = " +IPR" ; // Baud rate
56
57
// ### GPIO
@@ -313,9 +314,7 @@ LTE_Shield_error_t LTE_Shield::at(void)
313
314
LTE_Shield_error_t err;
314
315
char * command;
315
316
316
- // Construct command
317
- command = NULL ;
318
- err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK, NULL ,
317
+ err = sendCommandWithResponse (NULL , LTE_SHIELD_RESPONSE_OK, NULL ,
319
318
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
320
319
321
320
return err;
@@ -360,6 +359,7 @@ String LTE_Shield::imei(void)
360
359
memset (imeiResponse, 0 , 16 );
361
360
}
362
361
}
362
+ free (response);
363
363
return String (imeiResponse);;
364
364
}
365
365
@@ -380,6 +380,7 @@ String LTE_Shield::imsi(void)
380
380
memset (imsiResponse, 0 , 16 );
381
381
}
382
382
}
383
+ free (response);
383
384
return String (imsiResponse);
384
385
}
385
386
@@ -575,22 +576,28 @@ boolean LTE_Shield::setNetwork(mobile_network_operator_t mno)
575
576
mobile_network_operator_t currentMno;
576
577
577
578
// Check currently set MNO
578
- if (getMno (¤tMno) != LTE_SHIELD_ERROR_SUCCESS) return false ;
579
+ if (getMno (¤tMno) != LTE_SHIELD_ERROR_SUCCESS) {
580
+ Serial.println (" Error getting MNO" );
581
+ return false ;
582
+ }
579
583
if (currentMno == mno)
580
584
{
581
585
return true ;
582
586
}
583
587
584
588
if (functionality (MINIMUM_FUNCTIONALITY) != LTE_SHIELD_ERROR_SUCCESS) {
589
+ Serial.println (" Error setting functionality" );
585
590
return false ;
586
591
}
587
592
588
593
if (setMno (mno) != LTE_SHIELD_ERROR_SUCCESS) {
594
+ Serial.println (" Error setting MNO" );
589
595
return false ;
590
596
}
591
597
592
598
if (reset () != LTE_SHIELD_ERROR_SUCCESS)
593
599
{
600
+ Serial.println (" Error resetting" );
594
601
return false ;
595
602
}
596
603
@@ -610,6 +617,46 @@ mobile_network_operator_t LTE_Shield::getNetwork(void)
610
617
return mno;
611
618
}
612
619
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
+
613
660
LTE_Shield_error_t LTE_Shield::setSMSMessageFormat (lte_shield_message_format_t textMode)
614
661
{
615
662
char * command;
@@ -632,7 +679,6 @@ LTE_Shield_error_t LTE_Shield::sendSMS(String number, String message)
632
679
char * command;
633
680
char * messageCStr;
634
681
char * numberCStr;
635
- char * response;
636
682
int messageIndex;
637
683
LTE_Shield_error_t err;
638
684
@@ -641,37 +687,34 @@ LTE_Shield_error_t LTE_Shield::sendSMS(String number, String message)
641
687
number.toCharArray (numberCStr, number.length () + 1 );
642
688
643
689
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
+ {
645
692
sprintf (command, " %s=\" %s\" " , LTE_SHIELD_SEND_TEXT, numberCStr);
646
693
647
694
err = sendCommandWithResponse (command, " >" , NULL ,
648
695
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
649
696
free (command);
697
+ free (numberCStr);
650
698
if (err != LTE_SHIELD_ERROR_SUCCESS) return err;
651
699
652
700
messageCStr = lte_calloc_char (message.length () + 1 );
653
- response = lte_calloc_char (24 );
654
- if ((messageCStr == NULL ) || (response == NULL ))
701
+ if (messageCStr == NULL )
655
702
{
656
703
hwPrint (ASCII_ESC);
657
704
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
658
705
}
659
706
message.toCharArray (messageCStr, message.length () + 1 );
660
707
messageCStr[message.length ()] = ASCII_CTRL_Z;
661
708
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);
667
711
}
668
712
else
669
713
{
670
- return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE ;
714
+ err = LTE_SHIELD_ERROR_OUT_OF_MEMORY ;
671
715
}
672
716
673
717
free (messageCStr);
674
- free (numberCStr);
675
718
676
719
return err;
677
720
}
@@ -1286,14 +1329,17 @@ LTE_Shield_error_t LTE_Shield::sendCommandWithResponse(
1286
1329
int destIndex = 0 ;
1287
1330
unsigned int charsRead = 0 ;
1288
1331
1332
+ // Serial.print("Command: ");
1333
+ // Serial.println(String(command));
1289
1334
sendCommand (command, at);
1290
-
1335
+ // Serial.print("Response: ");
1291
1336
timeIn = millis ();
1292
1337
while ((!found) && (timeIn + commandTimeout > millis ()))
1293
1338
{
1294
1339
if (hwAvailable ())
1295
1340
{
1296
1341
char c = readChar ();
1342
+ // Serial.write(c);
1297
1343
if (responseDest != NULL )
1298
1344
{
1299
1345
responseDest[destIndex++] = c;
@@ -1312,6 +1358,7 @@ LTE_Shield_error_t LTE_Shield::sendCommandWithResponse(
1312
1358
}
1313
1359
}
1314
1360
}
1361
+ // Serial.println();
1315
1362
1316
1363
if (found)
1317
1364
{
0 commit comments