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全景的应用领…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
