美文网首页
实现一个Mqtt网关(二)处理MqttConn请求

实现一个Mqtt网关(二)处理MqttConn请求

作者: ShootHzj | 来源:发表于2020-12-19 09:08 被阅读0次

我们先创建一个MqttHandler,让他继承ChannelInboundHandlerAdapter, 用来接力MqttDecoder解码完成后的消息,这里要继承其中的channelRead方法

package com.github.shoothzj.demo.iot.mqtt.broker;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

/**
 * 处理Mqtt协议栈
 * @author hezhangjian
 */
@Slf4j
public class MqttHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        super.channelRead(ctx, msg);
    }

}

然后把这个handler加入到netty的职责链中,解码顺序

image-20201218204356576

打印出connectMessage如下

[MqttConnectMessage[fixedHeader=MqttFixedHeader[messageType=CONNECT, isDup=false, qosLevel=AT_MOST_ONCE, isRetain=false, remainingLength=22], variableHeader=MqttConnectVariableHeader[name=MQTT, version=4, hasUserName=false, hasPassword=false, isWillRetain=false, isWillFlag=false, isCleanSession=true, keepAliveTimeSeconds=60], payload=MqttConnectPayload[clientIdentifier=JavaSample, willTopic=null, willMessage=null, userName=null, password=null]]]

我们先忽略这些信息,无脑返回ack给他

final MqttConnAckMessage ackMessage = MqttMessageBuilders.connAck().returnCode(CONNECTION_ACCEPTED).build();

我们再运行起Server和Client,随后可以看到已经走过了Connect阶段,进入了publish message过程,接下来我们再实现更多的其他场景

image-20201218204302720

附上此阶段的MessageHandler代码

package com.github.shoothzj.demo.iot.mqtt.broker;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.mqtt.MqttConnAckMessage;
import io.netty.handler.codec.mqtt.MqttConnectMessage;
import io.netty.handler.codec.mqtt.MqttConnectPayload;
import io.netty.handler.codec.mqtt.MqttConnectVariableHeader;
import io.netty.handler.codec.mqtt.MqttFixedHeader;
import io.netty.handler.codec.mqtt.MqttMessageBuilders;
import lombok.extern.slf4j.Slf4j;

import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.CONNECTION_ACCEPTED;

/**
 * 处理Mqtt协议栈
 *
 * @author hezhangjian
 */
@Slf4j
public class MqttHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        super.channelRead(ctx, msg);
        if (msg instanceof MqttConnectMessage) {
            handleConnect(ctx, (MqttConnectMessage) msg);
        } else {
            log.error("Unsupported type msg [{}]", msg);
        }
    }

    private void handleConnect(ChannelHandlerContext ctx, MqttConnectMessage connectMessage) {
        log.info("connect msg is [{}]", connectMessage);
        final MqttFixedHeader fixedHeader = connectMessage.fixedHeader();
        final MqttConnectVariableHeader variableHeader = connectMessage.variableHeader();
        final MqttConnectPayload connectPayload = connectMessage.payload();
        final MqttConnAckMessage ackMessage = MqttMessageBuilders.connAck().returnCode(CONNECTION_ACCEPTED).build();
        ctx.channel().writeAndFlush(ackMessage);
    }

}

相关文章

  • 实现一个Mqtt网关(二)处理MqttConn请求

    我们先创建一个MqttHandler,让他继承ChannelInboundHandlerAdapter, 用来接力...

  • SpringCloud(六)路由网关

    网关的主要功能是路由转发和过滤器。网关会拦截请求, 并转发请求, 对请求做一些处理, zuul网关默认和Ribbo...

  • 服务网关-Zuul

    一、服务网关 服务网关是在微服务前面设置一道屏障,请求先到服务网关,网关会对请求进行过滤、校验、路由转发等处理...

  • 【JS tool】MQTT消息模块

    简述 基于Paho-mqtt,实现mqtt连接与消息处理 主要功能 MQTT 连接、重连、断开、消息发送 消息的订...

  • 6.Gateway网关

    网关的作用 对用户请求做身份认证、权限校验 对用户请求路由到微服务,并实现负载均衡 对用户请求做限流 一、搭建网关...

  • 4 MQTT-SN架构

    MQTT-SN的架构如图1所示。有3种类型的MQTT-SN组件:MQTT-SN客户端、MQTT-SN网关、MQTT...

  • spring boot集成mqtt协议发送和订阅数据

    maven的pom.xml引入包 mqtt.yml配置文件 初始化MQTT配置bean mqtt发送数据网关配置 ...

  • spring cloud gateway的作用(面试)

    1. 什么是网关 网关是整个微服务API请求的入口,负责拦截所有请求,分发到服务上去。可以实现日志拦截、权限控制、...

  • soul网关学习6-dubbo协议转换1

    我们知道协议转换也是API网关常见的一个功能,这次我们看下soul网关是如何实现协议转换的。 请求流图 大致流程:...

  • Spring-Cloud-Gateway之过滤器GatewayF

    在Spring-Cloud-Gateway之请求处理流程文中我们了解最终网关是将请求交给过滤器链表进行处理,接下来...

网友评论

      本文标题:实现一个Mqtt网关(二)处理MqttConn请求

      本文链接:https://www.haomeiwen.com/subject/xypfnktx.html