emqx-物联网消息服务器
EMQX指南
一、安装EMQX
1、下载
wget https://www.emqx.io/cn/downloads/broker/v4.2.2/emqx-centos7-4.2.2-x86_64.rpm
2、安装
rpm -ivh emqx-centos7-4.2.2-x86_64.rpm
3、运行
#sudo emqx start
systemctl start emqx.service
二、组建集群
1、静态集群
#集群方式:静态
cluster.discovery = static
#配置静态集群节点列表,以“,”分隔
cluster.static.seeds = emqx1@192.168.0.10,emqx2@192.168.0.20
#配置节点名
node.name = emqx1@192.168.0.10
2、组播集群
#集群方式:组播
cluster.discovery = mcast
cluster.mcast.addr = 239.192.0.1
cluster.mcast.ports = 4369,4370
cluster.mcast.iface = 0.0.0.0
cluster.mcast.ttl = 255
cluster.mcast.loop = on
#节点名
node.name = emqx1@192.168.1.162
#可以通过如下命令查看集群状态:
emqx_ctl cluster status
三、使用 Java 开发 MQTT 客户端
1、引入依赖
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
2、订阅消息
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.text.MessageFormat;
public class Subscribe {
public static void main(String[] args) {
String broker = "tcp://127.0.0.1:1883";
String clientId = "JavaSample Subscribe";
//Use the memory persistence
MemoryPersistence persistence = new MemoryPersistence();
try{
MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
//使用用户名密码认证登陆
//connOpts.setUserName("admin");
//connOpts.setPassword("public".toCharArray());
connOpts.setCleanSession(true);
System.out.println("Connecting to broker:" + broker);
sampleClient.connect(connOpts);
System.out.println("Connected");
//连接建立成功之后,可以进行主题订阅。`MqttClient` 提供了多个 `subscribe` 方法,可以实现不同方式的主题订阅。主题可以是明确的单个主题,也可以用通配符 `#` 或者 `+`。
String topic = "demo/topics";
System.out.println("Subscribe to topic:" + topic);
sampleClient.subscribe(topic);
//订阅主题后,设置一个回调实例 `MqttCallback`,在消息转发过来的时候将调用该实例的方法。
sampleClient.setCallback(new MqttCallback() {
public void messageArrived(String topic, MqttMessage message) throws Exception {
//在消息接收成功后,控制台打印转发的消息以及针对的主题。
String theMsg = MessageFormat.format("{0} is arrived for topic {1}.", new String(message.getPayload()), topic);
System.out.println(theMsg);
}
public void deliveryComplete(IMqttDeliveryToken token) {
}
public void connectionLost(Throwable throwable) {
}
});
} catch(MqttException me){
System.out.println("reason" + me.getReasonCode());
System.out.println("msg" + me.getMessage());
System.out.println("loc" + me.getLocalizedMessage());
System.out.println("cause" + me.getCause());
System.out.println("excep" + me);
me.printStackTrace();
}
}
}
3、发布消息
MqttClient
的 publish
方法用于发布消息
- topic:主题名称
- MqttMessage:消息内容
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.text.MessageFormat;
public class Publish {
public static void main(String[] args) {
String broker = "tcp://127.0.0.1:1883";
String clientId = "JavaSample Publish";
//Use the memory persistence
MemoryPersistence persistence = new MemoryPersistence();
try {
MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
//使用用户名密码认证登陆
//connOpts.setUserName("admin");
//connOpts.setPassword("public".toCharArray());
connOpts.setCleanSession(true);
System.out.println("Connecting to broker:" + broker);
sampleClient.connect(connOpts);
System.out.println("Connected");
//发布消息
String topic = "demo/topics";
String content = "Message from MqttPublishSample";
int qos = 2;
System.out.println("Publishing message:" + content);
MqttMessage message = new MqttMessage(content.getBytes());
message.setQos(qos);
sampleClient.publish(topic, message);
System.out.println("Message published");
} catch (MqttException me) {
System.out.println("reason" + me.getReasonCode());
System.out.println("msg" + me.getMessage());
System.out.println("loc" + me.getLocalizedMessage());
System.out.println("cause" + me.getCause());
System.out.println("excep" + me);
me.printStackTrace();
}
}
}
四:HTTP 认证模式
1、编辑配置文件
vim /etc/emqx/plugins/emqx_auth_http.conf
#修改http认证服务器地址为自己编写的接口
#EMQX服务器接收到客户端连接后将向此接口发送请求,并根据其返回参数决定是否放行该客户端的连接请求
auth.http.auth_req = http://127.0.0.1:8080/mqtt/auth
2、重启EMQX服务器使修改后的配置文件生效
3、开启http插件(通过控制面板 或 命令行都可以)
4、编写认证接口
//http://127.0.0.1:8080/mqtt/auth
@RequestMapping("/mqtt/auth")
public Object mqttAuth(@RequestParam String clientid,
@RequestParam String username,
@RequestParam String password){
//认证失败:返回 4xx 状态码
//认证成功:返回 200 状态码
//忽略认证:返回 200 状态码且消息体 ignore
}
5、使用客户端连接到emqx
下载MQTTBox:http://workswithweb.com/mqttbox.html
新建客户端
MQTT Client Name:任意填写
Protocol: mqtt / tcp
Host:emqx 服务器地址 + 默认 1883 端口:127.0.0.1:1883
Username、Password:在emqx服务器内新建的 user
保存并连接成功后即可新建发布或订阅
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具