@@ -174,15 +174,15 @@ bool SARA_R5::begin(HardwareSerial &hardSerial, unsigned long baud)
174
174
175
175
// Calling this function with nothing sets the debug port to Serial
176
176
// You can also call it with other streams like Serial1, SerialUSB, etc.
177
- void SARA_R5::enableDebugging (Stream &debugPort)
177
+ void SARA_R5::enableDebugging (Print &debugPort)
178
178
{
179
179
_debugPort = &debugPort;
180
180
_printDebug = true ;
181
181
}
182
182
183
183
// Calling this function with nothing sets the debug port to Serial
184
184
// You can also call it with other streams like Serial1, SerialUSB, etc.
185
- void SARA_R5::enableAtDebugging (Stream &debugPort)
185
+ void SARA_R5::enableAtDebugging (Print &debugPort)
186
186
{
187
187
_debugAtPort = &debugPort;
188
188
_printAtDebug = true ;
@@ -246,6 +246,8 @@ bool SARA_R5::bufferedPoll(void)
246
246
c = ' 0' ; // Convert any NULLs to ASCII Zeros
247
247
_saraRXBuffer[avail++] = c;
248
248
timeIn = millis ();
249
+ } else {
250
+ yield ();
249
251
}
250
252
}
251
253
@@ -546,10 +548,15 @@ bool SARA_R5::processURCEvent(const char *event)
546
548
{ // URC: +UUMQTTC (HTTP Command Result)
547
549
int command, result;
548
550
int scanNum;
549
-
551
+ int qos = -1 ;
552
+ String topic;
550
553
scanNum = sscanf (event, " +UUMQTTC: %d,%d" , &command, &result);
551
-
552
- if (scanNum == 2 )
554
+ if ((scanNum == 2 ) && (command == SARA_R5_MQTT_COMMAND_SUBSCRIBE)) {
555
+ char topicC[100 ] = " " ;
556
+ scanNum = sscanf (event, " +UUMQTTC: %*d,%*d,%d,\" %[^\" ]\" " , &qos, topicC);
557
+ topic = topicC;
558
+ }
559
+ if ((scanNum == 2 ) || (scanNum == 4 ))
553
560
{
554
561
if (_printDebug == true )
555
562
_debugPort->println (F (" processReadEvent: MQTT command result" ));
@@ -673,6 +680,8 @@ bool SARA_R5::poll(void)
673
680
{
674
681
c = readChar ();
675
682
_saraRXBuffer[avail++] = c;
683
+ } else {
684
+ yield ();
676
685
}
677
686
}
678
687
@@ -1615,14 +1624,12 @@ SARA_R5_error_t SARA_R5::setAPN(String apn, uint8_t cid, SARA_R5_pdp_type pdpTyp
1615
1624
}
1616
1625
1617
1626
// Return the Access Point Name and IP address for the chosen context identifier
1618
- SARA_R5_error_t SARA_R5::getAPN (int cid, String *apn, IPAddress *ip)
1627
+ SARA_R5_error_t SARA_R5::getAPN (int cid, String *apn, IPAddress *ip, SARA_R5_pdp_type* pdpType )
1619
1628
{
1620
1629
SARA_R5_error_t err;
1621
1630
char *command;
1622
1631
char *response;
1623
- int ipOctets[4 ];
1624
- int rcid = -1 ;
1625
-
1632
+
1626
1633
if (cid > SARA_R5_NUM_PDP_CONTEXT_IDENTIFIERS)
1627
1634
return SARA_R5_ERROR_ERROR;
1628
1635
@@ -1646,72 +1653,47 @@ SARA_R5_error_t SARA_R5::getAPN(int cid, String *apn, IPAddress *ip)
1646
1653
// Example:
1647
1654
// +CGDCONT: 0,"IP","payandgo.o2.co.uk","0.0.0.0",0,0,0,0,0,0,0,0,0,0
1648
1655
// +CGDCONT: 1,"IP","payandgo.o2.co.uk.mnc010.mcc234.gprs","10.160.182.234",0,0,0,2,0,0,0,0,0,0
1649
-
1656
+ int rcid = - 1 ;
1650
1657
char *searchPtr = response;
1651
1658
1652
1659
bool keepGoing = true ;
1653
1660
while (keepGoing == true )
1654
1661
{
1655
- int apnLen = 0 ;
1656
1662
int scanned = 0 ;
1657
1663
// Find the first/next occurrence of +CGDCONT:
1658
1664
searchPtr = strstr (searchPtr, " +CGDCONT: " );
1659
1665
if (searchPtr != NULL )
1660
1666
{
1667
+ char strPdpType[10 ];
1668
+ char strApn[128 ];
1669
+ int ipOct[4 ];
1670
+
1661
1671
searchPtr += strlen (" +CGDCONT: " ); // Point to the cid
1662
- rcid = (*searchPtr) - ' 0' ; // Get the first/only digit of cid
1663
- searchPtr++;
1664
- if (*searchPtr != ' ,' ) // Get the second digit of cid - if there is one
1665
- {
1666
- rcid *= 10 ;
1667
- rcid += (*searchPtr) - ' 0' ;
1668
- }
1669
- if (_printDebug == true )
1670
- {
1671
- _debugPort->print (F (" getAPN: cid is " ));
1672
- _debugPort->println (rcid);
1673
- }
1674
- if (rcid == cid) // If we have a match
1675
- {
1676
- // Search to the third double-quote
1677
- for (int i = 0 ; i < 3 ; i++)
1672
+ scanned = sscanf (searchPtr, " %d,\" %[^\" ]\" ,\" %[^\" ]\" ,\" %d.%d.%d.%d" ,
1673
+ &rcid, strPdpType, strApn,
1674
+ &ipOct[0 ], &ipOct[1 ], &ipOct[2 ], &ipOct[3 ]);
1675
+ if ((scanned == 7 ) && (rcid == cid)) {
1676
+ if (apn) *apn = strApn;
1677
+ for (int o = 0 ; ip && (o < 4 ); o++)
1678
1678
{
1679
- searchPtr = strchr (++searchPtr, ' \" ' ) ;
1679
+ (*ip)[o] = ( uint8_t )ipOct[o] ;
1680
1680
}
1681
- if (searchPtr != NULL )
1682
- {
1683
- // Fill in the APN:
1684
- // searchPtr = strchr(searchPtr, '\"'); // Move to first quote
1685
- while ((*(++searchPtr) != ' \" ' ) && (*searchPtr != ' \0 ' ))
1686
- {
1687
- apn->concat (*(searchPtr));
1688
- apnLen++;
1689
- }
1690
- // Now get the IP:
1691
- if (searchPtr != NULL )
1692
- {
1693
- scanned = sscanf (searchPtr, " \" ,\" %d.%d.%d.%d\" " ,
1694
- &ipOctets[0 ], &ipOctets[1 ], &ipOctets[2 ], &ipOctets[3 ]);
1695
- if (scanned == 4 )
1696
- {
1697
- for (int octet = 0 ; octet < 4 ; octet++)
1698
- {
1699
- (*ip)[octet] = (uint8_t )ipOctets[octet];
1700
- }
1701
- }
1702
- }
1681
+ if (pdpType) {
1682
+ *pdpType = (0 == strcmp (strPdpType, " IPV4V6" )) ? PDP_TYPE_IPV4V6 :
1683
+ (0 == strcmp (strPdpType, " IPV6" )) ? PDP_TYPE_IPV6 :
1684
+ (0 == strcmp (strPdpType, " IP" )) ? PDP_TYPE_IP :
1685
+ PDP_TYPE_INVALID;
1703
1686
}
1704
- }
1705
- else // We don't have a match so let's clear the APN and IP address
1706
- {
1707
- *apn = " " ;
1708
- *ip = {0 , 0 , 0 , 0 };
1687
+ keepGoing = false ;
1709
1688
}
1710
1689
}
1711
- if ((rcid == cid) || (searchPtr == NULL ) || (*searchPtr == ' \0 ' )) // Stop searching
1690
+ else // We don't have a match so let's clear the APN and IP address
1712
1691
{
1713
- keepGoing = false ;
1714
- }
1692
+ if (apn) *apn = " " ;
1693
+ if (pdpType) *pdpType = PDP_TYPE_INVALID;
1694
+ if (ip) *ip = {0 , 0 , 0 , 0 };
1695
+ keepGoing = false ;
1696
+ }
1715
1697
}
1716
1698
}
1717
1699
else
@@ -1752,7 +1734,8 @@ SARA_R5_error_t SARA_R5::getSimStatus(String* code)
1752
1734
scanned = sscanf (searchPtr, " +CPIN: %s\r\n " , c);
1753
1735
if (scanned == 1 )
1754
1736
{
1755
- *code = c;
1737
+ if (code)
1738
+ *code = c;
1756
1739
}
1757
1740
else
1758
1741
err = SARA_R5_ERROR_UNEXPECTED_RESPONSE;
@@ -4076,7 +4059,7 @@ SARA_R5_error_t SARA_R5::subscribeMQTTtopic(int max_Qos, String topic)
4076
4059
{
4077
4060
SARA_R5_error_t err;
4078
4061
char *command;
4079
- command = sara_r5_calloc_char (strlen (SARA_R5_MQTT_COMMAND) + topic.length () + 16 );
4062
+ command = sara_r5_calloc_char (strlen (SARA_R5_MQTT_COMMAND) + 16 + topic.length ());
4080
4063
if (command == NULL )
4081
4064
return SARA_R5_ERROR_OUT_OF_MEMORY;
4082
4065
sprintf (command, " %s=%d,%d,\" %s\" " , SARA_R5_MQTT_COMMAND, SARA_R5_MQTT_COMMAND_SUBSCRIBE, max_Qos, topic.c_str ());
@@ -4090,7 +4073,7 @@ SARA_R5_error_t SARA_R5::unsubscribeMQTTtopic(String topic)
4090
4073
{
4091
4074
SARA_R5_error_t err;
4092
4075
char *command;
4093
- command = sara_r5_calloc_char (strlen (SARA_R5_MQTT_COMMAND) + topic.length () + 16 );
4076
+ command = sara_r5_calloc_char (strlen (SARA_R5_MQTT_COMMAND) + 16 + topic.length ());
4094
4077
if (command == NULL )
4095
4078
return SARA_R5_ERROR_OUT_OF_MEMORY;
4096
4079
sprintf (command, " %s=%d,\" %s\" " , SARA_R5_MQTT_COMMAND, SARA_R5_MQTT_COMMAND_UNSUBSCRIBE, topic.c_str ());
@@ -4099,8 +4082,8 @@ SARA_R5_error_t SARA_R5::unsubscribeMQTTtopic(String topic)
4099
4082
free (command);
4100
4083
return err;
4101
4084
}
4102
-
4103
- SARA_R5_error_t SARA_R5::readMQTT (int * pQos, char * pTopic, uint8_t *readDest, int readLength, int *bytesRead)
4085
+
4086
+ SARA_R5_error_t SARA_R5::readMQTT (int * pQos, String * pTopic, uint8_t *readDest, int readLength, int *bytesRead)
4104
4087
{
4105
4088
char *command;
4106
4089
char *response;
@@ -4148,8 +4131,8 @@ SARA_R5_error_t SARA_R5::readMQTT(int* pQos, char* pTopic, uint8_t *readDest, in
4148
4131
// Extract the data
4149
4132
char *searchPtr = strstr (response, " +UMQTTC: 6" );
4150
4133
if (searchPtr != NULL )
4151
- scanNum = sscanf (searchPtr, " +UMQTTC: 6,%d,%d,%d,\" %[^\" ]\" ,%d\" " , pQos, &total_length, &topic_length, pTopic , &data_length);
4152
- if (scanNum != 5 )
4134
+ scanNum = sscanf (searchPtr, " +UMQTTC: 6,%d,%d,%d,\" %* [^\" ]\" ,%d, \" " , pQos, &total_length, &topic_length, &data_length);
4135
+ if (scanNum != 4 )
4153
4136
{
4154
4137
if (_printDebug == true )
4155
4138
{
@@ -4160,13 +4143,17 @@ SARA_R5_error_t SARA_R5::readMQTT(int* pQos, char* pTopic, uint8_t *readDest, in
4160
4143
free (response);
4161
4144
return SARA_R5_ERROR_UNEXPECTED_RESPONSE;
4162
4145
}
4163
-
4164
4146
searchPtr = strstr (searchPtr, " \" " );
4165
- searchPtr = strstr (searchPtr+1 , " \" " );
4166
- searchPtr = strstr (searchPtr+1 , " \" " );
4167
- *bytesRead = (data_length > readLength) ? readLength : data_length;
4168
- memcpy (readDest, searchPtr, *bytesRead);
4169
-
4147
+ if (pTopic) {
4148
+ searchPtr[topic_length+1 ] = ' \0 ' ; // zero terminate
4149
+ *pTopic = searchPtr+1 ;
4150
+ searchPtr[topic_length+1 ] = ' \" ' ; // restore
4151
+ }
4152
+ searchPtr = strstr (searchPtr + topic_length + 2 , " \" " );
4153
+ if (readDest) {
4154
+ *bytesRead = (data_length > readLength) ? readLength : data_length;
4155
+ memcpy (readDest, searchPtr+1 , *bytesRead);
4156
+ }
4170
4157
free (command);
4171
4158
free (response);
4172
4159
@@ -5495,6 +5482,8 @@ SARA_R5_error_t SARA_R5::waitForResponse(const char *expectedResponse, const cha
5495
5482
else
5496
5483
_saraResponseBacklog[_saraResponseBacklogLength++] = c;
5497
5484
}
5485
+ } else {
5486
+ yield ();
5498
5487
}
5499
5488
}
5500
5489
@@ -5616,6 +5605,8 @@ SARA_R5_error_t SARA_R5::sendCommandWithResponse(
5616
5605
else
5617
5606
_saraResponseBacklog[_saraResponseBacklogLength++] = c;
5618
5607
}
5608
+ } else {
5609
+ yield ();
5619
5610
}
5620
5611
}
5621
5612
@@ -5681,6 +5672,8 @@ void SARA_R5::sendCommand(const char *command, bool at)
5681
5672
c = ' 0' ;
5682
5673
_saraResponseBacklog[_saraResponseBacklogLength++] = c;
5683
5674
timeIn = millis ();
5675
+ } else {
5676
+ yield ();
5684
5677
}
5685
5678
}
5686
5679
}
@@ -6068,6 +6061,9 @@ void SARA_R5::pruneBacklog()
6068
6061
|| (strstr (event, " +UUSIMSTAT:" ) != NULL )
6069
6062
|| (strstr (event, " +UUPSDA:" ) != NULL )
6070
6063
|| (strstr (event, " +UUPING:" ) != NULL )
6064
+ || (strstr (event, " +UUMQTTC:" ) != NULL )
6065
+ || (strstr (event, " +UUCREG:" ) != NULL )
6066
+ || (strstr (event, " +UUCEREG:" ) != NULL )
6071
6067
|| (strstr (event, " +UUHTTPCR:" ) != NULL ))
6072
6068
{
6073
6069
strcat (_pruneBuffer, event); // The URCs are all readable text so using strcat is OK
0 commit comments