雲中樹莓派(2):將感測器資料上傳到 AWS IoT 並利用Kibana進行展示
1. 感測器安裝及配置
1.1 DHT22 安裝
DHT22 是一款溫度與溼度感測器,它有3個針腳,左邊的第一個引腳(#1)為3-5V電源,第二個引腳(#2)連線到資料輸入引腳,最右邊的引腳(#4)接地。
而樹莓派3B 一共有40個針腳(GPIO,General Purpose I/O Ports,通用輸入/輸出埠),只需要將感測器的3個引腳接入板子上的合適引腳即可。我的連線是 1 - 01,2 - 07, 4 - 09。注意 DHT22的資料引腳連線的GPIO編號為 07名稱為 GPIO04。下面的程式碼中會用到。
1.2 簡單測試
安裝程式碼庫:
git clonehttps://github.com/adafruit/Adafruit_Python_DHT.gitcd Adafruit_Python_DHT sudo apt-get update sudo apt-get install build-essential python-dev sudo python setup.py install
簡單的python測試程式碼:
import Adafruit_DHT as dht import time while True: time.sleep(2.5) h,t = dht.read_retry(dht.DHT22, 4) #這裡的 4 就指的是 GPIO04 print 'Temp = %.1f"C, Humidity = %.1f%%RH' % (t, h)
測試結果:
2. AWS IoT 實現
要實現的效果如下:
2.1 AWS IoT 配置
(1)建立 thing
(2)建立 thing 的證書,並下載
(3)建立 policy
policy 負責授權,上面的配置表示對所有資源都允許所有 aws iot 操作。
(4)將 policy 附加給第二步中建立的證書,將 thing 也附加給證書。
(5)建立一個 AWS ElasticSearch domain
(6)建立一條 rule,將樹莓派傳上來的資料匯入 ElasticSearch
操作的具體配置:
幾個配置項:
- ID:ES 中每個文件的_id,這裡使用自動生成的uuid
- 索引:儲存樹莓派文件的索引,取名為 homepi,它是一個邏輯名稱空間
- 型別:索引下面的一個 type,表示對應樹莓派的資料
2.2 樹莓派中的配置
(1)安裝 AWS IoT device python SDK
git clone https://github.com/aws/aws-iot-device-sdk-python cd aws-iot-device-sdk-python/ python setup.py install
(2)將 2.1 中下載到的四個證書上傳到樹莓派中
[email protected]:/home/pi/awsiot# ls -lt total 16 -rw-r--r-- 1 pi pi 1758 Aug 6 10:26 VeriSign-Class3-Public-Primary-Certification-Authority-G5.pem -rw-r--r-- 1 pi pi 1220 Aug 6 09:46 aec2731afd-certificate.pem.crt -rw-r--r-- 1 pi pi 1679 Aug 6 09:46 aec2731afd-private.pem.key -rw-r--r-- 1 pi pi 451 Aug 6 09:46 aec2731afd-public.pem.key
(3)編寫程式碼
import RPi.GPIO as GPIO import Adafruit_DHT as dht from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient from time import sleep from datetime import date, datetime # initialize GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.cleanup() # AWS IoT certificate based connection myMQTTClient = AWSIoTMQTTClient("123afhlss411") myMQTTClient.configureEndpoint("*************.iot.ap-southeast-1.amazonaws.com", 8883) myMQTTClient.configureCredentials("/home/pi/awsiot/VeriSign-Class3-Public-Primary-Certification-Authority-G5.pem", "/home/pi/awsiot/aec2731afd-private.pem.key", "/home/pi/awsiot/aec2731afd-certificate.pem.crt") myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec myMQTTClient.configureMQTTOperationTimeout(5) # 5 sec #connect and publish myMQTTClient.connect() myMQTTClient.publish("homepi/dht22", "connected", 0) #loop and publish sensor reading while 1: now = datetime.utcnow() now_str = now.strftime('%Y-%m-%dT%H:%M:%SZ') #e.g. 2016-04-18T06:12:25.877Z h,t = dht.read_retry(dht.DHT22, 4) #07 引腳的名稱是 GPIO04 print 'Temp = %.1f"C, Humidity = %.1f%%RH' % (t, h) payload = '{ "timestamp": "' + now_str + '","temperature": ' + "{:.2f}".format(t)+ ',"humidity": '+ "{:.2f}".format(h) + ' }' print payload myMQTTClient.publish("homepi/dht22", payload, 0) sleep(10)
程式碼很簡單,稍微解釋一下:
- 利用 AWS IoT device sdk 建立和 AWS IoT Core 的 MQTT 連線
- 利用 DHT22 sdk 每隔10秒從感測器獲取溫度和溼度資料
- 利用 AWS IoT device sdk 將資料發到 MQTT topic
(4)執行程式碼,在 AWS IoT 中進行測試,能夠收到傳上來的樹莓派感測器資料
(5)在 ElasticSearch 中也能看到資料統計
2.3 配置 Kibana
AWS ElasticSearch 預設內建了一個 Kibana,可以在 ES 的介面上看到其連結。開啟該連結,然後做以下配置:
(1)配置 index pattern
配置的目的是讓 Kibana 定位到 ES 中的某個或者某幾個 index。這裡就是用 homepi 這個index。
(2)配置 Virsualize,然後就可以看到圖了
話說最近家裡氣溫一直都在30度以上,本來以為晚上會低點的。溼度倒是有一些變化。
3. 一點感受
- github 是個好地方,大家分享的東西避免了大量重複造輪子的勞動
- AWS free tier 是個好東西,做一些PoC測試基本上不用花錢,但是要注意得看清楚免費提供的資源的內容,否則錢不小心就花出去了,另外就是定期看看賬單
- AWS 文件實在太豐富了,一個檔案動輒兩三百頁
- AWS IoT 平臺應該歸類為 應用支援平臺AEP(Application Enablement Platform),提供了裝置接入(MQTT)、與AWS服務對接、資料分析、安全等內容。
- AWS ElasticSearch 功能感覺還不是太全面,介面上能做的事情不多,許可權管理有些複雜
- 動手做,做了之後再分享,是一件蠻有意思的事情
參考連結:
歡迎大家關注我的個人公眾號: