update_device_temp_4_0.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import threading
  5. import time
  6. import uuid
  7. import thread
  8. from django.conf import settings
  9. from base import init_env
  10. import simplejson as json
  11. init_env(interactive = True)
  12. from apps.web.device.models import Device, DeviceDict
  13. from apps.web.core.networking import MessageSender
  14. from apps.web.constant import Const, DeviceCmdCode, DeviceOnlineStatus
  15. from apps.web.core.mqtt_client import MqttClient
  16. output_path = '/root/v4.0'
  17. version = 'v4.0.111'
  18. version_regex = 'v4\.0\.'
  19. version_check = 'v4.0.'
  20. done = open('%s/done_%d.txt' % (output_path, int(time.time())), 'w')
  21. # offline = open('%s/offline_%d.txt' % (output_path, int(time.time())), 'w')
  22. error = open('%s/error_%d.txt' % (output_path, int(time.time())), 'w')
  23. timeout = open('%s/timeout_%d.txt' % (output_path, int(time.time())), 'w')
  24. mqttc1883 = None
  25. mqttc1884 = None
  26. doing_dict = {}
  27. try:
  28. def on_connect(client, userdata, flags, rc):
  29. pass
  30. # client.subscribe('+/+/209', qos = Const.MQTT_QOS)
  31. # print('subscribe topic(%s) success' % '+/+/209')
  32. def on_message(mqttc, obj, msg):
  33. msgDict = json.loads(bytes.decode(msg.payload))
  34. imei = msgDict['IMEI']
  35. _ = Device.get_dev(imei)
  36. print('209 has received. msg = %s' % str(msgDict))
  37. if msgDict['result']:
  38. done.write('%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer'])))
  39. else:
  40. error.write('%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer'])))
  41. doing_dict.pop(imei, None)
  42. mqttc.subscribe('server/%s/209' % imei)
  43. def on_disconnect(client, userdata, self):
  44. print('exit. client = %s' % str(client))
  45. mqttc1883 = MqttClient(client_id = 'webapp_' + str(uuid.uuid1()))
  46. try:
  47. mqttc1883.on_message = on_message
  48. mqttc1883.on_connect = on_connect
  49. mqttc1883.on_disconnect = on_disconnect
  50. mqttc1883.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD)
  51. mqttc1883.connect(settings.MQTT_HOSTNAME, 1883, 60)
  52. mqttc1883.loop_start()
  53. except Exception as e:
  54. print(e)
  55. mqttc1884 = MqttClient(client_id = 'webapp_' + str(uuid.uuid1()))
  56. try:
  57. mqttc1884.on_message = on_message
  58. mqttc1884.on_connect = on_connect
  59. mqttc1884.on_disconnect = on_disconnect
  60. mqttc1884.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD)
  61. mqttc1884.connect(settings.MQTT_HOSTNAME, 1884, 60)
  62. mqttc1884.loop_start()
  63. except Exception as e:
  64. print(e)
  65. objs = Device.get_collection().find(
  66. {'$and': [{'softVer': {'$regex': version_regex}}, {'softVer': {'$ne': version}}]})
  67. count = 0
  68. # 做一下保护, 避免查询语句错误
  69. devNoList = []
  70. for obj in objs:
  71. if str(obj['softVer']).startswith(version_check):
  72. devNoList.append(str(obj['devNo']))
  73. else:
  74. print 'error dev = %s' % str(obj['devNo'])
  75. for devNo in devNoList:
  76. try:
  77. if count >= 10:
  78. break
  79. dev = Device.get_dev(devNo) # type: DeviceDict
  80. if dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE:
  81. continue
  82. if ':1884' in dev['server']:
  83. mqttc1884.subscribe('server/%s/209' % devNo, Const.MQTT_QOS)
  84. elif ':1883' in dev['server']:
  85. mqttc1883.subscribe('server/%s/209' % devNo, Const.MQTT_QOS)
  86. else:
  87. error.write('%s %s %s\n' % (str(dev['devNo']), str(dev['logicalCode']), str(dev['softVer'])))
  88. continue
  89. cmdPara = {"IMEI": devNo, "ota_set": {
  90. "fw_url": "http://develop.5tao5ai.com/uploaded/SMART_BOX_4.0.111_Luat_V0033_8955_SSL.bin"}}
  91. result = MessageSender.send(device = dev, cmd = DeviceCmdCode.SET_DEVINFO, payload = cmdPara)
  92. if result['rst'] != 0:
  93. error.write('%s %s %s\n' % (str(dev['devNo']), str(dev['logicalCode']), str(dev['softVer'])))
  94. continue
  95. else:
  96. count = count + 1
  97. doing_dict[devNo] = int(time.time())
  98. while True:
  99. if len(doing_dict) > 5:
  100. print('queue is full.')
  101. for imei in list(doing_dict.keys()):
  102. start_time = doing_dict[imei]
  103. if (int(time.time()) - start_time) > 2 * 60:
  104. doing_dict.pop(imei, None)
  105. _ = Device.get_dev(imei)
  106. timeout.write(
  107. '%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer'])))
  108. time.sleep(5)
  109. else:
  110. print('queue is not full')
  111. break
  112. except Exception, e:
  113. print 'some exception =%s' % e
  114. finally:
  115. print('finished')
  116. if mqttc1883:
  117. mqttc1883.loop_stop()
  118. mqttc1883.disconnect()
  119. mqttc1883.close()
  120. if mqttc1884:
  121. mqttc1884.loop_stop()
  122. mqttc1884.disconnect()
  123. mqttc1884.close()
  124. while len(doing_dict) > 0:
  125. for imei in list(doing_dict.keys()):
  126. start_time = doing_dict[imei]
  127. if (int(time.time()) - start_time) > 2 * 60:
  128. doing_dict.pop(imei, None)
  129. _ = Device.get_dev(imei)
  130. timeout.write(
  131. '%s %s %s\n' % (str(_['devNo']), str(_['logicalCode']), str(_['softVer'])))
  132. time.sleep(1)
  133. error.close()
  134. timeout.close()
  135. done.close()
  136. # offline.close()