当前位置: 首页 > news >正文

11、监测数据采集物联网应用开发步骤(8.2)

  1. 监测数据采集物联网应用开发步骤(8.1)

新建TCP/IP Client线程类com.zxy.tcp.ClientThread.py

#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''import datetime
import socket
import threading
import timefrom com.zxy.adminlog.UsAdmin_Log import UsAdmin_Log
from com.zxy.common import Com_Para
from com.zxy.common.Com_Fun import Com_Fun
from com.zxy.tcp.TcpClient import TcpClient
from com.zxy.z_debug import z_debug#监测数据采集物联网应用--TCP/IP Client线程
class ClientThread(z_debug):#断线重连idtTimeOut = 60sServerIP = "0.0.0.0"iPort = 6000connectionFlag = Falsedef __init__(self, timeout, ServerIP, temPort):self.idtTimeOut = timeoutself.sServerIP = ServerIPself.iPort = temPort#inputFlag网络链接是否正常def set_dSockList(self,inputFlag):key = str(self.sServerIP)+"|"+str(self.iPort) #存在if key not in list(Com_Para.dSockList.keys()):Com_Para.dSockList[key] = [0,datetime.datetime.now()]if inputFlag == False:objAry = Com_Para.dSockList[key]if objAry[0] <= int(180 / self.idtTimeOut)+12:objAry[0] = objAry[0] + 1objAry[1] = datetime.datetime.now()Com_Para.dSockList[key] = objAryelse:Com_Para.dSockList[key] = [0,datetime.datetime.now()]    #判断上次链接时间频率是否合规def judge_dSock(self):key = str(self.sServerIP)+"|"+str(self.iPort) if key not in list(Com_Para.dSockList.keys()):Com_Para.dSockList[key] = [0,datetime.datetime.now()]objAry = Com_Para.dSockList[key]starttime = datetime.datetime.now()if objAry[0] <= int(120 / self.idtTimeOut)+1:return Trueelif objAry[0] <= int(120 / self.idtTimeOut)+7 and starttime >= objAry[1] + datetime.timedelta(minutes=10):return Trueelif objAry[0] <= int(120 / self.idtTimeOut)+12 and starttime >= objAry[1] + datetime.timedelta(hours=1):return Trueelif objAry[0] > int(120 / self.idtTimeOut)+12 and starttime >= objAry[1] + datetime.timedelta(hours=1):return Trueelse:return Falsedef run(self):starttime = datetime.datetime.now()       endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)        ckeys = self.sServerIP + "|" + str(self.iPort)tc = TcpClient(ckeys)t = None        try:#判断上次链接时间频率是否合规if not self.judge_dSock():return Nones = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((self.sServerIP, self.iPort))Com_Fun.SetHashTable(Com_Para.dClientThreadList, ckeys, s)            self.set_dSockList(True)temResult = "*"Com_Fun.SendSocket(temResult,s)            t = threading.Thread(target=tc.client_link, name="ClientTh" + ckeys)t.start()except IOError as e:temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)uL.WriteLog()self.set_dSockList(False);while True:starttime = datetime.datetime.now()try:if t is None and starttime <= endtime:if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is not None:t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)t.start()time.sleep(self.idtTimeOut/2)elif starttime >= endtime:endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)                if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is None and self.judge_dSock():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((self.sServerIP, self.iPort))          self.set_dSockList(True)Com_Fun.SetHashTable(Com_Para.dClientThreadList, s.getpeername()[0]+"|"+str(s.getpeername()[1]), s)t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)t.start()time.sleep(self.idtTimeOut/2)#超过10分钟,重新计时elif (endtime - starttime).seconds > 10 * self.idtTimeOut:endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)else:time.sleep(self.idtTimeOut/2)except IOError as e:temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)uL.WriteLog()self.set_dSockList(False);def list_run(self):starttime = datetime.datetime.now()       endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)        ckeys = self.sServerIP + "|" + str(self.iPort)tc = TcpClient(ckeys)t = None        try:#判断上次链接时间频率是否合规if not self.judge_dSock():return Nones = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((self.sServerIP, self.iPort))Com_Fun.SetHashTable(Com_Para.dClientThreadList, ckeys, s)      self.set_dSockList(True)t = threading.Thread(target=tc.client_link, name="ClientTh" + ckeys)t.start()except IOError as e:temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)uL.WriteLog()            self.set_dSockList(False)while True:starttime = datetime.datetime.now()try:if t is None and starttime <= endtime:if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is not None:t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)t.start()time.sleep(self.idtTimeOut/2)elif starttime >= endtime:endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)                if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is None and self.judge_dSock():s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((self.sServerIP, self.iPort))Com_Fun.SetHashTable(Com_Para.dClientThreadList, s.getpeername()[0]+"|"+str(s.getpeername()[1]), s)   self.set_dSockList(True)t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)t.start()time.sleep(self.idtTimeOut/2)#超过10分钟,重新计时elif (endtime - starttime).seconds > 10 * self.idtTimeOut:endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)else:time.sleep(self.idtTimeOut/2)except IOError as e:temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)uL.WriteLog()self.set_dSockList(False);

新建tcp client数据接收插件类1 com.plugins.Usereflect.testClientReflectClass1.py

#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''
from com.zxy.z_debug import z_debug#监测数据采集物联网应用--往平台端发送数据协议拦截器,可组装发送平台数据协议程序
class testClientReflectClass1(z_debug):#接收到数据strResult        = ""#需要发送到服务端数据strSend          = ""#是否继续执行 1:继续执行 0:中断执行strContinue      = "1"        #所连接的远端IPstrIP            = ""def __init__(self):passdef init_start(self):#作为客户端接收数据拦截器if self.strResult == "A01":self.strSend = "#send to server data:server1"print("AAA作为客户端接收数据拦截器:"+self.strResult)self.strResult = "ok"#Com_Para.dClientThreadList  本机作为客户端连接socket list#Com_Para.htComPort          串口通讯hashtable <String, seria>
#         /*示例:此处写业务逻辑,最后给 strResult重新赋值*/
#         //self.strResult = "test"
#         //self.strSend = "发送到服务端数据"
#         /**************************************************/

新建tcp client数据接收插件类2 com.plugins.Usereflect.testClientReflectClass2.py

#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''
from com.zxy.z_debug import z_debug#监测数据采集物联网应用--往平台端发送数据协议拦截器,可组装发送平台数据协议程序
class testClientReflectClass2(z_debug):#接收到数据strResult        = ""#需要发送到服务端数据strSend          = ""#是否继续执行 1:继续执行 0:中断执行strContinue      = "1"        #所连接的远端IPstrIP            = ""def __init__(self):passdef init_start(self):#作为客户端接收数据拦截器if self.strResult == "A02":self.strSend = "#send to server data:server"print("BBB作为客户端接收数据拦截器:"+self.strResult)self.strResult = "ok"#Com_Para.dClientThreadList  本机作为客户端连接socket list#Com_Para.htComPort          串口通讯hashtable <String, seria>
#         /*示例:此处写业务逻辑,最后给 strResult重新赋值*/
#         //self.strResult = "test"
#         //self.strSend = "发送到服务端数据"
#         /**************************************************/

com.zxy.main.Init_Page.py中添加代码

    @staticmethoddef Start_Client():       try: for temSIP in Com_Para.ServerIPList.split(";"):if temSIP != "":sttem = ClientThread(10, temSIP.split(":")[0], int(temSIP.split(":")[1]))# TCP客户端案例t4tem = threading.Thread(target=sttem.list_run, name="ClientMainThread" + temSIP.split(":")[0])t4tem.start()except Exception as e:print("TCP client error:" + repr(e)+"=>"+str(e.__traceback__.tb_lineno))finally:Pass

TCP Client测试案例MonitorDataCmd.py主文件中编写:

在    if __name__ == '__main__':下添加

        #TCP Client配置服务端ip及端口参数Com_Para.ServerIPList = "127.0.0.1:5002;127.0.0.1:5003"#TCP/IP client连接初始化Init_Page.Start_Client()#暂停3秒钟,tcp client连接需要时间time.sleep(3)#测试TCP/IP client发送数据tcSock = Com_Fun.GetHashTableNone(Com_Para.dClientThreadList,"127.0.0.1|5002")#作为客户端接收数据拦截器Com_Para.ClientREFLECT_IN_CLASS = "com.plugins.usereflect.testClientReflectClass1"if tcSock != None:temStr = "TCP client往服务端发送数据:"+Com_Fun.GetTimeDef()+"\r\n"print("开始准备发送数据")Com_Fun.SendSocket(temStr, tcSock)print("TCP client往服务端发送数据")else:print("TCP Client未准备好")#改变下作为客户端接收数据拦截器#Com_Para.ClientREFLECT_IN_CLASS = "com.plugins.usereflect.testClientReflectClass2"#接收数据解析插件已经改变了

运行测试结果如下图:

监测数据采集物联网应用开发步骤(9.1)

相关文章:

11、监测数据采集物联网应用开发步骤(8.2)

监测数据采集物联网应用开发步骤(8.1) 新建TCP/IP Client线程类com.zxy.tcp.ClientThread.py #! python3 # -*- coding: utf-8 -Created on 2017年05月10日 author: zxyong 13738196011 import datetime import socket import threading import timefrom com.zxy.adminlog.Us…...

【PWN · ret2text | RISC-V异构】[2023 羊城杯]login

第一道异构PWN的题目&#xff0c;没做出来。。。。但是是因为工具没有 QAQ 目录 前言 一、食用工具 Ghidra 安装使用 二、解题思路 三、exp 总结 前言 我们context.arch经常是i386和amd64&#xff0c;突然遇到RISC-V架构的题目&#xff0c;一是本地运行不了&#xff08…...

【HBZ分享】TCP可靠性传输如何保证的?以及传输优化之Nagle算法

ACK机制 ACK机制是发送方与接收方的一个相互确认客户端向服务端发送连接请求&#xff0c;此时服务端要回馈给客户端ACK&#xff0c;以表示服务端接到了客户端请求&#xff0c;这是第一和的第二次握手客户端接收到服务端响应后&#xff0c;同样也要回馈服务端的响应&#xff0c…...

智能电销机器人,主要体现的价值是什么

21世纪科技的迅速发展&#xff0c;人工智能逐渐走入大家的视线&#xff0c;越来越多的机器人出现在我们生活中。见的最多的有电销公司的智能语音机器人、在仓库拣货打包的机器人、商场店铺供娱乐对话的机器人。机器人活跃在各行各业中&#xff0c;降低了人工成本&#xff0c;代…...

Win7系统电脑开机总出现硬盘自检的简单解决方法

你是不是经常会遇到电脑开机进行硬盘自检&#xff0c;而且每次开机都检查很久不能跳过&#xff1b;怎么才能跳过这一步骤呢&#xff1f;下面教大家如何让Win7系统电脑在开机的时候跳过硬盘自检这一步骤&#xff0c;加快开机时间。 解决步骤&#xff1a; 1、按下“Win R”快捷键…...

计网第四章(网络层)(五)

目录 静态路由配置 默认路由&#xff1a; 特定主机路由&#xff1a; 示例&#xff1a; 广播域和冲突域&#xff1a; 静态路由配置 在第四节&#xff08;计网第四章&#xff08;网络层&#xff09;&#xff08;四&#xff09;_永无魇足的博客-CSDN博客&#xff09;有提到过…...

ios 手机浏览器,点击输入框页面会放大

一个普通的h5静态页面&#xff0c;在ios手机上用浏览器打开&#xff0c;发现每次聚焦输入框的时候整个页面都会放大&#xff01; 解决办法在html的头部meta标签中设置 user-scalableno viewport meta 标记 - HTML&#xff08;超文本标记语言&#xff09; | MDN...

全局异常处理

案例一&#xff1a; 自定义异常 public class StudentException extends RuntimeException {private Integer code;private String msg;public StudentException(Integer code, String msg) {this.code code;this.msg msg;}/*** 这里需要重写 getMessage方法&#xff0c;否…...

更健康舒适更科技的照明体验!SUKER书客护眼台灯 L1上手体验

低价又好用的护眼台灯是多数人的需求&#xff0c;很多人只追求功能性护眼台灯&#xff0c;显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到&#xff0c;然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯&#xff0c;拥有高品质光源&#xff…...

Locked勒索病毒:最新变种.locked袭击了您的计算机?

导言&#xff1a; 在今天的数字时代&#xff0c;勒索病毒已经不再是仅仅让数据变得不可访问的小威胁。 .locked 勒索病毒&#xff0c;作为其中的一种&#xff0c;以其高度复杂的加密算法和迅速变化的攻击手法而备受恶意分子喜爱。本文91数据恢复将带您深入了解 .locked 勒索病毒…...

随机森林算法

介绍 随机森林是一种基于集成学习的有监督机器学习算法。随机森林是包含多个决策树的分类器&#xff0c;一般输出的类别是由决策树的众数决定。随机森林也可以用于常见的回归拟合。随机森林主要是运用了两种思想。具体如下所示。 Breimans的Bootstrap aggregatingHo的random …...

如何将国标规范用EndNote插入到英文期刊中,自定义文献插入指南

EndNote自定义文献 1.插入国标JTG 2034-2020这种新建一个Standard![](https://img-blog.csdnimg.cn/406cf11d1496431a9cf784f3ab71c6a1.png)Reference填入信息参考 插入英文期刊规范ASTM 1.插入国标JTG 2034-2020这种 首先找到大家要投稿的英文期刊&#xff0c;然后去找那些中…...

重写 UGUI

重写Button using UnityEngine; using UnityEngine.UI; public class MyButton : Button {[SerializeField] private int _newNumber; }using UnityEditor;//编辑器类在UnityEditor命名空间下。所以当使用C#脚本时&#xff0c;你需要在脚本前面加上 "using UnityEditor&q…...

合宙Air724UG LuatOS-Air LVGL API控件--容器 (Container)

容器 (Container) 容器是 lvgl 相当重要的一个控件了&#xff0c;可以设置布局&#xff0c;容器的大小也会自动进行调整&#xff0c;利用容器可以创建出自适应成都很高的界面布局。 代码示例 – 创建容器 cont lvgl.cont_create(lvgl.scr_act(), nil) lvgl.obj_set_auto_re…...

代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树

代码随想录训练营第41天|343.整数拆分&#xff0c;96.不同的二叉搜索树 343.整数拆分文章思路代码 96.不同的二叉搜索树文章思路代码 总结 343.整数拆分 文章 代码随想录|0343.整数拆分 思路 二刷不难 d p [ i ] M a x j ( m a x ( j 1 , d p [ j ] ) ∗ ( i − j ) ) \…...

高防服务器与云防产品都适用哪些情况

高防服务器与云防护产品&#xff08;如高防IP&#xff0c;高防CDN&#xff09;都可以对DDOS、CC等攻击进行防护&#xff0c;在现如今的互联网市场上&#xff0c;不法分子经常会通过DDOS、CC等攻击服务器&#xff0c;干扰业务正常运行&#xff0c;以此来获得利益。 高防服务器是…...

【广州华锐互动】AR远程连接专家进行协同管理,解放双手让协同更便捷

AR远程协同系统是一种基于AR技术&#xff0c;实现远程设备维修和技术支持的系统。该系统通过将虚拟信息叠加在现实世界中&#xff0c;实现对设备的全方位监控和管理&#xff0c;并可以通过AR眼镜等终端设备&#xff0c;实时查看设备的各项数据和信息&#xff0c;为设备维修提供…...

PNG图片压缩原理

png&#xff1f;&#xff1f;png的图片我们每天都在用&#xff0c;可是png到底是什么&#xff0c;它的压缩原理是什么&#xff1f; 很好&#xff0c;接下来我将会给大家一一阐述。 什么是PNG PNG的全称叫便携式网络图型&#xff08;Portable Network Graphics&#xff09;是…...

[ Linux Audio 篇 ] Linux Audio 子系统资料集锦

Linux Audio 子系统资料 背景OSS VS ALSAALSA 驱动ALSA libALSA Plugin音频延迟音频调试音频书籍 背景 最近需要准备Linux Audio 相关的PPT&#xff0c;于是将以往的知识点和遇到的问题进行整理和梳理&#xff0c;以便向大家讲解。同时&#xff0c;还整理了在这个过程中发现的…...

VR全景对行业发展有什么帮助?VR全景制作需要注意什么?

引言&#xff1a; 虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;早已不再是科幻电影的概念&#xff0c;而是在以惊人的速度改变着我们的世界。VR全景&#xff0c;作为其中的重要组成部分&#xff0c;正为多个行业带来了全新的机遇。 一、VR全景的应用领…...

别只盯着心跳了!CANopen主站用SDO还能配置这些关键参数(附PDO映射实例)

别只盯着心跳了&#xff01;CANopen主站用SDO还能配置这些关键参数&#xff08;附PDO映射实例&#xff09; 在工业自动化领域&#xff0c;CANopen协议因其高可靠性和灵活性成为设备互联的首选方案之一。许多工程师对通过SDO&#xff08;服务数据对象&#xff09;配置心跳时间已…...

开源音频工作站Audacity:专业级音频处理的自由解决方案

开源音频工作站Audacity&#xff1a;专业级音频处理的自由解决方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 在数字音频创作领域&#xff0c;专业软件往往意味着高昂的许可费用和陡峭的学习曲线。Audacity作…...

Android设备性能优化:Universal Android Debloater的技术实现与应用指南

Android设备性能优化&#xff1a;Universal Android Debloater的技术实现与应用指南 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery li…...

nli-distilroberta-base多场景:科研论文摘要与结论段落逻辑支撑关系分析

nli-distilroberta-base多场景&#xff1a;科研论文摘要与结论段落逻辑支撑关系分析 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)Web服务&#xff0c;专门用于分析两个句子之间的逻辑关系。这个轻量级模型在学术写作领域具有独特价值&…...

FastAdmin定时任务实战:从数据库备份到邮件提醒的5个真实场景配置

FastAdmin定时任务实战&#xff1a;从数据库备份到邮件提醒的5个真实场景配置 在FastAdmin的实际开发中&#xff0c;定时任务就像一位不知疲倦的助手&#xff0c;能够自动完成各种重复性工作。但很多开发者掌握了基础配置后&#xff0c;却不知道如何将其应用到真实业务场景中。…...

Claude Code + DeepSeek:用自然语言从PRD到上线的打地鼠游戏全流程实录

Claude Code DeepSeek&#xff1a;用自然语言从PRD到上线的打地鼠游戏全流程实录 最近在技术社区里&#xff0c;一个有趣的趋势正在兴起——开发者们开始尝试用自然语言描述需求&#xff0c;然后让AI编程助手自动完成从文档编写到代码生成的全流程。这听起来像科幻小说里的场景…...

告别VSCode与VS:在CLion中构建LVGL模拟器的完整实践(Windows 10)

1. 为什么选择CLion开发LVGL模拟器 作为一个长期在嵌入式领域摸爬滚打的开发者&#xff0c;我深知开发环境统一的重要性。LVGL作为轻量级嵌入式GUI库&#xff0c;官方推荐了VSCode和Visual Studio作为主要开发工具&#xff0c;但这并不意味着我们不能在CLion中实现同样的功能。…...

零知识证明终极指南:Awesome ZKP项目快速入门教程

零知识证明终极指南&#xff1a;Awesome ZKP项目快速入门教程 【免费下载链接】awesome-zero-knowledge-proofs A curated list of awesome things related to learning Zero-Knowledge Proofs (ZKP). 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-zero-knowledge-p…...

基于SSM + Vue的二手物品交易网站系统(角色:用户、管理员)

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…...

OpenClaw镜像体验方案:星图平台GLM-4.7-Flash沙盒环境快速验证

OpenClaw镜像体验方案&#xff1a;星图平台GLM-4.7-Flash沙盒环境快速验证 1. 为什么选择云端沙盒验证OpenClaw 去年冬天&#xff0c;当我第一次尝试在本地MacBook上部署OpenClaw时&#xff0c;整整浪费了一个周末的时间。从Node.js版本冲突到Python依赖缺失&#xff0c;再到…...