package cn.iocoder.yudao.module.iot.gateway.protocol.coap.handler.upstream; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.iot.core.biz.IotDeviceCommonApi; import cn.iocoder.yudao.module.iot.core.biz.dto.IotSubDeviceRegisterFullReqDTO; import cn.iocoder.yudao.module.iot.core.topic.auth.IotSubDeviceRegisterReqDTO; import cn.iocoder.yudao.module.iot.core.topic.auth.IotSubDeviceRegisterRespDTO; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.eclipse.californium.core.server.resources.CoapExchange; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; /** * IoT 网关 CoAP 协议的【子设备动态注册】处理器 *

* 用于子设备的动态注册,需要网关认证 * * @author 芋道源码 * @see 阿里云 - 动态注册子设备 */ @Slf4j public class IotCoapRegisterSubHandler extends IotCoapAbstractHandler { private final IotDeviceCommonApi deviceApi; public IotCoapRegisterSubHandler() { this.deviceApi = SpringUtil.getBean(IotDeviceCommonApi.class); } @Override @SuppressWarnings("DuplicatedCode") protected CommonResult handle0(CoapExchange exchange) { // 1.1 解析通用参数(从 URI 路径获取网关设备信息) List uriPath = exchange.getRequestOptions().getUriPath(); String productKey = getProductKey(uriPath); String deviceName = getDeviceName(uriPath); // 1.2 解析子设备列表 SubDeviceRegisterRequest request = deserializeRequest(exchange, SubDeviceRegisterRequest.class); Assert.notNull(request, "请求参数不能为空"); Assert.notEmpty(request.getParams(), "params 不能为空"); // 2. 调用子设备动态注册 IotSubDeviceRegisterFullReqDTO reqDTO = new IotSubDeviceRegisterFullReqDTO() .setGatewayProductKey(productKey) .setGatewayDeviceName(deviceName) .setSubDevices(request.getParams()); CommonResult> result = deviceApi.registerSubDevices(reqDTO); result.checkError(); // 3. 返回结果 return success(result.getData()); } @Override protected boolean requiresAuthentication() { return true; } @Override protected String getProductKey(List uriPath) { // 路径格式:/auth/register/sub-device/{productKey}/{deviceName} return CollUtil.get(uriPath, 3); } @Override protected String getDeviceName(List uriPath) { // 路径格式:/auth/register/sub-device/{productKey}/{deviceName} return CollUtil.get(uriPath, 4); } @Data public static class SubDeviceRegisterRequest { private List params; } }