【MQTT】在Windows下搭建MQTT服务器

【MQTT】在Windows下搭建MQTT服务器最近在项目中要使用MQTT协议,需要搭建一个MQTT服务器来进行调试,在网络上找了一天,找到的大多数都是MQTT客户端,最后发现这篇博客写的教程可以使用,特此记录。

大家好,又见面了,我是你们的朋友全栈君。

MQTT简介

MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。该协议的特点有:

  • 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
  • 对负载内容屏蔽的消息传输。
  • 使用 TCP/IP 提供网络连接。
  • 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
  • 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
  • 有三种消息发布服务质量:
  • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
  • “至少一次”,确保消息到达,但消息重复可能会发生。
  • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

前言

最近在项目中要使用MQTT协议,需要搭建一个MQTT服务器来进行调试,在网络上找了一天,找到的大多数都是MQTT客户端,最后发现这篇博客写的教程可以使用,特此记录。

寻找过程

在寻找MQTT服务器的过程中,我发现的Mosquitto是一款「An Open Source MQTT v3.1/v3.1.1 Broker」——开源的MQTT代理服务器,其下也有Windows的安装包。

Mosquitto

但是我使用的是Win10 64位系统,这两个都下载安装后不是报错就是缺少dll文件,不能使用。

最后参考了前面博客说的,搭建了Apollo服务器,这里使用的Apollo 1.7.1。

  • 官网:http://activemq.apache.org/index.html
  • 下载地址:http://activemq.apache.org/apollo/download.html
  • 快速开始教程:http://activemq.apache.org/apollo/documentation/getting-started.html

搭建MQTT服务器

使用Apollo搭建MQTT服务器步骤:

  1. 下载Apollo服务器并解压,在CMD环境运行其工作目录下的...\bin\apollo.cmd,命令后面带上参数「create mybroker」,创建服务器实例。这里需要Java环境,系统环境变量下要有JAVA_HOME。
  2. 创建实例之后会在bin目录下生成mybroker文件夹,其中 ...\etc\apollo.xml文件下是配置服务器信息的文件,...\etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,初始默认帐号是admin,密码password;
  3. 进入...\mybroker\bin\ 目录,在CMD输入命令「apollo-broker.cmd run」,可以使用TAB键自动补全,运行后输出信息如下:

MQTT服务运行信息

其中我们要留意的:

MQTT服务器TCP连接端口:tcp://0.0.0.0:61613

后台Web管理页面:https://127.0.0.1:61681/或http://127.0.0.1:61680/

登录服务器后,如果MQTT服务器有客户端连接,后台会显示如下

后台

Python的MQTT客户端

在Python环境下有MQTT客户端包——paho-mqtt。

安装命令

pip install paho-mqtt

客户端代码清单

下面是MQTT客户端代码清单

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    client.subscribe("lettuce")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.username_pw_set("admin", "password") # 必须设置,否则会返回「Connected with result code 4」
client.on_connect = on_connect
client.on_message = on_message

HOST = "127.0.0.1"

client.connect(HOST, 61613, 60)
client.loop_forever()

发布消息代码

下面是往MQTT服务器发布消息的代码

import paho.mqtt.publish as publish

HOST = "127.0.0.1"

publish.single("lettuce", "payload", hostname=HOST, port=61613,
               auth={'username': "admin", 'password':"password"})

更新

2017年7月28日更新:

最近发现了一款比较好的开源MQTT服务器:EMQ。Linux下部署教程可以参考这篇文章:EMQ初体验——在CentOS7上部署MQTT服务器

Windows下部署可以到官网查阅相关资料。

2017年8月15日更新:

注意:后台Web管理页面被设置为只能本地访问,如果想用其他主机访问该管理页面,需要修改「http://127.0.0.1:61680/」为「http://0.0.0.0:61680/」。

相关配置文件:apache-apollo-1.7.1\bin\mybroker\etc\apollo.xml,大约61行:

<web_admin bind="http://127.0.0.1:61680"/>
<web_admin bind="https://127.0.0.1:61681"/>

好饿啊,早知道不做物联网了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130302.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 循环队列 基本概念「建议收藏」

    循环队列 基本概念「建议收藏」循环队列是队列的一种特殊形式。首先介绍队列,然后引申出循环队列。队列又称为“先进先出”(FIFO)线性表限定插入操作只能在队尾进行,而删除操作只能在队首进行队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列队列的顺序表示—顺序队列用一组连续的存储单元依次存放从队首到队尾的元素,附设两个指针head和tail分别指向队首元素和队尾元素的位置,(有的地方用f…

    2022年5月6日
  • 分布式锁的应用场景和三种实现方式的区别_负载均衡策略

    分布式锁的应用场景和三种实现方式的区别_负载均衡策略多线程对同一资源的竞争,需要用到锁,例如Java自带的Synchronized、ReentrantLock。但只能用于单机系统中,如果涉及到分布式环境(多机器)的资源竞争,则需要分布式锁。分布式锁的主要作用:保证数据的正确性:比如:秒杀的时候防止商品超卖,表单重复提交,接口幂等性。避免重复处理数据:比如:调度任务在多台机器重复执行,缓存过期所有请求都去加载数据库。分布式锁的主要特性:互斥:同一时刻只能有一个线程获得锁。可重入:当一个线程获取锁后,还可以再次获取这个锁,避免死锁发生。高可用:当

    2022年9月8日
  • webstorm插件安装-代码缩略图插件「建议收藏」

    webstorm插件安装-代码缩略图插件「建议收藏」webstorm本身足够强大了,但是有时候也希望能有其他的附加功能。好在官方提供了足够多的插件。https://plugins.jetbrains.com/webstorm找一个自己喜欢的插件,以代码缩略图插件为例:https://plugins.jetbrains.com/plugin/7275-codeglance代码缩略图可以很直观的看到代码的情况,快速定位代码到对应位置…

    2022年9月4日
  • qt 获取窗口句柄「建议收藏」

    qt 获取窗口句柄「建议收藏」HWNDappwnd;appwnd=(HWND)w.winId();QStringClassName(“Qt5QWindowIcon”);QStringAppName=QStringLiteral(“GG”);LPCWSTRapp=reinterpret_cast(ClassName.data());LPCWSTRappCaption=reinterpret_

    2022年7月21日
  • HashMap扩容机制解读[通俗易懂]

    HashMap扩容机制解读[通俗易懂]扩容机制什么时候需要扩容:当hashmap中的元素个数超过数组大小*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75这是一个折中的取值,也就是说,默认情况下数组大小为16,那么当hashmap中的元素个数超过16*0.75=12(阈值或者边界值的时候)就把数组的大小扩展Wie2*16=32,然后重新计算出每个元素在数组中的位置,而这是一个非常耗性能的操作,所以我们最好能够提前预知并设置元素的个数。注

    2022年6月17日
  • 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法

    启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法

    2021年7月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号