智慧建筑云平台接入架构设计
本文由灵自古来 邮箱lingzigulai@163.com 微信号lingzigulai 原创,转载请注明出处,谢谢。
- 概述
- 架构设计
架构图
软网关:负责连接各种串口、modus、CAN、IO硬件协议设备,进行数据解析,将和他们的通信转化为mqtt协议的发布和订阅2类操作,和mqtt消息总线进行交互;将通过mqtt接收的各种二进制消息解析成标准数据结构;可通过配置页面,配置某个设备某天协议解析成某个属性或者某个方法;
硬网关:带串口/CAN等各种传统硬件接口转网口或者gprs/4G口的,硬件模块实现软网关的功能,解决方便部署和低成本问题;通过购买硬件模块二次开发实现;
智能硬件:本身支持mqtt协议的智能硬件,不需要进过软网关或者硬网关,可直接和mqtt消息总线通讯;
Mqtt消息总线:负责接入所有本公司软网关、硬网关、智能硬件,也作为对外的硬件接入平台开放给第三方开发者;
设备中心服务:负责将通过mqtt接收的各种消息转发到消息应用消息总线,或者其他系统;初始化设备影子redis,
云平台消息总线:接收接入服务发布的消息,进行具体的分析存储等操作;接入服务也订阅云平台消息总线的控制消息,进行下发控制操作;
设备管理web服务:维护设备影子生命周期(对设备影子提供web api增删查改);为网关提供数据配置信息web api ;为驱动包升级提供webapi;为设备提供数据连接信息api;为产品表、产品属性表(物模型)提供管理webapi; 为设备表提供web api; 为产品协议配置表、取值表提供web api;
设备影子缓存:采用redis缓存实现;
- 模块分解
分类 |
模块 |
描述 |
软件服务 |
软网关 |
|
设备中心服务 |
||
中间件 |
Mqtt |
设备接入总线 |
Redis |
设备影子 |
|
kafka |
云平台总线 |
|
Netty |
||
硬件 |
硬网关 |
|
Web配套服务 |
设备管理api |
|
- 静态数据定义
部分表结构设计:
产品属性表
分类 |
数据项 |
说明 |
基础 |
属性id |
|
属性名称 key |
属性英文名 |
|
产品id |
||
属性类型细节 |
说明如下 |
|
属性类型 |
有“float”,“string”,“int32”,“enum” |
|
用户读写权限 |
读写权限,“r”表示只能读、“rw”表示属性可读可写 | |
|
用户希望值 |
||
用户希望值设置时间 |
产品表
分类 |
数据项 |
说明 |
基础 |
id |
|
名称 |
属性类型细节:
对于float和int32的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | --------- | -------------------- |
| Unit | String | 属性的单位 |
| UnitName | String | 属性单位的中文名 |
| Min | Float/Integer | 属性可以接受的最小值 |
| Max | Float/Integer | 属性可以接受的最大值 |
| Step | Float/Integer | 属性的精度 |
对于string的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | ---- | ------------------------ |
| Length | Integer | 字符串可以接受的最大长度 |
对于enum的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | ------ | ------------------------ |
| 可取的值 | String | 枚举的可选值和对应的描述 |
设备影子:redis存储
分类 |
数据项 |
说明 |
基础 |
key |
项目id+设备id |
设备影子结构体 |
{things,properties} |
Thing 的结构如下:
| 参数名称 | 类型 | 描述 |
| --------- | :----- | ---------------------------------------------------- |
| ModelType | String | 设备影子的模型类型 |
| Version | Integer| 设备影子的版本号 |
| DeviceId | String | 设备ID |
| Timestamp | String | 影子最后的更新时间,设备上报、用户设置都会更新此时间 |
Property的结构如下:
| 参数名称 | 类型 | 描述 |
| ---------------- | ----------------------- | ------------------------------------------------------------ |
| DataType | object | 数据类型 |
| Name | String | 属性的中文名 |
| AccessMode | String | 读写权限,“r”表示只能读、“rw”表示属性可读可写 |
| Timestamp | String | 设备上报此属性的时间,单位:毫秒 |
| Desired | 类型由dataType.type描述 | 用户希望设置的值,如果用户没有希望的值,或者设备已经更新到用户希望设置的值,则无此项 |
| DesiredTimestamp | String | 用户设置值的时间,单位:毫秒,有desired的时候有此项,没有desired则无此项 |
DataType的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | -------------- | ------------------------------------------------ |
| Type | String | 属性的类型,有“float”,“string”,“int32”,“enum” |
| Value | 类型由type描述 | 属性的内容,type为“enum”时,value为string |
| Specs | Specs | 属性类型的细节 |
对于float和int32的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | --------- | -------------------- |
| Unit | String | 属性的单位 |
| UnitName | String | 属性单位的中文名 |
| Min | Float/Integer | 属性可以接受的最小值 |
| Max | Float/Integer | 属性可以接受的最大值 |
| Step | Float/Integer | 属性的精度 |
对于string的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | ---- | ------------------------ |
| Length | Integer | 字符串可以接受的最大长度 |
对于enum的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | ------ | ------------------------ |
| 可取的值 | String | 枚举的可选值和对应的描述 |
4、消息接口
网关向mqtt发布的消息 等于 转发服务向kafka发布的消息
网关向mqtt订阅的消息 等于 转发服务向kafka订阅的消息;
网关向mqtt发布消息时,主题路径如下:
/消息类型/项目id/设备id
数据格式:json
数据流:
- 网关启动时,设备向平台拉取一次设备影子(暂时不做)
A拉取设备影子
数据流向:
设备==sync==>平台
数据结构:
{meta,things}
B拉取设备影子回应
数据流向:
设备<==sync_rsp==平台
数据结构:
{meta,things,properties}
- 网关定时向平台上报状态(定时设置在设备表里面)
数据流向
设备==report==>平台
{meta,things,properties}
数据流向
设备<==report_rsp==平台
{meta,things,response}
- 平台查询设备状态
数据流向
设备<==get==平台
{meta,things}
数据流向
设备==report==>平台
{meta,things,response}
- 平台设置设备状态
数据流向
设备<==set==平台
{meta,things,properties}
数据流向
设备==set_rsp==>平台
{meta,things,response}
接口定义:
数据上报
###1. 请求方式
push kafka消息队列
### 2. 输入参数
数据格式:json
数据体:{meta,things,properties}
| 参数名称 | 必选 | 类型 | 描述 |
| ---------- | ---- | --------------- | ------------------------------------------------------- |
| Meta| 是 | Meta|消息头 |
| Things | 是 | Things | Things结构数据,描述设备的信息 |
| Properties | 是 | Map of Property | 希望设置的属性内容的Map,key是属性名称,value是属性描述 |
Meta的结构如下:
| 参数名称 | 必选 | 类型 | 描述 |
| -------- | ---- | ------ | ---------------------------------------------------- |
| infoType| 是 | String | report表示"设备上报状态", report_rsp表示"后台回复上报", sync表示"设备请求获得影子属性", sync_rsp表示"后台回复影子属性", set表示"后台对设备设置影子属性".set_rsp表示设备回复设置 get表示“后台主动查询设备状态”,设备对后台以report消息回应
|
| timeStamp| 是 | String | 单位: 毫秒. Json的int64会丢精度, 用string |
Things的结构如下:
| 参数名称 | 必选 | 类型 | 描述 |
| -------- | ---- | ------ | ---------------------------------------------------- |
| DeviceId | 是 | String | 设备ID |
| Version | 是 | String | 设备影子的版本号,需要和获取影子得到的Version一致 |
Property的结构如下:
| 参数名称 | 必选 | 类型 | 描述 |
| -------- | ---- | ------------------------------- | ------------ |
| Value| 是 | 和获取设备影子时对应属性的类型一致 | 设备的当前属性值 |
举例:
{
"meta":{
"infoType": "report", //report表示"设备上报状态", report_rsp表示"影子后台回复上报", sync表示"设备请求获得影子属性", sync_rsp表示"后台回复影子属性", set表示"后台对设备设置影子属性".
"timeStamp": "1535338490" //单位: 毫秒. Json的int64会丢精度, 用string.
},
"things": {
"version": XX,
"deviceId": "114400000000032" //设备id, json的int64类型会丢精度, 用string.
},
"properties": {
"Error": {
"value": "电源故障" //故障原因.
}
,
"Alarm": {
"value": "0" //0表示未告警状态, 1表示告警状态.
}
,
"Temperature": {
"value": "20"
}
}//end properties
}//尾
拉取设备影子回应
###1. 请求方式
Pull kafka消息队列
### 2. 输入参数
数据格式:json
数据体:{meta,things,properties}
Meta things定义同上
Property的结构如下:
| 参数名称 | 类型 | 描述 |
| ---------------- | ----------------------- | ------------------------------------------------------------ |
| DataType | object | 数据类型 |
| Name | String | 属性的中文名 |
| AccessMode | String | 读写权限,“r”表示只能读、“rw”表示属性可读可写 |
| Timestamp | String | 设备上报此属性的时间,单位:毫秒 |
| Desired | 类型由dataType.type描述 | 用户希望设置的值,如果用户没有希望的值,或者设备已经更新到用户希望设置的值,则无此项 |
| DesiredTimestamp | String | 用户设置值的时间,单位:毫秒,有desired的时候有此项,没有desired则无此项 |
DataType的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | -------------- | ------------------------------------------------ |
| Type | String | 属性的类型,有“float”,“string”,“int32”,“enum” |
| Value | 类型由type描述 | 属性的内容,type为“enum”时,value为string |
| Specs | Specs | 属性类型的细节 |
对于float和int32的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | --------- | -------------------- |
| Unit | String | 属性的单位 |
| UnitName | String | 属性单位的中文名 |
| Min | Float/Integer | 属性可以接受的最小值 |
| Max | Float/Integer | 属性可以接受的最大值 |
| Step | Float/Integer | 属性的精度 |
对于string的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | ---- | ------------------------ |
| Length | Integer | 字符串可以接受的最大长度 |
对于enum的DataType,Specs的结构如下:
| 参数名称 | 类型 | 描述 |
| -------- | ------ | ------------------------ |
| 可取的值 | String | 枚举的可选值和对应的描述 |
数据上报回复
请求方式
转发服务Pull kafka消息队列
数据格式:json
数据体:{meta,things,response}
| 参数名称 | 类型 | 描述 |
| --------- | ------ | -------------- |
| Meta| 是 | Meta|消息头 |
| Things | 是 | Things | Things结构数据,描述设备的信息
| response| response| 设置的结果信息 |
Meta things定义同上
response的结构如下:
| 参数名称 | 类型 | 描述 |
| --------- | ------ | -------------- |
| success| String | 上报结果,true是成功,false是失败 |
| error| error| 失败原因 |
error结构体
| 参数名称 | 类型 | 描述 |
| --------- | ------ | -------------- |
| code| String |错误码 |
| message| String | 错误描述 |
智慧建筑云平台接入架构设计相关推荐
- 云平台编程与开发(六):物联网云平台的架构设计设想(基于X5Cloud云平台)
1. 物联网概述 根据现在较通用的定义,物联网是指通过射频识别(RFID).红外感应器.全球定位系统.激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网连接起来,进行信息交换和通信,以实现智能 ...
- ⑭云上场景 神州导航科技,智慧云平台三层架构部署实践
神州导航科技集团为政府环卫部门提供全业务链的环境卫生业务监管.指挥.调度和业务流程管理解决方案,为政府提供环卫业务咨询.规划.信息化建设.工程实施.系统运维等一站式服务. 该集团的智慧环卫云平台选用阿 ...
- 打造企业级云深度学习平台——小米云深度学习平台的架构设计与实现
作者:陈迪豪,小米深度学习工程师,负责小米云深度学习平台的架构和实现,目前专注于TensorFlow和Kubernetes社区. 责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至 ...
- 智慧政务云平台建设方案案例与基础架构
大数据技术的应用与发展正在让我们的生活经历一场深刻的"变革",而且这种变革几乎让所有人都感觉非常舒服,自然而然的就完成了这样的一个变化.最根本的原因其实是大数据技术的应用真正帮助我 ...
- 智慧政务云平台建设方案架构介绍
大数据技术的应用与发展正在让我们的生活经历一场深刻的"变革",而且这种变革几乎让所有人都感觉非常舒服,自然而然的就完成了这样的一个变化.最根本的原因其实是大数据技术的应用真正帮助我 ...
- 云消防大数据_2020年刚需系列专题之智慧消防大数据平台建设方案 智慧消防云平台项目 解决方案,一查就有...
消防产业关乎国计民生,伴随城镇化进程而逐步成长.根据中国消防协会编撰的<中国消防产业发展现状>,我国消防产业每年的总体规模约为 1000-2000 亿元.消防产业的成长伴随着我国的城镇化进 ...
- 工作邦智慧水务云平台支持的20+硬件
"工作邦智慧水务云平台"是一个软件硬件深度结合的平台,硬件来自于合作多年的行业合作伙伴.通过与硬件的深度结合,水务云平台架构比较完整,业务办理更加流畅.操作更加快捷. 下面是平台支 ...
- 300页13万字新型智慧城市云平台中心及大数据平台建设方案
目 录 1. 智慧城市云计算中心总体设计 8 1.1 总体设计方案 8 1.1.1 设计原则 8 1.1.2 支撑平台技术架构设计 10 1.1.3 支撑平台网络拓扑设计 11 1.1.4 通过 ...
- TMC-城市智慧消防云平台
TMC TMC是一个开源智慧消防云平台,该平台融合了无线烟感监测.可燃气器监测.电气火灾监测.防火门监测.消防用水监测.消防主机联网.消防电源监测.消防巡检.视频智能识别九大子系统,是城市级消防联网的 ...
最新文章
- 二叉链表和职工管理系统结合_基于二叉链表的二叉树实现
- 机器学习Top10算法,教你选择最合适的那一个!
- 简单介绍 ghost封装过程
- 深度相机(三)--三种方案对比
- HDU4635 Strongly connected
- matlab fullbnt,Matlab2010下使用FULLBNT工具箱建立复杂的动态贝叶斯网络
- mysql关联子查询_MySQL 关联子查询
- Python实现熵值法
- 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现
- 老鸟程序员才知道的一些事
- 背景图片上面写字的方法。
- 卧槽,javaCV不到十行代码实现图片OCR文字识别
- 做好SEO必备的三步骤
- 从零基础到导入运行Java版坦克大战游戏项目 第一节(Java JDK的下载安装配置)
- PG虚拟文件描述符(VFD)机制——封装的文件接口:postgresql-8.4.1/src/backend/storage/file/fd.c
- `Computer-Algorithm` 二分图BipartiteGraph,最大匹配,最小点覆盖,最大独立集
- R语言 词云图过大不能全部显示怎么办
- 因果论在游戏场景中的应用
- 【转】Android中对付ANR的N种武器
- 英语propretie财产房产
热门文章
- 自定义laravel validate request 返回错误信息格式
- 如何拖动末端使机器人运动仿真-使用Peter机器人工具箱
- 学计算机买什么电脑性价比高,台式电脑性价比那么高,为什么我还推荐大学生买笔记本?...
- Git reset(回滚) 和 revert(撤销)(图文详解)
- Precision和Recall​
- Java实现暂停_Java中暂停线程的简单实现
- Flash 8 Video Encoder安装事项
- 阿里三面+技术面试+两轮交叉面试+HR面试,终于艰难啃下了这份阿里淘宝的Offer
- 阿里巴巴中国站按关键字搜索工厂数据 API
- 【设计模式系列】5.装饰器模式和适配器模式