物联网 基于netty核心实战-握手与认证

物联网 基于netty核心实战-握手与认证

简述

MQTT PUBLISH 报文 的二进制结构(固定头、可变头、有效载荷),并基于 Netty 实现一个支持 QoS 0 的发布/订阅 Broker

源码(netty-sample-05-auth)

https://gitee.com/kcnf-iot/iot-sample/tree/master/netty/netty-sample-05

协议结构

MQTT 报文结构 Netty 中的对应 Java 类 关键字段/作用
固定报头 (Fixed Header) MqttFixedHeader 包含 messageType (如 CONNECT), qosLevel, isRetain 等标志位
可变报头 (Variable Header) MqttConnectVariableHeader 包含协议名、版本号、连接标志(如 Clean Session)、保活时间
有效载荷 (Payload) MqttConnectPayload 包含实际数据,如客户端ID、遗嘱消息、用户名和密码
完整连接请求 MqttConnectMessage 一个对象就包含了上述三部分,可以直接在处理器中使用

简易demo

服务端
复制代码
package com.jysemel.iot;

import com.jysemel.iot.handler.MqttAuthHandler;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.mqtt.MqttDecoder;
import io.netty.handler.codec.mqtt.MqttEncoder;

public class MqttAuthServer {
    public static void main(String[] args) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ChannelPipeline p = ch.pipeline();
                            // (A) 使用 Netty 内置的 MqttDecoder
                            p.addLast("mqttDecoder", new MqttDecoder(1024));
                            // (B) 使用单例的 MqttEncoder
                            p.addLast("mqttEncoder", MqttEncoder.INSTANCE);
                            // (C) 实现我们自己的业务逻辑处理器
                            p.addLast("authHandler", new MqttAuthHandler());
                        }
                    });
            ChannelFuture f = b.bind(1883).sync();
            System.out.println("MQTT Auth Server started on port 1883");
            f.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
客户端
复制代码
package com.jysemel.iot;

import com.jysemel.iot.handler.MqttAuthClientHandler;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.mqtt.MqttDecoder;
import io.netty.handler.codec.mqtt.MqttEncoder;

public class MqttAuthClient {
    public static void main(String[] args) throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ChannelPipeline p = ch.pipeline();
                            p.addLast("mqttDecoder", new MqttDecoder(1024));
                            p.addLast("mqttEncoder", MqttEncoder.INSTANCE);
                            p.addLast("clientHandler", new MqttAuthClientHandler());
                        }
                    });
            ChannelFuture f = b.connect("127.0.0.1", 1883).sync();
            f.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully();
        }
    }
}
相关推荐
摇滚侠4 分钟前
《Spring Boot 3:高级与架构设计》第 3 章 Bean 的全生命周期原理 Bean 的全生命周期概览 阅读笔记 9
spring boot·笔记·后端
墨家句子10 分钟前
AnythingLLM 搭本地知识库:文档问答不准怎么调
linux·后端
知守观10 分钟前
OBS 同名文件互相覆盖,客户拿错了别人的报告:一次文件串号的排查与重构
java·后端
特立独行的猫A15 分钟前
Godot 游戏编辑器移植鸿蒙 PC:难度与可行性分析
后端·harmonyos
章鱼哥197118 分钟前
DeepSeek Harness 插件开发新手教程
后端·deepseek
特立独行的猫A27 分钟前
C++ 异步编程:std::future 与 std::promise 详解(含 RPC 客户端实现实践)
c++·后端
Anymous32 分钟前
支付为什么要验两次签?——从渠道验签到服务间信任边界与 RSA2
后端
泡海椒1 小时前
JQuick-Excel 字段映射实战:用 MAPPING 固化 Excel 表头与业务字段契约
xml·java·开发语言·excel
梦幻通灵1 小时前
IDEA 实用快捷键【持续更新】
java·ide·intellij-idea
南归北隐1 小时前
Spring AI Alibaba Graph框架实现Tools工具调用
java·后端·spring·spring ai·spring ai tools