@@ -1099,20 +1099,20 @@ SARA_R5_error_t SARA_R5::setAPN(String apn, uint8_t cid, SARA_R5_pdp_type pdpTyp
1099
1099
return err;
1100
1100
}
1101
1101
1102
+ // Return the first non-zero-length apn
1102
1103
SARA_R5_error_t SARA_R5::getAPN (String *apn, IPAddress *ip)
1103
1104
{
1104
1105
SARA_R5_error_t err;
1105
1106
char *command;
1106
1107
char *response;
1107
- char *searchPtr;
1108
1108
int ipOctets[4 ];
1109
1109
1110
1110
command = sara_r5_calloc_char (strlen (SARA_R5_MESSAGE_PDP_DEF) + 3 );
1111
1111
if (command == NULL )
1112
1112
return SARA_R5_ERROR_OUT_OF_MEMORY;
1113
1113
sprintf (command, " %s?" , SARA_R5_MESSAGE_PDP_DEF);
1114
1114
1115
- response = sara_r5_calloc_char (128 );
1115
+ response = sara_r5_calloc_char (1024 );
1116
1116
if (response == NULL )
1117
1117
{
1118
1118
free (command);
@@ -1124,43 +1124,60 @@ SARA_R5_error_t SARA_R5::getAPN(String *apn, IPAddress *ip)
1124
1124
1125
1125
if (err == SARA_R5_ERROR_SUCCESS)
1126
1126
{
1127
- // Example: +CGDCONT: 1,"IP","hologram","10.170.241.191",0,0,0,0
1128
- searchPtr = strstr (response, " +CGDCONT: " );
1127
+ // Example:
1128
+ // +CGDCONT: 0,"IP","","0.0.0.0",0,0,0,0,0,0,0,0,0,0
1129
+ // +CGDCONT: 1,"IP","payandgo.o2.co.uk.mnc010.mcc234.gprs","10.160.182.234",0,0,0,2,0,0,0,0,0,0
1130
+
1131
+ char *searchPtr = response;
1132
+
1133
+ boolean keepGoing = true ;
1134
+ while (keepGoing == true )
1135
+ {
1136
+ int apnLen = 0 ;
1137
+ int scanned = 0 ;
1138
+ // Find the first/next occurrence of +CGDCONT:
1139
+ searchPtr = strstr (searchPtr, " +CGDCONT: " );
1129
1140
if (searchPtr != NULL )
1130
1141
{
1131
- searchPtr += strlen (" +CGDCONT: " );
1132
- // Search to the third double-quote
1133
- for (int i = 0 ; i < 3 ; i++)
1134
- {
1135
- searchPtr = strchr (++searchPtr, ' \" ' );
1136
- }
1137
- if (searchPtr != NULL )
1138
- {
1139
- // Fill in the APN:
1140
- searchPtr = strchr (searchPtr, ' \" ' ); // Move to first quote
1141
- while ((*(++searchPtr) != ' \" ' ) && (*searchPtr != ' \0 ' ))
1142
- {
1143
- apn->concat (*(searchPtr));
1144
- }
1145
- // Now get the IP:
1146
- if (searchPtr != NULL )
1147
- {
1148
- int scanned = sscanf (searchPtr, " \" ,\" %d.%d.%d.%d\" " ,
1149
- &ipOctets[0 ], &ipOctets[1 ], &ipOctets[2 ], &ipOctets[3 ]);
1150
- if (scanned == 4 )
1151
- {
1152
- for (int octet = 0 ; octet < 4 ; octet++)
1153
- {
1154
- (*ip)[octet] = (uint8_t )ipOctets[octet];
1155
- }
1156
- }
1157
- }
1158
- }
1142
+ searchPtr += strlen (" +CGDCONT: " ); // Point to the cid
1143
+ // Search to the third double-quote
1144
+ for (int i = 0 ; i < 3 ; i++)
1145
+ {
1146
+ searchPtr = strchr (++searchPtr, ' \" ' );
1147
+ }
1148
+ if (searchPtr != NULL )
1149
+ {
1150
+ // Fill in the APN:
1151
+ // searchPtr = strchr(searchPtr, '\"'); // Move to first quote
1152
+ while ((*(++searchPtr) != ' \" ' ) && (*searchPtr != ' \0 ' ))
1153
+ {
1154
+ apn->concat (*(searchPtr));
1155
+ apnLen++;
1156
+ }
1157
+ // Now get the IP:
1158
+ if (searchPtr != NULL )
1159
+ {
1160
+ scanned = sscanf (searchPtr, " \" ,\" %d.%d.%d.%d\" " ,
1161
+ &ipOctets[0 ], &ipOctets[1 ], &ipOctets[2 ], &ipOctets[3 ]);
1162
+ if (scanned == 4 )
1163
+ {
1164
+ for (int octet = 0 ; octet < 4 ; octet++)
1165
+ {
1166
+ (*ip)[octet] = (uint8_t )ipOctets[octet];
1167
+ }
1168
+ }
1169
+ }
1170
+ }
1159
1171
}
1160
- else
1172
+ if ((apnLen > 0 ) || (scanned != 4 ) || (searchPtr == NULL ) || (*searchPtr == ' \0 ' )) // Stop searching
1161
1173
{
1162
- err = SARA_R5_ERROR_UNEXPECTED_RESPONSE ;
1174
+ keepGoing = false ;
1163
1175
}
1176
+ }
1177
+ }
1178
+ else
1179
+ {
1180
+ err = SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1164
1181
}
1165
1182
1166
1183
free (command);
@@ -1438,7 +1455,7 @@ SARA_R5_error_t SARA_R5::deregisterOperator(void)
1438
1455
sprintf (command, " %s=2" , SARA_R5_OPERATOR_SELECTION);
1439
1456
1440
1457
err = sendCommandWithResponse (command, SARA_R5_RESPONSE_OK, NULL ,
1441
- SARA_R5_STANDARD_RESPONSE_TIMEOUT );
1458
+ SARA_R5_3_MIN_TIMEOUT );
1442
1459
1443
1460
free (command);
1444
1461
return err;
0 commit comments