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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 租的房子是人家公租房怎么办 五险合一软件口令忘记了怎么办 计生办把婚育状况登记错了怎么办? 医院发票法院要保险也要怎么办 上海社保里生育险暂停参保怎么办? 痔疮手术后大姨妈来了怎么办 微创痔疮术后第五天涨出血怎么办? 肚子胀疼大便拉不出来怎么办 得痔疮了该怎么办昆明东大治 下体痒还没去检查就来月经了怎么办 直肠造口手术后造口肠子突出怎么办 痔疮pph手术瘢痕两年了该怎么办 肛瘘挂线术后六天腹泻了怎么办 刚满月的孩子鼻子不通气怎么办 齐鲁医院挂的号晚了怎么办 手机微信安装后注册失败怎么办 舞蹈基本功胸怎么都转不动怎么办 饥荒手机版第10天遇到的狗怎么办 饥荒海难手游石墙老是放歪怎么办 小燕子从窝里掉下来了怎么办 二岁宝宝晚上睡觉不踏实怎么办 脚扭伤了有点痛但没肿该怎么办 落地扇的机头摇摆的地方坏了怎么办 跌倒在楼梯上右侧肋骨骆上怎么办 1岁3个月害怕自己不敢走路怎么办 苹果手机没开定位丢了怎么办 我和我老婆每天都吵架怎么办 现在在学注册消防师好枯燥怎么办 店铺台阶太高顾客不愿进来怎么办? 上古卷轴5跑步要沉下去怎么办 1岁半宝宝半夜醒来不睡觉怎么办 上古卷轴5不小心偷了东西怎么办 47牙缺失17号长长了怎么办 碎纸机过热件亮了卡住纸了怎么办 汽车买贵了2万多怎么办 宝宝眼皮被蚊子咬肿了怎么办 一岁宝宝撞头咬到舌头有伤口怎么办 二胎快生了老大特别粘人怎么办 生二胎不舍得大宝跟奶奶睡怎么办 怀二胎婆婆不帮忙带孩子怎么办 注册过的高铁用户名忘了怎么办