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.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的题目,没做出来。。。。但是是因为工具没有 QAQ 目录 前言 一、食用工具 Ghidra 安装使用 二、解题思路 三、exp 总结 前言 我们context.arch经常是i386和amd64,突然遇到RISC-V架构的题目,一是本地运行不了(…...
【HBZ分享】TCP可靠性传输如何保证的?以及传输优化之Nagle算法
ACK机制 ACK机制是发送方与接收方的一个相互确认客户端向服务端发送连接请求,此时服务端要回馈给客户端ACK,以表示服务端接到了客户端请求,这是第一和的第二次握手客户端接收到服务端响应后,同样也要回馈服务端的响应,…...
智能电销机器人,主要体现的价值是什么
21世纪科技的迅速发展,人工智能逐渐走入大家的视线,越来越多的机器人出现在我们生活中。见的最多的有电销公司的智能语音机器人、在仓库拣货打包的机器人、商场店铺供娱乐对话的机器人。机器人活跃在各行各业中,降低了人工成本,代…...
Win7系统电脑开机总出现硬盘自检的简单解决方法
你是不是经常会遇到电脑开机进行硬盘自检,而且每次开机都检查很久不能跳过;怎么才能跳过这一步骤呢?下面教大家如何让Win7系统电脑在开机的时候跳过硬盘自检这一步骤,加快开机时间。 解决步骤: 1、按下“Win R”快捷键…...
计网第四章(网络层)(五)
目录 静态路由配置 默认路由: 特定主机路由: 示例: 广播域和冲突域: 静态路由配置 在第四节(计网第四章(网络层)(四)_永无魇足的博客-CSDN博客)有提到过…...
ios 手机浏览器,点击输入框页面会放大
一个普通的h5静态页面,在ios手机上用浏览器打开,发现每次聚焦输入框的时候整个页面都会放大! 解决办法在html的头部meta标签中设置 user-scalableno viewport meta 标记 - HTML(超文本标记语言) | MDN...
全局异常处理
案例一: 自定义异常 public class StudentException extends RuntimeException {private Integer code;private String msg;public StudentException(Integer code, String msg) {this.code code;this.msg msg;}/*** 这里需要重写 getMessage方法,否…...
更健康舒适更科技的照明体验!SUKER书客护眼台灯 L1上手体验
低价又好用的护眼台灯是多数人的需求,很多人只追求功能性护眼台灯,显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到,然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯,拥有高品质光源ÿ…...
Locked勒索病毒:最新变种.locked袭击了您的计算机?
导言: 在今天的数字时代,勒索病毒已经不再是仅仅让数据变得不可访问的小威胁。 .locked 勒索病毒,作为其中的一种,以其高度复杂的加密算法和迅速变化的攻击手法而备受恶意分子喜爱。本文91数据恢复将带您深入了解 .locked 勒索病毒…...
随机森林算法
介绍 随机森林是一种基于集成学习的有监督机器学习算法。随机森林是包含多个决策树的分类器,一般输出的类别是由决策树的众数决定。随机森林也可以用于常见的回归拟合。随机森林主要是运用了两种思想。具体如下所示。 Breimans的Bootstrap aggregatingHo的random …...
如何将国标规范用EndNote插入到英文期刊中,自定义文献插入指南
EndNote自定义文献 1.插入国标JTG 2034-2020这种新建一个StandardReference填入信息参考 插入英文期刊规范ASTM 1.插入国标JTG 2034-2020这种 首先找到大家要投稿的英文期刊,然后去找那些中…...
重写 UGUI
重写Button using UnityEngine; using UnityEngine.UI; public class MyButton : Button {[SerializeField] private int _newNumber; }using UnityEditor;//编辑器类在UnityEditor命名空间下。所以当使用C#脚本时,你需要在脚本前面加上 "using UnityEditor&q…...
合宙Air724UG LuatOS-Air LVGL API控件--容器 (Container)
容器 (Container) 容器是 lvgl 相当重要的一个控件了,可以设置布局,容器的大小也会自动进行调整,利用容器可以创建出自适应成都很高的界面布局。 代码示例 – 创建容器 cont lvgl.cont_create(lvgl.scr_act(), nil) lvgl.obj_set_auto_re…...
代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树
代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树 343.整数拆分文章思路代码 96.不同的二叉搜索树文章思路代码 总结 343.整数拆分 文章 代码随想录|0343.整数拆分 思路 二刷不难 d p [ i ] M a x j ( m a x ( j 1 , d p [ j ] ) ∗ ( i − j ) ) \…...
高防服务器与云防产品都适用哪些情况
高防服务器与云防护产品(如高防IP,高防CDN)都可以对DDOS、CC等攻击进行防护,在现如今的互联网市场上,不法分子经常会通过DDOS、CC等攻击服务器,干扰业务正常运行,以此来获得利益。 高防服务器是…...
【广州华锐互动】AR远程连接专家进行协同管理,解放双手让协同更便捷
AR远程协同系统是一种基于AR技术,实现远程设备维修和技术支持的系统。该系统通过将虚拟信息叠加在现实世界中,实现对设备的全方位监控和管理,并可以通过AR眼镜等终端设备,实时查看设备的各项数据和信息,为设备维修提供…...
PNG图片压缩原理
png??png的图片我们每天都在用,可是png到底是什么,它的压缩原理是什么? 很好,接下来我将会给大家一一阐述。 什么是PNG PNG的全称叫便携式网络图型(Portable Network Graphics)是…...
[ Linux Audio 篇 ] Linux Audio 子系统资料集锦
Linux Audio 子系统资料 背景OSS VS ALSAALSA 驱动ALSA libALSA Plugin音频延迟音频调试音频书籍 背景 最近需要准备Linux Audio 相关的PPT,于是将以往的知识点和遇到的问题进行整理和梳理,以便向大家讲解。同时,还整理了在这个过程中发现的…...
VR全景对行业发展有什么帮助?VR全景制作需要注意什么?
引言: 虚拟现实(Virtual Reality,简称VR)早已不再是科幻电影的概念,而是在以惊人的速度改变着我们的世界。VR全景,作为其中的重要组成部分,正为多个行业带来了全新的机遇。 一、VR全景的应用领…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
