背景
前几天公司接受到了一份来自阿里飞天园区, IOT 部门的小礼物. 由于上司比较忙, 无暇去顾及.
当时尚未开封, 我好奇是什么, 于是就急忙忙的拆开, 发现是 Raspberry Pi 3(树莓派 3). 我觉得挺好玩的, 就接过来了, 于是上司就兴起, 就让我拿这个小玩意去验证阿里物联网平台上的相关组件. 于是, 就有了这个软件工程师树莓派实现室内温湿度坎坷之旅!
以下是开箱的东西:
树莓派 3(Raspberry Pi 3 Model B+)
树莓派 3 代 B + 板
树莓派 USB 电源适配器 5V@2.5A
创客社区控制器(DFROBOT)
数根树莓派排线
DHT11 模块(温湿度传感器)
LED 模块
装机
下载官网镜像
树莓派官网, 点击 Downloads, 在所列镜像的最上面,
其中 Raspbian 是 Raspberry Pi 所有型号的官方操作系统.
下面镜像有以下 2 种:
NOOBS: 适合初学者的简易操作系统安装程序
RASPBIAN: 官方支持 Raspberry Pi 操作系统 --- 基于 Debian
我选择点击下载第二种的系统. 点击完之后, 你会发现, RASPBIAN 有 2 种类型让你选择
带有操作界面, Raspbian 预装了大量用于教育, 编程和一般用途的软件. 它有 Python,Scratch,Sonic Pi,Java 等.
不带有操作界面的 LITE 版本
对于我这种初次接触树莓派的人, 我选择下载带有操作界面的 RASPBIAN 系统.
SD 卡格式化
目的: 把 SD 卡放到 TF 读卡器中, 插入你的电脑中, 把 SD 卡格式化为 FAT32 格式.
鼠标右键 SD 卡的盘符, 点击格式化. 在格式化窗口文件系统中选择 "[FAT32]", 然后选择在格式化选项中选择 "[快速格式化]", 开点开始, 等到完成即可.
安装 GParted, 右键 SD 卡的盘符, 右键格式化, 并选择 FAT32, 选择格式化即可.
镜像的烧写
你需要下载一个 Win32diskimager 程序, 然后把 SD 卡插入读卡器中, 将上面下载的镜像拷入 SD 卡, 完成之后, 把 SD 卡从读卡器取下来, 插入树莓派.
下载好了之后打开 zip 文件所在文件夹, 输入以下命令, 进行解压.
unzip 2018-10-09-raspbian-stretch.zip
替换上自己下好的 zip 文件名称 得到 2018-10-09-raspbian-stretch.img 文件, 此文件就是我们要的镜像.
得到镜像文件后, 我们要将此镜像文件写入事先准备的 TF 卡内. 将 TF 卡放入读卡器, 然后接入电脑. 使用
sudo fdisk -l
命令查看此设备的名称, 在我的电脑上是 / dev/sdb.
知道读卡器的设备路径后, 我们用 dd 命令来将镜像文件写入到 TF 卡内. 命令如下:
sudo dd if=2018-10-09-raspbian-stretch.img of=/dev/sdc bs=2M
其中 if = 后面的是镜像文件名; of = 后面是读卡器的设备路径. 回车, 执行命令等它执行完毕.
刻录过程是需要一段时间的, 刻录完成了之后终端是会有显示的.
镜像刻录完成之后把 tf 卡放入卡槽内, 把电源线插入后会看到小红灯旁边的小绿灯会闪烁, 没有插卡的时候只会亮红灯, 表示电源接通. 绿灯闪烁表示镜像烧写是正确的, 树莓派已经成功的打开. 现在可以接上显示屏和键盘.
如下图所看到的样子
树莓派与温湿度采集模块连接
树莓派 3b 引脚图
先贴一张树莓派 3b 的引脚图:
在连线的时候注意编码方式, 注意树莓派引脚图的方向, 如上图所示.
DHT11
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 口
Python 获取室内温湿度
安装 Python3
首先测试一下树莓派 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 即可.
编写 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()
展示结果
为了测试结果是否准确, 我把手指放到传感器上, 测试的数据为:
测试无误~~~.
MQTT 发布消息到代理服务器
安装 paho-mqtt
使用 pip 工具安装 paho-mqtt, 输入以下指令即可:
sudo pip install paho-mqtt
Python 发布消息 Demo
- 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 实现高性能 IOT 服务器 (Groza) 之手撕 MQTT 协议篇上
Netty 实现高性能 IOT 服务器 (Groza) 之精尽代码篇中
其他
关于 IOT 市场与技术模拟详解到这里就结束了.
原创不易, 如果感觉不错, 希望给个推荐! 您的支持是我写作的最大动力!
下文会大家逐步用 Netty 实现 MQTT 协议的 IOT 服务器.
来源: https://www.cnblogs.com/sanshengshui/p/9942963.html