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全景的应用领…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果。…...
