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

Python调用Shelly Plug S API遇连接重置及拒绝错误求助

解决Shelly Plug S WiFi配置脚本的连接错误问题

问题背景

尝试通过Python脚本发送POST请求配置Shelly Plug S接入WiFi,Postman可正常完成配置,但脚本先后抛出以下错误:

  1. ConnectionResetError: [Errno 104] Connection reset by peer
  2. 更新后出现:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接

用户提供的原始代码:

import http.client

ssid = input("WiFi SSID: ")
pwd = input("Password: ")

conn = http.client.HTTPSConnection("192.168.33.1", "80")

payload = 'ssid='+ssid+'&key='+pwd+'&ipv4_method=dhcp&enabled=true'
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
conn.request("POST", "/settings/sta", payload, headers)
res = conn.getresponse()
data = res.read()
print(data. Decode("utf-8"))

首次错误回溯:

Traceback (most recent call last):
  File "/home/smarthome/shelly.py", line 12, in <module>
    conn.request("POST", "/settings/sta", payload, headers)
  File "/usr/lib/python3.10/http/client.py", line 1282, in request
  File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request
  File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders
  File "/usr/lib/python3.10/http/client.py", line 1037, in _send_output
  File "/usr/lib/python3.10/http/client.py", line 975, in send
  File "/usr/lib/python3.10/http/client.py", line 1454, in connect
  File "/usr/lib/python3.10/ssl.py", line 512, in wrap_socket
  File "/usr/lib/python3.10/ssl.py", line 1070, in _create
  File "/usr/lib/python3.10/ssl.py", line 1341, in do_handshake
ConnectionResetError: [Errno 104] Connection reset by peer

修复方案

1. 核心问题:错误使用HTTPS协议

Shelly设备在初始AP模式下(IP 192.168.33.1)仅提供HTTP服务,不支持SSL/TLS连接。原始代码用HTTPSConnection强制发起SSL握手,设备无法响应导致连接重置。

修复:将http.client.HTTPSConnection替换为http.client.HTTPConnection,端口保持80不变。

2. 语法错误修正

原始代码中print(data. Decode("utf-8"))存在多余空格,正确写法为print(data.decode("utf-8")),否则会触发语法错误。

3. 连接拒绝问题排查

若修改后仍出现ConnectionRefusedError,检查以下几点:

  • 确认电脑已连接到Shelly Plug S的默认AP热点(名称格式为ShellyPlugS-XXXXXX)
  • 验证设备IP是否为192.168.33.1(部分型号可能用192.168.1.1,可通过路由器ARP表或手机WiFi详情页确认)
  • 临时关闭电脑防火墙/安全软件,避免拦截本地网络请求

修复后完整代码

import http.client

ssid = input("WiFi SSID: ")
pwd = input("Password: ")

# 使用HTTP协议连接Shelly设备
conn = http.client.HTTPConnection("192.168.33.1", 80)

# 用f-string简化payload拼接,更简洁安全
payload = f'ssid={ssid}&key={pwd}&ipv4_method=dhcp&enabled=true'
headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
}

try:
    conn.request("POST", "/settings/sta", payload, headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"请求失败: {str(e)}")
finally:
    # 确保连接关闭
    conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:24:47