Exemple #1
0
    def send_once(self):
        try:
            for client in self.conn_to_addr:
                if self.clients[self.conn_to_addr[client]]['queue_out'].empty():
                    pass
                else:
                    data = self.clients[self.conn_to_addr[client]
                                        ]['queue_out'].get()
                    if isinstance(data, type(b'')):
                        tmp_data = data
                    else:
                        tmp_data = data.encode('utf-8')
                    if self.debug:
                        if self.printB:
                            self.LOG.yinfo(protocol_data_printB(
                                tmp_data, title="Send data to " + self.conn_to_addr[client][0] + ":"))
                        else:
                            self.LOG.yinfo(
                                "Send data to " + self.conn_to_addr[client][0] + ": " + tmp_data.decode('utf-8'))
                    client.send(tmp_data)

        except Exception as e:
            self.LOG.error(
                self.conn_to_addr[client][0] + ' closed! [%s]' % (str(e)))
            self.clients[self.conn_to_addr[client]]['conn'].close()
            self.inputs.remove(client)
            del self.clients[self.conn_to_addr[client]]
            del self.conn_to_addr[client]
Exemple #2
0
    def recv_once(self, timeout=None):
        try:
            if not self.get_connected():
                return
            data = ''
            readable, writable, exceptional = select.select(
                self.inputs, [], [], timeout)

            # When timeout reached , select return three empty lists
            if not (readable):
                pass
            else:
                data = self.client.recv(BUFF_SIZE)
                if data:
                    if isinstance(data, type(b'')):
                        tmp_data = data
                    else:
                        tmp_data = data.encode('utf-8')
                    self.LOG.debug(protocol_data_printB(
                        tmp_data, title="client get data:"))

                else:
                    self.LOG.error("Server maybe has closed!")
                    self.client.close()
                    self.inputs.remove(self.client)
                    self.set_connected(False)
            return data

        except socket.error:
            self.LOG.error("socket error, don't know why.")
            self.client.close()
            self.inputs.remove(self.client)
            self.set_connected(False)
Exemple #3
0
    def send_once(self, data=None):
        try:
            if not self.get_connected():
                return
            if isinstance(data, type(b'')):
                tmp_data = data
            else:
                tmp_data = data.encode('utf-8')

            if self.debug:
                if self.printB:
                    self.LOG.yinfo(protocol_data_printB(
                        tmp_data, title="client send date:"))
                else:
                    self.LOG.yinfo("client send data: %s" %
                                   (tmp_data.decode('utf-8')))

            self.client.send(tmp_data)

        except Exception as e:
            self.LOG.error(
                "send data fail, Server maybe has closed![%s]" % (str(e)))
            self.client.close()
            self.inputs.remove(self.client)
            self.set_connected(False)
Exemple #4
0
 def convert_to_dictstr(self, src):
     ret_str = ''
     ret_str += '\n{\n'
     for item in src:
         ret_str += protocol_data_printB(src[item],
                                         title="    %s," % (item))
         ret_str += '\n'
     ret_str += '}'
     return ret_str
Exemple #5
0
 def data_received(self, data):
     self.queue_in.put_nowait(data)
     self.LOG.debug(protocol_data_printB(data, title="client get data:"))
     command = self.get_cmd_from_pkt(data)
     self.LOG.debug("RECV_CMD:{}".format(command))
     if command and b'"Result":' in data:
         # 收到的带有回复的才去计算时延,否则计算时延无意义
         self.init_msgst_dict(command)
         self.msgst[command]['time_info'].recv_update()
     self.LOG.debug("RECV:{}".format(data.__repr__()))
Exemple #6
0
    async def send_data_once(self, data=b''):
        if data:
            self.queue_out.put_nowait(data)

        if self.queue_out.empty():
            pass
        else:
            data = await self.queue_out.get()
            self.transport.write(data)
            self.LOG.info(protocol_data_printB(data, title="client send data:"))
            self.LOG.info(repr(data))
 def protocol_handler(self, msg):
     ack = False
     if msg[0:4] == self.prefixHead:
         #目前貌似木有ACK
         ack = False
         self.LOG.info("recv msg: " + common_APIs.protocol_data_printB(msg))
         rsp_msg: MessageType = self.sim_obj.protocol_handler(msg, ack)
         if rsp_msg:
             final_rsp_msg = self.msg_build(
                 rsp_msg)  #rsp_msg.buildRspMessage()
         else:
             final_rsp_msg = 'No_need_send'
         return final_rsp_msg
     else:
         self.LOG.warn('Unknow msg: %s!' % (msg))
         return "No_need_send"
Exemple #8
0
 async def send_data_loop(self):
     while self.getStopConition() == False:
         if self.queue_out.empty():
             pass
         else:
             data = await self.queue_out.get()
             command = self.get_cmd_from_pkt(data)
             self.LOG.debug("SEND_CMD:{}".format(command))
             if command and b'"Result":' not in data:
                 # 发送ACK包的时候不需要计算时延,也不需要重置发送时间
                 self.init_msgst_dict(command)
                 self.msgst[command]['time_info'].send_update()
             # print("send:{}".format(data))
             self.transport.write(data)
             self.LOG.debug(protocol_data_printB(data, title="client send data:"))
             self.LOG.debug("SEND:{}".format(repr(data)))
         await asyncio.sleep(self.procInv)
Exemple #9
0
 def schedule_loop(self):
     while self.need_stop == False:
         if self.queue_in.empty():
             continue
         else:
             ori_data = self.left_data + self.queue_in.get()
             while len(ori_data) < self.min_length:
                 ori_data += self.queue_in.get()
             data_list, self.left_data = self.protocol_data_washer(ori_data)
             if data_list:
                 for request_msg in data_list:
                     response_msg = self.protocol_handler(request_msg)
                     if response_msg == 'No_need_send':
                         pass
                     elif response_msg:
                         self.queue_out.put(response_msg)
                     else:
                         self.LOG.error(protocol_data_printB(
                             request_msg, title='%s: got invalid data:' % (self.name)))
             else:
                 continue
 async def schedule(self):
     if self.queue_in.empty():
         pass
     else:
         ori_data = self.left_data + self.queue_in.get_nowait()
         while len(ori_data) < self.min_length:
             ori_data += self.queue_in.get_nowait()
         data_list, self.left_data = self.protocol_data_washer(ori_data)
         if data_list:
             for request_msg in data_list:
                 response_msg = self.protocol_handler(request_msg)
                 if response_msg == 'No_need_send':
                     pass
                 elif response_msg:
                     self.queue_out.put_nowait(response_msg)
                 else:
                     self.LOG.error(
                         protocol_data_printB(
                             request_msg,
                             title='%s: got invalid data:' % (self.name)))
         else:
             self.LOG.warn('whwer is go?')
             pass
Exemple #11
0
 async def schedule(self):
     while self.getStopConition() == False:
         if self.queue_in.empty():
             pass
         else:
             ori_data = self.left_data + self.queue_in.get_nowait()
             while len(ori_data) < self.min_length:
                 ori_data += self.queue_in.get_nowait()
             data_list, self.left_data = self.protocol_data_washer(ori_data)
             if data_list:
                 for request_msg in data_list:
                     # print("rsv:{}".format(request_msg))
                     # self.LOG.info("rsv:{}".format(request_msg))
                     response_msg = self.protocol_handler(request_msg)
                     if response_msg == 'No_need_send':
                         pass
                     elif response_msg:
                         self.queue_out.put_nowait(response_msg)
                     else:
                         self.LOG.error(protocol_data_printB(
                             request_msg, title='%s: got invalid data:' % (self.name)))
             else:
                 self.LOG.warn('whwer is go?')
         await asyncio.sleep(self.procInv)
Exemple #12
0
    def run_forever(self, *arg):
        BUFF_SIZE = 1024
        timeout = 1

        try:
            while True:
                self.LOG.debug(
                    "Waiting for next event, now has active clients: %d" % (len(self.clients)))
                readable, writable, exceptional = select.select(
                    self.inputs, [], [], timeout)
                for conn in readable:
                    if conn == self.server:
                        try:
                            connection, client_address = self.server.accept()
                            connection.setblocking(0)
                            self.LOG.info(
                                "Get connection from: " + client_address[0])
                            self.clients[client_address] = {
                                'conn': connection,
                                'queue_in': Queue.Queue(),
                                'queue_out': Queue.Queue(),
                            }
                            self.inputs.append(connection)
                            self.conn_to_addr[connection] = client_address

                        except Exception as e:
                            self.LOG.error("Get connection %s falied![%s]" % (
                                client_address[0], e))
                            pass

                    else:
                        try:
                            data = conn.recv(BUFF_SIZE)
                            if data:
                                self.clients[self.conn_to_addr[conn]
                                             ]['queue_in'].put(data)

                                dmsg = b'\x48\x44\x58\x4d\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x30\x01\x00\x00\x00\x01\x00\x00\x00\x29\x00\x00\x8f\x20\x7b\x22\x52\x65\x73\x75\x6c\x74\x22\x3a\x30\x2c\x22\x43\x6f\x6d\x6d\x61\x6e\x64\x22\x3a\x22\x43\x4f\x4d\x5f\x44\x45\x56\x5f\x52\x45\x47\x49\x53\x54\x45\x52\x22\x7d'

                                self.clients[self.conn_to_addr[conn]
                                             ]['queue_out'].put(dmsg)

                                if isinstance(data, type(b'')):
                                    tmp_data = data
                                else:
                                    tmp_data = data.encode('utf-8')
                                    self.LOG.info(protocol_data_printB(
                                        tmp_data, title="Get data from " + self.conn_to_addr[conn][0] + ":"))
                            else:
                                # Interpret empty result as closed connection
                                self.LOG.error(
                                    self.conn_to_addr[conn][0] + ' closed!')
                                self.clients[self.conn_to_addr[conn]
                                             ]['conn'].close()
                                self.inputs.remove(conn)
                                del self.clients[self.conn_to_addr[conn]]
                                del self.conn_to_addr[conn]

                        except socket.error:
                            self.LOG.error("Get data from %s falied!" %
                                           (self.conn_to_addr[conn][0]))
                            self.clients[self.conn_to_addr[conn]
                                         ]['conn'].close()
                            self.inputs.remove(conn)
                            del self.clients[self.conn_to_addr[conn]]
                            del self.conn_to_addr[conn]

                if self.singlethread:
                    self.send_once()

        except KeyboardInterrupt:
            self.LOG.info(
                'KeyboardInterrupt, now to close all clinets and server!')
            for client in self.clients:
                self.clients[client]['conn'].close()
            self.server.close()

        except Exception as e:
            self.LOG.error(str(e))
            for client in self.clients:
                self.clients[client]['conn'].close()
            self.server.close()

        finally:
            self.LOG.info("socket server end!")
            sys.exit(0)
Exemple #13
0
 def recv_data(self):
     datas = self.connection.readall()
     if datas:
         self.LOG.info(
             protocol_data_printB(datas, title=self.port + " recv data:"))
     return datas
Exemple #14
0
 def send_data(self, data):
     self.LOG.yinfo(
         protocol_data_printB(data, title=self.port + " send data:"))
     return self.connection.write(data)
Exemple #15
0
    def protocol_handler(self, msg):
        # 查询
        if msg[10:12] == b'\x4d\x01':
            self.LOG.debug("查询命令".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            # too much such msg, ignore it
            return self.msg_build()
            pass

        # 开机
        elif msg[10:12] == b'\x4d\x02':
            self.LOG.warn("开机".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(0)
            return self.msg_build()

        # 关机
        elif msg[10:12] == b'\x4d\x03':
            self.LOG.warn("关机".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_clear_bit(0)
            return self.msg_build()

        # 电加热 无
        elif msg[10:12] == b'\x4d\x04':
            self.LOG.warn("电加热 无".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_clear_bit(1)
            return self.msg_build()

        # 电加热 有
        elif msg[10:12] == b'\x4d\x05':
            self.LOG.warn("电加热 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(1)
            return self.msg_build()

        # 健康 无
        elif msg[10:12] == b'\x4d\x08':
            self.LOG.warn("健康 无".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_clear_bit(3)
            return self.msg_build()

        # 健康 有
        elif msg[10:12] == b'\x4d\x09':
            self.LOG.warn("健康 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(3)
            return self.msg_build()

        # 设定温度
        elif msg[10:12] == b'\x5d\x01':
            self.TEMP_set(msg[12:14], ifprint=1)
            return self.msg_build()

        # 电子锁 无
        elif msg[10:12] == b'\x4d\x18':
            self.LOG.warn("电子锁 无".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_clear_bit(15)
            return self.msg_build()

        # 电子锁 有
        elif msg[10:12] == b'\x4d\x19':
            self.LOG.warn("电子锁 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(15)
            return self.msg_build()

        # 换新风 无
        elif msg[10:12] == b'\x4d\x1e':
            self.LOG.warn("换新风 无".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDB_clear_bit(0)
            return self.msg_build()

        # 换新风 有
        elif msg[10:12] == b'\x4d\x1f':
            self.LOG.warn("换新风 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDB_set_bit(0)
            return self.msg_build()

        # 加湿 无
        elif msg[10:12] == b'\x4d\x1c':
            self.LOG.warn("加湿 无".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_clear_bit(6)
            return self.msg_build()

        # 加湿 有
        elif msg[10:12] == b'\x4d\x1d':
            self.LOG.warn("加湿 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(6)
            return self.msg_build()

        # 上下摆风
        elif msg[10:12] == b'\x4d\x22':
            if msg[12:14] == b'\x00\x01':
                self.LOG.warn("上下摆风 有".decode('utf-8').encode(
                    sys.getfilesystemencoding()))
            else:
                self.LOG.warn("上下摆风 无".decode('utf-8').encode(
                    sys.getfilesystemencoding()))
            self.SOLLDH_set(UD_data=msg[12:14])
            return self.msg_build()

        # 左右摆风
        elif msg[10:12] == b'\x4d\x23':
            if msg[12:14] == b'\x00\x01':
                self.LOG.warn("左右摆风 有".decode('utf-8').encode(
                    sys.getfilesystemencoding()))
            else:
                self.LOG.warn("左右摆风 无".decode('utf-8').encode(
                    sys.getfilesystemencoding()))
            self.SOLLDH_set(LR_data=msg[12:14])
            return self.msg_build()

        # 上下左右摆风
        elif msg[10:12] == b'\x4d\x24':
            if msg[12:14] == b'\x00\x01':
                self.LOG.warn("全摆风 有".decode('utf-8').encode(
                    sys.getfilesystemencoding()))
            else:
                self.LOG.warn("全摆风 无".decode('utf-8').encode(
                    sys.getfilesystemencoding()))
            self.SOLLDH_set(UD_data=msg[12:14], LR_data=msg[12:14])
            return self.msg_build()

        # 自清洁 无
        # elif msg[10:12] == b'\x4d\x1c':
        #    self.LOG.warn("自清洁 无".decode('utf-8').encode(sys.getfilesystemencoding()))
        #    self.WORDA_clear_bit(6)
        #    return self.msg_build()

        # 自清洁 有
        elif msg[10:12] == b'\x4d\x26':
            self.LOG.warn("自清洁 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(2)
            return self.msg_build()

        # 感人功能 无
        elif msg[10:12] == b'\x4d\x28':
            self.LOG.warn("感人功能 无".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_clear_bit(12)
            return self.msg_build()

        # 感人功能 有
        elif msg[10:12] == b'\x4d\x27':
            self.LOG.warn("感人功能 有".decode('utf-8').encode(
                sys.getfilesystemencoding()))
            self.WORDA_set_bit(12)
            return self.msg_build()

        # 风速
        elif msg[10:12] == b'\x5d\x07':
            self.WIND_set(msg[12:14], ifprint=1)
            return self.msg_build()

        # 模式
        elif msg[10:12] == b'\x5d\x08':
            self.MODE_set(msg[12:14], ifprint=1)
            return self.msg_build()

        # 健康除湿湿度
        elif msg[10:12] == b'\x4d\x0d':
            self.HUMSD_set(msg[12:14], ifprint=1)
            return self.msg_build()

        # 组控制命令
        # TODO, 模块暂时不支持

        # others
        else:
            self.LOG.error(protocol_data_printB(msg,
                                                title='%s: invalid data:'))
            return self.msg_build()
Exemple #16
0
    def protocol_handler(self, datas):
        need_ASP_response = False
        need_default_response = False
        rsp_datas = {
            'control': datas['control'],
            'seq': datas['seq'],
            'addr': datas['addr'],
            'cmd': b'\x0B' + datas['cmd'][1:],
            'reserve': datas['reserve'],
            'data': b'\x81',
        }
        if bit_get(datas['control'], 7):
            self.LOG.debug('ACK msg!')
            return
        else:
            self.LOG.info("recv msg: " + self.convert_to_dictstr(datas))
            self.send_msg(self.get_default_response(datas))
            self.set_seq(datas['seq'])
            self.addr = datas['addr']
            self.cmd = datas['cmd']

        req_cmd_type = datas['cmd'][0:0 + 1]
        req_cmd_domain = datas['cmd'][1:1 + 2]
        req_cmd_word = datas['cmd'][3:3 + 2]

        if datas['cmd'][:1] == b'\x40':
            if datas['cmd'][1:] == b'\x36\x00\x00\x00':
                rsp_data = self.get_cmd('Device Announce')
                if rsp_data:
                    rsp_datas['control'] = datas['control']
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            elif datas['cmd'][1:] == b'\x05\x00\x00\x00':
                self.Endpoint = b'\x01'
                rsp_data = self.get_cmd('Active Endpoint Response')
                #self.set_item('Short_id', datas['data'])
                if rsp_data:
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            elif datas['cmd'][1:] == b'\x34\x00\x01\x00':
                self.sdk_obj.set_work_status(False)
                rsp_data = self.get_cmd('Leave response')
                if rsp_data:
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            elif datas['cmd'][1:] == b'\x21\x00\x00\x00':
                #self.set_item('mac', datas['data'][0:0 + 8])
                #self.set_item('endpoint', datas['data'][8:8 + 1])
                #self.set_item('Short_id', datas['data'][9:9 + 2])
                rsp_data = self.get_cmd('Bind response')
                if rsp_data:
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            else:
                self.LOG.error(
                    protocol_data_printB(datas['cmd'][1:],
                                         title='Unknow cmd:'))

        elif datas['cmd'][:1] == b'\x41':
            if datas['cmd'][1:1 + 2] == b'\x06\x00':
                if datas['cmd'][3:3 + 2] == b'\x00\x00':
                    self.set_item('_Switch', b'\x00')
                elif datas['cmd'][3:3 + 2] == b'\x01\x00':
                    self.set_item('_Switch', b'\x01')
                else:
                    self.set_item('_Switch', b'\x02')

            elif datas['cmd'][1:1 + 2] == b'\x00\x03':
                if datas['cmd'][3:3 + 2] == b'\x06\x00':
                    self.set_item('_Hue', datas['data'][0:0 + 1])
                    self.set_item('Saturation', datas['data'][1:1 + 1])

                elif datas['cmd'][3:3 + 2] == b'\x07\x00':
                    self.set_item('_Color_X', datas['data'][0:0 + 2])
                    self.set_item('_Color_Y', datas['data'][2:2 + 2])

                elif datas['cmd'][3:3 + 2] == b'\x0a\x00':
                    self.set_item('_Color_Temperature', datas['data'][0:0 + 2])

                else:
                    self.LOG.error(
                        protocol_data_printB(datas['cmd'][3:3 + 2],
                                             title='Unknow cmd:'))

            elif datas['cmd'][1:1 + 2] == b'\x08\x00':
                self.set_item('_Level', datas['data'][0:0 + 1])

            elif datas['cmd'][1:1 + 2] == b'\x02\x01':
                if datas['cmd'][3:3 + 2] == b'\x00\x00':
                    self.set_item('_Window_covering', datas['cmd'][3:3 + 2])

                elif datas['cmd'][3:3 + 2] == b'\x01\x00':
                    self.set_item('_Window_covering', datas['cmd'][3:3 + 2])

                elif datas['cmd'][3:3 + 2] == b'\x02\x00':
                    self.set_item('_Window_covering', datas['cmd'][3:3 + 2])

                elif datas['cmd'][3:3 + 2] == b'\x05\x00':
                    self.set_item('_Window_covering', datas['cmd'][3:3 + 2])
                    self.set_item('Percentage_Lift_Value',
                                  datas['data'][0:0 + 1])

                else:
                    self.LOG.error(
                        protocol_data_printB(datas['cmd'][3:3 + 2],
                                             title='Unknow cmd:'))

            else:
                self.LOG.error(
                    protocol_data_printB(datas['cmd'][1:1 + 2],
                                         title='Unknow cmd:'))

            return

        elif datas['cmd'][:1] == b'\x00':
            rsp_data = self.get_cmd('Read attribute response')
            if rsp_data:
                if datas['cmd'][1:1 + 2] == b'\x00\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x00\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x00\x00']['data']

                elif datas['cmd'][1:1 + 2] == b'\x06\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x06\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x06\x00']['data']

                elif datas['cmd'][1:1 + 2] == b'\x08\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x08\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x08\x00']['data']
                #add by -zx for cmd:00 00 03 03 00 and 00 00 03 04 00
                elif datas['cmd'][1:1 + 2] == b'\x00\x03':
                    rsp_datas['cmd'] = rsp_data[b'\x00\x03']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x00\x03']['data']

                else:
                    self.LOG.error("F**k Read attribute response")
                    rsp_datas['cmd'] = rsp_data['default']['cmd']
                    rsp_datas['data'] = rsp_data['default']['data']

            else:
                pass

        elif datas['cmd'][:1] == b'\x06':
            self.sdk_obj.set_work_status(False)
            rsp_data = self.get_cmd('Configure reporting response')
            if rsp_data:
                if datas['cmd'][1:1 + 2] == b'\x06\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x06\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x06\x00']['data']

                elif datas['cmd'][1:1 + 2] == b'\x08\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x08\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x08\x00']['data']

                elif datas['cmd'][1:1 + 2] == b'\x00\x03':
                    rsp_datas['cmd'] = rsp_data[b'\x00\x03']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x00\x03']['data']

                else:
                    rsp_datas['cmd'] = rsp_data['default']['cmd']
                    rsp_datas['data'] = rsp_data['default']['data']

            else:
                pass

        else:
            self.LOG.error("What is the f**k msg?")
            return

        self.LOG.yinfo("send msg: " + self.convert_to_dictstr(rsp_datas))
        return rsp_datas
Exemple #17
0
 def recv_data(self):
     datas = self.connection.recv_once()
     if datas:
         self.LOG.debug(protocol_data_printB(datas, " recv data:"))
     return datas
Exemple #18
0
 def send_data(self, data):
     self.LOG.debug(protocol_data_printB(data, " send data:"))
     return self.connection.send_once(data)
Exemple #19
0
    def protocol_handler(self, datas):
        need_ASP_response = False
        need_default_response = False
        rsp_datas = {
            'control': datas['control'],
            'seq': datas['seq'],
            'addr': datas['addr'],
            'cmd': b'\x0B' + datas['cmd'][1:],
            'reserve': datas['reserve'],
            'data': b'\x81',
        }
        if bit_get(datas['control'], 7):
            self.LOG.debug('ACK msg!')
            return
        else:
            self.LOG.info("recv msg: " + self.convert_to_dictstr(datas))
            self.send_msg(self.get_default_response(datas))
            self.set_seq(datas['seq'])
            self.addr = datas['addr']
            self.cmd = datas['cmd']

        req_cmd_type = datas['cmd'][0:0 + 1]
        req_cmd_domain = datas['cmd'][1:1 + 2]
        req_cmd_word = datas['cmd'][3:3 + 2]

        if datas['cmd'][:1] == b'\x40':
            if datas['cmd'][1:] == b'\x36\x00\x00\x00':
                rsp_data = self.get_cmd('Device Announce')
                if rsp_data:
                    rsp_datas['control'] = datas['control']
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            elif datas['cmd'][1:] == b'\x05\x00\x00\x00':
                self.Endpoint = b'\x01'
                rsp_data = self.get_cmd('Active Endpoint Response')
                if rsp_data:
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            elif datas['cmd'][1:] == b'\x34\x00\x01\x00':
                self.sdk_obj.set_work_status(False)
                rsp_data = self.get_cmd('Leave response')
                if rsp_data:
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            elif datas['cmd'][1:] == b'\x21\x00\x00\x00':
                rsp_data = self.get_cmd('Bind response')
                if rsp_data:
                    rsp_datas['cmd'] = rsp_data['cmd']
                    rsp_datas['data'] = rsp_data['data']
                else:
                    pass

            else:
                self.LOG.error(
                    protocol_data_printB(datas['cmd'][1:],
                                         title='Unknow cmd:'))

        elif datas['cmd'][:1] == b'\x41':
            if datas['cmd'][1:1 + 2] == b'\x06\x00':
                if datas['cmd'][3:3 + 2] == b'\x01\x00':
                    self.set_item('_Switch', b'\x01')

                elif datas['cmd'][3:3 + 2] == b'\x00\x00':
                    self.set_item('_Switch', b'\x00')

                else:
                    self.LOG.error(
                        protocol_data_printB(datas['cmd'][3:3 + 2],
                                             title='Unknow cmd:'))

            else:
                self.LOG.error(
                    protocol_data_printB(datas['cmd'][1:1 + 2],
                                         title='Unknow cmd:'))

            return

        elif datas['cmd'][:1] == b'\x00':
            rsp_data = self.get_cmd('Read attribute response')
            if rsp_data:
                if datas['cmd'][1:1 + 2] == b'\x00\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x00\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x00\x00']['data']

                elif datas['cmd'][1:1 + 2] == b'\x06\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x06\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x06\x00']['data']

                else:
                    self.LOG.error("F**k Read attribute response")
                    rsp_datas['cmd'] = rsp_data['default']['cmd']
                    rsp_datas['data'] = rsp_data['default']['data']

            else:
                pass

        elif datas['cmd'][:1] == b'\x06':
            self.sdk_obj.set_work_status(False)
            rsp_data = self.get_cmd('Configure reporting response')
            if rsp_data:
                if datas['cmd'][1:1 + 2] == b'\x06\x00':
                    rsp_datas['cmd'] = rsp_data[b'\x06\x00']['cmd']
                    rsp_datas['data'] = rsp_data[b'\x06\x00']['data']

                else:
                    self.LOG.error("F**k Configure reporting response")
                    rsp_datas['cmd'] = rsp_data['default']['cmd']
                    rsp_datas['data'] = rsp_data['default']['data']

            else:
                pass

        else:
            self.LOG.error("What is the f**k msg?")
            return

        self.LOG.yinfo("send msg: " + self.convert_to_dictstr(rsp_datas))
        return rsp_datas
Exemple #20
0
            self.set_connection_state('online')
            self.LOG.info('Setup connection success!')
            return True
        else:
            self.LOG.warn(self.port + " can't open!")
            self.LOG.error('Setup connection failed!')
            return False

    def connection_close(self):
        if self.connection.close():
            self.connection = None
            self.set_connection_state('offline')
        else:
            self.LOG.error('Close connection failed!')

    def send_data(self, data):
        self.LOG.yinfo(
            protocol_data_printB(data, title=self.port + " send data:"))
        return self.connection.write(data)

    def recv_data(self):
        datas = self.connection.readall()
        if datas:
            self.LOG.info(
                protocol_data_printB(datas, title=self.port + " recv data:"))
        return datas


if __name__ == '__main__':
    print(protocol_data_printB(msg, title='see see'))