【导语】扔掉小瓶盖,腾讯云带你体验在线甲醛监测系统!本文详述腾讯云多产品组合设计和体验报告之 “树莓派 腾讯云=在线甲醛监测系统”。涉及腾讯云产品:API网关、无服务器云函数、云数据库、腾讯云图。
身边朋友在装修新房,顺便来吐槽甲醛检测麻烦,比如有检测无监测(一次性),比如测试复杂(现场 人工)等等。刚好做为云产品经理,经常想的就是如何了解和验证多云产品组合方案的可用性问题,索性结合一下,直接把这个需求上云,然后就有了这套系统。
系统概要
>> 系统组成
终端:硬件组件
- RaspberryPi 3B (raspbian-stretch-lite/GPIO接口/python2.7)
- UART-CH2O传感器(UART接口)
- 128X32 OLED屏 SSD1306芯片(I2C接口)
云端:腾讯云产品
- 腾讯云 API网关
- 腾讯云无服务器云函数
- 腾讯云云数据库 Mysql
- 腾讯云腾讯云图
>> 效果展示
腾讯云图
终端组件
当前版本中,Rpi 使用wifi 连接互联网(也可使用有线)
设计实现
>> 概要架构图
- 分级可用:避免单环故障,系统全面崩溃
- 读写分离:便于后续调试、优化、更新版本
- 远程维护:避免出现场处理异常。由于云产品的能力提供了各种便利,学习和搭建成本很低。
>> 云端开发与配置
无服务器云函数
优先配置无服务器云函数,参考官网文档建立并保存“函数代码”后,在管理页面的“触发方式”功能中,直接生成对应API网关。
注意事项:
- 自动提交:连接数据库必须使用“autocommit = True,”参数,否则由于事务隔离,DB链接重新连接前,查询结果不变。
- 返回头:API网关开启“响应集成”时,云函数返回值需结合返回信息,指定"Content-Type",否则出现 "transfer closed with outstanding read data remaining" 错误。
- 验证连接:云函数实例可长期存在,但一定时间未操作mysql链接时,mysql将释放链接,所以代码中需要进行验证链路可用性。
API网关
1. 配置服务
参考官方文档 ,在“触发方式”中建立的API网关服务,点击相应服务名,选择“API管理”分页,点击“编辑”,配置“请求方法-POST”、“鉴权类型-密钥对”、“使用响应集成”,其它配置默认即可。
2.下载与使用SDK
API网关控制台 -> 点击 服务名 -> 点击 API文档/SDK -> 点击 下载SDK
云数据库 Mysql
表结构
SET SQL_MODE ="NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT =0;
START TRANSACTION;
SET time_zone =" 00:00";
CREATETABLE `sensordata` (
`id`int(11) NOT NULL,
`stime`timestampNULL DEFAULT NULL,
`utype`int(11) NOT NULL DEFAULT '0',
`udata` float NOT NULL,
`sdata`varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTERTABLE`sensordata`
ADD PRIMARYKEY (`id`);
ALTERTABLE`sensordata`
MODIFY `id`int(11) NOT NULLAUTO_INCREMENT;
COMMIT;
云图配置
拖选组件 -> 点击数据栏 -> 选择数据库 -> 填写SQL -> 开启自动更新 -> 预览 -> 发布
组件配置信息
- 最新同步时间 - 通用文本
select concat('最新同步时间 ',stime)as value from sensordata order by id desc limit 1
- 国标系数比 - 水位图
select round((udata)/0.08*100, 2) as value fromsensordata order by id desc limit 1
- 实时读数 - 基本条形图
select round(udata, 3) as x, '' as y from sensordataorder by id desc limit 1
- 10分钟数据 - 基本折线图
select * from (select id, round(udata, 3) as y,date_format(stime, '%H:%i:%S') as x, utype as s from sensordata order by iddesc limit 360) as t1 order by id asc
- 7天数据 - 基本折线图
select distinct (dt), round(AVG(udata),3) as y, dt as x,'0' as s from (select id, date_format(stime, '%Y-%m-%d %H') as dt, udata fromsensordata order by id desc limit 604800) as t1 group by dt order by dt ASC
>> 硬件接线与打开系统接口
Rpi GPIO
GPIO (General-purpose input/output)即通用IO接口,是一种常见的端口扩展器,树莓派使用的是40针的GPIO接口。
UART-CH2O:接线方式(UART协议)。注:本次使用的传感器,硬件接口是1.25mm端子,Rpi是2.5mm端子,使用了 7P1.25转2.5杜邦线,进行连接。
OLED:接线方式(I2C协议)
1. 打开I2C接口
raspi-config
2. 测试执行
i2cdetect -y 1
看到 3C 即识别硬件成功
>> 本地开发与配置
本文暂仅放出关键代码(硬件操作部分),便于大家撸硬件。完整包(代码 配置) 稍后放出,请关注 github/DemoOnTencentCloud。
环境配置
- 启动对时:rc.local 增加 nptdata cn.ntp.org.cn。避免重启后时间错位,监测错位。
- 启动拉起:getdata.py oled.py 需持续在线。
- 定时检测:getdata.py oled.py cron每分钟判断活性,进程挂掉即拉起。
- 定时同步:sync.py cron每分钟执行
- 远程维护:使用ssh tunnel 的 Remote Port Forwarding 模式,进行反向代理。
ssh tunnel
此处使用 autossh 进行连接,autossh可完成建立通道与监控通道的工作,通道断开后,可自主重连。远端连接云主机,之后可以云主机为跳板,反向代理访问NAT环境Rpi设备。
autossh -M 监控端口 -R 远程通信端口:localhost:22 账号名@远程IP或域名 -p端口号 -i 账号KEY -o serveraliveinterval=60 -N -f
连接时,在云主机执行
ssh -p 远程通信端口 localhost
getdata.py
获取传感器读数代码(完整代码待放出 github/DemoOnTencentCloud)
import serial
from time import sleep
ser=serial.Serial("/dev/serial0",9600)
whileTrue :
r_data =ser.read()
sleep(0.3)
data_left =ser.inWaiting()
r_data =ser.read(data_left)
if9!=len(r_data):
print'errorlength: %d'%len(r_data)
continue
else:
n=ord(r_data[4])*256 ord(r_data[5])
updatedata(n/1000.0) # ppm =n/1000.0
flusholed.py
依赖库安装(基于 https://github.com/adafruit/Adafruit_Python_SSD1306)
sudo python -m pip install --upgrade pip setuptools wheel
sudo pip install Adafruit-SSD1306
sync.py
下为功能伪代码。(完整代码待放出 github/DemoOnTencentCloud)
# 访问 APIGW,获取最新记录时间戳
# 读本地sqlite库,获取增量数据
# 访问 APIGW,提交更新数据
Sqlite结构
CREATETABLE "sensordata" (
"id"INTEGERPRIMARYKEY AUTOINCREMENT,
"utime"INTEGERNOT NULL,
"utype"INTEGER DEFAULT 0NOT NULL,
"udata"REALNOT NULL,
"sdata"TEXT
);
附录| 涉及产品介绍
- 腾讯云 API网关
API 网关(APIGateway)是 API 托管服务。提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。您可使用 API Gateway 封装自身业务,将您的数据、业务逻辑或功能安全可靠的开放出来,用以实现自身系统集成、以及与合作伙伴的业务连接。
- 腾讯云无服务器云函数
无服务器云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助用户在无需购买和管理服务器的情况下运行代码。用户只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。
- 腾讯云云数据库 Mysql
腾讯云数据库 MySQL(TencentDB for MySQL)让用户可以轻松在云端部署、使用 MySQL 数据库。MySQL 是世界上最流行的开源关系数据库,通过云数据库 MySQL,您在几分钟内即可部署可扩展的 MySQL 数据库实例。不仅经济实惠,而且可以弹性调整硬件容量的大小而无需停机。云数据库 MySQL 提供备份回档、监控、快速扩容、数据传输等数据库运维全套解决方案,为您简化 IT 运维工作,让您能更加专注于业务发展。
- 腾讯云腾讯云图
腾讯云图(Tencent Cloud Visualization,TCV)是一站式数据可视化展示平台,旨在帮助用户快速通过可视化图表展示海量数据,10 分钟零门槛打造出专业大屏数据展示。精心预设多种行业模板,极致展示数据魅力。采用拖拽式自由布局,无需编码,全图形化编辑,快速可视化制作。腾讯云图支持多种数据来源配置,支持数据实时同步更新,同时腾讯云图基于 WEB 页面渲染,可灵活投屏多种屏幕终端。