我是靠谱客的博主 称心汉堡,最近开发中收集的这篇文章主要介绍MQTT服务+客户端MQTT服务器客户端架设服务器客户端重点内容说明MQTT协议,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MQTT服务器客户端架设

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

  • MQTT服务器客户端架设
  • 服务器
    • Windows下
    • Linux下
    • 配置文件
    • 运行
  • 客户端
    • Python
    • Javascript
    • cc
  • 重点内容说明
    • 消息质量
    • 消息主题
    • subscribe订阅
      • 数字符号
      • 加号
      • 订阅
    • publish发布
  • MQTT协议

服务器

安装包和源码地址: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

最后

以上就是称心汉堡为你收集整理的MQTT服务+客户端MQTT服务器客户端架设服务器客户端重点内容说明MQTT协议的全部内容,希望文章能够帮你解决MQTT服务+客户端MQTT服务器客户端架设服务器客户端重点内容说明MQTT协议所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部