+ * 提供基于 Eclipse Californium 的 IoT 设备连接和消息处理功能 + *
+ * URI 路径: + * - 认证:POST /auth + * - 属性上报:POST /topic/sys/{productKey}/{deviceName}/thing/property/post + * - 事件上报:POST /topic/sys/{productKey}/{deviceName}/thing/event/post + *
+ * Token 通过 CoAP Option 2088 携带
+ */
+package cn.iocoder.yudao.module.iot.gateway.protocol.coap;
diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/router/IotCoapAuthHandler.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/router/IotCoapAuthHandler.java
new file mode 100644
index 0000000000..2348cf990b
--- /dev/null
+++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/router/IotCoapAuthHandler.java
@@ -0,0 +1,117 @@
+package cn.iocoder.yudao.module.iot.gateway.protocol.coap.router;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import cn.iocoder.yudao.module.iot.core.biz.IotDeviceCommonApi;
+import cn.iocoder.yudao.module.iot.core.biz.dto.IotDeviceAuthReqDTO;
+import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
+import cn.iocoder.yudao.module.iot.core.util.IotDeviceAuthUtils;
+import cn.iocoder.yudao.module.iot.gateway.protocol.coap.IotCoapUpstreamProtocol;
+import cn.iocoder.yudao.module.iot.gateway.protocol.coap.util.IotCoapUtils;
+import cn.iocoder.yudao.module.iot.gateway.service.auth.IotDeviceTokenService;
+import cn.iocoder.yudao.module.iot.gateway.service.device.message.IotDeviceMessageService;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.californium.core.coap.CoAP;
+import org.eclipse.californium.core.server.resources.CoapExchange;
+
+import java.util.Map;
+
+/**
+ * IoT 网关 CoAP 协议的【认证】处理器
+ *
+ * 参考 {@link cn.iocoder.yudao.module.iot.gateway.protocol.http.router.IotHttpAuthHandler}
+ *
+ * @author 芋道源码
+ */
+@Slf4j
+public class IotCoapAuthHandler {
+
+ private final IotDeviceTokenService deviceTokenService;
+ private final IotDeviceCommonApi deviceApi;
+ private final IotDeviceMessageService deviceMessageService;
+
+ public IotCoapAuthHandler() {
+ this.deviceTokenService = SpringUtil.getBean(IotDeviceTokenService.class);
+ this.deviceApi = SpringUtil.getBean(IotDeviceCommonApi.class);
+ this.deviceMessageService = SpringUtil.getBean(IotDeviceMessageService.class);
+ }
+
+ /**
+ * 处理认证请求
+ *
+ * @param exchange CoAP 交换对象
+ * @param protocol 协议对象
+ */
+ @SuppressWarnings("unchecked")
+ public void handle(CoapExchange exchange, IotCoapUpstreamProtocol protocol) {
+ try {
+ // 1.1 解析请求体
+ byte[] payload = exchange.getRequestPayload();
+ if (payload == null || payload.length == 0) {
+ IotCoapUtils.respondError(exchange, CoAP.ResponseCode.BAD_REQUEST, "请求体不能为空");
+ return;
+ }
+ Map
+ * CoAP Option 范围 2048-65535 属于实验/自定义范围
+ */
+ public static final int OPTION_TOKEN = 2088;
+
+ /**
+ * 返回成功响应
+ *
+ * @param exchange CoAP 交换对象
+ * @param data 响应数据
+ */
+ public static void respondSuccess(CoapExchange exchange, Object data) {
+ CommonResult