我有一些代码可以从 Raspberry Pi 接收 WiFi 密码。 Pi 每 2 分钟发出一个新代码。下面的脚本检查密码并在需要时使用新密码更新连接。
# Create a TCP/IP socket
s=socket(AF_INET, SOCK_DGRAM)
# Bind the socket to the port
s.bind (('',4446))
s.settimeout(10.0)
print ("Listening . . . .")
data=s.recv(1024).decode()
print ("Password: "+data)
os.system('netsh wlan set profileparameter name=PI_AP Keymaterial='+data)
var1=data
try:
while 1:
data=s.recv(1024).decode()
print ("Password: "+data)
if var1!=data:
os.system('netsh wlan set profileparameter name=PI_AP Keymaterial='+data)
print ("Password: "+data)
var1=data
except socket.timeout:
print ("Timed Out")
这是输出,以及我在断开连接后看到的错误消息:
>>> ================================ RESTART ================================
>>>
Listening . . . .
Password: m9FyvpJCILQrZB4sq125AfUn9nfS9Z6qDlbBxy12pL48y5kJTLrH01osp4xXWN3
Password: m9FyvpJCILQrZB4sq125AfUn9nfS9Z6qDlbBxy12pL48y5kJTLrH01osp4xXWN3
Password: m9FyvpJCILQrZB4sq125AfUn9nfS9Z6qDlbBxy12pL48y5kJTLrH01osp4xXWN3
**Traceback (most recent call last): File "C:\Users\cave\Desktop\system_V1\UAD-V1.0.py", line 21, in <module> data=s.recv(1024).decode() socket.timeout: timed out During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\cave\Desktop\system_V1\UAD-V1.0.py", line 29, in <module> except socket.timeout: TypeError: catching classes that do not inherit from BaseException is not allowed >>>**
请您参考如下方法:
在断开连接的情况下,您应该收到套接字断开连接异常或空数据(如您在 if 中测试的那样)。
如果您没有收到异常(这有点尴尬),您可以使用 select
(低级)或 selectors
(高级)模块,以便查看是否在线接收数据。
您可以设置一个 2 分钟的超时,此后 select()
函数将抛出异常。
更新:
为了捕获超时异常,请像这样包装您的代码:
try:
while 1:
...
except socket.timeout:
print("timed out")
...
更新 2:
您似乎在 try catch socket.socket.timeout
而您需要捕获 socket.timeout
。我相信您在顶部使用了这一行:from socket import *
。如果是这样,请 try catch timeout
而不是 socket.timeout
。这就是不推荐 from ... import *
的原因。