我是靠谱客的博主 称心汉堡,这篇文章主要介绍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。
  • 禁用匿名用户,添加了授权用户和文件
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# ================================================================= # 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功能。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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因为是国外的,网络不稳。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<!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协议内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部