Ejemplo n.º 1
0
 def query_srv_name_by_dev_id(dev_id):
     try:
         if dev_id in g_dev_id_to_srv_name_map_dict.keys():
             dev_srv_name = g_dev_id_to_srv_name_map_dict[dev_id]
             msg = MyLog.color_green('从内存获取到设备(%s)的服务名为%s' %
                                     (dev_id, dev_srv_name))
             MyLog.logger.info(msg)
             return dev_srv_name
         else:
             MyLog.logger.info(f'RPC查询设备({dev_id})服务名称')
             with ClusterRpcProxy(url) as rpc:
                 dev_srv_name = rpc.mng_srv.get_srv_name_from_sn(dev_id)
             if dev_srv_name:
                 msg = MyLog.color_green('RPC查询得到设备(%s)的服务名为%s' %
                                         (dev_id, dev_srv_name))
                 MyLog.logger.info(msg)
                 g_dev_id_to_srv_name_map_dict[dev_id] = dev_srv_name
             else:
                 msg = MyLog.color_green('RPC查询得到设备(%s)的服务名为空' % (dev_id))
                 MyLog.logger.info(msg)
             return dev_srv_name
     except Exception as e:
         msg = MyLog.color_red("query_srv_name_by_dev_id has except: " +
                               str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 2
0
 def get_attributes(dev_id, attr_name):
     try:
         MyLog.logger.info('查询服务名称')
         dev_svr_name = DevCall.query_srv_name_by_dev_id(dev_id)
         msg = MyLog.color_green('设备(%s)的服务名为%s' % (dev_id, dev_svr_name))
         MyLog.logger.info(msg)
         if dev_svr_name:
             msg = MyLog.color_green('RPC调用设备(%s)获取属性值(%s)' %
                                     (dev_id, attr_name))
             MyLog.logger.info(msg)
             function_name = 'rpc.' + dev_svr_name + '.property_read'
             with ClusterRpcProxy(url) as rpc:
                 result, value = eval(function_name)(dev_id, attr_name)
             if result == g_retValue.qjBoxOpcodeSucess.value:
                 msg = MyLog.color_green(
                     f'RPC调用设备({dev_id})获取属性值({attr_name}:{value})')
                 MyLog.logger.info(msg)
                 return value
             else:
                 msg = MyLog.color_red(
                     '获取设备(%s)属性值(%s)返回错误(%s)' %
                     (dev_id, attr_name, g_retValue(result).name))
                 MyLog.logger.error(msg)
                 return None
     except Exception as e:
         msg = MyLog.color_red("get_attributes has except: " + str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 3
0
 def delete_rule_by_uuid(self, uuids) -> int:
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value
     payload = json.dumps(uuids)
     msg = MyLog.color_green('rpc call delete_rule_by_uuid: %s' % (payload))
     MyLog.logger.info(msg)
     return RuleMng.delete_rule_by_uuid(uuids)
Ejemplo n.º 4
0
 def get_rule_by_uuid(self, uuids) -> (int, dict):
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value, {}
     payload = json.dumps(uuids)
     msg = MyLog.color_green('rpc call get_rule_by_uuid: %s' % (payload))
     MyLog.logger.info(msg)
     return RuleMng.get_rule_by_uuid(uuids)
Ejemplo n.º 5
0
 def manual_control(self, services) -> int:
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value
     payload = json.dumps(services)
     msg = MyLog.color_green('rpc call manual_control: %s' % (payload))
     MyLog.logger.info(msg)
     return RuleMng.manual_control(services)
Ejemplo n.º 6
0
 def add_rule(self, rules) -> int:
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value
     payload = json.dumps(rules)
     msg = MyLog.color_green('rpc call add_rule: %s' % (payload))
     MyLog.logger.info(msg)
     return RuleMng.add_rule(rules)
Ejemplo n.º 7
0
 def outside_linkage(self, services) -> int:
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value
     payload = json.dumps(services)
     msg = MyLog.color_green('rpc call outside_linkage: %s' % (payload))
     MyLog.logger.info(msg)
     # 添加联动指令到指令列表
     return RuleMng.outside_linkage(services)
Ejemplo n.º 8
0
 def stop_linkage_rule_running(self, uuids) -> int:
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value
     payload = json.dumps(uuids)
     msg = MyLog.color_green('rpc call stop_linkage_rule_running: %s' % (payload))
     MyLog.logger.info(msg)
     # 删除指令列表中指定uuid的指令
     return RuleMng.stop_linkage_rule_running(uuids)
Ejemplo n.º 9
0
 def attribute_notice(self, product_id, dev_id, attrs) -> None:
     if not service_ready():
         return None
     msg = MyLog.color_green('rpc call attribute_notice, dev_id:%s' % dev_id)
     MyLog.logger.debug(msg)
     DevAttributeMng.update_dev_now_attributes(dev_id=dev_id, attr_dict=attrs)
     timer = Timer(0, RuleMng.run_linkage_rule_by_devid, args=(dev_id, attrs,))
     timer.start()
Ejemplo n.º 10
0
def main():
    msg = MyLog.color_green('+++++++++规则引擎启动+++++++++')
    MyLog.logger.info(msg)
    RuleNameko.open()
    time.sleep(6)
    MyLog.logger.info("query has mng srv ready")
    while not DevCall.mng_srv_ready():
        time.sleep(1)
    msg = MyLog.color_green('管理服务已就就绪')
    set_service_ready()
    MyLog.logger.info(msg)

    # 恢复设备之前联动过程中没有恢复的指令
    DevAttributeMng.restore_devices_when_start_up()
    RuleMng.timer_rule_decision()
    while True:
        time.sleep(3600)
Ejemplo n.º 11
0
 def event_notice(self, product_id, dev_id, event, payload) -> None:
     if not service_ready():
         return None
     msg = MyLog.color_green('rpc call event_notice, dev_id:%s, event:%s, payload:%s' % (dev_id, event, payload))
     MyLog.logger.info(msg)
     if EventHandle.update_event(product_id, dev_id, event, payload):
         # 根据dev_id,触发与其相关的联动脚本执行
         timer = Timer(0, RuleMng.run_linkage_rule_by_devid, args=(dev_id, None,))
         timer.start()
Ejemplo n.º 12
0
 def report_rule_end_event(uuid):
     try:
         msg = MyLog.color_green('上报规则结束事件 uuid=%s' % (uuid))
         MyLog.logger.info(msg)
         with ClusterRpcProxy(url) as rpc:
             resp = rpc.GW.raiseEvent.call_async('ruleEnd', uuid=uuid)
     except Exception as e:
         msg = MyLog.color_red("report_rule_end_event has except: " +
                               str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 13
0
def service_ready():
    global service_is_ready
    global start_ts
    if service_is_ready:
        return True
    elif time.time() - start_ts > 5:
        service_is_ready = True
        msg = MyLog.color_green('rule engine rpc service ready')
        MyLog.logger.info(msg)
        return True
    else:
        return False
Ejemplo n.º 14
0
 def report_linkage_custom_event(eventId, srcList):
     try:
         msg = MyLog.color_green(
             f'上报用户自定义事件 eventid={eventId} srcList={srcList}')
         MyLog.logger.info(msg)
         with ClusterRpcProxy(url) as rpc:
             resp = rpc.GW.raiseEvent.call_async('customEvent',
                                                 eventId=eventId,
                                                 srcList=srcList)
     except Exception as e:
         msg = MyLog.color_red("report_linkage_custom_event has except: " +
                               str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 15
0
 def report_rule_command_cover_event(dev_id, command, be_cover_rule_uuid,
                                     cover_rule_uuid):
     try:
         msg = MyLog.color_green('上报指令被高优先级抢占事件 dev_id=%s, command=%s, be_cover_rule_uuid=%s, cover_rule_uuid=%s'\
             %(dev_id, command, be_cover_rule_uuid, cover_rule_uuid))
         MyLog.logger.info(msg)
         with ClusterRpcProxy(url) as rpc:
             resp = rpc.GW.raiseEvent.call_async('ruleCommandCover',\
                 devId=dev_id, command=command, beCoverRuleUuid=be_cover_rule_uuid, coverRuleUuid=cover_rule_uuid)
     except Exception as e:
         msg = MyLog.color_red(
             "report_rule_command_cover_event has except: " + str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 16
0
 def call_service(dev_id, service_name, type, params=None, default=False):
     try:
         dev_svr_name = DevCall.query_srv_name_by_dev_id(dev_id)
         if dev_svr_name:
             command_save = True
             if type == 'linkage':
                 command_save = False
             if not default:
                 msg = MyLog.color_green(
                     'RPC调用设备(%s)服务(%s)类型(%s),参数:%s' %
                     (dev_id, service_name, type, params))
                 MyLog.logger.info(msg)
                 function_name = 'rpc.' + dev_svr_name + '.ioctl'
                 with ClusterRpcProxy(url) as rpc:
                     ret, data = eval(function_name)(dev_id, service_name,
                                                     command_save, params)
                     return False, True, ret, data
             else:
                 msg = MyLog.color_green('RPC调用设备(%s)服务(%s)类型(%s),默认参数' %
                                         (dev_id, service_name, type))
                 MyLog.logger.info(msg)
                 function_name = 'rpc.' + dev_svr_name + '.set_default'
                 with ClusterRpcProxy(url) as rpc:
                     ret, data = eval(function_name)(dev_id, service_name,
                                                     command_save)
                     return False, True, ret, data
         else:
             return False, False, g_retValue.qjBoxOpcodeSrvNoRunning.value, {}
     except UnknownService as e:
         msg = MyLog.color_red(
             "DevCall call_service has UnknownService except: " + str(e))
         MyLog.logger.error(msg)
         return True, False, g_retValue.qjBoxOpcodeSrvNoRunning.value, {}
     except Exception as e:
         msg = MyLog.color_red("DevCall call_service has except: " + str(e))
         MyLog.logger.error(msg)
         return True, False, g_retValue.qjBoxOpcodeExcept.value, {}
Ejemplo n.º 17
0
 def report_default_command_status_event(dev_id, command, result_code):
     try:
         msg = MyLog.color_green(
             '上报指令执行默认参数结果事件 dev_id=%s, command=%s, result_code=%d' %
             (dev_id, command, result_code))
         MyLog.logger.info(msg)
         with ClusterRpcProxy(url) as rpc:
             resp = rpc.GW.raiseEvent.call_async('ruleDefaultCommandStatus',
                                                 devId=dev_id,
                                                 command=command,
                                                 resultCode=result_code)
     except Exception as e:
         msg = MyLog.color_red(
             "report_default_command_status_event has except: " + str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 18
0
    def full_attribute_notice(self, product_id, dev_id, attrs):
        """
        接收设备的全量上报
        Args:
            product_id:
            dev_id:
            attrs:

        Returns:

        """
        if not service_ready():
            return None
        msg = MyLog.color_green(f'rpc call full_attribute_notice{product_id, dev_id, attrs}')
        MyLog.logger.debug(msg)

        DevAttributeMng.update_dev_now_attributes(dev_id=dev_id, attr_dict=attrs)
Ejemplo n.º 19
0
 def report_rule_command_ignore_event(dev_id, command, uuid,
                                      higher_priority_uuid):
     try:
         msg = MyLog.color_green(
             '上报指令忽略执行事件 dev_id=%s, command=%s, uuid=%s, higher_priority_uuid=%s'
             % (dev_id, command, uuid, higher_priority_uuid))
         MyLog.logger.info(msg)
         with ClusterRpcProxy(url) as rpc:
             resp = rpc.GW.raiseEvent.call_async(
                 'ruleCommandIgnore',
                 devId=dev_id,
                 command=command,
                 uuid=uuid,
                 higherPriorityUuid=higher_priority_uuid)
     except Exception as e:
         msg = MyLog.color_red(
             "report_rule_command_ignore_event has except: " + str(e))
         MyLog.logger.error(msg)
         return None
Ejemplo n.º 20
0
 def get_all_rules(self) -> (int, dict):
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value, {}
     msg = MyLog.color_green('rpc call get_all_rules')
     MyLog.logger.info(msg)
     return RuleMng.get_all_rules()
Ejemplo n.º 21
0
    def command_exe(dev_id, command: CommandInfo, force=False):
        try:
            MyLog.logger.info(
                f'指令执行 设备id:{dev_id}, 指令名称:{command.command}, 规则:{command.uuid}, force:{force}'
            )
            # 先获取指令名称
            command_name = command.command
            # 从该设备的指令队列中查询该指令名称正在执行的指令
            dev_command_queue = DevCommandQueueMng.get_dev_command_queue(
                dev_id)
            running_command = dev_command_queue.get_current_running_command(
                command_name)
            need_exe = False
            need_report_rule_command_cover_event = False
            if force:
                need_exe = True
                if running_command.priority < command.priority:
                    need_report_rule_command_cover_event = True
            elif running_command:
                # 判断是否为同一个规则指令,如果不是才允许执行
                MyLog.logger.info('running_command: %s, command:%s' %
                                  (running_command.uuid, command.uuid))
                MyLog.logger.info(
                    f'running_command_effective:{running_command.effective}')
                if not running_command.effective or running_command.uuid != command.uuid:
                    need_exe = True
                else:
                    msg = MyLog.color_green(
                        '指令执行 设备id:%s, 指令名称:%s, 规则:%s 已经在执行中,不需要重新下发' %
                        (dev_id, command.command, command.uuid))
                    MyLog.logger.info(msg)
                if running_command.priority < command.priority:
                    need_report_rule_command_cover_event = True
            else:
                need_exe = True

            result = g_retValue.qjBoxOpcodeSucess.value
            need_retry = False
            service_has_recv = False
            if need_exe:
                if command.default_param:
                    # 执行默认参数
                    msg = MyLog.color_green(
                        '下发默认参数指令(%s)给设备(%s)服务, 指令优先级:%d' %
                        (command.command, dev_id, command.priority))
                    MyLog.logger.info(msg)
                    need_retry, service_has_recv, result, data = DevCall.call_service(
                        dev_id, command.command, command.type, default=True)
                    msg = MyLog.color_green('下发默认参数指令(%s)给设备(%s)服务, 返回:%d' %
                                            (command.command, dev_id, result))
                    MyLog.logger.info(msg)
                    EventReport.report_default_command_status_event(
                        dev_id, command.command, result)
                else:
                    # 执行规则配置参数
                    msg = MyLog.color_green(
                        '下发规则(%s)指令(%s)给设备(%s)服务, 指令优先级:%d' %
                        (command.uuid, command.command, dev_id,
                         command.priority))
                    MyLog.logger.info(msg)
                    need_retry, service_has_recv, result, data = DevCall.call_service(
                        dev_id, command.command, command.type, command.params)
                    msg = MyLog.color_green(
                        '下发规则(%s)指令(%s)给设备(%s)服务, 返回:%d' %
                        (command.uuid, command.command, dev_id, result))
                    MyLog.logger.info(msg)
                    # 上报ruleCommandStatus event
                    EventReport.report_rule_command_status_event(
                        command.uuid, dev_id, command.command, result)

                if service_has_recv:
                    dev_command_queue.set_current_running_command(
                        command_name, command)

                    # 更新规则指令状态
                    CmdRecorder.update_cmd(dev_id, command)

                    if need_report_rule_command_cover_event:
                        EventReport.report_rule_command_cover_event(
                            dev_id, command.command, running_command.uuid,
                            command.uuid)
            return need_retry, service_has_recv, result
        except BaseException as e:
            msg = MyLog.color_red('command_exe has except: ' + str(e))
            MyLog.logger.error(msg)
            return False, False, g_retValue.qjBoxOpcodeExcept.value
Ejemplo n.º 22
0
 def clear_all_rule(self) -> int:
     if not service_ready():
         return g_retValue.qjBoxOpcodeNoReady.value
     msg = MyLog.color_green('rpc call clear_all_rule')
     MyLog.logger.info(msg)
     return RuleMng.clear_all_rule()