package cn.iocoder.yudao.module.iot.gateway.protocol.http; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.iot.core.biz.dto.IotDeviceAuthReqDTO; import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum; import cn.iocoder.yudao.module.iot.core.topic.IotDeviceIdentity; import cn.iocoder.yudao.module.iot.core.topic.auth.IotSubDeviceRegisterReqDTO; import cn.iocoder.yudao.module.iot.core.topic.property.IotDevicePropertyPackPostReqDTO; import cn.iocoder.yudao.module.iot.core.topic.topo.IotDeviceTopoAddReqDTO; import cn.iocoder.yudao.module.iot.core.topic.topo.IotDeviceTopoDeleteReqDTO; import cn.iocoder.yudao.module.iot.core.topic.topo.IotDeviceTopoGetReqDTO; import cn.iocoder.yudao.module.iot.core.util.IotDeviceAuthUtils; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.Map; /** * IoT 网关设备 HTTP 协议集成测试(手动测试) * *
测试场景:网关设备(IotProductDeviceTypeEnum 的 GATEWAY 类型)通过 HTTP 协议管理子设备拓扑关系 * *
使用步骤: *
* 网关设备向平台上报需要绑定的子设备信息 */ @Test public void testTopoAdd() { // 1.1 构建请求 String url = String.format("http://%s:%d/topic/sys/%s/%s/thing/topo/add", SERVER_HOST, SERVER_PORT, GATEWAY_PRODUCT_KEY, GATEWAY_DEVICE_NAME); // 1.2 构建子设备认证信息 IotDeviceAuthReqDTO subAuthInfo = IotDeviceAuthUtils.getAuthInfo( SUB_DEVICE_PRODUCT_KEY, SUB_DEVICE_NAME, SUB_DEVICE_SECRET); IotDeviceAuthReqDTO subDeviceAuth = new IotDeviceAuthReqDTO() .setClientId(subAuthInfo.getClientId()) .setUsername(subAuthInfo.getUsername()) .setPassword(subAuthInfo.getPassword()); // 1.3 构建请求参数 IotDeviceTopoAddReqDTO params = new IotDeviceTopoAddReqDTO(); params.setSubDevices(Collections.singletonList(subDeviceAuth)); String payload = JsonUtils.toJsonString(MapUtil.builder() .put("method", IotDeviceMessageMethodEnum.TOPO_ADD.getMethod()) .put("params", params) .build()); // 1.4 输出请求 log.info("[testTopoAdd][请求 URL: {}]", url); log.info("[testTopoAdd][请求体: {}]", payload); // 2.1 发送请求 try (HttpResponse httpResponse = HttpUtil.createPost(url) .header("Authorization", GATEWAY_TOKEN) .body(payload) .execute()) { // 2.2 输出结果 log.info("[testTopoAdd][响应体: {}]", httpResponse.body()); } } /** * 删除子设备拓扑关系测试 *
* 网关设备向平台上报需要解绑的子设备信息 */ @Test public void testTopoDelete() { // 1.1 构建请求 String url = String.format("http://%s:%d/topic/sys/%s/%s/thing/topo/delete", SERVER_HOST, SERVER_PORT, GATEWAY_PRODUCT_KEY, GATEWAY_DEVICE_NAME); // 1.2 构建请求参数 IotDeviceTopoDeleteReqDTO params = new IotDeviceTopoDeleteReqDTO(); params.setSubDevices(Collections.singletonList( new IotDeviceIdentity(SUB_DEVICE_PRODUCT_KEY, SUB_DEVICE_NAME))); String payload = JsonUtils.toJsonString(MapUtil.builder() .put("method", IotDeviceMessageMethodEnum.TOPO_DELETE.getMethod()) .put("params", params) .build()); // 1.3 输出请求 log.info("[testTopoDelete][请求 URL: {}]", url); log.info("[testTopoDelete][请求体: {}]", payload); // 2.1 发送请求 try (HttpResponse httpResponse = HttpUtil.createPost(url) .header("Authorization", GATEWAY_TOKEN) .body(payload) .execute()) { // 2.2 输出结果 log.info("[testTopoDelete][响应体: {}]", httpResponse.body()); } } /** * 获取子设备拓扑关系测试 *
* 网关设备向平台查询已绑定的子设备列表 */ @Test public void testTopoGet() { // 1.1 构建请求 String url = String.format("http://%s:%d/topic/sys/%s/%s/thing/topo/get", SERVER_HOST, SERVER_PORT, GATEWAY_PRODUCT_KEY, GATEWAY_DEVICE_NAME); // 1.2 构建请求参数(目前为空,预留扩展) IotDeviceTopoGetReqDTO params = new IotDeviceTopoGetReqDTO(); String payload = JsonUtils.toJsonString(MapUtil.builder() .put("method", IotDeviceMessageMethodEnum.TOPO_GET.getMethod()) .put("params", params) .build()); // 1.3 输出请求 log.info("[testTopoGet][请求 URL: {}]", url); log.info("[testTopoGet][请求体: {}]", payload); // 2.1 发送请求 try (HttpResponse httpResponse = HttpUtil.createPost(url) .header("Authorization", GATEWAY_TOKEN) .body(payload) .execute()) { // 2.2 输出结果 log.info("[testTopoGet][响应体: {}]", httpResponse.body()); } } // ===================== 子设备注册测试 ===================== /** * 子设备动态注册测试 *
* 网关设备代理子设备进行动态注册,平台返回子设备的 deviceSecret *
* 注意:此接口需要网关 Token 认证 */ @Test public void testSubDeviceRegister() { // 1.1 构建请求 String url = String.format("http://%s:%d/auth/register/sub-device/%s/%s", SERVER_HOST, SERVER_PORT, GATEWAY_PRODUCT_KEY, GATEWAY_DEVICE_NAME); // 1.2 构建请求参数 IotSubDeviceRegisterReqDTO subDevice = new IotSubDeviceRegisterReqDTO(); subDevice.setProductKey(SUB_DEVICE_PRODUCT_KEY); subDevice.setDeviceName("mougezishebei"); String payload = JsonUtils.toJsonString(MapUtil.builder() .put("method", IotDeviceMessageMethodEnum.SUB_DEVICE_REGISTER.getMethod()) .put("params", Collections.singletonList(subDevice)) .build()); // 1.3 输出请求 log.info("[testSubDeviceRegister][请求 URL: {}]", url); log.info("[testSubDeviceRegister][请求体: {}]", payload); // 2.1 发送请求 try (HttpResponse httpResponse = HttpUtil.createPost(url) .header("Authorization", GATEWAY_TOKEN) .body(payload) .execute()) { // 2.2 输出结果 log.info("[testSubDeviceRegister][响应体: {}]", httpResponse.body()); } } // ===================== 批量上报测试 ===================== /** * 批量上报属性测试(网关 + 子设备) *
* 网关设备批量上报自身属性、事件,以及子设备的属性、事件
*/
@Test
public void testPropertyPackPost() {
// 1.1 构建请求
String url = String.format("http://%s:%d/topic/sys/%s/%s/thing/event/property/pack/post",
SERVER_HOST, SERVER_PORT, GATEWAY_PRODUCT_KEY, GATEWAY_DEVICE_NAME);
// 1.2 构建【网关设备】自身属性
Map