You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将GPIO连接的DHT11传感器数据写入InfluxDB容器失败求助

问题排查与解决方案

1. 通信协议与端口使用错误

你直接用Socket连接8086端口并发送INSERT命令是核心问题:

  • 8086是InfluxDB的HTTP API端口,需要发送标准HTTP请求(如POST到/write端点),而非自定义文本命令。
  • 若要使用原生TCP协议,需连接8088端口(需在InfluxDB配置中开启tcp-listener),且协议格式为Line Protocol,而非INSERT语句。

2. Line Protocol格式完全不符合规范

你的Schreiben方法生成的字符串不满足InfluxDB数据写入格式要求:

  • 错误示例:INSERT Sensor_Daten {'Temperatur': 25.0, 'Luftfeuchtigkeit': 60}
  • 正确Line Protocol格式:Sensor_Daten Temperatur=25.0,Luftfeuchtigkeit=60(无需INSERT关键字,字段采用key=value格式,数值直接写入,字符串需加双引号)

3. 未明确指定目标数据库

初始化时传入了database参数,但写入过程中没有告知InfluxDB要写入的目标库,无论使用哪种协议都必须明确指定。


修复方案(推荐使用HTTP API,稳定性更高)

方案1:修改自定义库适配HTTP API

重写核心方法,生成符合要求的HTTP请求:

import socket
import sys

class InfluxDB_Bibliothek:
    def __init__(self, host, port, database):
        self.host = host
        self.port = port
        self.database = database
        self.socket = None

    def Verbinden(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            self.socket.connect((self.host, self.port))
            print("连接成功建立")
        except socket.error as e:
            print("数据库连接失败", e)
            sys.exit(1)

    def Schreiben(self, measurement, fields):
        # 生成标准Line Protocol字段字符串
        field_str = ",".join([f"{k}={v}" for k, v in fields.items()])
        line_protocol = f"{measurement} {field_str}\n"
        # 构造HTTP POST请求,指定目标数据库
        http_request = (
            f"POST /write?db={self.database} HTTP/1.1\r\n"
            f"Host: {self.host}:{self.port}\r\n"
            f"Content-Length: {len(line_protocol)}\r\n"
            "\r\n"
            f"{line_protocol}"
        )
        self.Senden(http_request)

    def Senden(self, data):
        try:
            self.socket.sendall(data.encode())
            antwort = self.socket.recv(4096)
            # 检查HTTP响应状态,204表示写入成功
            if b"204 No Content" not in antwort:
                print(f"写入失败,响应: {antwort.decode()}")
            return antwort.decode()
        except socket.error as e:
            print("向数据库发送数据时出错", e)
            sys.exit(1)

    def Schließen(self):
        self.socket.close()

方案2:改用官方InfluxDB Python客户端(更简单可靠)

无需自行实现协议细节,官方客户端已封装所有逻辑:

  1. 安装客户端:pip install influxdb-client
  2. 修改业务代码:
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
import time

# 替换为你的容器IP、令牌、组织名
client = InfluxDBClient(url="http://你的容器IP:8086", token="你的InfluxDB令牌", org="你的组织名")
write_api = client.write_api(write_options=SYNCHRONOUS)
bucket = "Sensor"  # InfluxDB 2.x为Bucket,1.x对应Database

try:
    while True:
        temperature = dht_device.temperature
        humidity = dht_device.humidity

        # 构造数据点并写入
        point = Point("Sensor_Daten").field("Temperatur", temperature).field("Luftfeuchtigkeit", humidity)
        write_api.write(bucket=bucket, record=point)

        time.sleep(2)
except KeyboardInterrupt:
    pass
finally:
    client.close()
    dht_device.exit()

注:若使用InfluxDB 1.x,安装influxdb库(pip install influxdb),代码逻辑可参考官方文档调整。

额外检查项

  • 确认InfluxDB容器的8086端口已映射到主机(启动容器时添加-p 8086:8086参数)
  • 提前创建目标数据库Sensor(通过InfluxDB CLI或Web UI执行CREATE DATABASE Sensor)
  • 写入前打印temperature和humidity,确保传感器返回有效数据(非None或异常值)

内容的提问来源于stack exchange,提问作者Amir004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:27:10