# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import threading import time import uuid import thread from django.conf import settings from base import init_env import simplejson as json init_env(interactive = True) from apps.web.device.models import Device, DeviceDict from apps.web.core.networking import MessageSender from apps.web.constant import Const, DeviceCmdCode, DeviceOnlineStatus from apps.web.core.mqtt_client import MqttClient output_path = '/root/v1.8' version = 'v1.8.110' version_regex = 'v1\.7\.' version_check = 'v1.7.' done = open('%s/done_%d.txt' % (output_path, int(time.time())), 'w') error = open('%s/error_%d.txt' % (output_path, int(time.time())), 'w') timeout = open('%s/timeout_%d.txt' % (output_path, int(time.time())), 'w') mqttc1883 = None mqttc1884 = None doing_dict = {} def on_connect(client, userdata, flags, rc): pass # client.subscribe('+/+/209', qos = Const.MQTT_QOS) # print('subscribe topic(%s) success' % '+/+/209') def on_message(mqttc, obj, msg): msgDict = json.loads(bytes.decode(msg.payload)) imei = msgDict['IMEI'] _ = Device.get_dev(imei) print('209 has received. msg = %s' % str(msgDict)) if msgDict['result']: done.write('%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer']))) else: error.write('%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer']))) doing_dict.pop(imei, None) mqttc.subscribe('server/%s/209' % imei) def on_disconnect(client, userdata, self): print('exit. client = %s' % str(client)) try: mqttc1883 = MqttClient(client_id = 'webapp_' + str(uuid.uuid1())) try: mqttc1883.on_message = on_message mqttc1883.on_connect = on_connect mqttc1883.on_disconnect = on_disconnect mqttc1883.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD) mqttc1883.connect(settings.MQTT_HOSTNAME, 1883, 60) mqttc1883.loop_start() except Exception as e: print(e) mqttc1884 = MqttClient(client_id = 'webapp_' + str(uuid.uuid1())) try: mqttc1884.on_message = on_message mqttc1884.on_connect = on_connect mqttc1884.on_disconnect = on_disconnect mqttc1884.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD) mqttc1884.connect(settings.MQTT_HOSTNAME, 1884, 60) mqttc1884.loop_start() except Exception as e: print(e) objs = Device.get_collection().find( {'$and': [{'softVer': {'$regex': version_regex}}, {'softVer': {'$ne': version}}]}) count = 0 # 做一下保护, 避免查询语句错误 devNoList = [] for obj in objs: if str(obj['softVer']).startswith(version_check): devNoList.append(str(obj['devNo'])) else: print 'error dev = %s' % str(obj['devNo']) for devNo in devNoList: try: if count >= 1: break dev = Device.get_dev(devNo) # type:DeviceDict if dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE: continue cmdPara = {"IMEI": devNo, "ota_set": { "fw_url": "http://develop.5tao5ai.com/uploaded/SMART_BOX_1.8.110_Luat_V0033_8955_SSL.bin"}} result = MessageSender.send(device = dev, cmd = DeviceCmdCode.SET_DEVINFO, payload = cmdPara) if result['rst'] != 0: print 'send updating cmd error,imei=%s' % devNo else: print 'success for imei=%s,send the message' % devNo count = count + 1 doing_dict[devNo] = int(time.time()) while True: if len(doing_dict) > 5: print('queue is full.') for imei in list(doing_dict.keys()): start_time = doing_dict[imei] if (int(time.time()) - start_time) > 2 * 60: doing_dict.pop(imei, None) _ = Device.get_dev(imei) timeout.write( '%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer']))) time.sleep(5) else: print('queue is not full') break except Exception, e: print 'some exception =%s' % e finally: print('finished') mqttc1883.loop_stop() mqttc1883.disconnect() mqttc1883.close() mqttc1884.loop_stop() mqttc1884.disconnect() mqttc1884.close() while len(doing_dict) > 0: for imei in list(doing_dict.keys()): start_time = doing_dict[imei] if (int(time.time()) - start_time) > 2 * 60: doing_dict.pop(imei, None) _ = Device.get_dev(imei) timeout.write( '%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer']))) time.sleep(1) error.close() timeout.close() done.close()