使用 InfluxdbV2.h 将 ESP32 数据写入 Influxdb 会出现 NULL 错误
Posted
技术标签:
【中文标题】使用 InfluxdbV2.h 将 ESP32 数据写入 Influxdb 会出现 NULL 错误【英文标题】:Writing ESP32 data to Influxdb using InfluxdbV2.h gives NULL error 【发布时间】:2020-10-18 23:56:17 【问题描述】:我大部分时间都在工作,以获取电容式土壤传感器,通过我的 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) Serial.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 文件来尝试解决这个问题,但我的成功率为零。
我希望有人能帮助我朝着正确的方向前进。
【问题讨论】:
阅读错误消息candidate expects 1 argument, 0 provided
,这意味着influx.setToken()
期望传入1 个参数,类似于influx.setToken(token)
。
【参考方案1】:
@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
并最终编译!
感谢您的帮助!
【讨论】:
以上是关于使用 InfluxdbV2.h 将 ESP32 数据写入 Influxdb 会出现 NULL 错误的主要内容,如果未能解决你的问题,请参考以下文章