| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | # -*- coding:utf-8 -*-import os, sys, timeimport abcimport socketimport jsonimport numpy as npimport structfrom 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, 大端>I'''            plen = struct.unpack('<I', phead[1:])[0]            '''返回头是否有效'''            if ord(phead[0]) != 0xAB:                return None                        msg_json = data[np.array([(0xAA, 0)], dtype=ProHead).itemsize:]            if plen - 5 != msg_json.__len__():                return None                        # print msg_json            msg_json = msg_json.decode('gb2312')            # 解析成json;            msg_dict = json.loads(msg_json)            return msg_dict        except Exception, e:            print "BaseClient=> 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, 大端>I'''            plen = struct.unpack('<I', phead[1:5])[0]   # len长度占4位字节;            '''返回头是否有效'''            if ord(phead[0]) != 0xAA and plen != 6:                return False                        # 添加设备,不返回其他数据;            return True        except Exception, e:            print "BaseClient=> recv Error:", e            return False    '''断开连接'''    def disconnect(self):        try:            self.sock.shutdown(2)            self.sock.close()        except Exception, e:            print "BaseClient=> socket disconnect error:", eif __name__ == "__main__":    client = SATClient()    client.send_add_device('192.168.1.102')
 |