# -*- coding:utf-8 -*- import os, sys, time import abc import socket import json import numpy as np import struct from ssat_sdk.MenuTree3.TConfig import TConfig # 创建协议头数据类型 ''' // 数据头; typedef struct _DATAHEADER_ { // 协议标识符; byte protocol; // 当前通信包的长度=header长度+buf长度; unsigned int len; // 命令类型; byte cmd; }DataHeader, *pDataHeader; // 请求包 typedef struct _PACKAGE_ { DataHeader header; byte buf[4]; // 具体内容(指针地址); }Package; ''' ProHead = np.dtype({'names': ['version', 'len', 'cmd'], 'formats': ['u1', 'u4', 'u1']}) class SATClient(): def __init__(self): self.config = TConfig(r"D:\SAT\SATService\SATService.ini") '''通信sock''' self.sock = None '''通信端口号''' self.port = self.config.get_int('SATService', 'TCPSvrPort') print u'通信端口号',self.port '''通信状态''' self.constate = False def __def__(self): self.disconnect() '''连接服务器''' def connect(self): try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect(('127.0.0.1', self.port)) # 没有返回值; self.sock.sendall('111') self.constate = True except Exception, e: print "BaseClient=> socket connect error:", e, self.port self.constate = False return self.constate # 发送消息; def sendmsg(self): '''是否连接''' if self.constate is False: if self.connect() is False: return None '''拼装要发送的数据包''' msg_json = "" msg_dict = {'device_id': self.device_id, 'device_name': self.device_name, "device_cmd": self.device_cmd, "device_timeout": self.device_timeout} try: msg_json = json.dumps(msg_dict) except Exception: print "BaseClient=> to json error:", msg_dict return None '''发送请求数据''' try: self.sock.settimeout(5) phead = np.array([(0xAA, msg_json.__len__() + np.array([(0xAA, 0)], dtype=ProHead).itemsize)], dtype=ProHead) '''一次性发送完整包''' self.sock.sendall(bytearray(phead.tobytes() + bytes(msg_json))) '''分包发送:头、体''' # self.sock.sendall(phead.tobytes()) # self.sock.sendall(bytes(msg_json)) self.sock.settimeout(None) except Exception, e: print "BaseClient=> send Error:", e self.disconnect() self.connect() return None '''接收返回数据''' try: # 等待数据返回;(串口若请求失败,超时值应该设置在3秒以上) self.sock.settimeout(10) data = bytes(self.sock.recv(1024 * 8)) self.sock.settimeout(None) phead = data[0: np.array([(0xAA, 0)], dtype=ProHead).itemsize] '''小端I''' plen = struct.unpack(' recv Error:", e return None def send_add_device(self, device_name): '''是否连接''' if self.constate is False: if self.connect() is False: return False '''发送请求数据''' try: self.sock.settimeout(3) phead = np.array( [ ( # 协议头; 0xAA, # 包长度; device_name.__len__() + np.array([(0xAA, 0, 1)], dtype=ProHead).itemsize, # 命令类型; 2 ) ], dtype=ProHead) '''一次性发送完整包''' self.sock.sendall(bytearray(phead.tobytes() + bytes(device_name))) self.sock.settimeout(None) except Exception, e: print "__send => send Error:", e import traceback traceback.print_exc() self.disconnect() self.connect() return False '''接收返回数据''' try: # 等待数据返回;(串口若请求失败,超时值应该设置在3秒以上) self.sock.settimeout(10) data = bytes(self.sock.recv(1024 * 8)) self.sock.settimeout(None) phead = data[0: np.array([(0xAA, 0, 1)], dtype=ProHead).itemsize] '''小端I''' plen = struct.unpack(' recv Error:", e return False '''断开连接''' def disconnect(self): try: self.sock.shutdown(2) self.sock.close() except Exception, e: print "BaseClient=> socket disconnect error:", e if __name__ == "__main__": client = SATClient() client.send_add_device('192.168.1.102')