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端的页面,也就是前端的页面,或者已经上服的页面,但也想生成一个安卓端供用户使用,本教程详细讲解如何把前…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
