1. 程式人生 > >樹莓派上傳數據錯誤一例

樹莓派上傳數據錯誤一例

incr mdi .get format bin xtra python3.5 use per

首先是源碼:

  1 # -*- utf-8 -*-
  2 #env !/usr/bin/python
  3 
  4 import RPi.GPIO as GPIO
  5 import time
  6 import json
  7 import datetime
  8 import requests
  9 
 10 requests.adapters.DEFAULT_RETRIES = 5
 11 # s = requests.session()
 12 # s.keep_alive = False
 13 apiurl = https://xxxxxx.cn/api/TmpApi
 14
apiheaders = {Content-Type: application/json,Connection: close} 15 16 def getCPUTemp(): 17 file = open("/sys/class/thermal/thermal_zone0/temp") 18 cpuTemp=float(file.read())/1000 19 file.close() 20 return cpuTemp 21 22 def getTemp(): 23 channel = 17 24 data = [] 25 j = 0
26 27 GPIO.setmode(GPIO.BCM) 28 29 time.sleep(1) 30 31 GPIO.setup(channel, GPIO.OUT) 32 33 GPIO.output(channel, GPIO.LOW) 34 time.sleep(0.02) 35 GPIO.output(channel, GPIO.HIGH) 36 37 GPIO.setup(channel, GPIO.IN) 38 39 while GPIO.input(channel) == GPIO.LOW:
40 continue 41 42 while GPIO.input(channel) == GPIO.HIGH: 43 continue 44 45 while j < 40: 46 k = 0 47 while GPIO.input(channel) == GPIO.LOW: 48 continue 49 50 while GPIO.input(channel) == GPIO.HIGH: 51 k += 1 52 if k > 100: 53 break 54 55 if k < 8: 56 data.append(0) 57 else: 58 data.append(1) 59 60 j += 1 61 62 print("sensor is working.") 63 # print(data) 64 65 humidity_bit = data[0:8] 66 humidity_point_bit = data[8:16] 67 temperature_bit = data[16:24] 68 temperature_point_bit = data[24:32] 69 check_bit = data[32:40] 70 71 humidity = 0 72 humidity_point = 0 73 temperature = 0 74 temperature_point = 0 75 check = 0 76 77 cpu_temperature = 0 78 79 for i in range(8): 80 humidity += humidity_bit[i] * 2 ** (7 - i) 81 humidity_point += humidity_point_bit[i] * 2 ** (7 - i) 82 temperature += temperature_bit[i] * 2 ** (7 - i) 83 temperature_point += temperature_point_bit[i] * 2 ** (7 - i) 84 check += check_bit[i] * 2 ** (7 - i) 85 86 tmp = humidity + humidity_point + temperature + temperature_point 87 88 csv=open(/home/pi/Desktop/Projects/DHT11/log.csv, a+) 89 if humidity>99: 90 return "Wrong data" 91 if check == tmp: 92 print("temperature : ", temperature, ", humidity : " , humidity) 93 cpu_temperature = getCPUTemp() 94 print("CPU Temperature : ", cpu_temperature) 95 96 CurTime = datetime.datetime.now() 97 payload = {DeviceName:"DHT11a",Temp:temperature,Humidity:humidity,AcquisitionTime:CurTime.isoformat(), Memo: cpu:%.3f % cpu_temperature} 98 print("Current time: %s" % CurTime.isoformat()) 99 print("Upload Temperature: %.3f" % temperature,"Humdity: %.3f" % humidity) 100 101 jdata = json.dumps(payload) 102 103 r=requests.post(apiurl,headers=apiheaders,data=json.dumps(payload)) 104 105 csv.write(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime()) + ",") 106 csv.write(str(temperature)) 107 csv.write(,) 108 csv.write(str(humidity)) 109 csv.write(\n) 110 else: 111 # print("wrong") 112 r = "wrong" 113 print("temperature : ", temperature, ", humidity : " , humidity, " check : ", check, " tmp : ", tmp) 114 115 csv.close() 116 117 return r 118 119 if __name__ == "__main__": 120 try: 121 while 1: 122 resp = getTemp() 123 print("xxxxxx.cn request result: %s" %resp) 124 time.sleep(60) 125 finally: 126 GPIO.cleanup()

錯誤故障:

 1 sensor is working.
 2 temperature :  24 , humidity :  44
 3 CPU Temperature :  47.236
 4 Current time: 2018-09-14T04:37:06.303399
 5 Upload Temperature: 24.000 Humdity: 44.000
 6 xxxxxx.cn request result:  <Response [201]>
 7 sensor is working.
 8 temperature :  16 , humidity :  50  check :  161  tmp :  78
 9 xxxxxx.cn request result:  wrong
10 sensor is working.
11 temperature :  24 , humidity :  55
12 CPU Temperature :  46.698
13 Current time: 2018-09-14T04:39:08.722444
14 Upload Temperature: 24.000 Humdity: 55.000
15 Traceback (most recent call last):
16   File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 138, in _new_conn
17     (self.host, self.port), self.timeout, **extra_kw)
18   File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 75, in create_connection
19     for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
20   File "/usr/lib/python3.5/socket.py", line 733, in getaddrinfo
21     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
22 socket.gaierror: [Errno -3] Temporary failure in name resolution
23 
24 During handling of the above exception, another exception occurred:
25 
26 Traceback (most recent call last):
27   File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 594, in urlopen
28     chunked=chunked)
29   File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 350, in _make_request
30     self._validate_conn(conn)
31   File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 837, in _validate_conn
32     conn.connect()
33   File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 281, in connect
34     conn = self._new_conn()
35   File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 147, in _new_conn
36     self, "Failed to establish a new connection: %s" % e)
37 requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x75aa01b0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution
38 
39 During handling of the above exception, another exception occurred:
40 
41 Traceback (most recent call last):
42   File "/usr/lib/python3/dist-packages/requests/adapters.py", line 423, in send
43     timeout=timeout
44   File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 643, in urlopen
45     _stacktrace=sys.exc_info()[2])
46   File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 363, in increment
47     raise MaxRetryError(_pool, url, error or ResponseError(cause))
48 requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=xxxxxx.cn, port=443): Max retries exceeded with url: /api/TmpApi (Caused by NewConnectionError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x75aa01b0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution,))
49 
50 During handling of the above exception, another exception occurred:
51 
52 Traceback (most recent call last):
53   File "dht11GV.py", line 121, in <module>
54     resp = getTemp()
55   File "dht11GV.py", line 102, in getTemp
56     r=requests.post(apiurl,headers=apiheaders,data=json.dumps(payload))
57   File "/usr/lib/python3/dist-packages/requests/api.py", line 110, in post
58     return request(post, url, data=data, json=json, **kwargs)
59   File "/usr/lib/python3/dist-packages/requests/api.py", line 56, in request
60     return session.request(method=method, url=url, **kwargs)
61   File "/usr/lib/python3/dist-packages/requests/sessions.py", line 488, in request
62     resp = self.send(prep, **send_kwargs)
63   File "/usr/lib/python3/dist-packages/requests/sessions.py", line 609, in send
64     r = adapter.send(request, **kwargs)
65   File "/usr/lib/python3/dist-packages/requests/adapters.py", line 487, in send
66     raise ConnectionError(e, request=request)
67 requests.exceptions.ConnectionError: HTTPSConnectionPool(host=xxxxxx.cn, port=443): Max retries exceeded with url: /api/TmpApi (Caused by NewConnectionError(<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x75aa01b0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution,))

根據錯誤提示

Max retries exceeded with url: /api/TmpApi (Caused by NewConnectionError(‘<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x75aa01b0>: 
Failed to establish a new connection: [Errno -3] Temporary failure in name resolution

在網上找到以下幾個點:

1. requests 模塊太老,須升級:

pip install --upgrade requests

2. 連接數太多,沒有釋放:

解決辦法:

1、增加重試連接次數

  requests.adapters.DEFAULT_RETRIES = 5

2、關閉多余的連接

requests使用了urllib3庫,默認的http connection是keep-alive的,requests設置False關閉。

操作方法

s = requests.session()
  s.keep_alive = False

3. 加代理服務器:

http://obroll.com/max-retries-exceeded-for-url-in-requests-module-python-solved/ 
A: 
Python代碼 
proxy = {‘http‘: ‘33.33.33.10:8118‘}  
result = requests.get(url, proxies=proxy)  

B: 
Java代碼
proxy = ‘33.33.33.11:8118‘  
result = requests.get(url, proxies={‘http‘: proxy})  

分析:

因為是自建的網站,所以排除封鎖IP的可能,所以代理服務器方法不用嘗試。

嘗試方法1和2,看後續效果。

樹莓派上傳數據錯誤一例