# -*- coding: utf-8 -*- # !/usr/bin/env python import os import sys from concurrent.futures import ThreadPoolExecutor, Future PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..') sys.path.insert(0, PROJECT_ROOT) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.production') from script.base import init_env init_env(False) from django.conf import settings from apps.web.device.models import Device, DeviceDict from apps.web.device.define import DeviceChannelType from apps.web.core.mqtt_client import MqttClient from apps.web.core.sysparas import SysParas def is_online(devNo): return bool(Device.get_dev(devNo).online) def done_callback(f): # type:(Future) -> None debug, devNo, check_port = f.result() if debug: print('{} debug.'.format(devNo)) else: with open("e:\\temp\\change_ip\\done_kick_off_{}.txt".format(check_port), "a") as f: f.write("{}\n".format(devNo)) def operate_kick_off(devNo, port): try: mqttc = MqttClient(client_id = devNo) mqttc.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD) mqttc.connect(SysParas.get_private_ip(settings.MQTT_HOSTNAME), port, 60) finally: mqttc.disconnect() mqttc.close() def kick_off(devNo, debug, check_port): if debug: return debug, devNo, check_port else: device = Device.get_dev(devNo) # type: DeviceDict if device.channelType == DeviceChannelType.Channel_BT: return debug, devNo, check_port if len(devNo) < 15: return debug, devNo, check_port serverIp, curr_port = device.server.split(":") if serverIp != settings.MQTT_HOSTNAME: return debug, devNo, check_port if not device.online: operate_kick_off(devNo, check_port) return debug, device.devNo, check_port elif int(curr_port) == check_port: print('{} is in {}.'.format(device.devNo, check_port)) return debug, devNo, check_port else: operate_kick_off(devNo, check_port) return debug, device.devNo, check_port def run(debug, devices, check_port): with ThreadPoolExecutor(max_workers = 20) as executor: for _dev in devices: # type: Device if not is_online(_dev.devNo): continue if 'DUMMY' in _dev.devNo: continue if 'LuaRTOS' in _dev.coreVer: print('{} is lua os'.format(_dev.devNo)) continue executor.submit(kick_off, _dev.devNo, debug, check_port).add_done_callback( done_callback) if __name__ == '__main__': __list = [] __done_list = [] check_port = 1884 try: with open("e:\\temp\\change_ip\\done_kick_off_{}.txt".format(check_port), "r") as f: lines = f.readlines() for line in lines: line = line.strip() __done_list.append(line) except Exception as e: pass try: with open("e:\\temp\\change_ip\\do_kick_off_{}.txt".format(check_port), "r") as f: lines = f.readlines() for line in lines: line = line.strip() if line not in __done_list: __list.append(line) except Exception as e: pass filter = { 'devNo': {'$in': __list} } devices = [dev for dev in Device.objects(__raw__ = filter)] run(debug = False, devices = devices, check_port = check_port)