## 3、指令下发 Zeus IoT 平台的指令下发也是完全开放式的模式,类似于一个 Webhook,平台层封装了 EventBus 来触发不同的事件。`具体和设备怎么交互,用什么协议交互,完全由开发者决定`。 `指令事件的触发是由 Zabbix Server 或者 Zabbix Proxy 来根据规则触发的,在 IoT Server 被执行,和设备进行交互` 1. 设备自动触发:告警规则、场景联动、基于设备事件上报触发 ```java @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。 ```java /** * 示例程序 * @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 接口,获取 设备服务定义的信息 来动态和设备交互。 - 具体的参考示例: 2. 手动触发 - 属于页面级功能,Comming soon...