鹅厂分布式大气监测系统:云端能力如何打造?

2023-12-01 17:50

本文主要是介绍鹅厂分布式大气监测系统:云端能力如何打造?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导语 | 为了跟踪小区级的微环境质量,腾讯内部发起了一个实验性项目:细粒度的分布式大气监测,希望基于腾讯完善的产品与技术能力,与志愿者们共建一套用于监测生活环境大气的系统。前序篇章已为大家介绍该系统总体架构和监测终端的打造,本期将就云端能力的各模块实现做展开,希望与大家一同交流。文章作者:高树磊,腾讯云高级生态产品经理。

一、前言

本系列的前序文章[1],已经对硬件层进行了详细的说明,讲解了设备性能、开发、灌装等环节的过程。本文将对数据上云后的相关流程,进行说明。

由于项目平台持续建设中,当前已开源信息为二期版本,所以本篇内容均基于此版本能力进行说明。此版本架构进一步优化了数据鉴权及数据库保护。

二期版本首页效果

在建三期版本首页效果

而在建的三期版本中,加入了日志服务 、对象存储、小程序等功能。提供了灵活的日志存储与高速检索能力、 低成本的数据库备份+恢复+迁移同步能力、移动端交互及其它能力。


二、架构组成

整个二期版本的架构组成如下图所示,其中浅蓝色标明的部分是相对一期的架构变更重点。


二期架构图

1. 部署维度

  • 终端:部署在监测点的设备。

  • 云端:部署在云上的平台。

2. 功能维度

以平台设计的基本组成部分,来进行逻辑拆分,并依架构层的设计需求,配套选型的具体产品。

具体功能与选型说明如下:

  • 监测节点:由软硬两部分组成。基于腾讯物联网终端操作系统 TencentOS tiny开发固件,将兼容腾讯云的硬件设备与腾讯云 IoT explorer 进行了协议级的对接。

  • 本地网关:此部分以通信协议转换为主,不解析具体数据,仅需按前文指引配置即可。

  • 物联网接入层:基于腾讯云 IoT explorer 产品,提供了解密、接入、转发的相关功能。在获取数据后,进行了基于 http 协议的转推动作,传递给下游 API 网关。

  • 中间件层:基于 API 网关提供了衔接及负载均衡等能力,基于鉴权、流控等能力,衔接云函数,提供可靠的数据输入输出服务。

  • 逻辑层:基于云函数,实现了接收数据入库(数据固化)、定时统计汇总(数据分析)、输出应用数据(数据输出,支撑展示)的能力。

  • 存储层:基于云数据库 TencentDB for MySQL,进行监测数据、汇总数据、平台配置的存储。

  • 展示层:基于腾讯云图,提供了地图展示、数据展示、折线图展示等能力。并配置提供联动处理,提高了响应速度,减少了资源文件的重复传输。


三、模块实现

整体系统,以数据为核心,进行了相关设计,所以本部分分为两个组成部分:

  • 数据结构:介绍各环节的核心数据结构与关联模式。

  • 模块说明:介绍各功能模块的实现与对应源码。

1. 数据结构


(1)IoT explorer(物联网开发平台)推送数据结构

以API网关推送进来,由云函数在环境变量 event 中提取到的原始数据。其中主要的部分如下:

  • 非'body' 部分,为 API 网关相关信息;

  • 'body' = IoT explorer 原始数据;

  • 'body' = 终端节点上报的原始数据,经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    }}

(2)数据库表单结构

数据库详细格式,请参考github-sql

https://github.com/eckygao/ampservice_demo/blob/master/amservice.sql

各表用途:

  • config:系统配置表;

  • space:地点表。记录节点部署地点;

  • client:节点表。记录节点信息及最新关键信息,关联space表;

  • base_data:日志表。记录每次上报的信息,关联space、client表;

  • aggregate_data:汇总信息表。记录按小时、天等时段汇总的数据信息;

  • temp_base_data:临时日志表。上报设备名如不在节点表内,则存入此表,主要用于调测。


2. 模块说明

(1)数据入库
  • 模块功能:接收IoT explorer推送数据,匹配并转换后,入数据库;

  • 使用产品:API 网关、无服务器云函数;

  • 关联源码:github-upload[2]

  • 部署方式:请参考相关文章 在线甲醛监测[3] “4.2.2 无服务器云函数/4.2.3 云API网关” 章节。


(2)终端在线更新
  • 模块功能:按3分钟触发,更新终端信息,用于快速查询与展示;

  • 使用产品:云函数;

  • 关联源码:github-client_active_new

  • 部署方式:请参考相关文章 在线甲醛监测  “4.2.2 无服务器云函数/4.2.3 云API网关” 章节,但改为“定时触发”模式。


(3)数据统计
  • 模块功能:按小时及天触发,统计监测数据,用于快速查询与展示;

  • 使用产品:云函数;

  • 关联源码:github-aggregate()

  • 部署方式:请参考相关文章 在线甲醛监测  “4.2.2 无服务器云函数/4.2.3 云API网关” 章节,但改为“定时触发”模式。


(4)数据接口-终端汇总信息表
  • 模块功能:通过API网关提供数据查询能力,响应云图调用,提供终端汇总信息表;

  • 使用产品:API 网关、云函数;

  • 关联源码:github-client_info

  • 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节。


(5)数据接口-终端单点信息表
  • 模块功能:通过API网关提供数据查询能力,响应云图调用,提供终端单点信息表;

  • 使用产品:API 网关、云函数;

  • 关联源码:github-client_data

  • 部署方式:请参考相关文章 在线甲醛监测 “4.2.2 无服务器云函数/4.2.3 云API网关” 章节。


(6)数据展示
  • 模块功能:提供WEB端展示能力,含地图绘点、列表展示、折线展示等;

  • 使用产品:腾讯云图;

  • 关联源码:无,当前为手工配置;

  • 部署方式:请参考相关文章 在线甲醛监测 “4.2.4 腾讯云图” 章节,但数据源选择时,改为使用“API”。其中“首页”地图使用“数据接口-终端汇总信息表”接口、“单点数据页”使用“数据接口-终端单点信息表”接口。具体调用的接口URL,请对应API网关提供的服务链接。


四、成本分析

二期成本展示

上图表数为每节点每15秒上报一次的计算结果。

硬件部分由于厂商与采购量的差异,价格不同。此处以云服务成本计算,如果10000节点规模,每节点每分钟上报一次,单节点云服务年成本如下:

1. 二期架构单节点成本

(数据库/年+云图/年)/10000+(API网关+云函数)/4=(468+48)/10000+(9+2.1)/4=3.335元

2. 三期架构单节点成本

 (消息队列/年+数据库/年\*2+云图/年)/10000+(云函数+日志服务+对象存储)/4=(3228+468*2+48)/10000+(2.1+2.24+0.02)/4=1.09元

其中,二期无对象存储及日志服务模块,但当前的在建三期中已使用数月,故有实际数据可列入统计。

五、后续计划

预计完成三期建设,计划内容涉及:

  • 交互优化(done): 启用space表,展示地点。

  • 交互建设(doing): 增加小程序能力,提供移动端查询能力,及告警推送能力。

  • 容灾优化1(done): 增加对象存储,提供低成本数据备份、恢复、异步迁移同步能力。

  • 容灾优化2(todo): 增加消息队列 CKafka,应对网络异常、数据库异常情况下的数据堆积与丢失风险。

  • 容灾优化3(doing): 增加日志服务,用于数据对账,应对多环节数据处理中,可能出现的数据丢失或错乱情况。


三期架构预告如下所示,浅蓝色标明的是相对二期的架构变更重点。

三期架构

三期版本部分完成效果展示如下:


WEB端展示

小程序端Demo

参考资料:

[1] 手搓一个分布式大气监测系统专栏:

https://cloud.tencent.com/developer/inventory/381

[2] 模块设计源码展示:

https://github.com/eckygao/ampservice_demo/tree/master/scf

[3] 腾讯云实践案例:基于树莓派实现甲醛在线监测

https://cloud.tencent.com/developer/article/1474978?from=10680

[4] 腾讯云-物联网开发平台:

https://cloud.tencent.com/product/iotexplorer

[5] TencentOS tiny:

https://github.com/Tencent/TencentOS-tiny

[6] 腾讯云-API网关:

https://cloud.tencent.com/product/apigateway

[7] 腾讯云-云函数:

https://cloud.tencent.com/product/scf

[8] 腾讯云-云数据库:

https://cloud.tencent.com/product/cdb

[9] 腾讯云-腾讯云图:

https://cloud.tencent.com/product/tcv

沙龙预告

今晚8点,国产开源物联网操作系统专题准时开讲,分享TencentOS Tiny操作系统开源过程中技术架构的探索、演进和实践,扫描下方二维码或点击文末「阅读原文」即可预约观看今晚直播~

这篇关于鹅厂分布式大气监测系统:云端能力如何打造?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/442105

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Python利用GeoPandas打造一个交互式中国地图选择器

《Python利用GeoPandas打造一个交互式中国地图选择器》在数据分析和可视化领域,地图是展示地理信息的强大工具,被将使用Python、wxPython和GeoPandas构建的交互式中国地图行... 目录技术栈概览代码结构分析1. __init__ 方法:初始化与状态管理2. init_ui 方法:

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Redis分布式锁中Redission底层实现方式

《Redis分布式锁中Redission底层实现方式》Redission基于Redis原子操作和Lua脚本实现分布式锁,通过SETNX命令、看门狗续期、可重入机制及异常处理,确保锁的可靠性和一致性,是... 目录Redis分布式锁中Redission底层实现一、Redission分布式锁的基本使用二、Red

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github