add initialize
diff --git a/supwisdom/protocol/nettrans.py b/supwisdom/protocol/nettrans.py
new file mode 100644
index 0000000..98099f7
--- /dev/null
+++ b/supwisdom/protocol/nettrans.py
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-

+""" 一卡通后台通讯协议包封装

+所有数据都是 unicode  utf-8 编码

+"""

+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)

+

+

+class message_writer:

+    """ 后台消息写接口

+    """

+    def __init__(self):

+        self.clear()

+

+    def clear(self):

+        self._attr = {}

+        self._row_data = []

+        self._col_names = []

+        self._row = {}

+        self._frozen = False

+

+    def attr(self, name, value):

+        if name in self._attr:

+            raise ValueError('Attribute [%s] already exists' % name)

+        self._attr[name] = _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)

+

+    def add_row(self):

+        if not self._row:

+            raise ValueError('Row has no values')

+        self._row_data.append(self._row)

+        self._row = {}

+        return len(self._row_data)

+

+    def append_row(self, row):

+        if not self._col_names:

+            for k, v in row.iteritems():

+                self._col_names.append(k)

+            self._row_data.append(row)

+        else:

+            new_row = dict([(v, row.get(v, None)) for v in self._col_names])

+            self._row_data.append(new_row)

+

+    def _normalize(self):

+        colcnt = len(self._col_names)

+        rowcnt = len(self._row_data)

+        self._attr["colcnt"] = colcnt

+        self._attr["rowcnt"] = rowcnt

+        if colcnt > 0:

+            self._attr["colname"] = self._col_names

+            self._attr["coldesc"] = self._col_names

+

+        if rowcnt > 0 and colcnt <= 0:

+            raise ValueError(u'数据没有列值')

+

+        if rowcnt > 0:

+            self._attr["rowdata"] = [[row.get(colname, u"") for colname in self._col_names]

+                for row in self._row_data]

+        self._frozen = True

+

+    def serialize(self):

+        """ 返回 unicode utf-8编码

+        """

+        if not self._frozen:

+            self._normalize()

+        seri = json.dumps(self._attr, ensure_ascii=False, encoding='utf-8')

+        return seri

+

+    def root(self):

+        if not self._frozen:

+            self._normalize()

+        return self._attr

+

+

+class message_reader:

+    """ 后台消息读接口

+    """

+    def __init__(self):

+        self.clear()

+

+    def clear(self):

+        """ 清空数据

+        """

+        self._attr = {}

+        self._row_data = None

+        self._col_names = []

+        self._col_desc = []

+        self._row_no = -1

+        self._frozen = False

+

+    def unserialize(self, message):

+        """ 解析报文

+        """

+        self.clear()

+        try:

+            message = _unicode_str(message)

+            obj = json.loads(message)

+            #obj = json.loads(msg.replace('\\',"\\\\"))

+        except Exception, ex:

+            traceback.print_exc()

+            raise ValueError(u'解析报文错误,' + ex.message)

+

+        if u"colname" in obj:

+            colname = obj[u"colname"]

+            colcnt = obj[u"colcnt"]

+            rowcnt = obj[u"rowcnt"]

+

+            if colcnt != len(colname):

+                raise ValueError(u'记录列数定义不符')

+

+            rowdata = obj[u"rowdata"]

+            if rowcnt != len(rowdata):

+                raise ValueError(u'记录行数定义不符')

+

+            self._row_data = [dict(zip(colname, row)) for row in rowdata]

+            self._col_names = colname

+            self._col_desc = obj["coldesc"]

+        else:

+            pass

+

+        for n, v in obj.iteritems():

+            if n in (u"colname", u"colcnt", u"rowcnt", u"coldesc", u"rowdata"):

+                continue

+            self._attr[n] = v

+        self._frozen = True

+        #print self._attr

+

+    def attr(self, name):

+        """ 获取属性值,如果没有改属性返回空字符串

+        """

+        assert self._frozen == True

+        if name not in self._attr:

+            return ""

+        return self._attr[name]

+

+    def has_more_row(self):

+        """ 判断是否有后续行

+        """

+        assert self._frozen == True

+        if not self._row_data:

+            return False

+        if self._row_no < len(self._row_data):

+            return True

+        return False

+

+    def next_row(self):

+        """ 将读取指针移到下一行

+        """

+        assert self._frozen == True

+        assert self.has_more_row()

+        self._row_no += 1

+

+    _ARG_DEFAULT = []

+

+    def col(self, name, default=[], strip=True):

+        """ 获取当前行的字段值

+        """

+        assert self._row_no >= 0

+        arg = self._row_data[self._row_no].get(name, None)

+        if not arg:

+            if strip and default == message_reader._ARG_DEFAULT:

+                raise IndexError(u'no such column %s' % name)

+            return default

+        return arg

+

+    def is_eof(self):

+        """判断是否到记录尾

+        """

+        if self._row_no >= len(self._row_data):

+            return True

+        return False

+

+    def fetch_rows(self):

+        """ 读取所有行记录

+        """

+        if not self.has_more_row():

+            return

+        self._row_no = 0

+        for row in self._row_data:

+            self._row_no += 1

+            yield row