MQTT服务+客户端

MQTT服务器客户端架设

服务器使用Mosquitto,客户端使用paho。

服务器

安装包和源码地址:http://mosquitto.org/download/

Windows下

下载win32安装包,安装到C盘根目录下。期间,提示需要下载Openssl和pthreadv2。按照链接地址下载,然后将dll到添加到path或者copy到mosquitto根目录下。
注意:坑在于,openssl只能使用1.0.x版本,否则各种找不到的问题。

Linux下

sudo apt install mosquitto ,然后命令行中就可以找到mosquitto。

配置文件

  • 修改了默认监听的端口为8080,同时开启websockets功能,端口31000。
  • 禁用匿名用户,添加了授权用户和文件
# =================================================================
# Default listener
# =================================================================
port 8080  # tcp监听的端口,必须开启,默认为1831  

# =================================================================
# Extra listeners
# =================================================================
listener 31000         # 新增,为websockets开启的端口 
protocol websockets    # 新增,设定31000的协议为websockets

# =================================================================
# Security
# =================================================================
allow_anonymous false  # 关闭匿名用户,配合用户管理使用  

# -----------------------------------------------------------------
# Default authentication and topic access control
# -----------------------------------------------------------------
password_file /etc/mosquitto/pwfile # 设置用户和密码验证方式的文件  

以上设定完毕后,需要通过命令行添加一个用户 test:
mosquitto_passwrod -c /etc/mosquitto/pwfile test 注意-c会重新创建文件,新增不用此参数。
按照提示,输入密码,即新建了一个用户test。

运行

mosquitto -c /etc/mosquitto/mosquitto.conf -d
注意:-d会让mosquitto在后台守护运行。windows配置文件在exe所在目录。
其实也可以直接执行mosquitto就可以,它会使用默认的配置文件运行。

客户端

你可以使用mosquitto自带的devel文件夹下文件开发,也可以使用第三方的,但是建议使用paho。原因很简单,clients端语言和功能支持很全面。
参考Url https://www.eclipse.org/paho/downloads.php

Python

这里主要演示sub功能。

# coding:utf-8

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: "+str(rc))

    client.subscribe("robot/#")

def on_message(client, userdata, msg):
    try:
        if msg.topic == "robot/str":
            print(userdata,msg.topic,msg.payload.decode("utf8"))
        elif msg.topic == "robot/json":
            print(userdata,msg.topic,msg.payload.decode("utf8"))
        else:
            print(userdata,msg.topic,len(msg.payload))
    except Exception as err:
        print("on_message error:",err)
        pass

def subtopic():
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message

    client.username_pw_set("test","testpwd")
    client.connect("remote.xxxx.com",8080)

    # client.publish("robot/python","Hello!!") # 发送消息
    client.loop_forever()
    pass

if __name__=="__main__":
    subtopic()
    pass

Javascript

mqttws31.js这个库,最好将它下载下来,然后引用。cdn因为是国外的,网络不稳。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MQTT js Test</title>
</head>
<body>
<h1>查看控制台输出~</h1>
<textarea id="id_msg">我是测试文本</textarea>
<br/>
<button onclick="javascripts:btn_msg();">发送</button>

<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js" type="text/javascript"></script>
<script>
    // Create a client instance
    client = new Paho.MQTT.Client("remote.xxxxx.com", 31000,"clientId");

    // set callback handlers
    client.onConnectionLost = onConnectionLost;
    client.onMessageArrived = onMessageArrived;

    // connect the client
    client.connect({
        userName:"test",
        password:"testpwd",
        onSuccess:onConnect,
    });

    function btn_msg() {
        var txt = document.getElementById('id_msg').value;
        message = new Paho.MQTT.Message(txt);
        message.destinationName = "robot/str";
        client.send(message);
    }

    // called when the client connects
    function onConnect() {
        // Once a connection has been made, make a subscription and send a message.
        console.log("onConnect");
        client.subscribe("robot/#");
        message = new Paho.MQTT.Message("Hello,i am fron web js.");
        message.destinationName = "robot/web";
        client.send(message);
    }

    // called when the client loses its connection
    function onConnectionLost(responseObject) {
        if (responseObject.errorCode !== 0) {
            console.log("onConnectionLost:"+responseObject.errorMessage);
        }
    }

    // called when a message arrives
    function onMessageArrived(msg) {
        if (msg.destinationName == "robot/str")
            console.log(msg.destinationName,msg.payloadString)
        else if (msg.destinationName == "robot/json")
            console.log(msg.destinationName,msg.payloadString)
        else
            console.log(msg.destinationName,(msg.payloadBytes).length)
    }
</script>
</body>
</html>

c/c++

需要使用 https://github.com/eclipse/paho.mqtt.c 自己编译,或者官方的x64编译好的dll。项目中自带vs2017的项目文件。
注意:需要在src文件夹下,复制一份VersionInfo.h.in文件,改名为VersionInfo.h。Demo参考官方Demo,很简单。
推荐使用异步dll。

重点内容说明

消息质量

  • 0: “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送;
  • 1 :“至少一次”,确保消息到达,但消息重复可能会发生;
  • 2:“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

消息主题

构建一个应用程序时,主题树的设计应考虑以下主题名称的语法和语义的原则:
- 主题必须至少一个字符长;  
- 主题名称是区分大小写的,例如,A和a是两个不同的主题;
- “/”创造了一个独特的主题,例如,/a与a是不同的主题。/a匹配“+/+”和“/+”,但不匹配“+”; 
- 任何主题不包含空字符(Unicode \ x0000)。  

以下原则适用于主题树的结构和内容:
- 64 k的长度是有限的,但在没有限制水平主题树的数量。  
- 可以有任意数量的根节点,也就是说,可以有任意数量的主题树。

subscribe订阅

使用正斜杠(/)分隔主题树中的每个级别,并提供一个主题空间的层次结构。主题层面分离器的使用中遇到两个通配符时重要的主题由用户指定。

数字符号(#)

是一个通配符匹配任意数量的水平在一个主题,只能用在最后,如a/#/c是不合法的。例如,如果你订阅a/b/c/#,你在这些主题接收消息:
- a/b/c
- a/b/c/d
- a/b/c/e

加号(+)

是一个通配符匹配的主题只有一个水平。例如,如果你订阅a/+/c/#,你在这些主题:接收消息:
- a/a/c/
- a/b/c/d
- a/c/c/e

订阅”+/#”

此主题可接受所有类型主题的消息

publish发布

发布的时候主题时,+或者#不能通配,是且仅是一个明确的主题。

MQTT协议

https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Qt 来搭建 MQTT 服务器和客户端。下面是一个简单的示例代码,演示了如何使用 Qt MQTT 模块来实现一个基本的 MQTT 客户端: ```cpp #include <QtMqtt/QMqttClient> #include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QMqttClient mqttClient; mqttClient.setHostname("mqtt.example.com"); // 设置 MQTT 服务器的主机名 mqttClient.setPort(1883); // 设置 MQTT 服务器的端口 QObject::connect(&mqttClient, &QMqttClient::connected, [&]() { qDebug() << "Connected to MQTT server"; mqttClient.subscribe("topic/example"); // 订阅主题 }); QObject::connect(&mqttClient, &QMqttClient::disconnected, [&]() { qDebug() << "Disconnected from MQTT server"; }); QObject::connect(&mqttClient, &QMqttClient::messageReceived, [&](const QByteArray &message, const QMqttTopicName &topic) { qDebug() << "Received message:" << message << "on topic:" << topic.name(); }); mqttClient.connectToHost(); // 连接到 MQTT 服务器 return app.exec(); } ``` 上面的示例代码创建了一个 `QMqttClient` 对象,并设置了 MQTT 服务器的主机名和端口。然后,通过连接相关的信号和槽,实现了连接到服务器、订阅主题以及接收消息的功能。最后,通过调用 `connectToHost` 函数来连接到 MQTT 服务器。 你还需要在项目文件中添加以下语句,以确保正确链接 Qt MQTT 模块: ``` QT += mqtt ``` 关于如何搭建 MQTT 服务器,你可以使用一些开源的 MQTT 服务器实现,如 Mosquitto、EMQ X 等。你可以在它们的官方文档中找到详细的安装和配置步骤。 希望这个简单的示例能够帮助你开始搭建 MQTT 服务器和客户端。如有更多问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值