更新39协议
更新webserivce功能
完善nettrans
diff --git a/supwisdom/protocol/nettrans.py b/supwisdom/protocol/nettrans.py
index 0d1df81..4973c8c 100644
--- a/supwisdom/protocol/nettrans.py
+++ b/supwisdom/protocol/nettrans.py
@@ -5,14 +5,10 @@
import traceback
import simplejson as json
-
-def _unicode_str(value):
- if isinstance(value, str):
- return value.decode('utf-8')
- elif isinstance(value, unicode):
- return value
- else:
- return unicode(value)
+"""
+后台服务的字符编码
+"""
+SERVICE_ENCODING = 'utf-8'
class message_writer:
@@ -21,6 +17,14 @@
def __init__(self):
self.clear()
+ def _unicode_str(value):
+ if isinstance(value, str):
+ return value.decode('utf-8')
+ elif isinstance(value, unicode):
+ return value
+ else:
+ return unicode(value)
+
def clear(self):
self._attr = {}
self._row_data = []
@@ -31,13 +35,13 @@
def attr(self, name, value):
if name in self._attr:
raise ValueError('Attribute [%s] already exists' % name)
- self._attr[name] = _unicode_str(value)
+ self._attr[name] = self._unicode_str(value)
return self
def row(self, name, value):
if not (name in self._col_names):
self._col_names.append(name)
- self._row[name] = _unicode_str(value)
+ self._row[name] = self._unicode_str(value)
def add_row(self):
if not self._row:
@@ -77,7 +81,7 @@
"""
if not self._frozen:
self._normalize()
- seri = json.dumps(self._attr, ensure_ascii=False, encoding='utf-8')
+ seri = json.dumps(self._attr, ensure_ascii=False, encoding=SERVICE_ENCODING)
return seri
def root(self):
@@ -92,6 +96,14 @@
def __init__(self):
self.clear()
+ def _unicode_str(value):
+ if isinstance(value, str):
+ return value.decode(SERVICE_ENCODING)
+ elif isinstance(value, unicode):
+ return value
+ else:
+ return unicode(value)
+
def clear(self):
""" 清空数据
"""
@@ -107,7 +119,7 @@
"""
self.clear()
try:
- message = _unicode_str(message)
+ message = self._unicode_str(message)
obj = json.loads(message)
#obj = json.loads(msg.replace('\\',"\\\\"))
except Exception, ex:
diff --git a/supwisdom/protocol/smart999protocol.py b/supwisdom/protocol/smart999protocol.py
index 176b7a1..c5a8ee3 100644
--- a/supwisdom/protocol/smart999protocol.py
+++ b/supwisdom/protocol/smart999protocol.py
@@ -98,16 +98,18 @@
class ProtocolError(BaseException):
def __init__(self, msg):
- super(ProtocolError,self).__init__()
+ super(ProtocolError, self).__init__()
self.msg = msg
class Smart999Connection(object):
- def __init__(self, ip, port):
+ def __init__(self, ip, port, debug=1):
self.ip = ip
self.port = port
self.sock = None
- self.errmsg = None
+ self.errmsg = ""
+ self.debug = debug
+ self._last_exec_err = 0
def connect(self, timeout=10.0):
try:
@@ -115,12 +117,15 @@
sock.settimeout(timeout)
sock.connect((self.ip, self.port))
self.sock = sock
+ logging.info(u"连接[%s:%d]成功" % (self.ip, self.port))
return True
except socket.error, msg:
self.errmsg = unicode(msg)
+ logging.info(u"连接[%s:%d]失败[%s]" % (self.ip, self.port, self.errmsg))
return False
def disconnect(self):
+ self._last_exec_err = 0
if self.sock:
try:
self.sock.close()
@@ -132,12 +137,18 @@
return self.sock != None
def log(self, data):
+ if not self.debug:
+ return
try:
print "CMD[%s]" % codecs.encode(data, 'hex')
except:
pass
def send_command(self, request, response, timeout=10.0):
+ if not self.is_connected():
+ if not self.connect(timeout):
+ logging.error(u"尝试重连设备失败")
+ return False
protocol = Smart999Protocol()
cmd = protocol.pack(request)
self.log(cmd)
@@ -165,11 +176,15 @@
self.errmsg = u"接收数据未收到结束符"
return False
self.sock.settimeout(timeout - est)
+ self._last_exec_err = 0
except socket.error, msg:
- if msg.errno == errno.ECONNABORTED:
- self.sock.close()
- self.sock = None
+ if msg.errno != None and msg.errno != errno.EWOULDBLOCK:
+ self.disconnect()
logging.error(u"远程连接[%s]已关闭!" % self.ip)
+ else:
+ self._last_exec_err += 1
+ if self._last_exec_err > 50:
+ self.disconnect()
self.errmsg = unicode(msg)
return False
except Exception, ex:
diff --git a/supwisdom/protocol/webservice.py b/supwisdom/protocol/webservice.py
index 99ee4ea..657fc68 100644
--- a/supwisdom/protocol/webservice.py
+++ b/supwisdom/protocol/webservice.py
@@ -203,5 +203,5 @@
if isinstance(funcdata, unicode):
request_token['funcdata'] = funcdata
elif isinstance(funcdata, str):
- request_token['funcdata'] = funcdata.encode('gbk', 'ignore')
+ request_token['funcdata'] = funcdata.decode('gbk', 'ignore')
return json.dumps(request_token, ensure_ascii=False)