前几天公司接受到了一份来自阿里飞天园区,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/