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


    1. 监测数据采集物联网应用开发步骤(8.1)

    新建TCP/IP Client线程类com.zxy.tcp.ClientThread.py

    1. #! python3
    2. # -*- coding: utf-8 -
    3. '''
    4. Created on 2017年05月10日
    5. @author: zxyong 13738196011
    6. '''
    7. import datetime
    8. import socket
    9. import threading
    10. import time
    11. from com.zxy.adminlog.UsAdmin_Log import UsAdmin_Log
    12. from com.zxy.common import Com_Para
    13. from com.zxy.common.Com_Fun import Com_Fun
    14. from com.zxy.tcp.TcpClient import TcpClient
    15. from com.zxy.z_debug import z_debug
    16. #监测数据采集物联网应用--TCP/IP Client线程
    17. class ClientThread(z_debug):
    18. #断线重连
    19. idtTimeOut = 60
    20. sServerIP = "0.0.0.0"
    21. iPort = 6000
    22. connectionFlag = False
    23. def __init__(self, timeout, ServerIP, temPort):
    24. self.idtTimeOut = timeout
    25. self.sServerIP = ServerIP
    26. self.iPort = temPort
    27. #inputFlag网络链接是否正常
    28. def set_dSockList(self,inputFlag):
    29. key = str(self.sServerIP)+"|"+str(self.iPort)
    30. #存在
    31. if key not in list(Com_Para.dSockList.keys()):
    32. Com_Para.dSockList[key] = [0,datetime.datetime.now()]
    33. if inputFlag == False:
    34. objAry = Com_Para.dSockList[key]
    35. if objAry[0] <= int(180 / self.idtTimeOut)+12:
    36. objAry[0] = objAry[0] + 1
    37. objAry[1] = datetime.datetime.now()
    38. Com_Para.dSockList[key] = objAry
    39. else:
    40. Com_Para.dSockList[key] = [0,datetime.datetime.now()]
    41. #判断上次链接时间频率是否合规
    42. def judge_dSock(self):
    43. key = str(self.sServerIP)+"|"+str(self.iPort)
    44. if key not in list(Com_Para.dSockList.keys()):
    45. Com_Para.dSockList[key] = [0,datetime.datetime.now()]
    46. objAry = Com_Para.dSockList[key]
    47. starttime = datetime.datetime.now()
    48. if objAry[0] <= int(120 / self.idtTimeOut)+1:
    49. return True
    50. elif objAry[0] <= int(120 / self.idtTimeOut)+7 and starttime >= objAry[1] + datetime.timedelta(minutes=10):
    51. return True
    52. elif objAry[0] <= int(120 / self.idtTimeOut)+12 and starttime >= objAry[1] + datetime.timedelta(hours=1):
    53. return True
    54. elif objAry[0] > int(120 / self.idtTimeOut)+12 and starttime >= objAry[1] + datetime.timedelta(hours=1):
    55. return True
    56. else:
    57. return False
    58. def run(self):
    59. starttime = datetime.datetime.now()
    60. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)
    61. ckeys = self.sServerIP + "|" + str(self.iPort)
    62. tc = TcpClient(ckeys)
    63. t = None
    64. try:
    65. #判断上次链接时间频率是否合规
    66. if not self.judge_dSock():
    67. return None
    68. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    69. s.connect((self.sServerIP, self.iPort))
    70. Com_Fun.SetHashTable(Com_Para.dClientThreadList, ckeys, s)
    71. self.set_dSockList(True)
    72. temResult = "*"
    73. Com_Fun.SendSocket(temResult,s)
    74. t = threading.Thread(target=tc.client_link, name="ClientTh" + ckeys)
    75. t.start()
    76. except IOError as e:
    77. temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)
    78. uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)
    79. uL.WriteLog()
    80. self.set_dSockList(False);
    81. while True:
    82. starttime = datetime.datetime.now()
    83. try:
    84. if t is None and starttime <= endtime:
    85. if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is not None:
    86. t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)
    87. t.start()
    88. time.sleep(self.idtTimeOut/2)
    89. elif starttime >= endtime:
    90. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)
    91. if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is None and self.judge_dSock():
    92. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    93. s.connect((self.sServerIP, self.iPort))
    94. self.set_dSockList(True)
    95. Com_Fun.SetHashTable(Com_Para.dClientThreadList, s.getpeername()[0]+"|"+str(s.getpeername()[1]), s)
    96. t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)
    97. t.start()
    98. time.sleep(self.idtTimeOut/2)
    99. #超过10分钟,重新计时
    100. elif (endtime - starttime).seconds > 10 * self.idtTimeOut:
    101. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)
    102. else:
    103. time.sleep(self.idtTimeOut/2)
    104. except IOError as e:
    105. temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)
    106. uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)
    107. uL.WriteLog()
    108. self.set_dSockList(False);
    109. def list_run(self):
    110. starttime = datetime.datetime.now()
    111. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)
    112. ckeys = self.sServerIP + "|" + str(self.iPort)
    113. tc = TcpClient(ckeys)
    114. t = None
    115. try:
    116. #判断上次链接时间频率是否合规
    117. if not self.judge_dSock():
    118. return None
    119. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    120. s.connect((self.sServerIP, self.iPort))
    121. Com_Fun.SetHashTable(Com_Para.dClientThreadList, ckeys, s)
    122. self.set_dSockList(True)
    123. t = threading.Thread(target=tc.client_link, name="ClientTh" + ckeys)
    124. t.start()
    125. except IOError as e:
    126. temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)
    127. uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)
    128. uL.WriteLog()
    129. self.set_dSockList(False)
    130. while True:
    131. starttime = datetime.datetime.now()
    132. try:
    133. if t is None and starttime <= endtime:
    134. if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is not None:
    135. t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)
    136. t.start()
    137. time.sleep(self.idtTimeOut/2)
    138. elif starttime >= endtime:
    139. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)
    140. if Com_Fun.GetHashTableNone(Com_Para.dClientThreadList, ckeys) is None and self.judge_dSock():
    141. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    142. s.connect((self.sServerIP, self.iPort))
    143. Com_Fun.SetHashTable(Com_Para.dClientThreadList, s.getpeername()[0]+"|"+str(s.getpeername()[1]), s)
    144. self.set_dSockList(True)
    145. t = threading.Thread(target=tc.client_link, name="ClientTh" + self.sServerIP)
    146. t.start()
    147. time.sleep(self.idtTimeOut/2)
    148. #超过10分钟,重新计时
    149. elif (endtime - starttime).seconds > 10 * self.idtTimeOut:
    150. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.idtTimeOut)
    151. else:
    152. time.sleep(self.idtTimeOut/2)
    153. except IOError as e:
    154. temError = "repeat connect server error:"+self.sServerIP+" "+Com_Fun.GetTime("%Y-%m-%d %H:%M:%S") + repr(e)
    155. uL = UsAdmin_Log(Com_Para.ApplicationPath, temError)
    156. uL.WriteLog()
    157. self.set_dSockList(False);

    新建tcp client数据接收插件类1 com.plugins.Usereflect.testClientReflectClass1.py

    1. #! python3
    2. # -*- coding: utf-8 -
    3. '''
    4. Created on 2017年05月10日
    5. @author: zxyong 13738196011
    6. '''
    7. from com.zxy.z_debug import z_debug
    8. #监测数据采集物联网应用--往平台端发送数据协议拦截器,可组装发送平台数据协议程序
    9. class testClientReflectClass1(z_debug):
    10. #接收到数据
    11. strResult = ""
    12. #需要发送到服务端数据
    13. strSend = ""
    14. #是否继续执行 1:继续执行 0:中断执行
    15. strContinue = "1"
    16. #所连接的远端IP
    17. strIP = ""
    18. def __init__(self):
    19. pass
    20. def init_start(self):
    21. #作为客户端接收数据拦截器
    22. if self.strResult == "A01":
    23. self.strSend = "#send to server data:server1"
    24. print("AAA作为客户端接收数据拦截器:"+self.strResult)
    25. self.strResult = "ok"
    26. #Com_Para.dClientThreadList 本机作为客户端连接socket list
    27. #Com_Para.htComPort 串口通讯hashtable
    28. # /*示例:此处写业务逻辑,最后给 strResult重新赋值*/
    29. # //self.strResult = "test"
    30. # //self.strSend = "发送到服务端数据"
    31. # /**************************************************/

    新建tcp client数据接收插件类2 com.plugins.Usereflect.testClientReflectClass2.py

    1. #! python3
    2. # -*- coding: utf-8 -
    3. '''
    4. Created on 2017年05月10日
    5. @author: zxyong 13738196011
    6. '''
    7. from com.zxy.z_debug import z_debug
    8. #监测数据采集物联网应用--往平台端发送数据协议拦截器,可组装发送平台数据协议程序
    9. class testClientReflectClass2(z_debug):
    10. #接收到数据
    11. strResult = ""
    12. #需要发送到服务端数据
    13. strSend = ""
    14. #是否继续执行 1:继续执行 0:中断执行
    15. strContinue = "1"
    16. #所连接的远端IP
    17. strIP = ""
    18. def __init__(self):
    19. pass
    20. def init_start(self):
    21. #作为客户端接收数据拦截器
    22. if self.strResult == "A02":
    23. self.strSend = "#send to server data:server"
    24. print("BBB作为客户端接收数据拦截器:"+self.strResult)
    25. self.strResult = "ok"
    26. #Com_Para.dClientThreadList 本机作为客户端连接socket list
    27. #Com_Para.htComPort 串口通讯hashtable
    28. # /*示例:此处写业务逻辑,最后给 strResult重新赋值*/
    29. # //self.strResult = "test"
    30. # //self.strSend = "发送到服务端数据"
    31. # /**************************************************/

    com.zxy.main.Init_Page.py中添加代码

    1. @staticmethod
    2. def Start_Client():
    3. try:
    4. for temSIP in Com_Para.ServerIPList.split(";"):
    5. if temSIP != "":
    6. sttem = ClientThread(10, temSIP.split(":")[0], int(temSIP.split(":")[1]))
    7. # TCP客户端案例
    8. t4tem = threading.Thread(target=sttem.list_run, name="ClientMainThread" + temSIP.split(":")[0])
    9. t4tem.start()
    10. except Exception as e:
    11. print("TCP client error:" + repr(e)+"=>"+str(e.__traceback__.tb_lineno))
    12. finally:
    13. Pass

    TCP Client测试案例MonitorDataCmd.py主文件中编写:

    在    if __name__ == '__main__':下添加

    1. #TCP Client配置服务端ip及端口参数
    2. Com_Para.ServerIPList = "127.0.0.1:5002;127.0.0.1:5003"
    3. #TCP/IP client连接初始化
    4. Init_Page.Start_Client()
    5. #暂停3秒钟,tcp client连接需要时间
    6. time.sleep(3)
    7. #测试TCP/IP client发送数据
    8. tcSock = Com_Fun.GetHashTableNone(Com_Para.dClientThreadList,"127.0.0.1|5002")
    9. #作为客户端接收数据拦截器
    10. Com_Para.ClientREFLECT_IN_CLASS = "com.plugins.usereflect.testClientReflectClass1"
    11. if tcSock != None:
    12. temStr = "TCP client往服务端发送数据:"+Com_Fun.GetTimeDef()+"\r\n"
    13. print("开始准备发送数据")
    14. Com_Fun.SendSocket(temStr, tcSock)
    15. print("TCP client往服务端发送数据")
    16. else:
    17. print("TCP Client未准备好")
    18. #改变下作为客户端接收数据拦截器
    19. #Com_Para.ClientREFLECT_IN_CLASS = "com.plugins.usereflect.testClientReflectClass2"
    20. #接收数据解析插件已经改变了

    运行测试结果如下图:

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

  • 相关阅读:
    【Vue】修饰符&表单提交方式&自定义组件
    Nginx配置实例-负载均衡
    您需要了解的有关NFT的所有知识
    Dorkish:一款针对OSINT和网络侦查任务的Chrome扩展
    常用眼底图像数据集简介及下载--糖尿病视网膜病变(Eyepacs,APTOS2019,Messdior,Messdior-2,STARE数据集)
    35【Aseprite 作图】苹果——拆解
    前端面试题
    Flink应用案例统计实现TopN的两种方式
    Prometheus+Grafana搭建Jmeter性能监控平台(2)
    【OSPF引入直连路由时巧借静态黑洞路由做汇总】
  • 原文地址:https://blog.csdn.net/yong427/article/details/132580679