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

news2024/10/7 8:20:23
  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 time

from 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 = 60
    sServerIP = "0.0.0.0"
    iPort = 6000
    connectionFlag = False
    
    def __init__(self, timeout, ServerIP, temPort):
        self.idtTimeOut = timeout
        self.sServerIP = ServerIP
        self.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] + 1
            objAry[1] = datetime.datetime.now()
            Com_Para.dSockList[key] = objAry
        else:
            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 True
        elif objAry[0] <= int(120 / self.idtTimeOut)+7 and starttime >= objAry[1] + datetime.timedelta(minutes=10):
            return True
        elif objAry[0] <= int(120 / self.idtTimeOut)+12 and starttime >= objAry[1] + datetime.timedelta(hours=1):
            return True
        elif objAry[0] > int(120 / self.idtTimeOut)+12 and starttime >= objAry[1] + datetime.timedelta(hours=1):
            return True
        else:
            return False
        
    def 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 None
            s = 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 None
            s = 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"        
    #所连接的远端IP
    strIP            = ""
    
    def __init__(self):
        pass

    def 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"        
    #所连接的远端IP
    strIP            = ""
    
    def __init__(self):
        pass

    def 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中添加代码

    @staticmethod
    def 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ATA-1222A宽带放大器的电子实验案例(案例合集)

ATA-1222A宽带放大器是安泰电子打造的高带宽功放产品&#xff0c;其采用ClassAB的工作模式&#xff0c;带宽高达22MHz&#xff0c;饱和输出功率40W&#xff0c;能兼容全球不同地区的电源标准要求。凭借其优异的指标参数受到不少电子工程师的喜欢&#xff0c;其在电子实验中的应…

远程访问Linux的DataEase数据可视化分析,有哪些推荐的工具?

DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。 在本地搭建后,借助cpolar 内…

Densenet模型详解

模型介绍 DenseNet的主要思想是密集连接&#xff0c;它在卷积神经网络&#xff08;CNN&#xff09;中引入了密集块&#xff08;Dense Block&#xff09;&#xff0c;在这些块中&#xff0c;每个层都与前面所有层直接连接。这种设计可以让信息更快速地传播&#xff0c;有助于解…

数据可视化工具中的显眼包:奥威BI自带方案上阵

根据经验来看&#xff0c;BI数据可视化分析项目是由BI数据可视化工具和数据分析方案两大部分共同组成&#xff0c;且大多数时候方案都需从零开始&#xff0c;反复调整&#xff0c;会耗费大量时间精力成本。而奥威BI数据可视化工具别具匠心&#xff0c;将17年经验凝聚成标准化、…

(AcWing) spfa求最短路

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 impossible。 数据保证不存在负权回路。 输入格式 第一行包含整数 n 和…

indexDb使用

indexDb是什么&#xff1f; indexDb是除了cookie&#xff0c;localstorage&#xff0c;sessionstroage外的另一种前端存贮方式。 现有前端存贮比较 indexDb特点 无大小限制&#xff0c;适用于前端存贮数据较多场景存贮结构以对象仓库形式&#xff0c;可以存入任何类型数据&a…

企业智能知识管理在线工具语雀、helplook、石墨文档、Baklib怎么样?

语雀、helplook、石墨文档和Baklib都是企业智能知识管理的在线工具&#xff0c;它们都提供了一系列功能来帮助企业管理和共享知识。下面我将对这些工具进行详细的介绍和评价。 语雀&#xff1a; 语雀是一款功能强大的在线知识管理工具&#xff0c;它提供了丰富的功能和优秀的…

Java对接海康威视(二次开发)组织信息、人员信息等

一.获取合作方数据 1.在【综合安防平台】的【关于】中前往【运行管理中心】 2.输入账户和密码进入【运行管理中心】 3.点击【状态监控】,搜索【能力开放网关】&#xff0c;点击【API管理】&#xff0c;查询可以对接的接口&#xff0c;点击对应的接口名称可以查看请求参数和返回…

抽象又有点垃圾的JavaScript

常数的排序 let x 10;let y 20;let z;if (x < y) {z x;x y;y z;}console.log(x, y);//x 20 ,y 10 通过一个媒介来继承x的初始值&#xff0c;然后将y的值赋值给x&#xff0c;再把媒介z的值赋值给y&#xff0c;达到排序 一个可重复使用的排序程序 第一种 function s…

微力同步私人网盘部署教程:利用端口映射实现远程访问的解决方案

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

ReID网络:MGN网络(4) - Loss计算

1. MGN Loss MGN采用三元损失(Triplet Loss)。 三元损失主要用于ReID算法&#xff0c;目的是帮助网络学习到一个好的Embedding信息。之所以称之为三元损失&#xff0c;主要原因在于在训练中&#xff0c;参与计算Loss的分别有Anchor、Positive和Negative三方。 2. Triplet Lo…

实现远程访问Linux堡垒机:通过JumpServer系统进行安全的服务器管理

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

Vue2里监听localstorage里值的变化

有的时候,我们需要根据本地缓存在localstorage里值的变化做出相应的操作,这就需要我们监听localstorage: 首先,我们在src下的libs文件夹下新建一个stroage.js用于重写setItem事件,当使用setItem的时候,触发,window.dispatchEvent派发事件 const Stroage = {// 重写set…

8.Redis-set

Set 常用命令saddsmemberssismemberscardspopsmovesrem集合间操作sinter 交集sinterstoresunion 并集sunionstoresdiff 差集sdiffstore 命令总结 内部编码应用场景使用 set来保存用户的“标签” set(集合)就是把一些有关联的数据放刀一起。 它与list的区别如下&#xff1a; 集合…

DP4863 国产双声道音频功率放大器芯片

产品概述&#xff1a; DP4863 电路是一种双声道桥接音频功率放大器。在 5 V 电源电压下&#xff0c;它能向 4 Ω 负载提供 2.2 W 的输出功率&#xff0c;或向 3 Ω 负载提供 2.5 W的输出功率&#xff0c;THD N 小于 1 %。此外&#xff0c;它还具有耳机输入端&#xff0c;可驱…

应用程序管理工具

应用程序管理是 DevOps 的重要组成部分。它可以定义为在所有阶段监控和管理软件应用程序的可用性、运行状况、性能和功能的过程&#xff0c;包括规划、设计、构建、测试、部署、维护和更新。这意味着应用程序从概念到停止都受到监控。 应用程序管理的重要性 管理应用程序可确…

关于一个git的更新使用流程

1.第一步使用git bash 使用git bash命令来进行操作&#xff08;当然我是个人比较喜欢用这种方法的&#xff09; 2. 第二步&#xff1a;连接 3.第三步&#xff1a;进入 4.第四步&#xff1a;查看分支 5.第五步&#xff1a;切换分支 将本地文件更新后之后进行提交 6.第六步&am…

山西电力市场日前价格预测【2023-09-01】

日前价格预测 预测明日&#xff08;2023-09-01&#xff09;山西电力市场全天平均日前电价为305.25元/MWh。其中&#xff0c;最高日前电价为349.30元/MWh&#xff0c;预计出现在19: 30。最低日前电价为240.52元/MWh&#xff0c;预计出现在12: 45。 价差方向预测 1&#xff1a; 实…

业主方怎么管理固定资产

业主方可以通过以下几种方式来管理固定资产&#xff1a; 建立资产管理制度&#xff1a;制定明确的资产采购、使用、维护、报废等流程和标准&#xff0c;确保资产管理的规范性和透明度。 采用专业的资产管理软件&#xff1a;通过数字化手段对固定资产进行管理和监控&#xff0c;…

【Dart】学习使用(二):基本类型

前言 基本类型是语言的基础。 Dart 语言支持以下基础类型&#xff1a;Numbers(int、double)&#xff0c; 整形Strings(String), 字符串Booleans(bool) , 布尔型Records((value1,value2)) 记录Lists(List ) 数组Sets(Set) 集合Maps(Map) 映射Runes(Runes,通常由 characters AP…