快来玩,mica-mqtt jfinal 插件,client 篇

1、添加依赖

<dependency>
	<groupId>net.dreamlu</groupId>
	<artifactId>jfinal-mica-mqtt-client</artifactId>
	<version>2.0.2</version>
</dependency>

2、删除 jfinal-demo 中的 slf4j-nop 依赖

3、添加 slf4j-log4j12

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.7.33</version>
</dependency>

4.、在 jfinal Config configPlugin 中添加 mica-mqtt client 插件

MqttClientPlugin mqttClientPlugin = new MqttClientPlugin();
mqttClientPlugin.config(mqttClientCreator -> {
	// 设置 mqtt 连接配置信息
	mqttClientCreator
			.clientId("clientId") // 按需配置,相同的会互踢
			.ip("mqtt.dreamlu.net")
			.port(1883)
			.connectListener(Aop.get(MqttClientConnectListener.class));
});
me.add(mqttClientPlugin);

5、在 jfinal Config onStart 启动完成之后添加 mqtt 订阅

@Override
public void onStart() {
    IMqttClientMessageListener clientMessageListener = Aop.get(TestMqttClientMessageListener.class);
    MqttClientKit.subQos0("#", clientMessageListener);
}

6. 使用 MqttClientKit 发送消息

MqttClientKit.publish("mica", "hello".getBytes(StandardCharsets.UTF_8));

7. 示例代码 MqttClientConnectListener

public class MqttClientConnectListener implements IMqttClientConnectListener {

    @Override
    public void onConnected(ChannelContext channelContext, boolean isReconnect) {
        if (isReconnect) {
            System.out.println("重连 mqtt 服务器重连成功...");
        } else {
            System.out.println("连接 mqtt 服务器成功...");
        }
    }

    @Override
    public void onDisconnect(ChannelContext channelContext, Throwable throwable, String remark, boolean isRemove) {
        System.out.println("mqtt 链接断开 remark:" + remark + " isRemove:" + isRemove);
    }
}

8. 示例 TestMqttClientMessageListener

public class TestMqttClientMessageListener implements IMqttClientMessageListener {
    @Override
    public void onMessage(String topic, MqttPublishMessage mqttPublishMessage, ByteBuffer byteBuffer) {
        System.out.println("收到消息 topic:" + topic + "内容:\n" + ByteBufferUtil.toString(byteBuffer));
    }
}

最后,mica-mqtt 开源地址:https://gitee.com/596392912/mica-mqtt 快来玩,欢迎反馈。

评论区

杜福忠

2022-07-29 18:24

期待已久~ 上手上手!

BigSnake1989

2022-08-01 19:30

NICE ,及时雨啊

rocker18

2022-08-02 17:17

这是做什么的

Dreamlu

2022-08-03 11:23

@rocker18 物联网,im,消息推送等场景

海哥

2022-08-04 14:48

@Dreamlu 直接 websockect 链接么?

Dreamlu

2022-08-05 10:58

@海哥 支持 websocket,websocket 的 mqtt 子协议。

zeroabc

2022-08-15 11:23

之前做一个简易的推送用过Server-sent Events (SSE)。话说推送业务该怎么管理客户端对话,就是怎么精准管理哪个推送session对应到具体用户(持久化或者缓存起来),用来后续业务处理?

hhchor

2022-08-15 14:05

感动,刚好要用。问个问题,app里有很多用户,每个用户都管理几台自己的设备,用户跟设备要怎么关联上呢?

杜福忠

2022-08-15 22:15

@hhchor 如果是我做,大概会用数据库创建用户设备表:accountId, clientId 字段。
设备端注册用:mqttClientCreator.clientId(clientId)
服务端发布用:MqttServerKit.publish(clientId, String topic, ByteBuffer payload);
服务端搭配JF使用HTTP接口:用户使用APP调用HTTP接口,携带自己设备的clientId参数进行JF里业务操控发布publish消息到设备。平台就搭好了

hhchor

2022-08-18 18:21

@杜福忠 设备数据的返回呢?

杜福忠

2022-08-18 19:57

@hhchor 交互思维不对哦,不是HTTP的交互,这个是MQTT传输协议,发布和订阅的交互模式。
所以设备处理完业务时是给服务器发送一个“我处理完了”的消息:MqttClientKit.publish("mica", "hello".getBytes(StandardCharsets.UTF_8)); 这样子的。服务器收到再处理了。

杜福忠

2022-08-18 19:58

MqttClientKit.publish...
MqttServerKit.publish...

hhchor

2022-08-20 09:47

@Dreamlu
启动的时候:
[ERROR]-[Thread: tio-timer-reconnect-1]-[org.tio.client.TioClient$2.run()]: closeds:0, connections:0
连接 mqtt 服务器成功...

项目手动关闭的时候:
[ERROR]-[Thread: Thread-6]-[org.tio.utils.thread.pool.TioCallerRunsPolicy.rejectedExecution()]:
mqtt 链接断开 remark:MqttClient disconnect. isRemove:true
Shutdown Complete in 0.1 seconds. See you later (^_^)

============
这个ERROR错误怎么解决呢?

Dreamlu

2022-08-22 09:41

@hhchor 这是正常的丫,关闭的时候断开连接

Dreamlu

2022-08-22 09:43

@zeroabc 不需要,mqtt 里面默认是按 topic 订阅关系进行消息路由的,把 topic 设计好就可以了。

热门分享

扫码入社