# -*- 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 doing_dict = {} print 'nowtime = %s start update device now.....' % datetime.datetime.now() def on_connect(client, userdata, flags, rc): 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'] print('209 has received. msg = %s' % str(msgDict)) doing_dict.pop(imei, None) def on_disconnect(client, userdata, self): print('exit. client = %s' % str(client)) 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': {'$lt': 'v3.0.999'}}, {'softVer': {'$gte': 'v3.0.0'}}]}) count = 0 devNoList = [str(obj['devNo']) for obj in objs] for devNo in devNoList: try: if count >= 1: break dev = Device.get_dev(devNo) # type:DeviceDict if dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE: print 'offline. devNo = %s' % devNo continue result = MessageSender.send(device = dev, cmd = DeviceCmdCode.GET_DEVINFO, payload = { 'IMEI': devNo, 'fields': ['driverCode', 'core_ver'] }) if result['rst'] != 0: print 'send 201 cmd error,imei=%s' % devNo continue cmdPara = {"IMEI": devNo, "ota_set": { "fw_url": "http://develop.5tao5ai.com/uploaded/SMART_BOX_4.0.111_Luat_V0020_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) > 5 * 60: doing_dict.pop(imei, None) time.sleep(5) else: print('queue is not full') break except Exception, e: print 'some exception =%s' % e print('finished') mqttc1883.loop_stop() mqttc1883.disconnect() mqttc1883.close() mqttc1884.loop_stop() mqttc1884.disconnect() mqttc1884.close()