class RFIDProtocol(Protocol): def __init__(self, factory): self.factory = factory self.data_list = "" # 用来拼接阅读器发送过来的的不完整的数据 self.rfid = RFIDController() self.getOnlineSession = self.factory.onlineSession.online_session def connectionMade(self): self.factory.numProtocols += 1 # 工厂创造的protocol数目加1 print "<----------- 连接成功,当前连接的RFID设备数目为: " + str(self.factory.numProtocols) + " ---------->" self.divName = str(self) + " of " + self.__class__.__name__ self.factory.onlineSession.add_client(self.divName, self.transport) self.ping(timeout=1) return def ping(self, timeout): frame = "\xFF\xFF\xF1\x06\x06\xF1" self.transport.write(frame) cb = functools.partial(self.ping, timeout=timeout) reactor.callLater(timeout, cb) # 定时器,timeout秒后调用cb函数 def connectionFailed(self): print "Connection Failed:", self.__class__.__name__ reactor.stop() def connectionLost(self, reason): print "conn lost reason --> " + str(reason) + "\n" self.factory.numProtocols -= 1 print "current conn num is " + str(self.factory.numProtocols) + "\n" self.factory.onlineSession.del_client(self.divName) return def dataReceived(self, data): """因为没有办法对字节流进行判断所以先转换成十六进制数从而判断是否接收的完整""" self.data_list += binascii.b2a_hex(data) # 接受字节流的数据转化成十六进制字符串 # print self.data_list if len(self.data_list) > 4: # 对接收的数据包的丢包处理 if self.data_list[0:4] != "ffff": self.data_list = "ffff" + self.data_list.split("ffff")[-1] # else: # self.data_list = "ffff" + self.data_list.split("ffff")[0] frame = bytearray.fromhex(self.data_list) # 将十六进制的数再次转化成字节流 pkgs, leftovers = self.rfid.parse_pkgs(frame) # 解析字节流转化为可识别的指令码存在pkgs,剩下的存在leftovers if self.factory.onlineSession.get_online_session("echo"): self.factory.onlineSession.get_online_session("echo").write(pkgs) if len(pkgs) != 0 and len(leftovers) == 0: rfidFrame.handle_data(pkgs)
def __init__(self, factory): self.factory = factory self.data_list = "" # 用来拼接阅读器发送过来的的不完整的数据 self.rfid = RFIDController() self.getOnlineSession = self.factory.onlineSession.online_session