阿里云物联网平台体验(树莓派+Python篇)
阿里云物聯(lián)網(wǎng)平臺(tái)體驗(yàn)(樹(shù)莓派+Python篇)
雖然對(duì)阿里云物聯(lián)網(wǎng)平臺(tái)比較熟悉了,從一開(kāi)始就有幸參與了飛鳳平臺(tái)(Link Develop 一站式開(kāi)發(fā)平臺(tái)的前身)的一些偏硬件接入的工作。但是同時(shí)也見(jiàn)證了阿里云物聯(lián)網(wǎng)團(tuán)隊(duì)從幾十人到數(shù)百人的迅速擴(kuò)張,其物聯(lián)網(wǎng)平臺(tái)所承載的內(nèi)容也急速膨脹,物聯(lián)網(wǎng)開(kāi)發(fā)套件基礎(chǔ)版、飛鳳、Link Develop一站式開(kāi)發(fā)平臺(tái)、物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái)高級(jí)版、飛燕、飛象、城市大腦、農(nóng)業(yè)大腦和工業(yè)互聯(lián)平臺(tái)不一而足……,很難有精力真正熟悉和了解阿里云的每一款物聯(lián)網(wǎng)產(chǎn)品。
這次有幸成為物聯(lián)網(wǎng)平臺(tái)的阿里云MVP體驗(yàn)官,可以從另外一個(gè)角度來(lái)體驗(yàn)阿里云物聯(lián)網(wǎng)平臺(tái)了。最早我們都是基于MCU單片+.NET MF平臺(tái),直接采用MQTT協(xié)議實(shí)現(xiàn)相關(guān)的代碼對(duì)接阿里云平臺(tái),雖然也可以基于組態(tài)配置很靈活地接入物聯(lián)網(wǎng)平臺(tái),但是對(duì)一些WEB、AI和云端開(kāi)發(fā)的人來(lái)說(shuō)還是有些陌生。正是因?yàn)檫@些需求,JS,Java,Python這些高級(jí)語(yǔ)言已經(jīng)走入了硬件開(kāi)發(fā),可以直接在MCU芯片上運(yùn)行,大大提速了物聯(lián)網(wǎng)云和端的連接工作。
本篇文章就是采用高級(jí)語(yǔ)言Python基于樹(shù)莓派進(jìn)行物聯(lián)網(wǎng)云端對(duì)接的(后續(xù)篇幅會(huì)介紹nodejs的云端對(duì)接)。
下面是阿里云團(tuán)隊(duì)快遞過(guò)來(lái)的相關(guān)測(cè)試硬件:
1、 樹(shù)莓派3B+ 自帶wifi和藍(lán)牙
2、 DHT11溫濕度模塊
3、 LED燈模塊
第一步:我們需要為樹(shù)莓派安裝操作系統(tǒng)
我們安裝的是Raspbian固件,可以按如下鏈接介紹的步驟進(jìn)行安裝:https://www.yuque.com/cloud-d...
第二步:安裝阿里云平臺(tái)的Python SDK
執(zhí)行如下指令:$ pip install aliyun-python-sdk-iot-client
第三步:代碼編寫
在阿里云平臺(tái)的說(shuō)明文檔:https://www.yuque.com/cloud-d... 中已經(jīng)提供了一個(gè)示例代碼,不過(guò)功能相對(duì)簡(jiǎn)單,就是把兩個(gè)隨機(jī)數(shù)送到云端。
我們?cè)O(shè)計(jì)一個(gè)相對(duì)復(fù)雜的場(chǎng)景,我們首先要實(shí)現(xiàn)雙向通信,不僅僅把傳感器數(shù)據(jù)送到云端,我們還要讓云端下發(fā)一個(gè)指令,控制相關(guān)的設(shè)備。
上傳數(shù)據(jù)我們選擇一個(gè)真實(shí)的傳感器 DHT11,可以獲取溫度和濕度值。另外還有一個(gè)LED燈模塊,通過(guò)云端下達(dá)的指令,控制燈亮和燈滅。
樹(shù)莓派的管腳定義圖如下:
DHT11模塊共3根線,屬于單總線通信,電源線我們接入5V-4pin,地線我們接入GND-6pin,通信pin我們接入GPIO16-36pin。LED模塊也是3根線,我們電源線接入3V3-1pin,地線接入GND-9pin,控制線接入GPIO4-7pin。
LED的控制相對(duì)容易,就是控制管腳的高低電平即可。
led_pin = 4 //GPIO為4
GPIO.setmode(GPIO.BCM) //BCM的GPIO定義
GPIO.setup(led_pin, GPIO.OUT) //設(shè)置為輸出模式
點(diǎn)亮燈:
GPIO.output(led_pin, GPIO.HIGH)
GPIO.output(led_pin, GPIO.LOW)
DHT11相對(duì)比較復(fù)雜,我2010年曾經(jīng)寫過(guò)一篇博文,想了解比較深入的可以參考一下(相關(guān)鏈接:https://blog.csdn.net/yfiot/a...)。
由于代碼比較多,所以我們封裝為一個(gè)函數(shù),并且可以同時(shí)返回兩個(gè)值,一個(gè)是溫度T,一個(gè)是濕度H。
網(wǎng)上大部分Python的實(shí)例都是讀一次溫濕度的,如果要連續(xù)讀,必須間隔3秒左右,否則很容易失敗。由于linux不是實(shí)時(shí)系統(tǒng),我們發(fā)現(xiàn)即使間隔3秒,無(wú)法正確獲取溫濕度值的現(xiàn)象也時(shí)有發(fā)生,并且有時(shí)候居然也有通過(guò)校驗(yàn)的錯(cuò)誤值出現(xiàn)。
DHT11的數(shù)據(jù)Pin接入的是 GPIO16,所以我們定義pin的代碼如下:
dht_pin =16
封裝函數(shù)的代碼如下:
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:continuewhile GPIO.input(dht_pin) == GPIO.HIGH:continuewhile j < 40:k = 0while GPIO.input(dht_pin) == GPIO.LOW:continuewhile GPIO.input(dht_pin) == GPIO.HIGH:k += 1if k > 100:breakif k < 8:data.append(0)else:data.append(1) j += 1humidity_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 = 0humidity_point = 0temperature = 0temperature_point = 0check = 0for 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_pointif check == tmp:return temperature,humidityelse:print "wrong"return 0,0這些準(zhǔn)備工作做好后,我們要在云端定義相關(guān)產(chǎn)品和設(shè)備了。和阿里云官方示例不一樣的是,我們額外增加了一個(gè)屬性LED,具備讀寫能力,枚舉型變量,0-表示關(guān)燈,1-表示開(kāi)燈
這個(gè)定義好后,我們創(chuàng)建設(shè)備,并且獲取設(shè)備的三元組。由于官方提供的示例僅僅是模擬數(shù)據(jù),并且是單向上傳,我們需要改造一下。
在main函數(shù)里,增加這句代碼:
client.on_message = on_message
表示我們可以獲取云端推送的信息。
我們?cè)贫送扑偷男畔?nèi)容如下:
{"method":"thing.service.property.set","id":"169885527","params":{"LED":1},"version":"1.0.0"}
我們需要獲取LED的值,所以on_message函數(shù)我們要增加一些內(nèi)容:
setjson = json.loads(msg.payload)
led = setjson['params']['LED']GPIO.output(led_pin,(GPIO.HIGH if led==1 else GPIO.LOW ))
根據(jù)led的值,我們開(kāi)燈或者關(guān)燈。
相關(guān)代碼修改好后,我們就可以上傳到樹(shù)莓派設(shè)備,開(kāi)始運(yùn)行了,如下圖所示:
這個(gè)時(shí)候我們查看云端設(shè)備的狀態(tài),會(huì)發(fā)現(xiàn)數(shù)據(jù)已經(jīng)正常上傳到云端了。
我們?cè)谠贫水a(chǎn)品的在線調(diào)試面板進(jìn)行數(shù)據(jù)下發(fā)測(cè)試
我們發(fā)送0或1,會(huì)發(fā)現(xiàn)LED滅或亮了。
以上,我們會(huì)發(fā)現(xiàn)通過(guò)我們所熟悉的Python語(yǔ)言,就可以輕松編寫物聯(lián)網(wǎng)代碼了。
總結(jié)
以上是生活随笔為你收集整理的阿里云物联网平台体验(树莓派+Python篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ubuntu终端命令行不显示颜色
- 下一篇: Android Studio 使用笔记: