Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add renewAddress to MQTT examples if connect fails #49

Merged
merged 7 commits into from
Jul 7, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions RF24Ethernet.h
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,12 @@ typedef RF24EthernetClass RF52EthernetClass;
* This is the example taken from the PubSub library (https://github.com/knolleary/pubsubclient) & slightly modified to include RF24Ethernet/RF24Mesh.
*/

/**
* @example mqtt_basic_no_blk.ino
*
* This is similar to the mqtt_basic example, but uses a non-blocking connect function.
*/

TMRh20 marked this conversation as resolved.
Show resolved Hide resolved
/**
* @example mqtt_basic_2.ino
*
Expand Down
11 changes: 5 additions & 6 deletions examples/MQTT/mqtt_basic/mqtt_basic.ino
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,17 @@ MQTTClient client;

void connect() {
Serial.print("connecting...");
uint32_t clTimeout = millis();
uint32_t clTimeout = millis() + 5001;
while (!client.connect(clientID)) {
Serial.print(".");
if (millis() - clTimeout > 5001) {
if (millis() > clTimeout) {
Serial.println();
mesh.renewAddress();
return;
}
uint32_t timer = millis();
uint32_t timer = millis() + 1000;
//Instead of delay, keep the RF24 stack updating
while (millis() - timer < 1000) {
while (millis() < timer) {
Ethernet.update();
}
}
Expand All @@ -91,7 +92,6 @@ void setup() {

//Convert the last octet of the IP address to an identifier used
char str[4];
int test = ip[3];
itoa(ip[3], str, 10);
memcpy(&clientID[13], &str, strlen(str));
Serial.println(clientID);
Expand Down Expand Up @@ -125,7 +125,6 @@ void loop() {
if (client.connected() && millis() - pub_timer > 3000) {
pub_timer = millis();
char str[4];
int test = ip[3];
itoa(ip[3], str, 10);
char str1[] = "Node \r\n";
memcpy(&str1[5], &str, strlen(str));
Expand Down
11 changes: 5 additions & 6 deletions examples/MQTT/mqtt_basic_2/mqtt_basic_2.ino
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,17 @@ MQTTClient client;

void connect() {
Serial.print("connecting...");
uint32_t clTimeout = millis();
uint32_t clTimeout = millis() + 5001;
while (!client.connect(clientID)) {
Serial.print(".");
if (millis() - clTimeout > 5001) {
if (millis() > clTimeout) {
mesh.renewAddress();
Serial.println();
return;
}
uint32_t timer = millis();
uint32_t timer = millis() + 1000;
//Instead of delay, keep the RF24 stack updating
while (millis() - timer < 1000) {
while (millis() < timer) {
Ethernet.update();
}
}
Expand All @@ -92,7 +93,6 @@ void setup() {

//Convert the last octet of the IP address to an identifier used
char str[4];
int test = ip[3];
itoa(ip[3], str, 10);
memcpy(&clientID[13], &str, strlen(str));
Serial.println(clientID);
Expand Down Expand Up @@ -126,7 +126,6 @@ void loop() {
if (client.connected() && millis() - pub_timer > 3000) {
pub_timer = millis();
char str[4];
int test = ip[3];
itoa(ip[3], str, 10);
char str1[] = "Node \r\n";
memcpy(&str1[5], &str, strlen(str));
Expand Down
122 changes: 122 additions & 0 deletions examples/MQTT/mqtt_basic_no_blk/mqtt_basic_no_blk.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/*
*************************************************************************
RF24Ethernet Arduino library by TMRh20 - 2014-2021

Automated (mesh) wireless networking and TCP/IP communication stack for RF24 radio modules

RF24 -> RF24Network -> UIP(TCP/IP) -> RF24Ethernet
-> RF24Mesh

Documentation: http://nRF24.github.io/RF24Ethernet/

*************************************************************************

**** EXAMPLE REQUIRES: Arduino MQTT library: https://github.com/256dpi/arduino-mqtt/ ***
Shown in Arduino Library Manager as 'MQTT' by Joel Gaehwiler

*************************************************************************
Basic MQTT example

This sketch demonstrates the basic capabilities of the library.
It connects to an MQTT server then:
- publishes "hello world" to the topic "outTopic"
- subscribes to the topic "inTopic", printing out any messages
it receives.
- it assumes the received payloads are strings not binary
- Continually publishes its nodeID to the outTopic

It will reconnect to the server if the connection is lost using a non-blocking
reconnect function.

*/

#include <SPI.h>
#include <RF24.h>
#include <RF24Network.h>
#include <RF24Mesh.h>
#include <RF24Ethernet.h>
#include <MQTT.h>

RF24 radio(7, 8);
RF24Network network(radio);
RF24Mesh mesh(radio, network);
RF24EthernetClass RF24Ethernet(radio, network, mesh);

IPAddress ip(10, 10, 2, 4);
IPAddress gateway(10, 10, 2, 2); //Specify the gateway in case different from the server
IPAddress server(10, 10, 2, 2); //The ip of the MQTT server
char clientID[] = { "arduinoClient " };

void messageReceived(MQTTClient* client, char topic[], char payload[], int length) {
Serial.println("incoming: ");
Serial.print(topic);
Serial.print(" - ");
Serial.println(payload);
}

EthernetClient ethClient;
MQTTClient client;

void connect() {
Serial.println("connecting...");
if (!client.connect(clientID)) {
mesh.renewAddress();
return;
}
Serial.println("\nconnected!");
client.publish("outTopic", "hello world");
client.subscribe("inTopic", 2);
}

void setup() {

Serial.begin(115200);

Ethernet.begin(ip, gateway);

if (mesh.begin()) {
Serial.println(" OK");
} else {
Serial.println(" Failed");
}

//Convert the last octet of the IP address to an identifier used
char str[4];
itoa(ip[3], str, 10);
memcpy(&clientID[13], &str, strlen(str));
Serial.println(clientID);

client.begin(server, ethClient);
client.onMessageAdvanced(messageReceived);
}


uint32_t pub_timer = 0;

void loop() {

Ethernet.update();

if (!client.connected()) {
if (!mesh.checkConnection()) {
if (mesh.renewAddress() == MESH_DEFAULT_ADDRESS) {
mesh.begin();
}
}
connect();
Serial.println();
}

client.loop();

// Every so often, report to the MQTT server the Node ID of this node
if (client.connected() && millis() - pub_timer > 3000) {
pub_timer = millis();
char str[4];
itoa(ip[3], str, 10);
char str1[] = "Node \r\n";
memcpy(&str1[5], &str, strlen(str));

client.publish("outTopic", str1);
}
}
Loading