| pipIrr-platform/pipIrr-web/pipIrr-web-wechat/README_REMOTE_INTEGRATION.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RemoteServiceConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteCtrl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application-self.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/README_REMOTE_INTEGRATION.md
New file @@ -0,0 +1,199 @@ # 微信模块调用远程视频模块集成说明 ## 概述 本文档说明如何在 `pipIrr-web-wechat` 模块中调用 `pipIrr-web-remote` 模块的 `video/some` 接口,实现微信端视频监控功能。 ## 架构说明 - **pipIrr-web-wechat**: 微信小程序服务(端口:/wx) - **pipIrr-web-remote**: 远程控制服务(端口:/remote) 两个服务通过HTTP接口进行通信,微信模块作为客户端调用远程控制模块的视频监控REST API。 ## 配置说明 ### 1. 配置文件 在 `application-self.yml` 中添加远程服务配置: ```yaml remote: service: base-url: ${pipIrr.remote.baseUrl:http://localhost:8081/remote} ``` ### 2. 环境变量配置 根据部署环境设置相应的环境变量: ```properties # 开发环境 pipIrr.remote.baseUrl=http://localhost:8081/remote # 生产环境 pipIrr.remote.baseUrl=http://remote-service-host:8081/remote ``` ## 接口说明 ### 获取视频监控数据 **接口地址**: `GET /wx/remote/video/some` **请求参数**: - pageCurr: 当前页码(默认1) - pageSize: 每页大小(可选) **响应示例**: ```json { "success": true, "msg": "查询成功", "content": { "obj": [ { "id": 123456, "name": "摄像机1", "videoUrl4Simple": "rtmp://...", "videoUrl4Standard": "rtmp://...", "videoUrl4Security": "rtmp://...", "videoUrl4PcLive": "http://..." } ], "pageCurr": 1, "pageSize": 4, "itemTotal": 10 } } ``` ## 使用示例 ### Java代码示例 ```java @RestController @RequestMapping("wechat/video") public class WechatVideoController { @Autowired private RemoteService remoteService; @GetMapping("cameras") public BaseResponse<Object> getCameras( @RequestParam(defaultValue = "1") Integer pageCurr, @RequestParam(required = false) Integer pageSize) { // 构建查询参数 StringBuilder queryParams = new StringBuilder(); queryParams.append("pageCurr=").append(pageCurr); if (pageSize != null) { queryParams.append("&pageSize=").append(pageSize); } // 调用远程视频接口 return remoteService.getVideoSome(queryParams.toString()); } } ``` ### 前端调用示例 ```javascript // 微信小程序调用示例 wx.request({ url: 'https://your-domain.com/wx/remote/video/some?pageCurr=1&pageSize=10', method: 'GET', success: function(res) { if (res.data.success) { const cameras = res.data.content.obj; // 处理摄像机数据 cameras.forEach(camera => { console.log('摄像机:', camera.name); console.log('直播地址:', camera.videoUrl4PcLive); }); } else { wx.showToast({ title: res.data.msg, icon: 'error' }); } } }); ``` ## 错误处理 ### 常见错误码 - `HTTP 404`: 远程服务接口不存在 - `HTTP 500`: 远程服务内部错误 - `HTTP 503`: 远程服务不可用 - `Connection Timeout`: 连接超时 - `Read Timeout`: 读取超时 ### 错误处理策略 1. **连接失败重试**: OkHttpClient配置了连接失败自动重试 2. **超时处理**: 配置合理的连接、读取、写入超时时间 3. **异常日志**: 详细记录调用异常信息,便于问题排查 4. **降级处理**: 在远程服务不可用时,可以考虑本地缓存或降级方案 ## 监控和日志 ### 日志配置 ```yaml logging: level: com.dy.pipIrrWechat.remote: DEBUG ``` ### 关键日志 - 远程接口调用记录 - 请求和响应内容(调试模式) - 异常详细信息 - 性能监控(响应时间) ## 部署注意事项 1. **网络连通性**: 确保微信服务能够访问远程控制服务 2. **端口配置**: 检查防火墙和安全组设置 3. **负载均衡**: 如果远程服务有多个实例,配置负载均衡 4. **健康检查**: 定期检查远程服务可用性 ## 扩展功能 ### 1. 添加新的远程接口 1. 在 `RemoteService` 中添加新的方法 2. 在 `RemoteCtrl` 中添加对应的控制器方法 3. 更新文档和测试用例 ### 2. 增加缓存机制 可以考虑对查询类接口添加缓存,提高响应速度: ```java @Cacheable(value = "controllerAlarmState", key = "#queryParams") public BaseResponse<Object> getControllerAlarmState(String queryParams) { // 实现代码 } ``` ### 3. 异步调用 对于不需要立即返回结果的操作,可以考虑异步调用: ```java @Async public CompletableFuture<BaseResponse<Object>> openValveAsync(String requestBody) { return CompletableFuture.completedFuture(callRemoteApi("/valve/open", requestBody, "POST")); } ``` ## 总结 通过以上配置和代码,微信模块可以成功调用远程控制模块的 `video/some` 接口,实现视频监控数据的获取功能。这种架构设计保持了模块间的解耦,同时提供了简洁高效的视频数据访问能力。 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/config/RemoteServiceConfig.java
New file @@ -0,0 +1,33 @@ package com.dy.pipIrrWechat.config; import okhttp3.OkHttpClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.TimeUnit; /** * 远程视频服务配置类 * * @author zuoxiao * @date 2025-01-21 * @description 远程视频服务相关配置 */ @Configuration public class RemoteServiceConfig { /** * 配置OkHttpClient Bean * * @return OkHttpClient实例 */ @Bean public OkHttpClient okHttpClient() { return new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .retryOnConnectionFailure(true) // 连接失败时重试 .build(); } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteCtrl.java
New file @@ -0,0 +1,61 @@ package com.dy.pipIrrWechat.remote; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; /** * 微信端远程视频接口 * 提供微信小程序调用远程控制模块video接口 * * @author zuoxiao * @date 2025-01-21 * @description 微信端远程视频功能控制器 */ @Slf4j @Tag(name = "微信远程视频", description = "微信端调用远程控制模块的video接口") @RestController @RequestMapping(path = "remote") @RequiredArgsConstructor public class RemoteCtrl { private final RemoteService remoteService; /** * 获取视频监控数据 * * @param pageCurr 当前页码 * @param pageSize 每页大小 * @return 视频监控数据 */ @Operation(summary = "获取视频监控数据", description = "微信端调用远程控制模块获取摄像机数据") @GetMapping(path = "video/some") public BaseResponse<Object> getVideoSome( @RequestParam(defaultValue = "1") Integer pageCurr, @RequestParam(required = false) Integer pageSize) { try { log.info("微信端请求视频监控数据: pageCurr={}, pageSize={}", pageCurr, pageSize); // 构建查询参数 StringBuilder queryParams = new StringBuilder(); queryParams.append("pageCurr=").append(pageCurr); if (pageSize != null) { queryParams.append("&pageSize=").append(pageSize); } // 调用远程服务 BaseResponse<Object> result = remoteService.getVideoSome(queryParams.toString()); log.info("视频监控数据查询结果: {}", result); return result; } catch (Exception e) { log.error("微信端视频监控数据查询异常", e); return BaseResponseUtils.buildException("视频监控数据查询失败: " + e.getMessage()); } } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/remote/RemoteService.java
New file @@ -0,0 +1,99 @@ package com.dy.pipIrrWechat.remote; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.dy.common.webUtil.BaseResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; /** * 远程视频服务调用类 * 用于调用pipIrr-web-remote模块的video接口 * * @author zuoxiao * @date 2025-01-21 * @description 微信模块调用远程控制模块的视频服务类 */ @Slf4j @Service @RequiredArgsConstructor public class RemoteService { @Value("${remote.service.base-url:http://localhost:8081/remote}") private String remoteServiceBaseUrl; private final OkHttpClient httpClient; /** * 调用远程视频监控接口 - 获取摄像机数据 * * @param queryParams 查询参数字符串 * @return 远程调用结果 */ public BaseResponse<Object> getVideoSome(String queryParams) { return callRemoteApi("/video/some?" + (queryParams != null ? queryParams : ""), null, "GET"); } /** * 通用远程API调用方法 * * @param endpoint 接口端点 * @param requestBody 请求体(GET请求时为null) * @param method HTTP方法 * @return 调用结果 */ private BaseResponse<Object> callRemoteApi(String endpoint, String requestBody, String method) { String url = remoteServiceBaseUrl + endpoint; Request request; try { Request.Builder requestBuilder = new Request.Builder() .url(url) .addHeader("Content-Type", "application/json") .addHeader("Accept", "application/json"); if ("POST".equalsIgnoreCase(method) && requestBody != null) { RequestBody body = RequestBody.create(requestBody, MediaType.get("application/json; charset=utf-8")); request = requestBuilder.post(body).build(); } else { request = requestBuilder.get().build(); } log.info("调用远程接口: {} {}", method, url); log.debug("请求体: {}", requestBody); try (Response response = httpClient.newCall(request).execute()) { if (!response.isSuccessful()) { log.error("远程调用失败: HTTP {}", response.code()); return BaseResponse.<Object>builder() .success(false) .msg("远程服务调用失败: HTTP " + response.code()) .build(); } String responseBody = response.body() != null ? response.body().string() : ""; log.debug("远程接口响应: {}", responseBody); // 解析远程服务返回的BaseResponse JSONObject jsonResponse = JSON.parseObject(responseBody); return BaseResponse.<Object>builder() .success(jsonResponse.getBooleanValue("success")) .msg(jsonResponse.getString("msg")) .content(jsonResponse.get("content")) .build(); } } catch (IOException e) { log.error("调用远程接口异常: {}", e.getMessage(), e); return BaseResponse.<Object>builder() .success(false) .msg("远程服务调用异常: " + e.getMessage()) .build(); } } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/resources/application-self.yml
@@ -21,6 +21,11 @@ delay: 5 #轮灌中计划开阀的延迟时长(分钟) preOpeningTime: 10 #提前时间(分钟) planTerminateLimitMinutes: 5 #计划终止后限制发布新计划的时间间隔(分钟) #远程视频服务配置 remote: service: base-url: ${pipIrr.remote.baseUrl:http://localhost:8081/remote} #远程控制服务基础URL #阿里短信服务 aliyun: sms: