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

Raspberry Pi Pico W接入InfluxDB Cloud 2.0时sock.connect报错排查

Raspberry Pi Pico W 连接 InfluxDB Cloud 2.0 报错排查

问题重现

你编写了将Pico W风速数据上传到InfluxDB Cloud 2.0的代码,但执行时在sock.connect步骤触发错误:

ValueError: invalid arguments
at: sock.connect(("europe-west1-1.gcp.cloud2.influxdata.com", 443))

你的代码如下:

def send_data_to_influxdb(data):
    # Build the HTTP request
    request = (
        "POST /api/v2/write?org=haschke-florian@web.de&bucket=myBucket HTTP/1.1\r\n"
        "Host: cloud2.influxdata.com\r\n"
        "Authorization: Token myToken\r\n"
        "Content-Type: application/json\r\n"
        "Content-Length: {}\r\n\r\n"
        "{}"
    ).format(len(data), data)

    sock = usocket.socket()
    sock.connect(("europe-west1-1.gcp.cloud2.influxdata.com", 443))
    sock.send(request.encode("utf-8"))
    response = sock.recv(4096).decode("utf-8")
    sock.close()


# Sample data to send
data = [
    {
        "measurement": "test_measurement",
        "fields": {
            "value": 100
        }
    }
]

# Write data to InfluxDB
send_data_to_influxdb(ujson.dumps(data))

错误原因及解决办法

1. 未使用SSL套接字处理HTTPS连接

InfluxDB Cloud 2.0的API强制使用HTTPS协议,你直接创建的普通TCP套接字无法处理SSL加密通信,这是触发连接参数错误的核心原因之一。

修复代码:
导入ssl模块,创建套接字后先进行SSL包装,再执行连接:

import ssl
import usocket
import ujson

def send_data_to_influxdb(data):
    request = (
        "POST /api/v2/write?org=haschke-florian@web.de&bucket=myBucket HTTP/1.1\r\n"
        "Host: europe-west1-1.gcp.cloud2.influxdata.com\r\n"  # Host需与连接域名一致
        "Authorization: Token myToken\r\n"
        "Content-Type: text/plain; charset=utf-8\r\n"  # 匹配Line Protocol格式的Content-Type
        "Content-Length: {}\r\n\r\n"
        "{}"
    ).format(len(data), data)

    sock = usocket.socket()
    # 包装SSL套接字并指定服务器域名
    sock = ssl.wrap_socket(sock, server_hostname="europe-west1-1.gcp.cloud2.influxdata.com")
    sock.connect(("europe-west1-1.gcp.cloud2.influxdata.com", 443))
    sock.send(request.encode("utf-8"))
    response = sock.recv(4096).decode("utf-8")
    print(response)  # 打印响应便于排查后续问题
    sock.close()

# 改用InfluxDB默认接受的Line Protocol格式数据
data = "test_measurement value=100"
send_data_to_influxdb(data)

2. DNS解析失败

Pico W的网络可能未正确获取DNS服务器地址,导致无法解析InfluxDB的域名。可以先手动解析域名再连接:

修复代码:

# 在connect前先解析域名获取地址元组
addr = usocket.getaddrinfo("europe-west1-1.gcp.cloud2.influxdata.com", 443)[0][-1]
sock.connect(addr)

3. 数据格式错误(额外提示)

你当前用JSON格式发送数据,但InfluxDB 2.0的/api/v2/write接口默认只接受Line Protocol格式,即使连接成功也会写入失败。格式规则为:measurement tag_key=tag_value field_key=field_value timestamp,字段值为字符串时需加引号,数值直接书写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:51:29