update_device_temp_3_0.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. doing_dict = {}
  17. print 'nowtime = %s start update device now.....' % datetime.datetime.now()
  18. def on_connect(client, userdata, flags, rc):
  19. client.subscribe('+/+/209', qos = Const.MQTT_QOS)
  20. print('subscribe topic(%s) success' % '+/+/209')
  21. def on_message(mqttc, obj, msg):
  22. msgDict = json.loads(bytes.decode(msg.payload))
  23. imei = msgDict['IMEI']
  24. print('209 has received. msg = %s' % str(msgDict))
  25. doing_dict.pop(imei, None)
  26. def on_disconnect(client, userdata, self):
  27. print('exit. client = %s' % str(client))
  28. mqttc1883 = MqttClient(client_id = 'webapp_' + str(uuid.uuid1()))
  29. try:
  30. mqttc1883.on_message = on_message
  31. mqttc1883.on_connect = on_connect
  32. mqttc1883.on_disconnect = on_disconnect
  33. mqttc1883.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD)
  34. mqttc1883.connect(settings.MQTT_HOSTNAME, 1883, 60)
  35. mqttc1883.loop_start()
  36. except Exception as e:
  37. print(e)
  38. mqttc1884 = MqttClient(client_id = 'webapp_' + str(uuid.uuid1()))
  39. try:
  40. mqttc1884.on_message = on_message
  41. mqttc1884.on_connect = on_connect
  42. mqttc1884.on_disconnect = on_disconnect
  43. mqttc1884.username_pw_set(settings.MQTT_USER, settings.MQTT_PSWD)
  44. mqttc1884.connect(settings.MQTT_HOSTNAME, 1884, 60)
  45. mqttc1884.loop_start()
  46. except Exception as e:
  47. print(e)
  48. objs = Device.get_collection().find(
  49. {'$and': [{'softVer': {'$lt': 'v3.0.999'}}, {'softVer': {'$gte': 'v3.0.0'}}]})
  50. count = 0
  51. devNoList = [str(obj['devNo']) for obj in objs]
  52. for devNo in devNoList:
  53. try:
  54. if count >= 1:
  55. break
  56. dev = Device.get_dev(devNo) # type:DeviceDict
  57. if dev.online != DeviceOnlineStatus.DEV_STATUS_ONLINE:
  58. print 'offline. devNo = %s' % devNo
  59. continue
  60. result = MessageSender.send(device = dev, cmd = DeviceCmdCode.GET_DEVINFO, payload = {
  61. 'IMEI': devNo, 'fields': ['driverCode', 'core_ver']
  62. })
  63. if result['rst'] != 0:
  64. print 'send 201 cmd error,imei=%s' % devNo
  65. continue
  66. cmdPara = {"IMEI": devNo, "ota_set": {
  67. "fw_url": "http://develop.5tao5ai.com/uploaded/SMART_BOX_4.0.111_Luat_V0020_8955_SSL.bin"}}
  68. result = MessageSender.send(device = dev, cmd = DeviceCmdCode.SET_DEVINFO, payload = cmdPara)
  69. if result['rst'] != 0:
  70. print 'send updating cmd error,imei=%s' % devNo
  71. else:
  72. print 'success for imei=%s,send the message' % devNo
  73. count = count + 1
  74. doing_dict[devNo] = int(time.time())
  75. while True:
  76. if len(doing_dict) > 5:
  77. print('queue is full.')
  78. for imei in list(doing_dict.keys()):
  79. start_time = doing_dict[imei]
  80. if (int(time.time()) - start_time) > 5 * 60:
  81. doing_dict.pop(imei, None)
  82. time.sleep(5)
  83. else:
  84. print('queue is not full')
  85. break
  86. except Exception, e:
  87. print 'some exception =%s' % e
  88. print('finished')
  89. mqttc1883.loop_stop()
  90. mqttc1883.disconnect()
  91. mqttc1883.close()
  92. mqttc1884.loop_stop()
  93. mqttc1884.disconnect()
  94. mqttc1884.close()