热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

qt物联网平台

本文主要分享【qt物联网平台】,技术文章【Qt编写物联网管理平台48-特色功能设计】为【feiyangqingyun】投稿,如果你遇到Qt-物联网管理平台相关问题,本文相关知识或能到你。qt物联网平

本文主要分享【qt物联网平台】,技术文章【Qt编写物联网管理平台48-特色功能设计】为【feiyangqingyun】投稿,如果你遇到Qt-物联网管理平台相关问题,本文相关知识或能到你。

qt物联网平台

一、前言

在物联网管理平台的实际现场应用过程中,遇到过大大小小几十个改进的需求点,这些需求点都是实际用户提出来的,一方面为了方便用户使用提高用户体验,一方面为了提升整体的整个系统的完整性,甚至有些需求说的不好听一点就是造假,比如硬件设备精度不够,会短暂的在某些值附近飘动,但是客户端采集到数据后,如果该值刚好在报警值附近飘动,不能说是报警,因为也有可能是干扰引起的飘动,这种严格意义上说又不算是报警,只有持续超过了报警值,才算是真正的报警,所以需要设计一个报警延时参数,超过了延时时间还处于报警则认为是报警。

存储周期很好理解,就是多久存储一次这个设备的记录值,有些设备很重要,可以将这个存储周期设置的小一点,比如5s就存储一个值,有些不大重要的,可以设置一个很大的值,这样可以因地制宜,省下不少的存储空间。报警类型也是一个很好的参数规则,对于我们常见的规则就是大于上限值属于高报,低于下限值属于低报,比如温度就属于这个情况。而有些气体是高于最小值属于低报,高于最大值属于高报,相当于一定要低于最低值才是正常的,有毒气体一般都属于这个类型。有些特定环境又是要求气体的浓度超过最大值才正常比如氧气,要求超过最大值才是正常,最大值和最小值中间是低报,小于最小值是高报,因为氧气太少了属于最紧急的事件。

字段说明

编 号:节点的编号,从1开始。位 号:探测器的位置编号,用于唯一标识一个探测器。控 制 器:对应挂载的主设备名称。探 测 器:探测器的名称,方便记忆,可以填写地理位置。地 址:探测器对应在控制器的编号索引。型 号:探测器的型号,从下拉框选择。气体种类:探测器对应采集的气体的种类。气体型号:探测器对应采集气体的型号。上 限 值:报警的上限值。下 限 值:报警的下限值最 大 值:最大的警戒值,超过该值则显示为该值。消 零:最小的警戒值,小于该值则显示0,大于显示真实值。量 程:假设量程0.25则 实际数=模拟量/4000x量程 模拟量就是采集的值。状 态:默认启用,当某个探测器未接时候可以选择禁用。声 音:报警后对应的声音文件。地 图:探测器所位于的地图文件。存 储:探测器记录存储的周期,单位分钟。即隔多久存储一次记录到本地。小 数 点:计算解析数据的数据位对应的小数点位数。报警延时:报警后,延时多久处理,以便过滤数据抖动偏差造成的误报。默认0。报警类型:HH LL HL。X坐 标:探测器位于地图上的X坐标。Y坐 标:探测器位于地图上的Y坐标。 二、功能特点 2.1 软件模块 设备监控模块,包括数据监控(表格形式展示)、设备面板(面板形式展示)、地图监控(地图形式展示)、曲线监控(曲线形式展示)。数据查询模块,包括报警记录、运行记录、操作记录。系统设置模块,包括基本设置、端口管理、控制器管理、探测器管理、报警联动、类型设置等。其他设置模块,包括用户管理、地图管理、位置调整、组态设计、设备调试等。 2.2 基础功能 设备数据采集,支持串口、网络,串口可设置串口号、波特率,网络可设置IP地址、通讯端口。每个端口支持采集周期时间,默认1秒钟一个设备。支持设置通讯超时次数,默认3次。支持最大重连时间,用于重新读取离线的设备。控制器信息,能够添加控制器名称,选择控制器地址、控制器型号,设置该控制器下面的探测器数量。探测器信息,能够添加位号、探测器型号、气体种类、气体符号、高报值、低报值、缓冲值、清零值、是否启用、报警声音、背景地图、存储周期、数值换算小数点位数、报警延时时间、报警的类型(HH,LL,HL)等。类型管理可配置控制器型号、探测器型号、气体种类、气体符号等。地图支持导入和删除,所有的探测器在地图上的位置可自由拖动保存。端口信息、控制器信息、探测器信息、类型信息、用户信息等,都支持导入、导出、导出到excel、打印。运行记录、报警记录、操作记录,都支持多条件组合查询,比如时间段、控制器、探测器等,所有记录支持导出到excel/pdf和打印。运行记录、报警记录、操作记录都可删除指定时间范围内的数据。系统设置可选择对应表最大保存记录数,自动清理早期数据,留出足够的空间存储重要的数据。报警短信转发,支持多个接收手机号码,可设定发送间隔,比如即时发送或者6个小时发送一次所有的报警信息,短信内容过长,自动拆分多条短信。报警邮件转发,支持多个接收邮箱,可设定发送间隔,比如即时发送或者6个小时发送一次所有的报警信息,支持附件发送。设置软件的中文标题、英文标题、logo路径、版权所有等。开关设置开机运行、报警声音、自动登录、记住密码等。报警声音可设置播放次数,界面风格样式提供18套皮肤文件选择。用户管理,包括用户权限配置,不同用户可以有不同模块的权限。用户登录和用户退出,可以记住密码和自动登录,超过三次报错提示并关闭程序。四种监控模式,设备面板监控、地图监控、表格数据监控、曲线数据监控,可自由切换,四种模式下都实时展示采集到的数据,报警闪烁等。报警继电器联动,一个位号可以跨串口联动多个模块和继电器号,支持多对多。 2.3 特色功能 通信协议支持modbus_com、modbus_tcp_rtu,后期拓展mqtt等协议。数据源除了真实的硬件设备采集,还可选数据库采集,这样用户可以安排其他程序员比如java程序员将前端采集好的数据放到数据库,本系统直接从数据库采集即可。数据库采集模式可以作为通用的系统使用,更适合多人多系统协作。智能跳过超时的设备,加快对在线设备的采集速度,当设备数量很多的时候尤其有用。对智能跳过的超时的设备,在设定的重连时间自动采集一次,以便探测设备是否又重新上线。每个探测器可控是否启用,不启用则不会采集,也不会在界面显示,相当于运行阶段临时关闭。探测器可设置缓冲值和报警延时时间,在该值附近波动产生的报警,不计入报警,只有持续处于报警值且超过报警延时时间才算真正报警,这样可以规避很多波动导致的误报。探测器可设置存储周期,按照设定的时间来存储一条运行记录,可以按照重要程度对重要性高的设定存储周期短一些,不重要的设定大一些,这样可以节省不少的存储空间,也保证了重要的数据及时存储。探测器可设置清零值,在一些高精度高灵敏的设备可能出厂的时候默认值未必是0,需要设定清零值来表示初始值。探测器可设置小数点,用于计算后的真实数据控制小数点点位显示,相当于除以10、除以100、除以1000,这样大部分的探测器数据直接通过小数点位设置控制真实换算后的值,极个别的需要特殊转换的可以在通信协议中约定。探测器报警的类型支持多种,有些设备是高于某个值高报,低于某个值低报,而有些设备是在最小值最大值范围内是高报,低于最小值低报,高于最大值正常。这样可以分情况处理,涵盖各种报警类型。原创数据导入、导出、打印机制,跨平台不依赖任何组件,瞬间导出数据。导出到excel的记录支持所有excel、wps等表格文件版本,不依赖excel等软件。高报颜色、低报颜色、正常颜色、默认值颜色等,都可以自由设置。支持云端数据同步,将本地采集到的数据实时同步到云端。支持网络转发和网络接收,网络接收开启后,软件从udp接收数据进行解析。网络转发支持多个目标IP,这样就实现了本地采集的软件,自由将数据转到客户端,随时查看采集到的数据。自动记住用户最后停留的界面以及其他配置信息,重启后自动应用。报警自动切换到对应的地图,探测器按钮闪烁,表格数据对应颜色显示。双击探测器图标,弹出对应探测器详细信息,可以根据需要定制回控操作。数据库支持多种,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。本地设备采集到的数据实时上传到云端,以便手机APP或者web等其他方式提取。自带设备模拟工具,支持不同型号的多个设备数据模拟,同时还带数据库数据模拟,以便在没有设备的时候测试数据。标准modbus协议,各种控制器类型、探测器类型、种类、符号等全部自定义,非常灵活和强大,通信协议示例数据非常完整,通用各种modbus协议系统,适用于各种应用场景接入。同时集成了串口通信、网络通信、数据库通信、数据导入导出打印、通信协议解析、界面UI、全局换肤等众多组件和知识点,非常适合新手入门和进阶。支持xp、win7、win10、、win11、linux、mac、各种国产系统(UOS、中标麒麟、银河麒麟等)、嵌入式linux等系统。注释完整,项目结构清晰,超级详细完整的使用开发手册,精确到每个代码文件的功能说明,不断持续迭代版本。 三、体验地址 国内站点:https://gitee.com/feiyangqingyun国际站点:https://github.com/feiyangqingyun个人主页:https://blog.csdn.net/feiyangqingyun知乎主页:https://www.zhihu.com/people/feiyangqingyun产品主页:https://blog.csdn.net/feiyangqingyun/article/details/97565652在线文档:https://feiyangqingyun.gitee.io/qwidgetdemo/iotsystem/体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_iotsystem.zip。文章导航:https://qtchina.blog.csdn.net/article/details/121330922 四、效果图

qt物联网平台


qt物联网平台


qt物联网平台


qt物联网平台

五、相关代码
void DeviceServer::doReceiveValue(const QString &portName, quint8 addr, const QList<quint16> &values)
{
   
    //找到设备名称
    QString deviceName = DbQuery::getDeviceName(portName, addr);
    //找到当前索引位置的设备地址对应探测器的最小寄存器地址
    //如果读取的起始寄存器地址是5则回来的数据位第一个是寄存器地址5的数据,后面连续
    quint16 nodeMinAddr = DbQuery::getNodeMinAddr(portName, addr);

    //根据不同的探测器对应的小数点,换算值
    QList<float> datas;
    foreach (quint16 value, values) {
   
        datas << value;
    }

    for (int i = 0; i < DbData::NodeInfo_Count; ++i) {
   
        if (DbData::NodeInfo_DeviceName.at(i) == deviceName) {
   
            //有时候可能出现总共添加了8个探测器但是真实读到4个探测器的情况
            int startIndex = DbData::NodeInfo_NodeAddr.at(i) - nodeMinAddr - 1;
            if (startIndex >= datas.count()) {
   
                continue;
            }

            QString positionID = DbData::NodeInfo_PositionID.at(i);
            float nodeMax = DbData::NodeInfo_NodeMax.at(i);
            float nodeMin = DbData::NodeInfo_NodeMin.at(i);
            float nodeRange = DbData::NodeInfo_NodeRange.at(i);
            int dotCount = DbData::NodeInfo_DotCount.at(i);

            //目前收到的值需要经过几层过滤计算才是真实的值
            //第一层是小数点(默认0),比如收到的值是1000,如果小数点设定的1则真实的是100
            //第二层是量程(默认0),比如收到998,如果设定的量程0.25则运算后 998/4000*0.25=0.062375
            //第三层是最大值(默认1000),假设设定的最大值1000,如果收到的值>1000则取1000,因为某些设备损坏或者误报采集到的是一个很大的不准确的值
            //第四层是清零值(默认0),假设设定的是50,则低于50都认为是0,因为某些设备损坏或者误报采集到的是一个很小的不准确的值

            //根据设定的小数点来重新计算真实的值
            float nodeValue = (float)values.at(startIndex);
            if (dotCount > 0) {
   
                nodeValue = nodeValue / qPow(10, dotCount);
            }

            //4218按照新的规则计算值 实际数=模拟量/4000*量程 模拟量就是采集的值
            if (nodeRange > 0) {
   
                nodeValue = (float)values.at(startIndex) / 4000 * nodeRange;
            }

            //如果收到的值大于最大值则取最大值作为当前的值
            nodeValue = nodeValue > nodeMax ? nodeMax : nodeValue;
            //如果设置了消零阀值,在未达到消零阀值时显示都是零,只有超过消零阀值才是显示真实值
            if (nodeRange == 0) {
   
                nodeValue = nodeValue < nodeMin ? 0 : nodeValue;
            }

            //精度过滤,避免精度过大显示太长
            nodeValue = QString::number(nodeValue, 'f', AppConfig::Precision).toFloat();

            //找到当前探测器处理探测器报警
            //如果当前值小于最小值而且当前不处于下限报警则触发报警
            //如果当前值大于最大值而且当前不处于上限报警则触发报警
            //0-低报 1-低报恢复 2-高报 3-高报恢复
            quint8 nodeStatus = 100;

            //根据设定的不同的报警类型处理,假定上限值100,下限值25
            //HH表示超过25是低报,超过100是高报
            //HL表示低于25是低报,超过100是高报
            //LL表示低于25是高报,低于100是低报
            QString alarmType = DbData::NodeInfo_AlarmType.at(i);
            if (alarmType == "HH") {
   
                doAlarmHH(nodeStatus, positionID, nodeValue, i);
            } else if (alarmType == "HL") {
   
                doAlarmHL(nodeStatus, positionID, nodeValue, i);
            } else if (alarmType == "LL") {
   
                doAlarmLL(nodeStatus, positionID, nodeValue, i);
            }

            //处理报警
            //qDebug() <
            doAlarm(nodeStatus, positionID, nodeValue, i);

            //没有变动的数据则无需处理,不然界面上一下子这么多数据刷新可能导致高CPU,一样的数据也没有必要
            if (DbData::NodeInfo_NodeValue.at(i) != nodeValue) {
   
                QString nodeSign = DbData::NodeInfo_NodeSign.at(i);
                DeviceHelper::deviceValue(positionID, nodeValue, nodeSign);
                DbData::NodeInfo_NodeValue[i] = nodeValue;
            }

            //云端数据同步
            if (AppConfig::UseNetDb) {
   
                QString sql = QString("update NodeData set NodeValue='%1',SaveTime='%2' where PositiOnID='%3'").arg(nodeValue).arg(DATETIME).arg(positionID);
                DbData::DbNet->append(sql);
            }

            datas[startIndex] = nodeValue;
        }
    }

    emit receiveValue(portName, addr, datas);
}

本文《Qt编写物联网管理平台48-特色功能设计》版权归feiyangqingyun所有,引用Qt编写物联网管理平台48-特色功能设计需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
author-avatar
曾雅芬珍念孟璇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有