手搓一个分布式大气监测系统(六)云端能力更新、说明及源码放出
时间:2022-07-26
本文章向大家介绍手搓一个分布式大气监测系统(六)云端能力更新、说明及源码放出,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前述
本系列前序文章,已经对硬件层进行了详细的说明,讲解了设备性能、开发、灌装等环节的过程。本篇将对数据上云后的相关流程,进行说明。
由于项目平台持续建设中,当前已开源信息为二期版本,所以本篇内容均基于此版本能力进行说明。此版本架构进一步优化了数据鉴权及数据库保护。
本文将分为两个部分:
- 架构组成:技术角度,拆解设计逻辑
- 模块实现:功能角度,讲解实现逻辑
【注1】二期版本首页效果
【注2】在建三期版本首页效果
【注3】在建三期版本中,加入了 日志服务 、对象存储、小程序功能。提供灵活的日志存储与高速检索能力、 低成本的数据库备份+恢复+迁移同步能力、移动端交互及其它能力。
架构组成
二期架构图
注:浅蓝色标明的是相对一期的架构变更重点。
部署维度
- 终端:部署在监测点的设备。相关设计在本系列前文中已说明。
- 云端:部署在云上的平台。相关设计将在本文说明。
功能维度
以平台设计的基本组成部分,进行的逻辑拆分。并依架构层的设计需求,配套选型的具体产品。
具体功能与选型说明:
- 监测节点:由软硬两部分组成。基于腾讯物联网终端操作系统 TencentOS tiny开发固件,将 兼容腾讯云的硬件设备 与 腾讯云IoT explorer进行了协议级的对接。
- 本地网关:此部分以通信协议转换为主,不解析具体数据,仅需按前文指引配置即可。
- 物联网接入层:基于腾讯云IoT explorer产品,提供了解密、接入、转发的相关功能。在获取数据后,进行了基于http协议的转推动作,传递给下游 API 网关。
- 中间件层:基于API 网关提供了衔接及负载均衡等能力,基于鉴权、流控等能力,衔接云函数,提供可靠的数据输入输出服务。
- 逻辑层:基于云函数,实现了接收数据入库(数据固化)、定时统计汇总(数据分析)、输出应用数据(数据输出,支撑展示)的能力。
- 存储层:基于云数据库 TencentDB for MySQL,进行监测数据、汇总数据、平台配置的存储。
- 展示层:基于腾讯云图,提供了地图展示、数据展示、折线图展示等能力。并配置提供联动处理,提高了响应速度,减少了资源文件的重复传输。
模块实现
整体系统,以数据为核心,进行了相关设计,所以本部分有两个组成部分:
- 数据结构:讲解各环节的核心数据结构与关联模式。
- 模块说明:讲解各功能模块的实现与对应源码。
数据结构
IoT explorer(物联网开发平台)推送数据结构
以API网关推送进来,由云函数在环境变量 event 中提取到的原始数据。
其中主要的部分:
- 非'body' 部分,为api网关相关信息
- 'body' = IoT explorer 原始数据
- 'body'->'payload' = 终端节点上报的原始数据,经base64编码
{
"body": "{"payload":"eyJtZXRob2QiOiJyZXBvcnQiLCJjbGllbnRUb2tlbiI6IjIwMjAtMDgtMThUMTE6MTc6NDkuNDAzWiIsInBhcmFtcyI6eyJQTTFfQ0YxIjo1LCJQTTJkNV9DRjEiOjYsIlBNMTBfQ0YxIjo3LCJQTTEiOjUsIlBNMmQ1Ijo2LCJQTTEwIjo3LCJwYXJ0aWNsZXNfMGQzIjo3OTIsInBhcnRpY2xlc18wZDUiOjI1NCwicGFydGljbGVzXzEiOjE1LCJwYXJ0aWNsZXNfMmQ1IjozLCJwYXJ0aWNsZXNfNSI6MywicGFydGljbGVzXzEwIjowLCJ2ZXJzaW9uIjoxNTEsIkVycm9yIjowfX0=", "seq":18639, "timestamp":1597749469,"topic":"$thing/up/property/?????/?????", "devicename":"?????", "productid":"?????"}",
"headerParameters": {},
"headers": {
"accept-encoding": "gzip",
"content-length": "511",
"content-type": "application/json",
"endpoint-timeout": "15",
"host": "service-???-???.gz.apigw.tencentcs.com",
"user-agent": "Go-http-client/1.1",
"x-anonymous-consumer": "true",
"x-api-requestid": "???03a993936ae191f44651???",
"x-b3-traceid": "???03a993936ae191f44651???",
"x-qualifier": "$LATEST"
},
"httpMethod": "POST",
"path": "/??????",
"pathParameters": {},
"queryString": {},
"queryStringParameters": {},
"requestContext": {
"httpMethod": "POST",
"identity": {},
"path": "/??????",
"serviceId": "service-?????",
"sourceIp": "?.?.?.?",
"stage": "release"
}
}
'body' 解base64编码后:
{
"clientToken": "2020-08-18T11:17:49.403Z",
"method": "report",
"params": {
"Error": 0,
"PM1": 5,
"PM10": 7,
"PM10_CF1": 7,
"PM1_CF1": 5,
"PM2d5": 6,
"PM2d5_CF1": 6,
"particles_0d3": 792,
"particles_0d5": 254,
"particles_1": 15,
"particles_10": 0,
"particles_2d5": 3,
"particles_5": 3,
"version": 151
}
}
数据库表单结构
数据库详细格式,请参考 github-sql
各表用途:
- config:系统配置表
- space:地点表。记录节点部署地点。
- client:节点表。记录节点信息及最新关键信息,关联space表。
- base_data:日志表。记录每次上报的信息,关联space、client表。
- aggregate_data:汇总信息表。记录按小时、天等时段汇总的数据信息。
- temp_base_data:临时日志表。上报设备名如不在节点表内,则存入此表,主要用于调测。
API接口数据结构
模块说明
数据入库
- 模块功能:接收IoT explorer推送数据,匹配并转换后,入数据库
- 使用产品:API 网关、无服务器云函数
- 关联源码:github-upload
- 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节
终端在线更新
- 模块功能:按3分钟触发,更新终端信息,用于快速查询与展示
- 使用产品:云函数
- 关联源码:github-client_active_new
- 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节,但改为“定时触发”模式
数据统计
- 模块功能:按小时及天触发,统计监测数据,用于快速查询与展示
- 使用产品:云函数
- 关联源码:github-aggregate
- 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节,但改为“定时触发”模式
数据接口-终端汇总信息表
- 模块功能:通过API网关提供数据查询能力,响应云图调用,提供终端汇总信息表
- 使用产品:API 网关、云函数
- 关联源码:github-client_info
- 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节
数据接口-终端单点信息表
- 模块功能:通过API网关提供数据查询能力,响应云图调用,提供终端单点信息表
- 使用产品:API 网关、云函数
- 关联源码:github-client_data
- 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节
数据展示
- 模块功能:提供WEB端展示能力,含地图绘点、列表展示、折线展示等
- 使用产品:腾讯云图
- 关联源码:无,当前为手工配置
- 部署方式:请参考相关文章 在线甲醛监测 “4.2.4 腾讯云图” 章节,但数据源选择时,改为使用“API”。其中“首页”地图使用“数据接口-终端汇总信息表”接口、“单点数据页”使用“数据接口-终端单点信息表”接口。具体调用的接口URL,请对应API网关提供的服务链接。
成本分析
上图表数为每节点每15秒上报一次的计算结果。
硬件部分由于厂商与采购量的差异,价格不同。此处以云服务成本计算,如果10000节点规模,每节点每分钟上报一次,单节点云服务年成本:
- 二期架构单节点年成本 2.83元 (数据库/年+云图/年)/10000+(API网关+云函数+对象存储)/4=(468+48)/10000+(9+2.1+0.02)/4
- 三期架构单节点年成本 0.95元 (消息队列/年+数据库/年*2+云图/年)/10000+(云函数+对象存储)/4=(3228+468*2+48)/10000+(2.1+0.02)/4
后续计划
完成三期建设,计划内容涉及:
- 交互建设(doing): 增加小程序能力,提供移动端查询能力,及告警推送能力。
- 管控优化1(doing): 增加日志服务,用于数据对账,应对多环节数据处理中,可能出现的数据丢失或错乱情况。
- 管控优化2(todo): 增加消息队列 CKafka,应对网络异常、数据库异常情况下的数据堆积与丢失风险。并进一步以此平台,提供数据开放订阅基础。
三期架构图预告
注:浅蓝色标明的是相对二期的架构变更重点。
三期版本部分完成效果
WEB端展示
小程序端Demo
- 这或许是我见过的最简单的正则表达式教程(一)
- Linux下如何安装和卸载JDK
- 讨厌算法的程序员 2 - 证明算法的正确性
- Day4上午解题报告
- [编程经验] Python正则表达式
- Day4下午解题报告
- linux下 Error running javac compiler
- 讨厌算法的程序员 1 - 插入排序
- Linux下使用ssh密钥实现无交互备份
- [编程经验] Python中的continue和break语句
- 洛谷 P3386 【模板】二分图匹配 Dinic版
- [编程经验] 拉勾网爬虫数据的后续处理
- Linux下使用rsync实现文件备份
- 【干货】基于TensorFlow卷积神经网络的短期股票预测
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法基础:分治
- 黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!
- 设计模式(3)[JS版]-JavaScript中的构造函数模式是什么?
- 基于docker 安装elasticsearch + kibana + ik分词器(6.7.2版本)
- 算法基础:排序
- 算法基础:动态规划
- 什么是 “并查集” ?
- Sentinel + SpringBoot 基于本地文件模式实现规则持久化
- 1.5 Arduino的第一个程序
- 2.1 Arduino语言和结构
- TKE 实践亲和性与反亲和性
- 从HotSpot虚拟机源码了解Java的访问控制修饰符
- 设计模式(4)[JS版]-JavaScript如何实现建造者模式?
- 前端基础:HTML
- SignalR 2.x入门(一):SignalR简单例子