立即注册

扫一扫,访问微社区

micropython-microbit 中文社区

查看: 460|回复: 1

“大周”的物联网 DIY-- 家庭温湿度监控 (二)

[复制链接]

该用户从未签到

发表于 2019-3-18 16:01:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 大周 于 2019-3-18 15:59 编辑

原文地址:https://www.kgkzone.com/20190315/cid=66.html
书接上回,今天来说下监控的软件部分。
4. 软件篇
软件开发主要涉及到两部分,一个是 TYPBOARD 主板的开发,另外一部分为 APP_server 应用服务器的开发。
本监控所有涉及到的开发软件如下
code0.jpg
花开两头,各表一支。我们从传感器开发说起。
4.1 TYPBOARD 主板的开发
主板中的应用结构如下图

                               
登录/注册后可看大图
图中的 boot.py 和 main.py 为系统要求的文件, 不可改名。
该程序的功能就是读取 DHT11 传感器的气温湿度数据,然后通过 wifi 网络,使用 MQTT 协议向 MQTT BROKER 发布相关数据。
主板程序请从我的 GitHub 下载
(1)boot.py 为启动文件
microPython 使用该文件确定启动方式,类似于系统引导文件。在这里我们把 wifi 的连接写在 boot.py 文件里,主板通电后,能立即连接网络。
这里我们通过配置文件读取 wifi 名和密码,如果 wifi 连接失败,会提示手动添加 wifi 名和密码(该功能主要是调试时用)
下面为 boot.py 中 wifi 连接核心代码:
code1.jpg
(2)main.py 为主程序文件
micropython 启动时,会先运行 boot.py,然后紧接着运行 main.py,主要代码都需要写在 main.py 这个文件里。
main.py 通过无限循环的方式定时读取传感器数据,并把数据打包成 json 格式。
main.py 里的核心代码如下:
code2.jpg
(3)mqtt.py 文件
mqtt.py 文件主要负责和 MQTT 服务器通讯, 并发送数据。
c_mqtt.publish('weather',j_d) 这里的 weather 为 MQTT 中 “PUBLISH” 中自定义的 topic 名字,我们可以按照需要自行修改。如要订阅该 topic 的数据,服务器端的 “SUBSCRIBE” 只使用相同的 topic 名字就可以了。
下面为 mqtt.py 的核心代码:
code3.jpg
(4)wifi_config.json 配文件
该文件为连接 wifi 的配置文件,以 json 格式保存数据。
essid 保存 wifi 名,password 保存 wifi 密码。
  1. {
  2.     "essid": "xxxx",
  3.     "password": "xxx"
  4. }
复制代码
(5)lib 文件夹
micropython 中这个 lib 是必须存在的,
lib 这个文件夹里存放的是程序使用的相关类。
4.2 API_Server 端开发
由于 API_Server 端代码,暂时只是演示代码。并未完善日志,错误判断等功能。
API_Server 主要作用为订阅 MQTT BORKER 的数据。并把数据转化为相应的 json 格式后保存在本地 MySQL 数据库。
应用结构如下图:

                               
登录/注册后可看大图
(1)iothub.py 为主程序
iothub.py 为 API_Server 端的主程序,通过运行该文件,启动程序。
iothub.py 主要负责启动多进程,并订阅 MQTT BORKER 推行的相关 topic。
mqtt_client 为自定义函数,主要负责连接处理与 MQTT BROKER 的通讯,并处理相关业务逻辑。
该函数有四个参数,
web_url:MQTT BROKER 的 ip 地址或是 url,需按实际修改
port_num:MQTT BROKER 的端口,需按实际修改
uesrname: MQTT BROKER 的用户名,需按实际修改
password:MQTT BROKER 的密码,需按实际修改
data_process:为一个自定义的回调函数,用于数据本地化存储。
code4.jpg

(2)LOGIC.py
该文件包含了 Python 的 paho 模块用于处理业务逻辑的回调函数,本项目里主要是把接受到的 json 数据转化为相对应的 sql 语句,并插入数据库。
下面的代码中需要注意的是 inst_mysql=db_mysql('dbusername','dbpassword','dbip','dbname') ,该函数用于连接数据库,其中四个参数分别是:
dbusername: 数据库用户名,需按实际修改
dbpassword: 数据库密码,需按实际修改
dbip:数据库 IP 地址,需按实际修改
dbname: 数据库名字,需按实际修改
code5.jpg


(3)DATAOP.py
该文件存放 json 转化为 sql 的逻辑代码。
code6.jpg

(4)DATABASE.py
所有的外部连接代码存放在该文件里,这里包含了数据库连接,MQTT BROKER 的连接。
需要额外注意的是
client.subscribe([("weather",1),("test",1)]
这里的 weather 和 test 其实就是我们前面所指的 topic,我们可以按照实际情况修改。
后面的数字 “1” 为 MQTT 的 Qos(Quality of Service),完整的 Qos 如下:
0:MQTT BROKER 只发一次包,是否收到完全不管,适合那些不是很重要的数据。
1:当 client 没收到 service 的 puback 或者 service 没有收到 client 的 puback,那么就会一直发送 publisher
只一次。
2:对于 1 而言,2 可以实现仅仅接受一次 message。
code7.jpg

表面为数据库表结构的创建语句:
保存传感器的相关信息表
  1. create table sensor_info
  2. (
  3.     id              int  UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  4.     topic_name        varchar(100),
  5.     sensor_location                    varchar(100)
  6. )
复制代码
保存传感器数据表
  1. create table sensor_data
  2. (
  3.     id              int  UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  4.     topic_name        varchar(100),
  5.     data_value          varchar(100),
  6.     data_time                varchar(14),
  7.     received_time        varchar(14)
  8. )
复制代码
服务端代码请从我的 GitHub 下载
至此传感和服务器的应用程序已搭建完毕,
关于如何配置 grafana 和 Iot MQTT Plane 以后有机会再开贴了。
如有问题欢迎随时联系。



手机扫码浏览
回复

使用道具 举报

该用户从未签到

发表于 2019-3-30 14:07:16 | 显示全部楼层
厉害,我都是用现成的网上资源部署的
回复 支持 反对

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|小黑屋|micropython-microbit 中文社区

GMT+8, 2019-7-17 03:35 , Processed in 0.171567 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表