MQTT服务+客户端
来源:互联网 发布:安卓个人中心界面源码 编辑:程序博客网 时间:2024/06/16 15:57
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-8import paho.mqtt.client as mqttdef 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) passdef 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() passif __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 java客户端代码
- mqtt 协议客户端代码
- MQTT客户端推送实现
- MQTT协议 C#客户端
- MQTT协议 Python客户端
- java MQTT 客户端问题
- MQTT paho客户端使用
- windows MQTT客户端
- MQTT协议 C#客户端
- qt for mqtt 客户端
- C# MQTT客户端--M2MQTT
- mqtt C客户端
- Python MQTT客户端实现
- MQTT 客户端JAVA代码 fusesource mqtt-client
- MQTT客户端JAVA代码----fusesource mqtt-client
- MQTT客户端JAVA代码----fusesource mqtt-client
- MQTT客户端JAVA代码----fusesource mqtt-client
- 从ASCII聊起
- 3D Touch的基本使用
- JavaScript 数据结构(一): 链表
- JS 获取7天前的日期YYYY-MM-DD
- Android数据存储之Android 6.0运行时权限下文件存储的思考
- MQTT服务+客户端
- flume-02-flume案例集锦
- jQuery学习笔记之$(document).ready()
- vc++ 2015 RC x64在windows2008安装时提示没有权限的解决
- 哆啦宝
- C++ pair(对组)用法
- SSM整合Activiti工作流
- Java中private、protected、public和default的区别
- 编程题目