c++ - setup() 中的 Arduino 和对象实例化
问题描述
我对 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()输出以作为提要名称的前缀
解决方案
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
使用一个构造函数实例化,该构造函数接受一个指向客户端的指针、一些服务器常量等。
查看以下代码后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
推荐阅读
- angular - 使用 Angular 6 中的自定义表单控件进行自定义验证
- reporting-services - SSRS 错误:无法加载文件夹内容。SQL 服务器 2016
- azure-bot-service - 使用 JS 从 azure healthbot 调用 rest api
- list - AHK 多维列表可使用箭头键和 Enter 导航
- sql - SQL Server TABLOCKX 未锁定表
- javascript - 按月和年对数组进行排序
- c# - 如何在后续瀑布步骤中检索自适应卡的表单提交
- css - Safari 的不同行为和样式
- python - 如何在 django 中使用 UpdateView 更改用户密码
- python - 使用 python 脚本的单词列表