前幾天公司接受到了一份來自阿里飛天園區,IOT部門的小禮物。因爲上司比較忙,無暇去顧及。html
當時還沒有開封,我好奇是什麼,因而就急忙忙的拆開,發現是Raspberry Pi 3(樹莓派3)。我以爲挺好玩的,就接過來了,因而上司就興起,就讓我拿這個小玩意去驗證阿里物聯網平臺上的相關組件。因而,就有了這個軟件工程師樹莓派實現室內溫溼度坎坷之旅!python
如下是開箱的東西:git
樹莓派官網,點擊Downloads,在所列鏡像的最上面,github
其中Raspbian是Raspberry Pi全部型號的官方操做系統。編程
下面鏡像有如下2種:json
我選擇點擊下載第二種的系統。點擊完以後,你會發現,RASPBIAN有2種類型讓你選擇bash
對於我這種初次接觸樹莓派的人,我選擇下載帶有操做界面的RASPBIAN系統。服務器
目的: 把SD卡放到TF讀卡器中,插入你的電腦中,把SD卡格式化爲FAT32格式。session
:checkered_flag: 鼠標右鍵SD卡的盤符,點擊格式化。在格式化窗口文件系統中選擇「[FAT32]」,而後選擇在格式化選項中選擇「[快速格式化]」,開點開始,等到完成便可。app
:penguin: 安裝GParted,右鍵SD卡的盤符,右鍵格式化,並選擇FAT32,選擇格式化便可。
:checkered_flag: 你須要下載一個Win32diskimager程序,而後把SD卡插入讀卡器中,將上面下載的鏡像拷入SD卡,完成以後,把SD卡從讀卡器取下來,插入樹莓派。
:penguin:
unzip 2018-10-09-raspbian-stretch.zip
複製代碼
替換上本身下好的zip文件名稱 獲得2018-10-09-raspbian-stretch.img文件,此文件就是咱們要的鏡像。
sudo fdisk -l
複製代碼
命令查看此設備的名稱,在個人電腦上是/dev/sdb。
sudo dd if=2018-10-09-raspbian-stretch.img of=/dev/sdc bs=2M
複製代碼
其中if=後面的是鏡像文件名;of=後面是讀卡器的設備路徑。回車,執行命令等它執行完畢。
刻錄過程是須要一段時間的,刻錄完成了以後終端是會有顯示的。
鏡像刻錄完成以後把tf卡放入卡槽內,把電源線插入後會看到小紅燈旁邊的小綠燈會閃爍,沒有插卡的時候只會亮紅燈,表示電源接通。綠燈閃爍表示鏡像燒寫是正確的,樹莓派已經成功的打開。如今能夠接上顯示屏和鍵盤。
以下圖所看到的樣子
先貼一張樹莓派3b的引腳圖:
在連線的時候注意編碼方式,注意樹莓派引腳圖的方向,如上圖所示。
DHT11是一款有已校準數字信號輸出的溫溼度傳感器。 其精度溼度+-5%RH, 溫度+-2℃,量程溼度20-90%RH, 溫度0~50℃。分爲3個接口,分別爲:VCC
, DATA
, GND
。
引腳號 | 名稱 | 類型 | 說明 |
---|---|---|---|
1 | VCC | 電源 | +級,輸入3V-5.5V |
2 | DATA | 數據輸出 | 輸出引腳 |
3 | GND | 接地 | 接地引腳 |
我用的是三個頭的dht11傳感器,所以連線方式是:
VCC(或正極) --- 樹莓派的3v電源
GND (地線或者負極)--- 樹莓派的gnd接口
DATA (D或者out) ---樹莓派的GPIO引腳
1.VCC
接上3V
,能夠選擇1
口或者17
口
2.DATA
接上GPIO
口,我選的是GPIO4
,第7
口
3.GND
接上接地口
,我選的是第14
口
首先測試一下樹莓派3安裝的python版本。
sudo apt-get install python3
複製代碼
由於Ubuntu不少底層採用的是Python2.*,Python3和Python2是互相不兼容的,因此此時不能卸載Python2,須要將默認Python的指向Python3。
首先,刪除usr/bin/目錄下的默認python link文件。
sudo rm -rf /usr/bin/python
複製代碼
而後打開終端輸入以下命令行,創建新的鏈接關係
sudo ln -s /usr/bin/python3.5 /usr/bim/python
複製代碼
而後測試一下python版本是否正確,命令行輸入python便可。
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
channel =4
data = []
j = 0
GPIO.setmode(GPIO.BCM)
time.sleep(1)
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)
time.sleep(0.02)
GPIO.output(channel, GPIO.HIGH)
GPIO.setup(channel, GPIO.IN)
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print("sensor is working.")
print(data)
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:
print("temperature :", temperature, "*C, humidity :", humidity, "%")
else:
print("wrong")
print("temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp)
GPIO.cleanup()
複製代碼
爲了測試結果是否準確,我把手指放到傳感器上,測試的數據爲:
測試無誤~~~.
使用pip工具安裝paho-mqtt,輸入如下指令便可:
sudo pip install paho-mqtt
複製代碼
import paho.mqtt.client as mqtt
import time
import json
#當代理響應鏈接請求時調用。
#rc的值決定了鏈接成功或者不成功
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
#當收到關於客戶訂閱的主題的消息時調用
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
client = mqtt.Client()
#客戶端初始化,設置客戶端id等信息
client.reinitialise(client_id="test01",clean_session=True,userdata=None)
#客戶端設置用戶名,密碼信息
client.username_pw_set(username="123456",password="2236FDE7A9744017E25C95B333E5D546AF354F74463EF6FDABA09AC20C19306979DA982C9659877D4896336A7E3484F12B1BAFF773B8343A2AA75CC9EC8B51B2")
client.on_connect = on_connect
client.on_message = on_message
#組裝json數據
s = {'name':'mushuwei','age':24}
jo = json.dumps(s)
try:
#connect()函數將客戶端鏈接到代理。 這是一個阻塞函數。
client.connect("127.0.0.1", 1883, 600)
while True:
#從客戶端發送消息給代理。 publish(topic, payload=None, qos=0, retain=False)
client.publish('test', payload=jo, qos=0)
time.sleep(1)
client.loop_forever(timeout=1.0,max_packets=1,retry_first_connection=False)
except KeyboardInterrupt:
client.disconnect()
複製代碼
將上面獲取到的溫溼度數據放在一個函數裏,組裝成json數據,放到負載裏,發佈消息給代理。便可!
訂閱test主題的客戶端數據展現以下:
至於MQTT代理服務器代碼的編寫,能夠參考我以前寫的文章:
關於IOT市場與技術模擬詳解到這裏就結束了。
原創不易,若是感受不錯,但願給個推薦!您的支持是我寫做的最大動力!
下文會你們逐步用Netty實現MQTT協議的IOT服務器。
版權聲明:
做者:穆書偉
博客園出處:www.cnblogs.com/sanshengshu…
github出處:github.com/sanshengshu…
我的博客出處:sanshengshui.github.io/