123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- # -*- 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/v4.0'
- version = 'v4.0.111'
- version_regex = 'v4\.0\.'
- version_check = 'v4.0.'
- done = open('%s/done_%d.txt' % (output_path, int(time.time())), 'w')
- # offline = open('%s/offline_%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 = {}
- try:
- 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))
- 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 >= 10:
- break
- dev = Device.get_dev(devNo) # type: DeviceDict
- if dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE:
- continue
- if ':1884' in dev['server']:
- mqttc1884.subscribe('server/%s/209' % devNo, Const.MQTT_QOS)
- elif ':1883' in dev['server']:
- mqttc1883.subscribe('server/%s/209' % devNo, Const.MQTT_QOS)
- else:
- error.write('%s %s %s\n' % (str(dev['devNo']), str(dev['logicalCode']), str(dev['softVer'])))
- continue
- cmdPara = {"IMEI": devNo, "ota_set": {
- "fw_url": "http://develop.5tao5ai.com/uploaded/SMART_BOX_4.0.111_Luat_V0033_8955_SSL.bin"}}
- result = MessageSender.send(device = dev, cmd = DeviceCmdCode.SET_DEVINFO, payload = cmdPara)
- if result['rst'] != 0:
- error.write('%s %s %s\n' % (str(dev['devNo']), str(dev['logicalCode']), str(dev['softVer'])))
- continue
- else:
- 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')
- if mqttc1883:
- mqttc1883.loop_stop()
- mqttc1883.disconnect()
- mqttc1883.close()
- if mqttc1884:
- 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()
- # offline.close()
|