listener.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import getopt
  4. import logging
  5. import sys
  6. from typing import TYPE_CHECKING
  7. try:
  8. options, args = getopt.getopt(sys.argv[1:], 'q:e:p:d:',
  9. ['queue=', 'env=', 'port=', 'debug='])
  10. except getopt.GetoptError as e:
  11. print(str(e))
  12. sys.exit()
  13. platform_env = 'testing'
  14. queue = False
  15. port = None
  16. debug = ''
  17. for name, value in options:
  18. if name in ('-e', '--env'):
  19. platform_env = value
  20. if name in ('-q', '--queue'):
  21. queue = value
  22. if name in ('-p', '--port'):
  23. port = int(value)
  24. if name in ('-d', '--debug'):
  25. debug = value
  26. if not port:
  27. print 'no port parameter.'
  28. sys.exit(1)
  29. import os
  30. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env=platform_env))
  31. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  32. sys.path.insert(0, PROJECT_ROOT)
  33. from script.base import init_env
  34. init_env(interactive=False)
  35. import simplejson as json
  36. from django.conf import settings
  37. from apps.web.common.event import do_device_event
  38. from apps.web.core.sysparas import SysParas
  39. from script.eventer.mqtt_context import MqttContext
  40. from apps.web.constant import Const
  41. from script.eventer.handlers.query_info import QueryInfoHandler, getQRcode
  42. if TYPE_CHECKING:
  43. from apps.web.device.models import DeviceDict
  44. logger = logging.getLogger(__name__)
  45. host = SysParas.get_private_ip(settings.MQTT_HOSTNAME)
  46. def worker(cmd, dev, payload):
  47. # type: (str, DeviceDict, str)->None
  48. try:
  49. device_event = json.loads(bytes.decode(payload))
  50. except ValueError:
  51. logger.error(
  52. "can not loads message payload, cmd = <{}>, dev= <{}>, payload = <{}>".format(cmd, dev.devNo, payload))
  53. return
  54. if dev.devNo != device_event.get('IMEI', None):
  55. logger.warning('invalid msg for not same devNo({} != {})'.format(dev.devNo, device_event.get('IMEI')))
  56. return
  57. if cmd != str(device_event.get('cmd', '')):
  58. logger.warning('invalid msg for not same cmd({} != {})'.format(cmd, device_event.get('cmd', None)))
  59. return
  60. if cmd == '101':
  61. QueryInfoHandler(cmd, dev, payload).do()
  62. elif cmd == '102':
  63. logger.info('Device request QR code devNo={}'.format(dev.devNo))
  64. getQRcode(dev)
  65. else:
  66. do_device_event(cmd, dev, device_event)
  67. with MqttContext(host=host,
  68. port=port,
  69. user=settings.MQTT_USER,
  70. password=settings.MQTT_PSWD,
  71. worker=worker,
  72. platform_env=platform_env,
  73. queue=queue,
  74. debug=debug,
  75. cmds={
  76. '120': {
  77. 'qos': Const.MQTT_QOS,
  78. 'checkRegistered': True
  79. },
  80. '110': {
  81. 'qos': Const.MQTT_QOS,
  82. 'checkRegistered': True
  83. },
  84. '100': {
  85. 'qos': Const.MQTT_QOS,
  86. 'checkRegistered': True
  87. },
  88. '101': {
  89. 'qos': Const.MQTT_QOS,
  90. 'checkRegistered': False
  91. },
  92. '102': {
  93. 'qos': Const.MQTT_QOS,
  94. 'checkRegistered': False
  95. },
  96. '301': {
  97. 'qos': Const.MQTT_QOS,
  98. 'checkRegistered': True
  99. },
  100. '307': {
  101. 'qos': Const.MQTT_QOS,
  102. 'checkRegistered': True
  103. }
  104. },
  105. logger=logger,
  106. name='listener') as context:
  107. context.start()
  108. logger.debug('exit now.')