3、指令下发

Zeus IoT 平台的指令下发也是完全开放式的模式,类似于一个 Webhook,平台层封装了 EventBus 来触发不同的事件。具体和设备怎么交互,用什么协议交互,完全由开发者决定

指令事件的触发是由 Zabbix Server 或者 Zabbix Proxy 来根据规则触发的,在 IoT Server 被执行,和设备进行交互

  1. 设备自动触发:告警规则、场景联动、基于设备事件上报触发

    @Override
    public String pathSpec() {
        return "/device/action/exec";
    }


    /**
     * 动作触发Http入口,可在设备 上面设置 宏 定义,动态传入 identifier
     *
     * @param req
     * @return JsonElement
     * @throws ArgumentsParseException ex
     * @throws IOException             ex
     */
    @Override
    protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException, IOException {

        String request = getJsonBody(req);
        log.debug(request);

        EventBusService eventBusService = moduleManager.find(CoreModule.NAME).provider().getService(EventBusService.class);
        JsonObject requestJson = gson.fromJson(request, JsonObject.class);
        ActionParam actionParam = new ActionParam();
        actionParam.setTriggerDevice(requestJson.get("triggerId").toString());

        eventBusService.postExecuteActionMsg(ActionRouteIdentifier.helloworld, actionParam);

        return null;
    }
  • pathSpec : 定义了 Webhook Path 入口,由 Zabbix Server 和 Zabbix Proxy 在事件触发时调用,会动态传入 设备ID设备TAG 等信息。

  • doPost: 重写 Servlet 方法,传入 HttpServletRequest 对象,包含 Post 的数据,解析后,发布到 EventBus , 可以根据不同的条件发布到不同的 Topic。

    /**
     * 示例程序
     * @param event
     */

    @Subscribe
    public void subscribe(ActionParam event) {

        log.info("子线程接收异步事件, 设备ID - {} ", event.getTriggerDevice());


        String deviceInfo = Forest.post("/device/service?triggerId=" + event.getTriggerDevice().replaceAll("\\\"", "")).host("127.0.0.1").port(9090).execute();

        /***   设备交互代码,可以基于 Apache Camel 动态执行  ****/

    }
  • deviceInfo: 由于IoT Server 根据架构图可知 是不会连接业务数据库的,所以 deviceInfo 就是根据设备ID去调用 Zeus Webapp 接口,获取 设备服务定义的信息 来动态和设备交互。

  • 具体的参考示例:

  1. 手动触发

    • 属于页面级功能,Comming soon...