springboot集成mqtt_springboot mqtt

    #用户名
    userName: admin
    #密码
    password: public

2. 实例信息获取



/**
* Mqtt配置类
*/
@Data
@Configuration
@ConfigurationProperties(prefix = “customer.mqtt”)
public class MqttConfig {
/**
* mqtt broker地址
*/
String broker;
/**
* 需要创建的MQTT客户端
*/
List clientList;
}



/**
* MQTT客户端
*/
@Data
public class MqttClient {
/**
* 客户端ID
*/
private String clientId;
/**
* 监听主题
*/
private String subscribeTopic;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String password;
}


3. 根据信息创建实例,订阅主题



/**
* MQTT客户端创建
*/
@Component
@Slf4j
public class MqttClientCreate {
@Resource
private MqttClientManager mqttClientManager;
@Autowired
private MqttConfig mqttConfig;

/\*\*

* 创建MQTT客户端
*/
@PostConstruct
public void createMqttClient() {
List mqttClientList = mqttConfig.getClientList();

    for (MqttClient mqttClient : mqttClientList) {
        log.info("{}", mqttClient);
        //创建客户端,客户端ID:demo,回调类跟客户端ID一致
        mqttClientManager.createMqttClient(mqttClient.getClientId(), mqttClient.getSubscribeTopic(), mqttClient.getUserName(), mqttClient.getPassword());
    }
}

}



/**
* MQTT客户端管理类,如果客户端非常多后续可入redis缓存
*/
@Slf4j
@Component
public class MqttClientManager {
@Value(“${customer.mqtt.broker}”)
private String mqttBroker;
@Resource
private MqttCallBackContext mqttCallBackContext;
/**
* 存储MQTT客户端
*/
public static Map<String, MqttClient> MQTT_CLIENT_MAP = new ConcurrentHashMap<>();

public static MqttClient getMqttClientById(String clientId) {
    return MQTT\_CLIENT\_MAP.get(clientId);
}

/\*\*

* 创建mqtt客户端
*
* @param clientId 客户端ID
* @param subscribeTopic 订阅主题,可为空
* @param userName 用户名,可为空
* @param password 密码,可为空
* @return mqtt客户端
*/
public void createMqttClient(String clientId, String subscribeTopic, String userName, String password) {
MemoryPersistence persistence = new MemoryPersistence();

    try {
        MqttClient client = new MqttClient(mqttBroker, clientId, persistence);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        if (null != userName && !"".equals(userName)) {
            connOpts.setUserName(userName);
        }

        if (null != password && !"".equals(password)) {
            connOpts.setPassword(password.toCharArray());
        }

        connOpts.setCleanSession(true);

        if (null != subscribeTopic && !"".equals(subscribeTopic)) {
            AbsMqttCallBack callBack = mqttCallBackContext.getCallBack(clientId);

            if (null == callBack) {
                callBack = mqttCallBackContext.getCallBack("default");
            }

            callBack.setClientId(clientId);
            callBack.setConnectOptions(connOpts);
            client.setCallback(callBack);
        }

        //连接mqtt服务端broker
        client.connect(connOpts);
        // 订阅主题
        if (null != subscribeTopic && !"".equals(subscribeTopic)) {
            if (subscribeTopic.contains("-"))
                client.subscribe(subscribeTopic.split("-"));
            else

// if (!subscribeTopic.equals(“mqtt/receive”))
{
client.subscribe(subscribeTopic);
}
}

        MQTT\_CLIENT\_MAP.putIfAbsent(clientId, client);
    } catch (MqttException e) {
        log.error("Create mqttClient failed!", e);
    }
}

}


4. 实现 `MqttCallback` 接口



/**
* MQTT回调抽象类
*/
@Slf4j
public abstract class AbsMqttCallBack implements MqttCallback {
private String clientId;

private MqttConnectOptions connectOptions;

public String getClientId() {
    return clientId;
}

public void setClientId(String clientId) {
    this.clientId = clientId;
}

public MqttConnectOptions getConnectOptions() {
    return connectOptions;
}

public void setConnectOptions(MqttConnectOptions connectOptions) {
    this.connectOptions = connectOptions;
}

/\*\*

* 失去连接操作,进行重连
*
* @param throwable 异常
*/
@Override
public void connectionLost(Throwable throwable) {
try {
if (null != clientId) {
if (null != dconnectOptions) {
MqttClientManager.getMqttClientById(clientId).connect(connectOptions);
} else {
MqttClientManager.getMqttClientById(clientId).connect();
}
}

    } catch (Exception e) {
        log.error("{} reconnect failed!", e);
    }
}

/\*\*

* 接收订阅消息
* @param topic 主题
* @param mqttMessage 接收消息
* @throws Exception 异常
*/
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
String content = new String(mqttMessage.getPayload());
handleReceiveMessage(topic, content);
}

/\*\*

* 消息发送成功
*
* @param iMqttDeliveryToken toke
*/
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info(“消息发送成功”);
}

/\*\*

* 处理接收的消息
* @param topic 主题
* @param message 消息内容
*/
protected abstract void handleReceiveMessage(String topic, String message);
}



/**
* 默认回调
*/
@Slf4j
@Component(“default”)
public class DefaultMqttCallBack extends AbsMqttCallBack {

/\*\*

* @param topic 主题
* @param message 消息内容
*/
@Override
protected void handleReceiveMessage(String topic, String message) {
log.info(“接收到主题—{}”, topic);
log.info(“接收到消息—{}”, message);
// 你自己的消息处理业务

}

}



/**
* MQTT订阅回调环境类
*/
@Component
@Slf4j
public class MqttCallBackContext {
private final Map<String, AbsMqttCallBack> callBackMap = new ConcurrentHashMap<>();

/\*\*

* 默认构造函数
*
* @param callBackMap 回调集合
*/
public MqttCallBackContext(Map<String, AbsMqttCallBack> callBackMap) {
this.callBackMap.clear();
this.callBackMap.putAll(callBackMap);
}

/\*\*

* 获取MQTT回调类
*
* @param clientId 客户端ID
* @return MQTT回调类
*/
public AbsMqttCallBack getCallBack(String clientId) {
return this.callBackMap.get(clientId);
}
}


5. 发送消息



@RestController
public class SendController {
@Resource
MqttClientManager mqttClientManager;

@RequestMapping("/sendMessage")
public String sendMessage(String topic){
    try {
        MqttMessage mqttMessage = new MqttMessage("你好".getBytes());
        mqttClientManager.getMqttClientById("nxys\_service").publish(topic,mqttMessage);
        return "发送成功";
    } catch (Exception e) {
        e.printStackTrace();
        return "发送失败";
    }
}

}


### 3 测试


1. 启动订阅,查看MQTT 管理页面  
 ![两个实例](https://img-blog.csdnimg.cn/direct/4ac2a748716f42adbba6cba8d766bcc1.png)
2. 测试发送消息,查看发送情况,接受情况  
 `http://localhost:8081/sendMessage?topic=mqtt/receive`  
 ![发送成功,并接受到消息](https://img-blog.csdnimg.cn/direct/4b2e6734566349e5b16b2e0173a407aa.png)




---


## 总结


## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/0abe97a484598d13190b90d12865b5e2.png)

![img](https://img-blog.csdnimg.cn/img_convert/8994a813f4773e58be7966ed1ddda62e.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/19fd8cbb475687552b164130c536e148.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/aefa1bdb6805b80b9e29104b01bf42bc.png)

![img](https://img-blog.csdnimg.cn/img_convert/3a5452241d3e31e204d762420839cc96.png)

![img](https://img-blog.csdnimg.cn/img_convert/1abb5b891f569106d023823354a0ce70.png)

![](https://img-blog.csdnimg.cn/img_convert/e3ab3bf30e6e89fbd0d78cf59b1f6776.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


58443)]

[外链图片转存中...(img-KCM97lNU-1715598358443)]

[外链图片转存中...(img-A8C1Cux7-1715598358444)]

[外链图片转存中...(img-qYm68by0-1715598358444)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值