def get_action_payload(self, action): if isinstance(action, ActionLearnir): if len(action.irdata): fk = action.irdata[action.irdata.find(':') + 1:].translate( None, '!@#$/\\+-_') if len(fk) < 2: fk = generatestring(5) cmd = collections.OrderedDict() cmd['fKey'] = fk cmd['fid'] = self.get_fid() cmd['uid'] = tohexs(self.mac) cmd['cmd'] = 25 cmd['order'] = 'ir control' cmd['lastUpdateTime'] = int( Device.unix_time_millis(datetime.now()) / 1000.0) cmd['clientSessionId'] = self.clientSessionId cmd['serial'] = None cmd['deviceId'] = self.deviceId cmd['fName'] = fk return cmd elif isinstance(action, ActionEmitir): if len(action.irdata): cmd = collections.OrderedDict() cmd['uid'] = tohexs(self.mac) cmd['defaultResponse'] = 1 cmd['delayTime'] = 0 cmd['qualityOfService'] = 1 cmd['clientSessionId'] = self.clientSessionId cmd.update(action.irdata[2]) cmd['pluseNum'] = action.irdata[0].count(',') + 1 cmd['value1'] = 0 cmd['value2'] = 0 cmd['value3'] = 0 cmd['value4'] = 0 cmd['cmd'] = 15 cmd['order'] = 'ir control' # cmd['userName'] = '******' cmd['pluseData'] = action.irdata[0] cmd['serial'] = None cmd['deviceId'] = self.deviceId return cmd return IrManager.get_action_payload(self, action)
def to_dict(self): # a = datetime(1900,1,1,0,0,0) # b = a + timedelta(seconds=self.sec1900) # b.strftime('%d/%m/%Y %H:%M:%S') return { "host": str(self.host), "port": str(self.port), "offlimit": str(self.offlimit), "mac": tohexs(self.mac), "type": self.__class__.__name__, "mytime": str(Device.unix_time_millis(datetime.now())), "name": self.name }
def parse(self, clinfo, data): if isinstance(clinfo, dict): returnv = clinfo else: returnv = {'addr': clinfo} hp = returnv['addr'] if len(data) > 6 and data[0:1] == b'@': returnv['type'] = b'mfz' idx = data.find(b'\n') if idx < 0: if len(data) >= 200: returnv['idxout'] = RoughParser.DISCARD_BUFFER else: returnv['idxout'] = RoughParser.STILL_WAIT else: _LOGGER.info("R [" + hp[0] + ":" + str(hp[1]) + "] <-" + b2s(data)) event.EventManager.fire(eventname='ExtInsertAction', hp=hp, cmdline=b2s(data[1:]), action=None) returnv['idxout'] = idx + 1 elif len(data) > 7 and data[0:2] == MAGIC: msgid = data[4:6] ln = struct.unpack('>H', data[2:4])[0] _LOGGER.info("Detected Magic with ln %d and id %s" % (ln, b2s(msgid))) if len(data) >= ln: returnv[ 'type'] = b'cry' if msgid == PK_MSG_ID or msgid == DK_MSG_ID else b'orv' returnv['idxout'] = ln contentmsg = data[0:ln] if msgid == PK_MSG_ID: outv = SendBufferTimer.handle_incoming_data(contentmsg) if outv is not None: obj = outv['msg'] if obj['cmd'] == 0: name = obj['hardwareVersion'] # obj['serial'] dictout = { 'serial': 0, 'cmd': 0, 'key': None, 'status': 0 } returnv['name'] = name.replace(' ', '_') returnv['reply'] = SendBufferTimer.get_send_bytes( dictout, None, typemsg=b"pk") returnv['key'] = dictout['key'] elif msgid == DK_MSG_ID: if 'sender' in clinfo: outv = clinfo['sender'].handle_incoming_data2( contentmsg) else: outv = SendBufferTimer.handle_incoming_data( contentmsg, returnv['key']) if outv is not None: obj = outv['msg'] if obj['cmd'] == 6: returnv['hp'] = hp returnv['localIp'] = obj['localIp'] returnv['localPort'] = obj['localPort'] returnv['password'] = obj['password'] returnv['mac'] = tohexs(obj['uid']) returnv['convid'] = outv['convid'] dictout = { 'serial': obj['serial'], 'cmd': 6, 'status': 0 } returnv['reply'] = SendBufferTimer.get_send_bytes( dictout, outv['convid'], key=returnv['key'], typemsg=b"dk") dev = DeviceCT10( hp=hp, mac=returnv['mac'], name=returnv['name'] + '_' + obj['uid'], key=returnv['key'], password=obj['password'], deviceid=generatestring(32), clientsessionid=generatestring(32), hp2=(obj['localIp'], obj['localPort'])) returnv['device'] = dev act = ActionDiscovery() act.hosts[obj['uid']] = dev event.EventManager.fire( eventname='ActionDiscovery', device=dev, action=act, retval=1) elif obj['cmd'] == 116 or obj['cmd'] == 32: dictout = { 'serial': obj['serial'], 'cmd': obj['cmd'], 'status': 0, 'uid': obj['uid'] } returnv['reply'] = SendBufferTimer.get_send_bytes( dictout, outv['convid'], key=returnv['key'], typemsg=b"dk") returnv['disconnecttimer'] = time.time() + 3 * 60 else: if msgid == STATECHANGE_EXT_ID or msgid == DISCOVERY_ID: event.EventManager.fire( eventname='ExtChangeState', hp=hp, mac=DeviceUDP.mac_from_data(data), newstate="1" if data[-1:] == b'\x01' else "0") rx = re.compile(MAGIC + b'(.{2}).{2}.*' + MAC_START) control = {} off = 0 while True: m = re.search(rx, data) if m: st = m.start() ln = struct.unpack('>H', m.group(1))[0] # _LOGGER.info("st = {} ln = {}".format(st,ln)) off = st + ln if off <= len(data): sect = data[st:off] data = data[off:] keyv = DeviceUDP.keyfind(hp, sect) if keyv not in control: control[keyv] = 1 event.EventManager.fire( eventname='RawDataReceived', key=keyv, hp=hp, data=sect) _LOGGER.info("R [" + keyv + "] <-" + tohexs(sect)) else: break else: break returnv[ 'idxout'] = RoughParser.UNRECOGNIZED if not off else off else: returnv['idxout'] = RoughParser.STILL_WAIT else: returnv['idxout'] = RoughParser.UNRECOGNIZED return returnv
def keyfind(addr, data): mac = DeviceUDP.mac_from_data(data) return tohexs(mac) if mac else "{}:{}".format(*addr)
def default_name(self): return 'dev_' + tohexs(self.mac)
def ir_encode(self, irc): return tohexs(irc)
def handle(self): self.stopped = False keyv = '{}:{}'.format(*self.client_address) threading.currentThread().name = ("TCPServerHandler") _LOGGER.info(keyv + " connected") self.request.setblocking(0) olddata = b'' serv = self.server.s serv.setclienthandler(self.client_address, self) wlist = [] remain = b'' disconnectat = 0 parser = RoughParser() while not serv.stopped and not self.stopped: try: ready = select.select([self.request], wlist, [], 0.5) if disconnectat > 0 and time.time() >= disconnectat: break if ready[0]: data = self.request.recv(4096) if len(data) > 0: _LOGGER.info("RTCP [" + keyv + "/" + str(len(data)) + "] <-" + tohexs(data)) data = olddata + data while True: dictout = parser.parse( serv.getclientinfo(self.client_address), data) rv = dictout['idxout'] if 'disconnecttimer' in dictout: disconnectat = dictout['disconnecttimer'] if 'reply' in dictout: remain += dictout['reply'] del dictout['reply'] if rv and rv > 0: tp = dictout['type'] if tp == b"mfz" or tp == b"cry": serv.setclientinfo(self.client_address, dictout) data = data[rv:] if len(data): continue elif rv == RoughParser.DISCARD_BUFFER: data = b'' break olddata = data else: raise Exception("Readline failed: connection closed?") if ready[1] or len(wlist) == 0: if len(remain) == 0: remain = serv.dowrite(self.client_address) if len(remain) > 0: _LOGGER.info("Sending packet to %s:%d" % self.client_address) nb = self.request.send(remain) _LOGGER.info("Sent") # if tp=="cry": # _LOGGER.info("STCP ["+keyv+"/"+str(len(remain))+"/"+str(nb)+"] <-"+remain.encode('hex')) remain = remain[nb:] wlist = [self.request] else: wlist = [] except: # noqa: E722 _LOGGER.warning(f"{traceback.format_exc()}") break _LOGGER.info(keyv + " DISCONNECTED") serv.unsetclientinfo(self.client_address) _LOGGER.info(keyv + " DELETED") self.stop()