阿里雲物聯網平臺體驗(樹莓派+Python篇)

雖然對阿里雲物聯網平臺比較熟悉了,從一開始就有幸參與了飛鳳平臺(Link Develop 一站式開發平臺的前身)的一些偏硬件接入的工做。可是同時也見證了阿里雲物聯網團隊從幾十人到數百人的迅速擴張,其物聯網平臺所承載的內容也急速膨脹,物聯網開發套件基礎版、飛鳳、Link Develop一站式開發平臺、物聯網開發平臺高級版、飛燕、飛象、城市大腦、農業大腦和工業互聯平臺不一而足……,很難有精力真正熟悉和了解阿里雲的每一款物聯網產品。node

此次有幸成爲物聯網平臺的阿里雲MVP體驗官,能夠從另一個角度來體驗阿里雲物聯網平臺了。最先咱們都是基於MCU單片+.NET MF平臺,直接採用MQTT協議實現相關的代碼對接阿里雲平臺,雖然也能夠基於組態配置很靈活地接入物聯網平臺,可是對一些WEB、AI和雲端開發的人來講仍是有些陌生。正是由於這些需求,JS,Java,Python這些高級語言已經走入了硬件開發,能夠直接在MCU芯片上運行,大大提速了物聯網雲和端的鏈接工做。python

本篇文章就是採用高級語言Python基於樹莓派進行物聯網雲端對接的(後續篇幅會介紹nodejs的雲端對接)。linux

下面是阿里雲團隊快遞過來的相關測試硬件:ios

904625c55030b9923fc58bd846b7477b548c4731

一、 樹莓派3B+  自帶wifi和藍牙json

二、 DHT11溫溼度模塊app

三、 LED燈模塊函數

第一步:咱們須要爲樹莓派安裝操做系統測試

咱們安裝的是Raspbian固件,能夠按以下連接介紹的步驟進行安裝:https://www.yuque.com/cloud-dev/iot-tech/ig269q阿里雲

第二步:安裝阿里雲平臺的Python SDKspa

執行以下指令:$ pip install aliyun-python-sdk-iot-client

第三步:代碼編寫

在阿里雲平臺的說明文檔:https://www.yuque.com/cloud-dev/iot-tech/rz6fpl 中已經提供了一個示例代碼,不過功能相對簡單,就是把兩個隨機數送到雲端。

咱們設計一個相對複雜的場景,咱們首先要實現雙向通訊,不只僅把傳感器數據送到雲端,咱們還要讓雲端下發一個指令,控制相關的設備。

上傳數據咱們選擇一個真實的傳感器 DHT11,能夠獲取溫度和溼度值。另外還有一個LED燈模塊,經過雲端下達的指令,控制燈亮和燈滅。

樹莓派的管腳定義圖以下:

682de0e98d5333dee50d66c1f79e833a77a05224

DHT11模塊共3根線,屬於單總線通訊,電源線咱們接入5V-4pin,地線咱們接入GND-6pin,通訊pin咱們接入GPIO16-36pin。LED模塊也是3根線,咱們電源線接入3V3-1pin,地線接入GND-9pin,控制線接入GPIO4-7pin。

554c26e55946ca0354c108d90b8b5180bf86ec9e

LED的控制相對容易,就是控制管腳的高低電平便可。

led_pin = 4                       //GPIO爲4

GPIO.setmode(GPIO.BCM)            //BCM的GPIO定義

GPIO.setup(led_pin, GPIO.OUT)     //設置爲輸出模式

點亮燈:

 
GPIO.output(led_pin, GPIO.HIGH)

 

 
 
GPIO.output(led_pin, GPIO.LOW)

 

 

DHT11相對比較複雜,我2010年曾經寫過一篇博文,想了解比較深刻的能夠參考一下(相關連接:https://blog.csdn.net/yfiot/article/details/5996524)。

5e4f6e5acb209b7a38c1fe6b66cac8a3ceba0c5e

 

因爲代碼比較多,因此咱們封裝爲一個函數,而且能夠同時返回兩個值,一個是溫度T,一個是溼度H。

網上大部分Python的實例都是讀一次溫溼度的,若是要連續讀,必須間隔3秒左右,不然很容易失敗。因爲linux不是實時系統,咱們發現即便間隔3秒,沒法正確獲取溫溼度值的現象也時有發生,而且有時候竟然也有經過校驗的錯誤值出現。

DHT11的數據Pin接入的是 GPIO16,因此咱們定義pin的代碼以下:

dht_pin =16

封裝函數的代碼以下:

def GetDTH(): data = [] j = 0 GPIO.setup(dht_pin, GPIO.OUT) GPIO.output(dht_pin, GPIO.LOW) time.sleep(0.02) GPIO.output(dht_pin, GPIO.HIGH) GPIO.setup(dht_pin, GPIO.IN) while GPIO.input(dht_pin) == GPIO.LOW: continue while GPIO.input(dht_pin) == GPIO.HIGH: continue while j < 40: k = 0 while GPIO.input(dht_pin) == GPIO.LOW: continue while GPIO.input(dht_pin) == GPIO.HIGH: k += 1 if k > 100: break if k < 8: data.append(0) else: data.append(1) j += 1 humidity_bit = data[0:8] humidity_point_bit = data[8:16] temperature_bit = data[16:24] temperature_point_bit = data[24:32] check_bit = data[32:40] humidity = 0 humidity_point = 0 temperature = 0 temperature_point = 0 check = 0 for i in range(8): humidity += humidity_bit[i] * 2 ** (7-i) humidity_point += humidity_point_bit[i] * 2 ** (7-i) temperature += temperature_bit[i] * 2 ** (7-i) temperature_point += temperature_point_bit[i] * 2 ** (7-i) check += check_bit[i] * 2 ** (7-i) tmp = humidity + humidity_point + temperature + temperature_point if check == tmp: return temperature,humidity else: print "wrong" return 0,0

這些準備工做作好後,咱們要在雲端定義相關產品和設備了。和阿里雲官方示例不同的是,咱們額外增長了一個屬性LED,具有讀寫能力,枚舉型變量,0-表示關燈,1-表示開燈

9ff0273b9f4e6dbe2f869286c5ec28ecbb0cc389

這個定義好後,咱們建立設備,而且獲取設備的三元組。因爲官方提供的示例僅僅是模擬數據,而且是單向上傳,咱們須要改造一下。

在main函數裏,增長這句代碼:

client.on_message = on_message

表示咱們能夠獲取雲端推送的信息。

咱們雲端推送的信息內容以下:

{"method":"thing.service.property.set","id":"169885527","params":{"LED":1},"version":"1.0.0"}

咱們須要獲取LED的值,因此on_message函數咱們要增長一些內容:

setjson = json.loads(msg.payload) led = setjson['params']['LED'] GPIO.output(led_pin,(GPIO.HIGH if led==1 else GPIO.LOW ))

根據led的值,咱們開燈或者關燈。

相關代碼修改好後,咱們就能夠上傳到樹莓派設備,開始運行了,以下圖所示:

8e18c40abc796a30175a382b4fe48cb6aa3afebc

這個時候咱們查看雲端設備的狀態,會發現數據已經正常上傳到雲端了。

2b6143dc908d627c10ee5b94421e1577205c344b

咱們在雲端產品的在線調試面板進行數據下發測試

3b97d1f9bc4a7702a653908b7612a3ff8710b33a

咱們發送0或1,會發現LED滅或亮了。

以上,咱們會發現經過咱們所熟悉的Python語言,就能夠輕鬆編寫物聯網代碼了。

本文相關的代碼文件:alios_ht_all.py

 

做者:劉洪峯iot
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索