阿里云物聯網平臺體驗(樹莓派+Python篇)
雖然對阿里云物聯網平臺比較熟悉了,從一開始就有幸參與了飛鳳平臺(Link Develop?一站式開發平臺的前身)的一些偏硬件接入的工作。但是同時也見證了阿里云物聯網團隊從幾十人到數百人的迅速擴張,其物聯網平臺所承載的內容也急速膨脹,物聯網開發套件基礎版、飛鳳、Link Develop一站式開發平臺、物聯網開發平臺高級版、飛燕、飛象、城市大腦、農業大腦和工業互聯平臺不一而足……,很難有精力真正熟悉和了解阿里云的每一款物聯網產品。
這次有幸成為物聯網平臺的阿里云MVP體驗官,可以從另外一個角度來體驗阿里云物聯網平臺了。最早我們都是基于MCU單片+.NET MF平臺,直接采用MQTT協議實現相關的代碼對接阿里云平臺,雖然也可以基于組態配置很靈活地接入物聯網平臺,但是對一些WEB、AI和云端開發的人來說還是有些陌生。正是因為這些需求,JS,Java,Python這些高級語言已經走入了硬件開發,可以直接在MCU芯片上運行,大大提速了物聯網云和端的連接工作。
本篇文章就是采用高級語言Python基于樹莓派進行物聯網云端對接的(后續篇幅會介紹nodejs的云端對接)。
下面是阿里云團隊快遞過來的相關測試硬件:
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燈模塊,通過云端下達的指令,控制燈亮和燈滅。
樹莓派的管腳定義圖如下:
DHT11模塊共3根線,屬于單總線通信,電源線我們接入5V-4pin,地線我們接入GND-6pin,通信pin我們接入GPIO16-36pin。LED模塊也是3根線,我們電源線接入3V3-1pin,地線接入GND-9pin,控制線接入GPIO4-7pin。
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)。

?
由于代碼比較多,所以我們封裝為一個函數,并且可以同時返回兩個值,一個是溫度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-表示開燈
這個定義好后,我們創建設備,并且獲取設備的三元組。由于官方提供的示例僅僅是模擬數據,并且是單向上傳,我們需要改造一下。
?
在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的值,我們開燈或者關燈。
?
相關代碼修改好后,我們就可以上傳到樹莓派設備,開始運行了,如下圖所示:
這個時候我們查看云端設備的狀態,會發現數據已經正常上傳到云端了。
我們在云端產品的在線調試面板進行數據下發測試
我們發送0或1,會發現LED滅或亮了。
以上,我們會發現通過我們所熟悉的Python語言,就可以輕松編寫物聯網代碼了。
電子發燒友App























評論