SATClient.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. # -*- coding:utf-8 -*-
  2. import os, sys, time
  3. import abc
  4. import socket
  5. import json
  6. import numpy as np
  7. import struct
  8. from ssat_sdk.MenuTree3.TConfig import TConfig
  9. # 创建协议头数据类型
  10. '''
  11. // 数据头;
  12. typedef struct _DATAHEADER_ {
  13. // 协议标识符;
  14. byte protocol;
  15. // 当前通信包的长度=header长度+buf长度;
  16. unsigned int len;
  17. // 命令类型;
  18. byte cmd;
  19. }DataHeader, *pDataHeader;
  20. // 请求包
  21. typedef struct _PACKAGE_ {
  22. DataHeader header;
  23. byte buf[4]; // 具体内容(指针地址);
  24. }Package;
  25. '''
  26. ProHead = np.dtype({'names': ['version', 'len', 'cmd'], 'formats': ['u1', 'u4', 'u1']})
  27. class SATClient():
  28. def __init__(self):
  29. self.config = TConfig(r"D:\SAT\SATService\SATService.ini")
  30. '''通信sock'''
  31. self.sock = None
  32. '''通信端口号'''
  33. self.port = self.config.get_int('SATService', 'TCPSvrPort')
  34. print u'通信端口号',self.port
  35. '''通信状态'''
  36. self.constate = False
  37. def __def__(self):
  38. self.disconnect()
  39. '''连接服务器'''
  40. def connect(self):
  41. try:
  42. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  43. self.sock.connect(('127.0.0.1', self.port)) # 没有返回值;
  44. self.sock.sendall('111')
  45. self.constate = True
  46. except Exception, e:
  47. print "BaseClient=> socket connect error:", e, self.port
  48. self.constate = False
  49. return self.constate
  50. # 发送消息;
  51. def sendmsg(self):
  52. '''是否连接'''
  53. if self.constate is False:
  54. if self.connect() is False:
  55. return None
  56. '''拼装要发送的数据包'''
  57. msg_json = ""
  58. msg_dict = {'device_id': self.device_id, 'device_name': self.device_name, "device_cmd": self.device_cmd, "device_timeout": self.device_timeout}
  59. try:
  60. msg_json = json.dumps(msg_dict)
  61. except Exception:
  62. print "BaseClient=> to json error:", msg_dict
  63. return None
  64. '''发送请求数据'''
  65. try:
  66. self.sock.settimeout(5)
  67. phead = np.array([(0xAA, msg_json.__len__() + np.array([(0xAA, 0)], dtype=ProHead).itemsize)], dtype=ProHead)
  68. '''一次性发送完整包'''
  69. self.sock.sendall(bytearray(phead.tobytes() + bytes(msg_json)))
  70. '''分包发送:头、体'''
  71. # self.sock.sendall(phead.tobytes())
  72. # self.sock.sendall(bytes(msg_json))
  73. self.sock.settimeout(None)
  74. except Exception, e:
  75. print "BaseClient=> send Error:", e
  76. self.disconnect()
  77. self.connect()
  78. return None
  79. '''接收返回数据'''
  80. try:
  81. # 等待数据返回;(串口若请求失败,超时值应该设置在3秒以上)
  82. self.sock.settimeout(10)
  83. data = bytes(self.sock.recv(1024 * 8))
  84. self.sock.settimeout(None)
  85. phead = data[0: np.array([(0xAA, 0)], dtype=ProHead).itemsize]
  86. '''小端<I, 大端>I'''
  87. plen = struct.unpack('<I', phead[1:])[0]
  88. '''返回头是否有效'''
  89. if ord(phead[0]) != 0xAB:
  90. return None
  91. msg_json = data[np.array([(0xAA, 0)], dtype=ProHead).itemsize:]
  92. if plen - 5 != msg_json.__len__():
  93. return None
  94. # print msg_json
  95. msg_json = msg_json.decode('gb2312')
  96. # 解析成json;
  97. msg_dict = json.loads(msg_json)
  98. return msg_dict
  99. except Exception, e:
  100. print "BaseClient=> recv Error:", e
  101. return None
  102. def send_add_device(self, device_name):
  103. '''是否连接'''
  104. if self.constate is False:
  105. if self.connect() is False:
  106. return False
  107. '''发送请求数据'''
  108. try:
  109. self.sock.settimeout(3)
  110. phead = np.array(
  111. [
  112. (
  113. # 协议头;
  114. 0xAA,
  115. # 包长度;
  116. device_name.__len__() + np.array([(0xAA, 0, 1)], dtype=ProHead).itemsize,
  117. # 命令类型;
  118. 2
  119. )
  120. ],
  121. dtype=ProHead)
  122. '''一次性发送完整包'''
  123. self.sock.sendall(bytearray(phead.tobytes() + bytes(device_name)))
  124. self.sock.settimeout(None)
  125. except Exception, e:
  126. print "__send => send Error:", e
  127. import traceback
  128. traceback.print_exc()
  129. self.disconnect()
  130. self.connect()
  131. return False
  132. '''接收返回数据'''
  133. try:
  134. # 等待数据返回;(串口若请求失败,超时值应该设置在3秒以上)
  135. self.sock.settimeout(10)
  136. data = bytes(self.sock.recv(1024 * 8))
  137. self.sock.settimeout(None)
  138. phead = data[0: np.array([(0xAA, 0, 1)], dtype=ProHead).itemsize]
  139. '''小端<I, 大端>I'''
  140. plen = struct.unpack('<I', phead[1:5])[0] # len长度占4位字节;
  141. '''返回头是否有效'''
  142. if ord(phead[0]) != 0xAA and plen != 6:
  143. return False
  144. # 添加设备,不返回其他数据;
  145. return True
  146. except Exception, e:
  147. print "BaseClient=> recv Error:", e
  148. return False
  149. '''断开连接'''
  150. def disconnect(self):
  151. try:
  152. self.sock.shutdown(2)
  153. self.sock.close()
  154. except Exception, e:
  155. print "BaseClient=> socket disconnect error:", e
  156. if __name__ == "__main__":
  157. client = SATClient()
  158. client.send_add_device('192.168.1.102')