在云服务器上搭建了mqtt,为啥手机连接不上mqtt,要怎么做才能连接上?求求大神帮忙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在云服务器上搭建了mqtt,为啥手机连接不上mqtt,要怎么做才能连接上?求求大神帮忙相关的知识,希望对你有一定的参考价值。

别复制协议啥的,可以讲一下要怎么操作吗,谢谢各位大佬

MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理。有两种方法使用MQTT服务,一是租用现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务,使用公用的MQTT服务器的好处是省事,但如果仅仅用于测试学习还需要注册帐号,灵活性差些,有的平台还需要付费。另一方法是自己使用开源的MQTT组件来搭建。
MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。
这里介绍的是用轻量级的mosquitto开源项目来搭建一个属于自己的MQTT服务器。
第一步:需要安装一台linux主机,这不多介绍,可以使用真机安装也可以使用虚拟机安装。如果仅仅是自己测试使用都可以。
第二步:下载mosquitto需要的依赖
sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake

第三步:下载mosquitto并解压,现在mosquitto官网最新的版本是1.5.1
tar xzvf mosquitto-1.5.1.tar.gz
第四步:编译
cd mosquitto-1.5.1/
make
make install
第五步:启动mosquitto
./mosquitto -v
1535473957: mosquitto version 1.5.1 starting
1535473957: Using default config.
1535473957: Opening ipv4 listen socket on port 1883.
1535473957: Opening ipv6 listen socket on port 1883.
这时候mosquitto就会以默认的参数启动。如果需要带配置文件可以修改配置文件mosquitto.conf,
启动时候加上参数 -c,
./mosquitto -c mosquitto.conf
可以看到,mosquitto监听的端口为1883.
这时候我们的MQTT服务器就搭建好了。可找一个mqtt客户端来测试一下。
先发布一个主题“home/garden/fountain/2”
内容是“hello world”
这时候在mosquitto会打印出下面的log
535474247: New connection from 192.168.1.105 on port 1883.
1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).
1535474247: No will message specified.
1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)
1535474307: Received PINGREQ from MQTT_FX_Client
1535474307: Sending PINGRESP to MQTT_FX_Client
1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))
1535474367: Received PINGREQ from MQTT_FX_Client
1535474367: Sending PINGRESP to MQTT_FX_Client

订阅主题“home/garden/fountain/2”

可以看到收到了自己发布的消息。
用wireshark抓包
可以看到抓到了一个MQTT的publish的报文。
参考技术A 云服务器内的防火墙设置了吗?mqtt的通讯端口是什么?云服务提供商的安全组设置了吗?如果都设置了,服务启动了吗?端口正常监听吗?
按如下格式提供你的信息:
系统版本:
# 命令uname -a
服务状态:
# 命令systemctl status 服务名
端口监听状态:
# 命令netstat -antupl
防火墙放行端口:
# 命令firewall-cmd --list-port
云服务商安全组设置
不然没法帮你判断问题出现的位置以及如何解决该问题本回答被提问者采纳
参考技术B MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理。有两种方法使用MQTT服务,一是租用现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务,使用公用的MQTT服务器的好处是省事,但如果仅仅用于测试学习还需要注册帐号,灵活性差些,有的平台还需要付费。另一方法是自己使用开源的MQTT组件来搭建。
MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。
这里介绍的是用轻量级的mosquitto开源项目来搭建一个属于自己的MQTT服务器。
第一步:需要安装一台linux主机,这不多介绍,可以使用真机安装也可以使用虚拟机安装。如果仅仅是自己测试使用都可以。
第二步:下载mosquitto需要的依赖
sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake

第三步:下载mosquitto并解压,现在mosquitto官网最新的版本是1.5.1
tar xzvf mosquitto-1.5.1.tar.gz
第四步:编译
cd mosquitto-1.5.1/
make
make install
第五步:启动mosquitto
./mosquitto -v
1535473957: mosquitto version 1.5.1 starting
1535473957: Using default config.
1535473957: Opening ipv4 listen socket on port 1883.
1535473957: Opening ipv6 listen socket on port 1883.
这时候mosquitto就会以默认的参数启动。如果需要带配置文件可以修改配置文件mosquitto.conf,
启动时候加上参数 -c,
./mosquitto -c mosquitto.conf
可以看到,mosquitto监听的端口为1883.
这时候我们的MQTT服务器就搭建好了。可找一个mqtt客户端来测试一下。
先发布一个主题“home/garden/fountain/2”
内容是“hello world”
这时候在mosquitto会打印出下面的log
535474247: New connection from 192.168.1.105 on port 1883.
1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).
1535474247: No will message specified.
1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)
1535474307: Received PINGREQ from MQTT_FX_Client
1535474307: Sending PINGRESP to MQTT_FX_Client
1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))
1535474367: Received PINGREQ from MQTT_FX_Client
1535474367: Sending PINGRESP to MQTT_FX_Client

订阅主题“home/garden/fountain/2”

可以看到收到了自己发布的消息。
用wireshark抓包
可以看到抓到了一个MQTT的publish的报文。

基于node.js搭建简单的MQTT服务器,手机通过热点连接电脑实现MQTT服务器测试

基于node.js搭建简单的MQTT服务器,手机通过热点连接电脑实现MQTT服务器测试

服务器搭建

首先搭建好node.js环境,配置好MQTT服务器,这个网上教程有许多,可以参照这篇博客来进行配置Node.js配置

服务端mqtt.js:

const mosca = require("mosca");
const MqttServer = new mosca.Server(
  port: 1883
);
MqttServer.on("clientConnected", function(client) 
  //当有客户端连接时的回调.
  console.log("client connected", client.id);
);
/**
 * 监听MQTT主题消息
 * 当客户端有连接发布主题消息时
 **/
MqttServer.on("published", function(packet, client) 
  var topic = packet.topic;
  switch (topic) 
    case "test":
      // console.log('message-publish', packet.payload.toString());
      //MQTT可以转发主题消息至其他主题
      //MqttServer.publish( topic: 'other', payload: 'sssss' );
      break;
    case "other":
      console.log("message-123", packet.payload.toString());
      break;
  
);

MqttServer.on("ready", function() 
  //当服务开启时的回调
  console.log("mqtt is running...");
);

客户端发送方publish.js

const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://192.168.137.1 :1883"); //连接到mqtt服务端
setInterval(function() 
  const value = Math.ceil(Math.random() * 40);
  client.publish("test", value.toString(),  qos: 0, retain: true );
, 3000);

客户端订阅方subscribe.js

const mqtt = require("mqtt");
// const mqtt = require('./node_modules/mqtt/dist/mqtt.min.js')
const client = mqtt.connect("mqtt://192.168.137.1 :1883"); //指定服务端地址和端口
client.on("connect", function() 
  console.log("服务器连接成功");
  // connected = client.connected
  client.subscribe("test",  qos: 0); //订阅主题为test的消息
);
client.on("message", function(top, message) 
  console.log("当前topic:", top);
  console.log("收到消息:", message.toString());
);

测试

首先终端输入node mqtt打开服务端

输入node subscribe打开接收客户端

输入node publish 打开发送客户端

之后可以看到

发送客户端向test话题发送数据,接收客户端订阅test话题,能收到数据。证明MQTT服务器搭建完成。

手机电脑MQTT测试

手机通过连接电脑热点进行手机发送客户端发送数据,电脑接收客户端订阅话题获取数据。

首先编写手机端APP,让它能使用MQTT协议发送数据,这里基于APP inventor开发了一个简单的APP来进行测试

逻辑设计:

之后进行电脑端的配置,打开防火墙设置,把1883端口打开。

之后打开电脑热点,手机连接到电脑热点

然后查看自己电脑的ip地址

由于我的ip地址是上述,使用上面客户端配置的时候连接的服务端IP也是这个,自己配置的时候需要注意

之后通过连接到服务器,电脑端打开接收客户端,手机端点击发送数据按钮,观察电脑接收客户端变化

可以看到电脑端订阅到了手机客户端向服务器发送的数据。测试成功。

整个过程中我认为最重要的就说确定好自己的局域网连接情况,因为这是自己搭建的服务器,只有当手机和电脑在同一个局域网下,手机才能连接到电脑的服务端上面,否则是连接不上的,这是我做这次测试过程中最直观的感受。

以上是关于在云服务器上搭建了mqtt,为啥手机连接不上mqtt,要怎么做才能连接上?求求大神帮忙的主要内容,如果未能解决你的问题,请参考以下文章

OTG为啥连不上(OTG为啥连不上手机)

node-red实现MQTT通讯

在云服务器中搭建MQTT平台

在云服务器中搭建MQTT平台

在云服务器中搭建MQTT平台

使用MQTT连接华为云的物联网平台