예제 #1
0
 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)
예제 #2
0
 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
     }
예제 #3
0
    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
예제 #4
0
파일: deviceudp.py 프로젝트: p3g4asus/orvpy
 def keyfind(addr, data):
     mac = DeviceUDP.mac_from_data(data)
     return tohexs(mac) if mac else "{}:{}".format(*addr)
예제 #5
0
 def default_name(self):
     return 'dev_' + tohexs(self.mac)
예제 #6
0
 def ir_encode(self, irc):
     return tohexs(irc)
예제 #7
0
    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()