WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
Выше три строки создают новые переменные глобальной области видимости. Переменная client
создается с использованием конструктора по умолчанию класса WiFiClient
. mqtt
создается с использованием конструктора, который принимает указатель на клиента, некоторую серверную константу и т. Д. c.
После просмотра кода для Adafruit_MQTT_Publish
: https://github.com/adafruit/Adafruit_MQTT_Library/blob/master/Adafruit_MQTT.cpp я вижу что это просто вспомогательный класс-оболочка, который содержит указатель на объект Adafruit_MQTT
, qos
(по умолчанию 0
) и topic
. Он реализует несколько различных publish
методов, которые различаются по типу аргумента, который они получают. Например, это метод для uint32_t
:
bool Adafruit_MQTT_Publish::publish(uint32_t i) {
char payload[11];
ultoa(i, payload, 10);
return mqtt->publish(topic, payload, qos);
}
Вы можете просто реализовать те же функции самостоятельно:
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
char whatever[] = "What ever";
void loop()
{
char topic[64]; //Note, if the input can be longer than 64 characters long, change to topic[128] for example...
strcpy(topic, AIO_USERNAME);
strcat(topic, whatever);
char something[] = "asdf";
mqtt.publish(topic,something,0);
}
Что касается вашего вопроса о синтаксисе
AIO_USERNAME "/feeds/photocell"
Препроцессор превратит его в:
"your AIO username" "/feeds/photocell"
, который затем компилятор превращает в одну длинную строку:
"your AIO username/feeds/photocell"
Эта конкатенация возможно только для строковых литералов (таких как "string"
). Чтобы объединить материал во время выполнения, вы должны будете использовать библиотечные функции, такие как strcat
и strcpy
. Пожалуйста, обратитесь к string.h
: https://en.cppreference.com/w/c/string/byte