c++ - 使用 InfluxdbV2.h 将 ESP32 数据写入 Influxdb 会出现 NULL 错误
问题描述
我一天中的大部分时间都在努力让电容式土壤传感器通过我的 ESP32 DEVKITV1 与我的 Pi 服务器上的 InfluxDB 设置进行通信。我已成功设置读取传感器并连接到我家的 WIFI,但我还不能让它与我的 InfluxDB 对话。
我正在使用由 davidgs 在https://github.com/davidgs/ESP8266_Influx_DB_V2分叉的 InfluxDB 处理库。这是我的第一个 ESP32 项目,从 15 年前大学开始我就没有接触过 C....
我的设置:
- 硬件:ESP32 DEVKIT (ESP32-WROOM-32)
- 软件:Arduino IDE 1.8.13,Linux Mint 19.3,内核为 5.4.0-39-generic
- 服务器 = Raspberry PI 4,通过 Portainer 将 influxdb 安装到 Docker,使用 8086 和 8083 端口。
我的 ESP32 代码:
#include "WiFi.h" #include "InfluxDbV2.h" //设置变量和定义 //WIFI定义 #define WIFI_SSID “已编辑” #define WIFI_PASS“已编辑” int status = WL_IDLE_STATUS;//设置启动的初始状态 #define INFLUXDB_HOST "192.168.1.220"//pi_server 静态ip #define INFLUXDB_PORT 8086 // pi_server 上的 influxdb 端口 InfluxdbV2 涌入(INFLUXDB_HOST,INFLUXDB_PORT); float asoilmoist=analogRead(34);//保持传感器 1 的湿度读数的变量 #define uS_TO_S_FACTOR 1000000ULL /* 微秒到秒的转换因子 */ #define TIME_TO_SLEEP 600 /* ESP32 进入睡眠的时间(以秒为单位)*/ 无效设置() { 序列号.开始(115200);//如果不需要,则禁用串行打印 延迟(10); //连接WIFI 序列号.println(); 序列号.println(); Serial.print("正在连接"); Serial.println(WIFI_SSID); 状态 = WiFi.开始(WIFI_SSID,WIFI_PASS); WiFi.setSleep(false);//防止它进入睡眠状态 //当它连接时,打印一个 . 而(状态!= WL_CONNECTED){ 序列号.print("."); 延迟(100); 状态 = WiFi.开始(WIFI_SSID,WIFI_PASS); } //连接wifi成功消息 Serial.println("WiFi 已连接"); Serial.println("IP地址:"); Serial.println(WiFi.localIP()); //influxdb 设置 influx.setOrg("默认"); influx.setBucket("db_soil_moisture"); 涌入.setToken(); //成功消息 Serial.println("设置完成"); } 无效循环() { Serial.println((String)"传感器 1 土壤湿度:="+asoilmoist); //仅调试 //设置要写入db的数据 InfluxDataV2 测量(“Soil_Moisture”); 测量.addTag("传感器", "1"); measure.addValue("值", asoilmoist); //将数据写入表 流入。写入(测量); 延迟(5000);//如果慢则等待它写入 esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); //进入睡眠时间X Serial.println((String)"要睡觉了"+TIME_TO_SLEEP); //用于调试 esp_deep_sleep_start(); }
我目前正在解决的错误是:
Arduino: 1.8.13 (Linux), Board: "DOIT ESP32 DEVKIT V1, 80MHz, 921600, None"
/home/nathan/Arduino/test_soil_moisture_V2/test_soil_moisture_V2.ino: In function 'void setup()':
test_soil_moisture_V2:50:19: error: no matching function for call to 'InfluxdbV2::setToken()'
influx.setToken();
^
In file included from /home/nathan/Arduino/test_soil_moisture_V2/test_soil_moisture_V2.ino:3:0:
/home/nathan/Arduino/libraries/ESP8266_Influx_DB_V2/InfluxDbV2.h:28:8: note: candidate: void InfluxdbV2::setToken(String)
void setToken(String token);
^
/home/nathan/Arduino/libraries/ESP8266_Influx_DB_V2/InfluxDbV2.h:28:8: note: candidate expects 1 argument, 0 provided
exit status 1
no matching function for call to 'InfluxdbV2::setToken()'
我试图用 NULL、()、"" 和假字符串设置令牌。似乎没有任何效果。我已经深入研究了 InfluxDbV2.cpp、InfluxDbV2.h 和 InfluxDataV2.h 文件来尝试解决这个问题,但我的成功率为零。
我希望有人可以帮助我朝着正确的方向前进。
解决方案
@hcheung:谢谢你的回复。我将该行设置为influx.setToken("SomeFakeToken")
,它删除了错误candidate expects 1 argument, 0 provided
,但它仍然无法正确编译。
然后我注意到了这条线
'null' was not declared in this scope
if(_token == null || _token.length() < 10){
这是我整个周末都在努力的错误。然后我记得读过 C 是如何要求 NULL 而 js 是如何使用 null 的。我更新了 InfluxDbV2.cpp 并更改null
为NULL
它终于编译了!
感谢你的帮助!
推荐阅读
- c++ - 如何确保我的 Arduino 秒表计时准确?
- android - 如何强制 MQTT 代理不从 Android Paho 客户端清除会话?
- mongodb - 在 mongodb 聚合管道中,我可以使用 $match 过滤数组字段吗?
- python - Python 脚本打印输出在外部调用它并将 stdout/stderr 记录到文件时仅出现在执行结束时
- python - 为什么 numpy 的 polyfit 和 polyval 期望多项式系数的顺序相反?
- r - 如何在 R 的 3-d 数组中应用每个矩阵
- android - 毕加索垃圾收集目标
- sql - SQL 聚合保留来自 VB.NET 中不同表的非聚合列
- flutter - 未来的实例
当函数返回 - ios - 无法从函数返回字符串