Arduino и создание объекта в setup () - PullRequest
0 голосов
/ 06 января 2020

Я действительно новичок в C и Arduino, но имею опыт работы с языками высокого уровня. Я попытался найти решение в документации, но не смог найти ничего достаточно сложного, чтобы понять основы arduino

Итак, вот пример, который я пытаюсь понять: https://learn.adafruit.com/mqtt-adafruit-io-and-you/arduino-plus-library-setup

пример называется mqtt_esp8266

соответствующие части:

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define AIO_USERNAME    "your AIO username"

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");

void setup() {
...
}

void loop() {
...
photocell.publish(something);
}

Мои вопросы:

  • WiFiClient client; означает что объект определен или он создан? Если он создан, то для чего?
  • Adafruit_MQTT_Publi sh photocell = Adafruit_MQTT_Publi sh (& mqtt, AIO_USERNAME "/ feeds / photocell"); здесь, я полагаю, что это так используя клиент mqtt, определенный в предыдущей строке. Я также предполагаю, что не могу использовать информацию «времени выполнения» для объявления topi c, так как я не в функции «setup», я прав?
  • AIO_USERNAME "/ feeds / photocell" какого черта этот синтаксис? Как они объединяют строки, используя пробелы?

То, чего я пытаюсь добиться, - это использовать информацию времени выполнения для построения topi c. упрощенно, я хочу опубликовать sh в AIO_USERNAME "/ feeds" + WiFi.macAddress () + "/ photocell", но без какого-либо состояния. В частности, я не знаю, как определить Adafruit_MQTT_Publi sh в глобальной области видимости, чтобы я мог использовать его как в функциях setup (), так и в l oop (), но создать экземпляр в функции настройки, чтобы я мог использовать вывод WiFi.macAddress () для префикса имени канала

1 Ответ

0 голосов
/ 06 января 2020
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

...