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


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


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


這次有幸成爲物聯網平臺的阿里雲MVP體驗官,可以從另外一個角度來體驗阿里雲物聯網平臺了。最早我們都是基於MCU單片+.NET MF平臺,直接採用MQTT協議實現相關的代碼對接阿里雲平臺,雖然也可以基於組態配置很靈活地接入物聯網平臺,但是對一些WEBAI和雲端開發的人來說還是有些陌生。正是因爲這些需求,JSJavaPython這些高級語言已經走入了硬件開發,可以直接在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-36pinLED模塊也是3根線,我們電源線接入3V3-1pin,地線接入GND-9pin,控制線接入GPIO4-7pin



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


led_pin = 4                       //GPIO4


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


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


 


點亮燈:




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


 


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



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



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



我們發送01,會發現LED滅或亮了。


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


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


 


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章