更新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)