# -*- coding: utf-8 -*- # !/usr/bin/env python import getopt import logging import sys from typing import TYPE_CHECKING try: options, args = getopt.getopt(sys.argv[1:], 'q:e:p:d:', ['queue=', 'env=', 'port=', 'debug=']) except getopt.GetoptError as e: print(str(e)) sys.exit() platform_env = 'testing' queue = False port = None debug = '' for name, value in options: if name in ('-e', '--env'): platform_env = value if name in ('-q', '--queue'): queue = value if name in ('-p', '--port'): port = int(value) if name in ('-d', '--debug'): debug = value if not port: print 'no port parameter.' sys.exit(1) import os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.{env}'.format(env=platform_env)) PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..') sys.path.insert(0, PROJECT_ROOT) from script.base import init_env init_env(interactive=False) import simplejson as json from django.conf import settings from apps.web.common.event import do_device_event from apps.web.core.sysparas import SysParas from script.eventer.mqtt_context import MqttContext from apps.web.constant import Const from script.eventer.handlers.query_info import QueryInfoHandler, getQRcode if TYPE_CHECKING: from apps.web.device.models import DeviceDict logger = logging.getLogger(__name__) host = SysParas.get_private_ip(settings.MQTT_HOSTNAME) def worker(cmd, dev, payload): # type: (str, DeviceDict, str)->None try: device_event = json.loads(bytes.decode(payload)) except ValueError: logger.error( "can not loads message payload, cmd = <{}>, dev= <{}>, payload = <{}>".format(cmd, dev.devNo, payload)) return if dev.devNo != device_event.get('IMEI', None): logger.warning('invalid msg for not same devNo({} != {})'.format(dev.devNo, device_event.get('IMEI'))) return if cmd != str(device_event.get('cmd', '')): logger.warning('invalid msg for not same cmd({} != {})'.format(cmd, device_event.get('cmd', None))) return if cmd == '101': QueryInfoHandler(cmd, dev, payload).do() elif cmd == '102': logger.info('Device request QR code devNo={}'.format(dev.devNo)) getQRcode(dev) else: do_device_event(cmd, dev, device_event) with MqttContext(host=host, port=port, user=settings.MQTT_USER, password=settings.MQTT_PSWD, worker=worker, platform_env=platform_env, queue=queue, debug=debug, cmds={ '120': { 'qos': Const.MQTT_QOS, 'checkRegistered': True }, '110': { 'qos': Const.MQTT_QOS, 'checkRegistered': True }, '100': { 'qos': Const.MQTT_QOS, 'checkRegistered': True }, '101': { 'qos': Const.MQTT_QOS, 'checkRegistered': False }, '102': { 'qos': Const.MQTT_QOS, 'checkRegistered': False }, '301': { 'qos': Const.MQTT_QOS, 'checkRegistered': True }, '307': { 'qos': Const.MQTT_QOS, 'checkRegistered': True } }, logger=logger, name='listener') as context: context.start() logger.debug('exit now.')