首页 > 解决方案 > 使用 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 代码:

#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 文件来尝试解决这个问题,但我的成功率为零。

我希望有人可以帮助我朝着正确的方向前进。

标签: c++arduinoinfluxdbesp32

解决方案


@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 并更改nullNULL它终于编译了!

感谢你的帮助!


推荐阅读