Commit 36dd18d41faa4a34a197821e73af20116ba97da1
1 parent
006ef40c
【代码评审】IoT:MQTT 插件
Showing
6 changed files
with
35 additions
and
10 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/util/MqttSignUtils.java
| ... | ... | @@ -59,9 +59,11 @@ public class MqttSignUtils { |
| 59 | 59 | @Getter |
| 60 | 60 | @AllArgsConstructor |
| 61 | 61 | public static class MqttSignResult { |
| 62 | + | |
| 62 | 63 | private final String clientId; |
| 63 | 64 | private final String username; |
| 64 | 65 | private final String password; |
| 66 | + | |
| 65 | 67 | } |
| 66 | 68 | |
| 67 | 69 | } |
| 68 | 70 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-emqx/src/main/java/cn/iocoder/yudao/module/iot/plugin/emqx/config/IotPluginEmqxProperties.java
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-emqx/src/main/java/cn/iocoder/yudao/module/iot/plugin/emqx/downstream/IotDeviceDownstreamHandlerImpl.java
| ... | ... | @@ -26,6 +26,7 @@ public class IotDeviceDownstreamHandlerImpl implements IotDeviceDownstreamHandle |
| 26 | 26 | |
| 27 | 27 | private static final String SYS_TOPIC_PREFIX = "/sys/"; |
| 28 | 28 | |
| 29 | + // TODO @haohao:讨论,感觉 mqtt 和 http,可以做个相对统一的格式哈。 | |
| 29 | 30 | // 设备服务调用 标准 JSON |
| 30 | 31 | // 请求Topic:/sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier} |
| 31 | 32 | // 响应Topic:/sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier}_reply | ... | ... |
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-emqx/src/main/java/cn/iocoder/yudao/module/iot/plugin/emqx/upstream/IotDeviceUpstreamServer.java
| ... | ... | @@ -26,17 +26,33 @@ import java.util.concurrent.TimeUnit; |
| 26 | 26 | @Slf4j |
| 27 | 27 | public class IotDeviceUpstreamServer { |
| 28 | 28 | |
| 29 | - private static final int RECONNECT_DELAY_MS = 5000; // 重连延迟时间(毫秒) | |
| 30 | - private static final int CONNECTION_TIMEOUT_MS = 10000; // 连接超时时间(毫秒) | |
| 31 | - private static final String TOPIC_SEPARATOR = ","; // 主题分隔符 | |
| 32 | - private static final MqttQoS DEFAULT_QOS = MqttQoS.AT_LEAST_ONCE; // 默认QoS级别 | |
| 29 | + /** | |
| 30 | + * 重连延迟时间(毫秒) | |
| 31 | + */ | |
| 32 | + private static final int RECONNECT_DELAY_MS = 5000; | |
| 33 | + /** | |
| 34 | + * 连接超时时间(毫秒) | |
| 35 | + */ | |
| 36 | + private static final int CONNECTION_TIMEOUT_MS = 10000; | |
| 37 | + /** | |
| 38 | + * 主题分隔符 | |
| 39 | + */ | |
| 40 | + private static final String TOPIC_SEPARATOR = ","; | |
| 41 | + /** | |
| 42 | + * 默认 QoS 级别 | |
| 43 | + */ | |
| 44 | + private static final MqttQoS DEFAULT_QOS = MqttQoS.AT_LEAST_ONCE; | |
| 33 | 45 | |
| 34 | 46 | private final Vertx vertx; |
| 35 | 47 | private final HttpServer server; |
| 36 | 48 | private final MqttClient client; |
| 37 | 49 | private final IotPluginEmqxProperties emqxProperties; |
| 38 | 50 | private final IotDeviceMqttMessageHandler mqttMessageHandler; |
| 39 | - private volatile boolean isRunning = false; // 服务运行状态标志 | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * 服务运行状态标志 | |
| 54 | + */ | |
| 55 | + private volatile boolean isRunning = false; | |
| 40 | 56 | |
| 41 | 57 | public IotDeviceUpstreamServer(IotPluginEmqxProperties emqxProperties, |
| 42 | 58 | IotDeviceUpstreamApi deviceUpstreamApi, |
| ... | ... | @@ -50,6 +66,7 @@ public class IotDeviceUpstreamServer { |
| 50 | 66 | Router router = Router.router(vertx); |
| 51 | 67 | router.route().handler(BodyHandler.create()); // 处理 Body |
| 52 | 68 | router.post(IotDeviceAuthVertxHandler.PATH) |
| 69 | + // TODO @haohao:疑问,mqtt 的认证,需要通过 http 呀? | |
| 53 | 70 | .handler(new IotDeviceAuthVertxHandler(deviceUpstreamApi)); |
| 54 | 71 | // 创建 HttpServer 实例 |
| 55 | 72 | this.server = vertx.createHttpServer().requestHandler(router); | ... | ... |
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-emqx/src/main/java/cn/iocoder/yudao/module/iot/plugin/emqx/upstream/router/IotDeviceAuthVertxHandler.java
| ... | ... | @@ -27,7 +27,7 @@ public class IotDeviceAuthVertxHandler implements Handler<RoutingContext> { |
| 27 | 27 | @Override |
| 28 | 28 | @SuppressWarnings("unchecked") |
| 29 | 29 | public void handle(RoutingContext routingContext) { |
| 30 | - | |
| 30 | + // TODO @haohao:try catch 兜底异常 | |
| 31 | 31 | JsonObject json = routingContext.body().asJsonObject(); |
| 32 | 32 | String clientId = json.getString("clientid"); |
| 33 | 33 | String username = json.getString("username"); |
| ... | ... | @@ -40,9 +40,11 @@ public class IotDeviceAuthVertxHandler implements Handler<RoutingContext> { |
| 40 | 40 | denyAccess(routingContext); |
| 41 | 41 | return; |
| 42 | 42 | } |
| 43 | + // TODO @haohao:貌似可以考虑封装一个 writeJson ,里面有个参数是 data,然后里面去 JsonUtils.toJsonString(data) | |
| 43 | 44 | IotPluginCommonUtils.writeJson(routingContext, "{\"result\": \"allow\"}"); |
| 44 | 45 | } |
| 45 | 46 | |
| 47 | + // TODO @haohao:下面两个简单方法,貌似可以考虑不抽小方法哈。 | |
| 46 | 48 | private void denyAccess(RoutingContext routingContext) { |
| 47 | 49 | IotPluginCommonUtils.writeJson(routingContext, "{\"result\": \"deny\"}"); |
| 48 | 50 | } | ... | ... |
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-emqx/src/main/java/cn/iocoder/yudao/module/iot/plugin/emqx/upstream/router/IotDeviceMqttMessageHandler.java
| ... | ... | @@ -26,12 +26,14 @@ import java.util.Arrays; |
| 26 | 26 | @Slf4j |
| 27 | 27 | public class IotDeviceMqttMessageHandler { |
| 28 | 28 | |
| 29 | + // TODO @haohao:讨论,感觉 mqtt 和 http,可以做个相对统一的格式哈。 | |
| 29 | 30 | // 设备上报属性 标准 JSON |
| 30 | - // 请求Topic:/sys/${productKey}/${deviceName}/thing/event/property/post | |
| 31 | - // 响应Topic:/sys/${productKey}/${deviceName}/thing/event/property/post_reply | |
| 31 | + // 请求 Topic:/sys/${productKey}/${deviceName}/thing/event/property/post | |
| 32 | + // 响应 Topic:/sys/${productKey}/${deviceName}/thing/event/property/post_reply | |
| 33 | + | |
| 32 | 34 | // 设备上报事件 标准 JSON |
| 33 | - // 请求Topic:/sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post | |
| 34 | - // 响应Topic:/sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post_reply | |
| 35 | + // 请求 Topic:/sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post | |
| 36 | + // 响应 Topic:/sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post_reply | |
| 35 | 37 | |
| 36 | 38 | private static final String SYS_TOPIC_PREFIX = "/sys/"; |
| 37 | 39 | private static final String PROPERTY_POST_TOPIC = "/thing/event/property/post"; | ... | ... |