MQTT之https页面请求问题

本文介绍了在网站启用HTTPS后遇到MQTT连接失败的问题及其解决方案。通过在nginx中设置反向代理,将wss请求转发到未启用SSL的MQTT服务器,成功实现了前端与MQTT服务器的连接。配置包括修改ActiveMQ的transportConnectors和在nginx的location块中设置代理参数。

网站开启了https,开始总会遇到各种问题,用户登入认证失败,视频请求失败,mqtt连接失败等问题。是不是很不爽,来看看,教你怎么解决这些问题。
1.网站开启https,mqtt连接失败
解决过程,开启activemq的ssl加密传输,前端直接请求wss://192.168.1.10:6165,注意6165是我开启了mqtt的ssl端口

        <!--
            The transport connectors expose ActiveMQ over a given protocol to
            clients and other brokers. For more information, see:

            http://activemq.apache.org/configuring-transports.html
        -->
        <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
       <!--     <transportConnector name="wss" uri="wss://0.0.0.0:61615?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>  -->
        </transportConnectors>

        <!-- destroy the spring context on shutdown to stop jetty -->
        <shutdownHooks>
            <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
        </shutdownHooks>

   <!--  
       <sslContext>
          <sslContext keyStore="file:${activemq.conf}/broker1.ks"
                keyStorePassword="adminadmin" trustStore="file:${activemq.conf}/broker1.ts"
                trustStorePassword="adminadmin"
          />
       </sslContext>
   -->

    </broker>

此方案最后失败了。

解决方案
借鉴用户认证思想,使用nginx反向代理到没有开启ssl的mqtt服务器
网站前端mqtt请求:wss://192.168.1.10/mqtt/

<template>
  <div class="hello">
    <p>MQTT:{{msg}}</p>
    <button @click="handleclick">发布</button>
  </div>
</template>

<script>
import mqtt from 'mqtt'

export default {
  name: 'HelloWorld',
 data() {
    return {
      mtopic: "mqtt_topic",
      msg: "test-test-test!",
      client: {}
    };
  },
  mounted() {
    this.client = mqtt.connect('wss://192.168.1.10/mqtt/', {
      username: "88888888",
      password: "88888888"
    });
    this.client.on("connect", () =>{
      console.log("连接成功");
      this.client.subscribe(this.mtopic, (err)=> {
        if (!err) {
          console.log("订阅成功:" + this.mtopic);
        }
      });
    });
    this.client.on("message", (topic, message) => {
      this.msg = message
    });
  },
  methods: {
    handleclick: function() {
      this.client.publish(this.mtopic, this.msg);
    }
  }
}
</script>
<style scoped>
</style>

nginx反向代理配置

          location /mqtt/ {
                proxy_pass http://192.168.1.10:61614/;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $remote_addr;
                proxy_set_header   X-Forwarded-Proto http;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

MQTT(Message Queuing Telemetry Transport)使用过程中页面卡死可能由多种原因导致。 ### 网络问题 - **网络延迟或中断**:MQTT是基于网络进行消息传输的协议,如果网络不稳定,例如出现高延迟、丢包或者网络中断的情况,客户端在等待服务器响应时可能会出现阻塞,进而导致页面卡死。比如在无线网络环境不佳的地方,信号强度弱、干扰大,就容易出现网络问题。 - **网络拥塞**:当网络中存在大量的数据传输时,会造成网络拥塞。MQTT客户端发送的消息可能无法及时到达服务器,服务器的响应也难以快速返回给客户端,使得页面长时间处于等待状态,最终导致卡死。 ### 代码逻辑问题 - **死锁**:在多线程或多进程的环境中,如果代码中存在死锁的情况,会导致程序无法继续执行。例如在处理MQTT消息的线程和更新页面的线程之间,如果对共享资源的访问没有进行合理的同步控制,就可能出现死锁,使得页面卡死。 - **无限循环**:代码中可能存在无限循环的逻辑,例如在处理MQTT消息的回调函数中,如果没有正确的退出条件,会使程序一直停留在循环中,无法继续执行后续的操作,造成页面卡死。 ### 服务器问题 - **服务器过载**:如果MQTT服务器负载过高,无法及时处理客户端发送的请求,客户端会一直等待服务器的响应,从而导致页面卡死。例如服务器同时处理大量的客户端连接和消息,超出了其处理能力。 - **服务器故障**:服务器出现故障,如硬件故障、软件崩溃等,会导致无法正常与客户端进行通信。客户端在尝试与服务器建立连接或发送消息时,会因为得不到响应而出现页面卡死的现象。 ### 资源耗尽问题 - **内存泄漏**:如果代码中存在内存泄漏的问题,随着程序的运行,内存占用会不断增加,最终导致系统资源耗尽。当系统没有足够的内存来处理MQTT消息和更新页面时,就会出现页面卡死的情况。 - **CPU资源耗尽**:某些复杂的MQTT消息处理逻辑可能会占用大量的CPU资源,如果CPU资源被耗尽,程序的运行速度会变得非常缓慢,甚至出现页面卡死的现象。 ```python # 以下是一个简单的MQTT客户端示例,展示基本的连接和消息处理逻辑 import paho.mqtt.client as mqtt # 连接成功回调 def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("test/topic") # 消息接收回调 def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("localhost", 1883, 60) client.loop_forever() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值