3、监测数据采集物联网应用开发步骤(3)
- 监测数据采集物联网应用开发步骤(2)
系统整体结构搭建
新建项目

输入项目名称:MonitorData
所谓兵马未动粮草先行,按下图创建好对应的模块备用:

com.plugins 业务插件模块
com.zxy.adminlog 日志或文本文件读写模块
com.zxy.autoUpdate 程序版本自动更新模块
com.zxy.business 通用业务处理模块
com.zxy.common 通用函数模块
com.zxy.comport 串口通讯模块
com.zxy.db_Self 静态接口配置库(Sqlit3)模块
com.zxy.db1 静态接口配置库(Sqlit3)模块
com.zxy.db2 业务数据库(Sqlite3)模块
com.zxy.interfaceReflect 通用插件管理模块
com.zxy.main 全局变量初始化模块
com.zxy.taskhandler 定时器任务模块
com.zxy.tcp tcp协议模块
编写主程序代码MonitorDataCmd.py,打印启动时间,sleep 5秒,然后打印结束时间
#! python3
# -*- coding: utf-8 -
'''
Created on 2023年08月28日
@author: zxyong 13738196011
'''import time
from com.zxy.common.Com_Fun import Com_Fun#监测数据采集物联网应用-主程序
class MonitorDataCmd(object):def __init__(self, params):passif __name__ == '__main__':print("监测数据采集物联网应用软件开始:"+Com_Fun.GetTimeDef())time.sleep(5)print("监测数据采集物联网应用软件结束:"+Com_Fun.GetTimeDef())
新建通用函数代码com.zxy.common.Com_Fun.py
#! python3
# -*- coding: utf-8 -
'''
Created on 2023年08月28日
@author: zxyong 13738196011
'''import datetime,uuid,time
from datetime import timedelta#监测数据采集物联网应用--通用函数
class Com_Fun():def __init__(self):pass@staticmethoddef NoNull(objTag):if objTag is None:return ""else:return str(objTag)@staticmethoddef FloatNull(objTag):if objTag is None or objTag == "" or objTag == "-":return 0else:return float(objTag)@staticmethoddef ZeroNull(objTag):if objTag is None or objTag == "":return 0else:return int(objTag)@staticmethoddef GetLong(inputTimeFormat,inputTime):if len(inputTime) > 19:inputTime = inputTime[0:19]time1=datetime.datetime.strptime(inputTime.replace("T"," "),inputTimeFormat)return time.mktime(time1.timetuple())#获得当前时间戳@staticmethoddef getTimeLong():temT = datetime.datetime.now()timeStamp = time.mktime(temT.timetuple())return timeStamp#日期信息格式化timeFormat : '%Y-%m-%d %H:%M:%S'@staticmethoddef GetTime(inputTimeFormat):return datetime.datetime.now().strftime(inputTimeFormat)#日期信息格式化秒数据10整数化@staticmethoddef GetTimeNum(inputTime):temTime = datetime.datetime.strptime(inputTime.replace("T", " "),"%Y-%m-%d %H:%M:%S")temSB = temTime.strftime("%Y-%m-%d %H:%M")temSE = temTime.strftime("%S")temSec = int(int(temSE) / 10)return temSB+":"+str(temSec)+"0"#日期信息格式化timeFormat : '%Y-%m-%d %H:%M:%S'@staticmethoddef GetTimeDef():return str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))#日期信息格式化timeFormat : '%Y-%m-%d %H:%M:%S' 字符串@staticmethoddef GetTimeInput(inputTimeFormat,inputTime):if inputTime is None or inputTime == "":return "1900-01-01 00:00:00"time1=datetime.datetime.strptime(inputTime.replace("T", " "),inputTimeFormat)return time1#日期信息格式化timeFormat : '%Y-%m-%d %H:%M:%S' 字符串@staticmethoddef GetStrTimeInput(inputTimeFormat,inputTime):if inputTime is None or inputTime == "":return "1900-01-01 00:00:00"time1=datetime.datetime.strptime(inputTime.replace("T", " "),inputTimeFormat)return str(time1)#返回time格式@staticmethoddef GetToTimeInput(inputTimeFormat,inputTime):if inputTime is None or inputTime == "":return "1900-01-01 00:00:00"elif len(inputTime) <= 19:return datetime.datetime.strptime(inputTime.replace("T"," "),inputTimeFormat)else:return datetime.datetime.strptime(inputTime[0:19],inputTimeFormat)#日期信息格式化timeFormat : '%Y-%m-%d %H:%M:%S',返回字符串格式@staticmethoddef GetDateInput(inputDateFormat,inputTimeFormat,inputTime):if len(inputTime) < 10 or inputTime is None or inputTime == "":return "1900-01-01"time1=datetime.datetime.strptime(inputTime.replace("T"," "),inputTimeFormat)return time1.strftime(inputDateFormat)#(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)@staticmethoddef DateTimeAdd(inputDate,inputDateType,inputNum):#%d %H:%M:%Sdelta = Noneif inputDateType == "d":delta = timedelta(days=inputNum)elif inputDateType == "W":delta = timedelta(weeks=inputNum)elif inputDateType == "H":delta = timedelta(hours=inputNum)elif inputDateType == "M":delta = timedelta(minutes=inputNum)elif inputDateType == "S":delta = timedelta(seconds=inputNum)return inputDate + delta@staticmethoddef SetHashTable(inputHt,inputStrKey,inputStrValue):if inputHt is None:inputHt = {}inputHt[inputStrKey] = inputStrValue@staticmethoddef GetHashTable(inputHt,inputStrKey):if inputHt is None or inputStrKey not in list(inputHt.keys()):return ""else:return inputHt[inputStrKey]@staticmethoddef GetHashTableNone(inputHt,inputStrKey):if inputHt is None or inputStrKey not in list(inputHt.keys()):return Noneelse:return inputHt[inputStrKey]@staticmethoddef RemoveHashTable(inputHt,inputStrKey):if inputHt.get(inputStrKey) is not None:inputHt.pop(inputStrKey)@staticmethoddef Str_To_Int(inputStr):if inputStr is not None and inputStr != "":return int(inputStr)else:return 0@staticmethoddef Get_New_GUID():return str(uuid.uuid1()).upper()
运行程序,选择主程序右键:

程序执行结果:

恭喜你!系统整体结构搭建完成。
- 监测数据采集物联网应用开发步骤(4)
相关文章:
3、监测数据采集物联网应用开发步骤(3)
监测数据采集物联网应用开发步骤(2) 系统整体结构搭建 新建项目 输入项目名称:MonitorData 所谓兵马未动粮草先行,按下图创建好对应的模块备用: com.plugins 业务插件模块 com.zxy.adminlog 日志或文本文…...
MySQL用户管理及用户权限
目录 数据库用户管理 新建用户 查看用户 重命名用户rename 删除用户drop 修改用户密码 找回root密码 数据库用户授权 授予权限 查看用户权限 撤销用户权限 数据库用户管理 新建用户 CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];用户名:…...
Yolov8-pose关键点检测:模型轻量化创新 | PConv结合c2f | CVPR2023 FasterNet
💡💡💡本文解决什么问题:新的partial convolution(PConv),通过同时减少冗余计算和内存访问可以更有效地提取空间特征。 PConv| GFLOPs从9.6降低至8.5,参数量从6482kb降低至6134kb, mAP50从0.921提升至0.925 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.n…...
聊聊mybatis-plus的SafetyEncryptProcessor
序 本文主要研究一下mybatis-plus的SafetyEncryptProcessor SafetyEncryptProcessor mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/autoconfigure/SafetyEncryptProcessor.java public class SafetyEncryptProcessor implements EnvironmentPostProc…...
【PCL (Point Cloud Library)可视化点云的工具汇总】
PCL (Point Cloud Library)可视化点云的工具 PCL (Point Cloud Library) 提供了一系列的工具和类用于点云的可视化。以下是其中的一些主要工具和功能: pcl::visualization::CloudViewer: 如前所述,这是一个简单易用的可视化工具,主要用于基本的点云显示。pcl::visualizatio…...
实现 Trie (前缀树)
题目链接 实现 Trie (前缀树) 题目描述 注意点 word 和 prefix 仅由小写英文字母组成 解答思路 首先要理解前缀树是什么,参照该篇文章【图解算法】模板变式——带你彻底搞懂字典树(Trie树)在了解前缀树是什么后,设计前缀树就会更加容易,…...
ElasticSearch基础知识汇总
文章目录 前言一、认识ElasticSearch1.正向索引和倒排索引2. MySql与ElasticSearc3.IK分词器 二、ES索引库操作1.mapping映射属性2.索引库的CRUD 三、ES文档库操作 前言 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基…...
服务器数据库中了locked勒索病毒怎么办,locked勒索病毒恢复工具
最近一段时间网络上的locked勒索病毒非常嚣张,自从6月份以来,很多企业的计算机服务器数据库遭到了locked勒索病毒的攻击,起初locked勒索病毒攻击用友畅捷通T用户,后来七月份开始攻击金蝶云星空客户,导致企业的财务系统…...
没有 JavaScript 计时器的自动播放轮播 - CSS 动画
先看效果: 再看代码(查看更多): <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>计时器</title><style>* {padding: 0;margin: 0;box-siz…...
《Flink学习笔记》——第三章 Flink的部署模式
不同的应用场景,有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。 3.1 部署模式(作业角度/通用分类) 根据集群的生命周期、资源的分配方式、main方法到底在哪里执行——客户端还是Client还是JobManage…...
网络安全(黑客技术)0基础学习手册
目录梗概 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来…...
腾讯云服务器价格表大全_轻量服务器_CVM云服务器报价明细
腾讯云服务器租用费用表:轻量应用服务器2核2G4M带宽112元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天,腾讯云服务器网长期更新腾讯云轻量…...
vue中bus的使用和涉及到的问题
创建一个js文件 import Vue from "Vue" export default new Vue 我们可以直接在要使用的页面中引用使用 import bus from /assets/js/eventBus.js;bus.$emit("info", "123") // 使用bus.$on("info", (val) > { // 接收console.l…...
Flink的简要概述
以下是Flink的各种架构的简要概述: 1. Flink概述:Apache Flink是一个开源的流处理和批处理框架,具有高性能、容错性和数据一致性保证。它支持事件驱动的流处理和批量处理,并提供了丰富的API和工具来处理实时数据流和大规模数据集…...
多线程下的signal信号处理
多线程中,信号在哪个线程中处理是不确定的,可能被任意一个线程处理 下边的代码可以验证该结论,多次Ctrlc,会被不同的线程捕获此信号,并处理,最终每个线程死锁,阻塞在等待锁的状态 #include &l…...
〖Python网络爬虫实战㉞〗- 图形验证码OCR识别
订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者࿱…...
Python Scrapy网络爬虫框架从入门到实战
Python Scrapy是一个强大的网络爬虫框架,它提供了丰富的功能和灵活的扩展性,使得爬取网页数据变得简单高效。本文将介绍Scrapy框架的基本概念、用法和实际案例,帮助你快速上手和应用Scrapy进行数据抓取。 Scrapy是一个基于Python的开源网络爬…...
后端面试话术集锦第四篇:ElasticSearch面试话术
🚗后端面试集锦目录 💖后端面试话术集锦第 1 篇:spring面试话术💖 💖后端面试话术集锦第 2 篇:spring boot面试话术💖 💖后端面试话术集锦第 3 篇:spring cloud面试话术💖 💖后端面试话术集锦第 4 篇:ElasticSearch面试话术💖 💖后端面试话术集锦第 5 …...
C++之ifstream成员函数get、tellg、eof实例(一百八十五)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
安卓webview,网页端生成安卓项目(极速生成)教程
安卓webview,网页端生成安卓项目(极速生成)教程 一,前言 当自己做了一个PC端的页面,也就是前端的页面,或者已经上服的页面,但也想生成一个安卓端供用户使用,本教程详细讲解如何把前…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
