概述
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协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复