那些年用EMQ踩过的坑

3 篇文章 0 订阅

前提

语言用的是Java,包是org.eclipse.paho.client.mqttv3这个,MQ是EMQ。

坑一

客户端ID相同,导致互相挤下线

场景

公司有很多场景用到MQTT,比如移动端、Java后台、前端JS、流水线C#程序、各类物联网硬件Python脚本等等

很多同事使用的时候,如果进行连接的clientID有冲突的话,会导致已经连接的客户端断开连接,而这个时候如果客户端的回调里面做了断线重连处理的话,就会变成2个客户端一直在断线重连...断线重连...断线重连...

解决方案:

既然问题是客户端ID相同,那就让客户端ID不相同即可。

比如给客户端ID加UUID后缀,或者加时间戳后缀之类的,只要能确保不重复即可。

//客户端
MqttClient testClient = new MqttClient("主题名称","testClient_"+UUID.randomUUID().toString());
//配置
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);//设置清除会话信息  
options.setUserName("用户名");//设置用户名
options.setPassword("密码".toCharArray());//设置密码
testClient.setCallback(new TestCallback());//回调
testClient.connect(options);//连接

坑二

回调类报错引发的客户端断线

场景

当我们的客户端订阅了某个主题,该主题收到消息后,就会进到messageArrived方法。

public void messageArrived(String topic, MqttMessage message) throws Exception {
    // subscribe后得到的消息会执行到这里面
    // 时间格式转换
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("接收消息时间 : " + sdf.format(new Date()));
    System.out.println("接收消息主题 : " + topic);
    System.out.println("接收消息Qos : " + message.getQos());
    System.out.println("接收消息内容 : " + new String(message.getPayload()));
        
}

一般我们发送和接收到的消息都是JSON格式的字符串,然后会在这个方法里面做业务逻辑处理。

当我们收到的消息内容不符合预期的格式时,而我们又未做相应的处理时,就会报错抛出异常,从而导致接收到该消息的客户端断线。

如果只是普通的代码逻辑问题,只需要打个断点看看具体问题具体分析,然后处理即可。

如果是因为发送消息方使用了Retained,导致的一订阅收到消息即报错,触发重连后重新订阅又报错的死循环的话。

有可能是在18083控制台发送的测试数据,默认被勾选了Retained

也可能是代码里面发送消息设置了Retained

//第四个参数retained
testClient.publish(topic, payload, qos, retained);

解决方案:

用任一客户端往有问题的主题发送一条空消息,并设置Retained为true,即可清除该主题所保留的最后一条设置了Retained的异常消息。

testClient.publish("有问题的主题", "".getBytes(), 0, true);

坑三

发送的消息内容太长,导致客户端断线

场景

客户端往某个主题发送消息,消息内容太长导致一执行发送操作,客户端就掉线。

原因是EMQ默认的消息长度是64K(65536字节),一旦超过就会出问题。

解决方案:

根据版本的不同,找到对应的配置文件,修改对应的配置即可,最高为256MB

如1.x版本的EMQ则在安装目录的/emqttd/etc/emqttd.config修改其中的

如2.x版本的EMQ则在安装目录的/emqttd/etc/emqttd.conf修改其中的

也可能在安装目录的/emqttd/etc/emq.conf修改其中的

然后重启EMQ即可。

坑四

未完。。。待编辑。。。

注:仅供自己学习,记录问题和参考,若有带来误解和不便请见谅,共勉!

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
您可以按以下步骤使用 Android 连接 EMQX: 1. 在您的 Android 项目中添加 Eclipse Paho MQTT 客户端库。 2. 在 EMQX 的管理界面中创建一个 MQTT 用户。 3. 在 Android 代码中使用以下代码片段连接到 EMQX: ``` String brokerURL = "tcp://<EMQX-Broker-IP>:1883"; String clientId = "android-client"; MqttAndroidClient client = new MqttAndroidClient(context, brokerURL, clientId); ``` 其中,<EMQX-Broker-IP> 是您的 EMQX 代理服务器的 IP 地址。 4. 使用以下代码片段连接到 EMQX 并订阅主题: ``` IMqttToken token = client.connect(); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.d(TAG, "Connected to EMQX"); String topic = "your_topic"; int qos = 1; try { IMqttToken subToken = client.subscribe(topic, qos); subToken.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.d(TAG, "Subscribed to " + topic); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.d(TAG, "Failed to subscribe to " + topic); } }); } catch (MqttException e) { e.printStackTrace(); } } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.d(TAG, "Failed to connect to EMQX"); } }); ``` 其中,"your_topic" 是您要订阅的主题。 5. 使用以下代码片段发布消息EMQX: ``` String message = "your_message"; String topic = "your_topic"; int qos = 1; try { IMqttDeliveryToken deliveryToken = client.publish(topic, message.getBytes(), qos, false); } catch (MqttException e) { e.printStackTrace(); } ``` 其中,"your_message" 是您要发布的消息,"your_topic" 是您要发布到的主题。 这些步骤应该可以帮助您使用 Android 连接 EMQX。请注意,您需要在 EMQX 的管理界面中进行适当的配置和设置,以确保您的连接成功。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值