1. 程式人生 > >阿里雲物聯網平臺體驗(樹莓派+Python篇)!

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

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

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

這次有幸成為物聯網平臺的阿里雲 MVP 體驗官,可以從另外一個角度來體驗阿里雲物聯網平臺了。最早我們都是基於 MCU 單片 +.NET MF 平臺,直接採用 MQTT 協議實現相關的程式碼對接阿里雲平臺,雖然也可以基於組態配置很靈活地接入物聯網平臺,但是對一些 WEB 、 AI 和雲端開發的人來說還是有些陌生。正是因為這些需求, JS , Java , Python 這些高階語言已經走入了硬體開發,可以直接在 MCU 晶片上執行,大大提速了物聯網雲和端的連線工作。

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

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

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

 

1、 樹莓派 3B+ 自帶 wifi 和藍芽

2、 DHT11 溫溼度模組

3、 LED 燈模組

第一步:我們需要為樹莓派安裝作業系統

我們安裝的是 Raspbian 韌體,可以按如下連結介紹的步驟進行安裝:https://www.yuque.com/cloud-dev/iot-tech/ig269q

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

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

第三步:程式碼編寫

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

我們設計一個相對複雜的場景,我們首先要實現雙向通訊,不僅僅把感測器資料送到雲端,我們還要讓雲端下發一個指令,控制相關的裝置。

上傳資料我們選擇一個真實的感測器 DHT11 ,可以獲取溫度和溼度值。另外還有一個 LED 燈模組,通過雲端下達的指令,控制燈亮和燈滅。

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

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

 

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

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

 

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 )。

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

 

由於程式碼比較多,所以我們封裝為一個函式,並且可以同時返回兩個值,一個是溫度 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- 表示開燈

進群“960410445 ”即可獲取數十套PDF以及大量的學習原始碼!

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

 

這個定義好後,我們建立裝置,並且獲取裝置的三元組。由於官方提供的示例僅僅是模擬資料,並且是單向上傳,我們需要改造一下。

在 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 的值,我們開燈或者關燈。

相關程式碼修改好後,我們就可以上傳到樹莓派裝置,開始運行了,如下圖所示:

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

 

這個時候我們檢視雲端裝置的狀態,會發現資料已經正常上傳到雲端了。

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

 

我們在雲端產品的線上除錯面板進行資料下發測試

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

 

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

以上,我們會發現通過我們所熟悉的 Python 語言,就可以輕鬆編寫物聯網程式碼了。