- 监测数据采集物联网应用开发步骤(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)