【发布时间】:2020-01-06 18:39:08
【问题描述】:
我对 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 客户端; 表示定义了对象还是实例化了对象?如果被实例化,它被实例化成什么?
- Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell"); 我猜这里是使用 mqtt 客户端定义的前一行。我也想我不能使用“运行时”信息来声明一个主题,因为我不在“设置”功能中,对吗?
- AIO_USERNAME "/feeds/photocell" 这到底是什么语法?它们如何使用空格连接字符串?
我想要实现的是使用运行时信息来构建主题。简化,我想发布到 AIO_USERNAME "/feeds" + WiFi.macAddress() + "/photocell" 但没有任何财富。特别是,我不知道如何在全局范围内定义 Adafruit_MQTT_Publish 以便我可以在 setup() 和 loop() 函数中使用它,但在 setup 函数中实例化以便我可以使用 WiFi.macAddress()输出以作为提要名称的前缀
【问题讨论】:
-
仅供参考,您使用的是 C++,而不是 C。其次,反复试验可能不是学习语言的最佳方式:The Definitive C++ Book Guide and List
-
每个问题回答一个问题
-
#define AIO_USERNAME "your AIO username"的特别标注。它是一个宏。这是 1970 年代的遗留物,因此请尽量避开它们。在代码中的任何地方都可以找到令牌AIO_USERNAME,无论这样做是否有意义,它将被"your AIO username"替换。就宏而言,AIO_USERNAME还不错,因为它不太可能被重用,但过去人们使用诸如max、min、l之类的东西,以及其他经常显示为变量的东西名称,功能或你有什么。由此产生的错误可能很难诊断。 -
已更改有关宏语法的问题。问题不在于宏,而是使用空格连接 2 个字符串的事实。不应该是“+”吗?顺便说一句,“+”不起作用
-
@user4581301 宏在嵌入式环境中非常常见,其中存在大量寄存器屏蔽和位旋转。此外,由于它们在编译时被替换,因此它们不会占用有时只有 4kB 内存的嵌入式控制器上的宝贵内存。