我正在使用树莓派 3 和 python 2.7 请求将数据发布到我的灯服务器。除了被困request.exceptions.ConnectTimeout的间歇性发布错误外,所有工作都很好。顺便说一句,超时=0.5 秒,这是发布时间(0.2 秒)的 2.5 倍。请参阅下面的代码。
当请求异常发生时,我使用 CheckConnection() 检查互联网访问。顺便说一句,这在 pi 上只需要 0.016 秒;与其他技术相比,速度如此之快。当为 False 时,它不会重试发布并在本地记录数据。
但是,在发生这种情况时,我可以使用 TeamViewer 远程连接到 Pi! 我正在通过其他安装将数据发布到我们的服务器,因此这不是云服务器停机问题。
几分钟到几分钟后,问题自行解决,并发布简历,就像没有任何问题一样。
任何关于如何更改代码的建议都非常受欢迎,以确定根本原因或解决问题。先感谢您。
******** 代码 ************
def PostData(有效负载,retry_count=3):
url = 'http://xxx.xxx.xxx.xxx/api/data/push/'
try:
response = requests.post(url,params=payload,timeout=0.5)
if response.status_code == 200:
return response.text
response.raise_for_status()
except (requests.exceptions.RequestException, requests.exceptions.ConnectTimeout) as e:
print "Post Error..."
x = CheckConnection()
if x==False:
return "Internet for Posting: " + str(x)
if retry_count >0:
Reason = "Post Settings Retry: " + str(retry_count)
print Reason
#sleeptime = 0.05*2**(3-retry_count)
#time.sleep(sleeptime)
return PostData(payload, retry_count-1)
if retry_count==0:
Reason = "Error! Post settings retry failed. Retry=0. Internet: " + str(x)
return Reason
return None
except Exception as e:
x = CheckConnection()
Reason= "Error! Posting Exception: " + str(e) + "Internet: " + str(x)
print Reason
return None
def CheckConnection(host="8.8.8.8",port=53,timeout=0.5):
try:
socket.setdefaulttimeout(timeout)
socket.socket(socket.AF_INET,socket.SOCK_STREAM).connect((host,port))
return True
except Exception:
return False