Python调用Shelly Plug S API遇连接重置及拒绝错误求助
解决Shelly Plug S WiFi配置脚本的连接错误问题
问题背景
尝试通过Python脚本发送POST请求配置Shelly Plug S接入WiFi,Postman可正常完成配置,但脚本先后抛出以下错误:
ConnectionResetError: [Errno 104] Connection reset by peer- 更新后出现:
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
相关产品推荐
相关产品推荐

