コード例 #1
0
async def heartbeat():
    """
    心跳包
    :return:
    """
    try:

        # 这里是防止硬件断电,断网。tcp链路还存在,切断心跳包。

        global TCP_CONNECTION2, info_dict
        # print('==============')
        # print(TCP_CONNECTION)
        # print(TCP_CONNECTION2)
        # global TCP_CONNECTION
        # TCP_CONNECTION2 = {}
        # print(TCP_CONNECTION)
        # print(TCP_CONNECTION2)
        if TCP_CONNECTION != {} and TCP_CONNECTION2 != {}:
            tcp_dead_list = cmp_dict(TCP_CONNECTION, TCP_CONNECTION2)
            for i in tcp_dead_list:
                # air-1D712
                split_list = i.split('+')
                print(split_list, '-----------------------------掉线')
                update = WifiDevice.update(is_alive=0).where(
                    (WifiDevice.device_name == split_list[0])
                    & (WifiDevice.class_number == split_list[1]))
                update.execute()
                # WifiDevice.select().where(WifiDevice.device_number)
                print('pop')
                print(i)
                info_dict.pop(split_list[0] + '+' + split_list[1])
                TCP_CONNECTION.pop(i)
            # TCP_CONNECTION = TCP_CONNECTION2
            # print(tcp_dead_list)
        # for i in tcp_dead_list:
        #     print(i)
        #
        #     TCP_CONNECTION.pop(i)
            print('clear')
            TCP_CONNECTION2.clear()
        for key, value in list(TCP_CONNECTION.items()):
            print('{}发送心跳包'.format(key))
            # logging.info('{}发送心跳包'.format(key))
            await value.write(b"{'heartBeat'}")
    except Exception as e:
        # TCP_CONNECTION.pop(key)

        print('错误信息{}'.format(e))
コード例 #2
0
    async def handle_stream(self, stream, address):
        info_dict = {}
        try:
            while True:
                msg = await stream.read_bytes(2048, partial=True)
                # print(msg)
                # logging.info('记录tcp连接:{}'.format(msg))
                msg = msg.decode('utf-8')
                # logging.info('msg1{}'.format(msg))
                for msg in re.findall('({.*?})', msg):
                    print(msg)
                    # logging.info(msg, '-----------------------------msg----------------------')
                    # print(msg, '------------------------------msg----------------------')
                    msg = eval(msg)
                    # logging.info('msg{}'.format(msg))
                    # 掉线处理要用到的port
                    msg['port'] = address[1]
                    # 判断是否为初次建立连接,发送heartbeat
                    # 用规定的指令设备名和课室创建key
                    # 处理返回指令
                    if (
                            msg['device_name'] + msg['class']
                            in info_dict.keys()
                    ):  # 判断是否已经连接,这里匹配,应该为 {'device_name': 'fan-lamp-curtain', 'class': 'G511', 'fan': '3', 'lamp': '3', 'curtain': '1'}
                        # info_dict根据device_name和class来存放整一个msg
                        if (msg == info_dict[msg['device_name'] +
                                             msg['class']]):  # 判断是否心跳包
                            # print(info_dict[msg['device_name']])
                            print('状态相同,心跳包')
                            # logging.info('心跳包')
                            continue
                        else:
                            # 下发指令或者android更改设备状态返回信息
                            # logging.info('更新操作{}'.format(msg))

                            # if (msg['device_name'] == 'fan-lamp-curtain'):
                            if (re.findall('lamp|fan|curtain', str(msg))):
                                print('风扇更新操作')
                                match_list = re.findall('\w*-\d', str(msg))
                                # 匹配lamp-1,fan-1...
                                for i in match_list:
                                    # i: ['lamp-1', 'curtain-1'.....]
                                    update = WifiDevice.update(status=msg[i]). \
                                        where(
                                        (WifiDevice.device_number == i) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    # 更新info_dict信息里面单个信息
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']][i] = msg[
                                            i]  # msg[i] 为lamp-1的 ‘1’ or ‘0’                            print('更新操作')
                            # elif (msg['device_name'] == 'fan-lamp'):
                            #
                            #     match_list = re.findall('\w*-\d', str(msg))
                            #     # 匹配lamp-1,fan-1...
                            #     for i in match_list:
                            #         update = WifiDevice.update(status=msg[i]). \
                            #             where(
                            #             (WifiDevice.device_number == i) & (WifiDevice.class_number == msg['class']))
                            #         update.execute()
                            #         # 更新info_dict信息里面单个信息
                            #         info_dict[msg['device_name']+msg['class']][i] = msg[i] # msg[i] 为lamp-1的 ‘1’ or ‘0’
                            elif (re.findall('air', msg['device_name'])):
                                print('空调更新')
                                # logging.info('air{}'.format(msg))
                                # logging.info('info_dict{}'.format(info_dict[msg['device_name']]))
                                if ('degree' in msg.keys()
                                        and 'status' in msg.keys()
                                        and 'gear' in msg.keys()
                                        and 'model' in msg.keys()):
                                    # logging.info('更新全部')
                                    # logging.info(msg)
                                    update = WifiDevice.update(degree=msg['degree'], status=msg['status'], gear=msg['gear'], model=msg['model']). \
                                        where(
                                        (WifiDevice.device_name == msg['device_name']) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['degree'] = msg['degree']
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['status'] = msg['status']
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['gear'] = msg['gear']
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['model'] = msg['model']
                                # 单独更新
                                elif ('degree' in msg.keys()):
                                    update = WifiDevice.update(degree=msg['degree']). \
                                        where(
                                        (WifiDevice.device_name == msg['device_name']) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    # logging.info('更新degree')
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['degree'] = msg['degree']
                                elif ('status' in msg.keys()):
                                    update = WifiDevice.update(status=msg['status']). \
                                        where(
                                        (WifiDevice.device_name == msg['device_name']) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    # logging.info('更新status')
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['status'] = msg['status']
                                elif ('gear' in msg.keys()):
                                    update = WifiDevice.update(gear=msg['gear']). \
                                        where(
                                        (WifiDevice.device_name == msg['device_name']) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    # logging.info('更新gear')
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['gear'] = msg['gear']
                                elif ('model' in msg.keys()):
                                    update = WifiDevice.update(gear=msg['model']). \
                                        where(
                                        (WifiDevice.device_name == msg['device_name']) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    # logging.info('更新model')
                                    info_dict[
                                        msg['device_name'] +
                                        msg['class']]['model'] = msg['model']
                            elif (re.findall('controller',
                                             msg['device_name'])):
                                match_list = re.findall('console-\d', str(msg))
                                # 匹配lamp-1,fan-1...
                                for i in match_list:
                                    update = WifiDevice.update(status=msg[i]). \
                                        where(
                                        (WifiDevice.device_number == i) & (WifiDevice.class_number == msg['class']))
                                    update.execute()
                                    # 更新info_dict信息里面单个信息
                                    info_dict[msg['device_name'] +
                                              msg['class']][i] = msg[i]
                            elif (re.findall('switch', msg['device_name'])):
                                # match_list = re.findall('switch-\d', str(msg))
                                print('开关动作')
                                # 匹配lamp-1,fan-1...
                                devices = WifiDevice.select() \
                                    .where((WifiDevice.class_number == msg['class']) & (
                                            WifiDevice.device_name == msg['device_name'])).execute()
                                list_ = [
                                    device.device_number for device in devices
                                ]
                                if msg['status'] == '1':
                                    print('action ==1 ')
                                    await TCP_CONNECTION[
                                        msg['device_name'] + msg['class']
                                    ].write(
                                        b'''{'devices_name': 'fan-lamp-curtain', 'class': 'C1004', 'lamp-1': '0', 'lamp-2': '0','lamp-3': '0', 'fan-1': '0', 'fan-2': '0', 'curtain-1':'0'}'''
                                    )
                                    # await device_controller.turn_devices_on(list_)
                                    # for i in list_:
                                    #     pass
                                    # await DeviceController(i, msg['class']).turn_devices_on(list_)
                                elif msg['status'] == '0':
                                    await TCP_CONNECTION[
                                        msg['device_name'] + msg['class']
                                    ].write(
                                        b'''{'device_name': 'fan-lamp-curtain', 'class': 'C1004', 'lamp-1': '0', 'lamp-2': '0','lamp-3': '0', 'fan-1': '0', 'fan-2': '0', 'curtain-1':'0'}'''
                                    )
                                    print('0')
                                    # for i in list_:
                                    #     pass
                                    # await DeviceController(i, msg['class']).turn_devices_off(list_)
                                update = WifiDevice.update(status=msg['status']). \
                                    where(
                                    (WifiDevice.device_name == msg['device_name']) & (
                                                WifiDevice.class_number == msg['class']))
                                update.execute()
                                # 更新info_dict信息里面单个信息
                                info_dict[
                                    msg['device_name'] +
                                    msg['class']]['status'] = msg['status']
                    else:
                        print('第一次连接')
                        # logging.info('第一次连接')
                        return_dict = {}
                        TCP_CONNECTION[msg['device_name'] +
                                       msg['class']] = stream
                        # stream.write(bytes(msg, encoding='utf-8'))
                        # 根据初次连接上发的指令,记录到数据库
                        if ('lamp' in msg.keys() and 'fan' in msg.keys()
                                and 'curtain' in msg.keys()):
                            print('同时存在')
                            logging.info('三个设备同时存在')
                            for i in range(1, int(msg['fan']) + 1):
                                fan = WifiDevice.get_or_create(
                                    device_number='fan-{}'.format(i),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['fan-{}'.format(i)] = fan[0].status
                            for j in range(1, int(msg['lamp']) + 1):
                                lamp = WifiDevice.get_or_create(
                                    device_number='lamp-{}'.format(j),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['lamp-{}'.format(
                                    j)] = lamp[0].status
                            for k in range(1, int(msg['curtain']) + 1):
                                curtain = WifiDevice.get_or_create(
                                    device_number='curtain-{}'.format(k),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['curtain-{}'.format(
                                    k)] = curtain[0].status
                        elif ('lamp' in msg.keys() and 'fan' in msg.keys()):
                            print('lamp和fan同时存在')
                            logging.info('风扇,灯同时存在')
                            for i in range(1, int(msg['fan']) + 1):
                                fan = WifiDevice.get_or_create(
                                    device_number='fan-{}'.format(i),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['fan-{}'.format(i)] = fan[0].status
                            for j in range(1, int(msg['lamp']) + 1):
                                lamp = WifiDevice.get_or_create(
                                    device_number='lamp-{}'.format(j),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['lamp-{}'.format(
                                    j)] = lamp[0].status
                        elif ('fan' in msg.keys()):
                            print('fan存入数据库操作')
                            for i in range(1, int(msg['fan']) + 1):
                                fan = WifiDevice.get_or_create(
                                    device_number='fan-{}'.format(i),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['fan-{}'.format(i)] = fan[0].status
                                print(fan[0].status)
                                print(msg.keys())
                        elif ('lamp' in msg.keys()):
                            print('lamp存入数据库')
                            for j in range(1, int(msg['lamp']) + 1):
                                lamp = WifiDevice.get_or_create(
                                    device_number='lamp-{}'.format(j),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['lamp-{}'.format(
                                    j)] = lamp[0].status

                        elif ('curtain' in msg.keys()):
                            print('curtain存入数据库')
                            for j in range(1, int(msg['curtain']) + 1):
                                curtain = WifiDevice.get_or_create(
                                    device_number='curtain-{}'.format(j),
                                    class_number=msg['class'],
                                    device_name=msg['device_name'],
                                    defaults={
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['curtain-{}'.format(
                                    j)] = curtain[0].status
                                print(curtain[0].port)

                        elif (re.findall('air', msg['device_name'])):
                            print('空调')
                            # number = re.findall('\d', msg['device_name'])[0]
                            # for k in msg['air']:
                            air = WifiDevice.get_or_create(
                                device_name=msg['device_name'],
                                class_number=msg['class'],
                                device_number=msg['device_name'],
                                defaults={
                                    'degree': '25',
                                    'is_alive': 1,
                                    'gear': '1',
                                    'model': '1',
                                    'port': address[1]
                                })
                            return_dict['status'] = air[0].status
                            return_dict['degree'] = str(air[0].degree)
                            return_dict['gear'] = air[0].gear
                            return_dict['model'] = air[0].model
                        elif (re.findall('controller', msg['device_name'])):
                            for i in range(1, int(msg['console']) + 1):
                                controller = WifiDevice.get_or_create(
                                    device_number='console-{}'.format(i),
                                    class_number=msg['class'],
                                    defaults={
                                        'device_name': msg['device_name'],
                                        'is_alive': 1,
                                        'port': address[1]
                                    })
                                return_dict['console-{}'.format(
                                    i)] = controller[0].status
                        # 开关
                        elif (re.findall('switch', msg['device_name'])):
                            print('开关')
                            switch = WifiDevice.get_or_create(
                                device_name=msg['device_name'],
                                class_number=msg['class'],
                                device_number=msg['device_name'],
                                defaults={
                                    'is_alive': 1,
                                    'port': address[1]
                                })
                            return_dict['status'] = switch[0].status
                        ClassRoom.get_or_create(name=msg['class'])
                        return_dict['device_name'] = msg['device_name']
                        return_dict['class'] = msg['class']
                        # logging.info('info_dict{}'.format(info_dict.values()))
                        # 硬件死机重连返回必要信息,取消,硬件找到存储信息的方法了.
                        # print('return_dict:{}'.format(return_dict))
                        await stream.write(b"{'heartBeat'}")
                        # logging.info('return_dict{}'.format(return_dict))
                        # await stream.write(bytes(str(return_dict), encoding='utf-8'))
                        return_dict['port'] = msg['port']
                        info_dict[msg['device_name'] +
                                  msg['class']] = return_dict
                        del return_dict
                        # 重连修改连接端口号
                        update = WifiDevice.update(
                            port=address[1], is_alive=1).where(
                                (WifiDevice.device_name == msg['device_name'])
                                & (WifiDevice.class_number == msg['class']))
                        update.execute()
                    # else:
                    #     # 处理单片机返回非json数据
                    #     logging.info("处理单片机返回非json数据:{}".format(msg))
                    #     print(msg)
        except Exception as e:
            print('错误信息{}'.format(e))
            # 掉线处理

            for value in info_dict.values():
                # value = eval(value)
                print(value, '掉线')
                if (address[1] in value.values()):
                    print('处理')
                    # print(value['device_name'], value['class'])
                    # wifi设备掉线,数据更改数据库设备状态
                    update = WifiDevice.update(is_alive=0).where(
                        WifiDevice.port == address[1])
                    update.execute()