使用 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266和ESP32通过网页端控制引脚输出

esp32怎么输出80code

ESP32-CAM 使用 socketIO 将视频输出流式传输到 nodejs 服务器的最快方法

使用 ESP32 网络服务器下载文件时面临问题

esp32和php XXTEA字符串加密

GCP 中的物联网管道