123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- # -*- 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, 大端>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:", e
- if __name__ == "__main__":
- client = SATClient()
- client.send_add_device('192.168.1.102')
|