小能手曾经分享过一篇文章自制一个 LoRa PM2.5 监测器,用于监测自家小区的空气质量。个体的力量是微小的,如果集合更多人的力量,用丰富的大气监测节点来观测区域性的大气质量,相信会造福更多的人。
为了跟踪小区级的微环境质量,腾讯内部发起了一个实验性项目:细粒度的分布式大气监测。希望基于腾讯完善的产品与技术能力,与志愿者们共同建设一套用于监测生活环境大气的系统,监测终端就分布在志愿者的身边,所以这个系统的数据,更贴近每个人的生活空间,以及提供更细粒度的数据监测能力。
目前这个系统已经运营了几个月,期间追踪到几次环境污染气团在深圳的移动过程,详情可查看文章鹅厂的这波青年,自发搭建了一套分布式大气监测系统。
这篇文章将从系统架构的角度来介绍目前正在构建的大气监测系统,并逐个模块介绍其设计思路和要点。
整个系统计划由如下几个模块组成:
数据采集模块负责在终端侧采集传感器的监测数据。
这里有2个设计要求:
模块设计思路:
无线接入模块提供多样的无线接入方式,让终端入网并接入设备接入平台。
无线接入这边有一个硬性要求,大部分终端应该都安装在室内及阳台,仍需要部分终端安装于街道上,用以监测户外真实的大气环境。
模块设计思路:
由于 LPWAN 具有低功耗、远距离等优势,我们可选用 LPWAN 相关技术来满足户外街道的终端接入需求。目前最主流的是 LoRa 和 NB-IoT 两种无线接入方式。
NB-IoT 同 GPRS 一样,都要购买 sim 卡;LoRa 则需要购买 LoRaWAN 网关。二者都存在一定的搭建成本。但在 LoRa 方面,鹅厂提供了开放共享的腾讯 LoRa 社区网络,其中包括腾讯在深圳自建的数百个LoRa网关,用户可查找附近的社区LoRa网关就近完成 LoRaWAN 设备接入,降低应用开发门槛。
同时考虑在成本和便利性的优势,市面上一个WiFi开发板在20块钱左右,直接通过家庭路由器便可以接入平台,因此我们仍希望能支持 WiFi 接入方式。
综上,在无线接入模块的设计,我们首选 LoRa、辅以 WiFi,同时仍能尽量支持其他的无线接入方式。
设备接入模块负责各类终端设备的平台侧接入,并且进行不同设备协议的规整,发送给业务处理模块。
为了让业务系统快速支撑海量物联网设备连接,毫无疑问需要选择成熟的物联网平台进行开发。腾讯云物联网开发是目前腾讯云主推的一站式开发平台。除了具备海量连接的可靠能力,还支持 LoRa、WiFi、蜂窝网络 等多种接入协议。
另外很重要的一点,腾讯云物联网开发平台还为用户提供产品开发及定义数据模板的能力,可以定义统一的大气传感器产品;同时灵活的设备数据解析引擎,可以将不同的传感器协议格式进行脚本处理,转化成我们需要的统一的数据模版格式,满足我们端侧不限制传感器数据格式的需求。
最后物联网开发平台中可以配置相应的第三方服务器 URL,将规整后的设备协议推送给我们的业务处理模块。
业务处理模块负责管理终端设备,分析传感器监测数据。
在设备管理部分的设计中,由于物联网开发平台已经可以定义具体数据模版的产品,因此我们在这个大气监测系统将会定义具体的几种大气监测产品,如pm2.5,如voc。业务处理模块中只需进行指定产品的设备管理,用户无需再操心具体的产品json协议,降低用户的使用门槛。
在业务处理部分,涉及API网关、SCF云函数、云数据库及腾讯云图等多款云端组件,此前的文章系统功能与架构概述中已有了阐述。
在春节前我们快速讨论确定了这套系统架构,不到2天的时间内,快速搭建了整套系统及5个监测点。
下面介绍下具体案例,以方便大家加深理解这个系统架构。
在数据采集部分,我们采用了目前 NUCLEO LoRa 开发套件作为主控,串口连接攀藤 PMS7003 PM2.5 传感器。
软件上基于 TencentOS tiny 快速开发了一个固件版本,下图是具体的传感器数据协议,开发板直接透传数据 payload 给到云端。
在无线接入部分,5 个监测点直接安装了 5 个社区LoRa网关。
5个监测点覆盖。
传感器的原始数据上传到腾讯云物联网开发平台后,经过设备数据解析脚本的处理,原始的传感器协议格式已转化为具体的产品属性,以json格式推送给大气监测平台。
如下是针对攀藤 PMS7003 PM2.5 传感器编写的数据解析脚本:
function RawToProtocol(fPort, bytes) {
var data = {
"method": "report",
"clientToken" : new Date(),
"params" : {}
};
var i = 0;
data.params.PM1_CF1 = (bytes[i++] << 8) | bytes[i++];
data.params.PM2d5_CF1 = (bytes[i++] << 8) | bytes[i++];
data.params.PM10_CF1 = (bytes[i++] << 8) | bytes[i++];
data.params.PM1 = (bytes[i++] << 8) | bytes[i++];
data.params.PM2d5 = (bytes[i++] << 8) | bytes[i++];
data.params.PM10 = (bytes[i++] << 8) | bytes[i++];
data.params.particles_0d3 = (bytes[i++] << 8) | bytes[i++];
data.params.particles_0d5 = (bytes[i++] << 8) | bytes[i++];
data.params.particles_1 = (bytes[i++] << 8) | bytes[i++];
data.params.particles_2d5 = (bytes[i++] << 8) | bytes[i++];
data.params.particles_5 = (bytes[i++] << 8) | bytes[i++];
data.params.particles_10 = (bytes[i++] << 8) | bytes[i++];
data.params.version = bytes[i++];
data.params.Error = bytes[i++]
return data;
}
下图是 LoRa PM2.5 节点在物联网开发平台中的设备属性呈现:
最后再附上一张大气监测平台的腾讯云图呈现效果。