Add hostname in mqtt topics

So we are able to have several devices
This commit is contained in:
Mathieu Maret 2016-03-25 01:08:48 +01:00
parent d51df5dd64
commit dfb5746180
2 changed files with 27 additions and 13 deletions

View File

@ -5,26 +5,39 @@ Adafruit_MQTT_Publish *mqtt_temp;
Adafruit_MQTT_Publish *mqtt_pressure; Adafruit_MQTT_Publish *mqtt_pressure;
#define NB_ELEMENTS(x) (sizeof(x)/ sizeof(x[0])) #define NB_ELEMENTS(x) (sizeof(x)/ sizeof(x[0]))
#define FEED_MAX_SIZE 64
const char TEMPERATURE_FEED[] = "/feeds/temperature"; #define TEMPERATURE_FEED_FORMAT "/feeds/%s/temperature"
const char PRESSURE_FEED[] = "/feeds/pressure"; #define PRESSURE_FEED_FORMAT "/feeds/%s/pressure"
char temperatureFeed[FEED_MAX_SIZE] = {};
char pressureFeed[FEED_MAX_SIZE] = {};
// Should have less that MAXSUBSCRIPTIONS elements // Should have less that MAXSUBSCRIPTIONS elements
// MAXSUBSCRIPTIONS is defined is Adafruit_mqtt.h // MAXSUBSCRIPTIONS is defined is Adafruit_mqtt.h
const int gpioWatched[] = {12, 13}; const int gpioWatched[] = {12, 13};
#define GPIO_BASE "/feeds/gpio/" #define GPIO_FEED_FORMAT "/feeds/%s/gpio/%d"
const char *GPIO_FEED[] = { GPIO_BASE"12", GPIO_BASE"13"}; #define GPIO_SET_FEED_FORMAT "/feeds/%s/gpio/%d/set"
const char *GPIO_SET_FEED[] = { GPIO_BASE"12/set", GPIO_BASE"13/set"};
char *mqttId;
char GPIO_FEED[MAXSUBSCRIPTIONS][FEED_MAX_SIZE] = {};
char GPIO_SET_FEED[MAXSUBSCRIPTIONS][FEED_MAX_SIZE] = {};
Adafruit_MQTT_Publish * mqttGpio[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish * mqttGpio[MAXSUBSCRIPTIONS] = {};
int MqttSetup(char *server, char *user, char *passwd, int port) { int MqttSetup(char *server, char *user, char *passwd, int port, char * hostname) {
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details. mqttId = hostname;
snprintf(temperatureFeed, FEED_MAX_SIZE, TEMPERATURE_FEED_FORMAT, mqttId);
snprintf(pressureFeed, FEED_MAX_SIZE, PRESSURE_FEED_FORMAT, mqttId);
mqtt = new Adafruit_MQTT_Client(&client, server, port, user, passwd); mqtt = new Adafruit_MQTT_Client(&client, server, port, user, passwd);
mqtt_temp = new Adafruit_MQTT_Publish(mqtt, TEMPERATURE_FEED); mqtt_temp = new Adafruit_MQTT_Publish(mqtt, temperatureFeed);
mqtt_pressure = new Adafruit_MQTT_Publish(mqtt, PRESSURE_FEED); mqtt_pressure = new Adafruit_MQTT_Publish(mqtt, pressureFeed);
for (int i = 0 ; i < NB_ELEMENTS(gpioWatched) && i < MAXSUBSCRIPTIONS; i++) { for (int i = 0 ; i < NB_ELEMENTS(gpioWatched) && i < MAXSUBSCRIPTIONS; i++) {
snprintf(GPIO_FEED[i], FEED_MAX_SIZE, GPIO_FEED_FORMAT, mqttId, gpioWatched[i]);
snprintf(GPIO_SET_FEED[i], FEED_MAX_SIZE, GPIO_SET_FEED_FORMAT, mqttId, gpioWatched[i]);
Adafruit_MQTT_Subscribe *gpioSet = new Adafruit_MQTT_Subscribe(mqtt, GPIO_SET_FEED[i]); Adafruit_MQTT_Subscribe *gpioSet = new Adafruit_MQTT_Subscribe(mqtt, GPIO_SET_FEED[i]);
mqtt->subscribe(gpioSet); mqtt->subscribe(gpioSet);
@ -72,9 +85,10 @@ int MqttPublish(double temp, double pressure) {
} }
int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription) { int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription) {
if (!strstr(subscription->topic, GPIO_BASE)) char *temp = strstr(subscription->topic, "/gpio/");
if (!temp)
return -1; return -1;
String gpioStr(subscription->topic + strlen(GPIO_BASE)); String gpioStr(temp + strlen("/gpio/"));
int idx = gpioStr.indexOf("/"); int idx = gpioStr.indexOf("/");
int gpio = gpioStr.substring(0, idx).toInt(); int gpio = gpioStr.substring(0, idx).toInt();

View File

@ -75,7 +75,7 @@ bool BMP180IsConnected();
/* MQTT decl */ /* MQTT decl */
int MqttConnect(); int MqttConnect();
int MqttIsConnected(); int MqttIsConnected();
int MqttSetup(char *server, char *user, char *passwd, int port); int MqttSetup(char *server, char *user, char *passwd, int port, char * hostname);
int MqttPublish(double temp, double pressure); int MqttPublish(double temp, double pressure);
void MqttCheckSubscription(); void MqttCheckSubscription();
void MqttChangeGpioValue(int gpio, int value); void MqttChangeGpioValue(int gpio, int value);
@ -197,7 +197,7 @@ void setup() {
Serial.println(); Serial.println();
WifiSetup(mode, txStatus == 0, confSsid, confPassword, confHost); WifiSetup(mode, txStatus == 0, confSsid, confPassword, confHost);
MqttSetup(mqttServer, mqttUser, mqttPasswd, mqttPort); MqttSetup(mqttServer, mqttUser, mqttPasswd, mqttPort, confHost);
if (mode == BOOTMODE_OTA) { if (mode == BOOTMODE_OTA) {
OTASetup(); OTASetup();