mqtt_mqttfx - CSDN
mqtt 订阅
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。 展开全文
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
信息
性    质
即时通讯协议
外文名
MQTT(Message Queuing Telemetry Transport)
开发商
IBM
中文名
消息队列遥测传输
支持平台
所有
MQTT简介
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。IBM公司的安迪·斯坦福-克拉克及Cirrus Link公司的阿兰·尼普于1999年撰写了该协议的第一个版本。该协议的可用性取决于该协议的使用环境。IBM公司在2013年就向结构化资讯标准促进组织提交了 MQTT 3.1 版规范,并附有相关章程,以确保只能对规范进行少量更改。MQTT-SN是针对非 TCP/IP 网络上的嵌入式设备主要协议的变种,与此类似的还有ZigBee协议。纵观行业的发展历程,“MQTT”中的“MQ” 是来自于IBM的MQ系列消息队列产品线。然而通常队列本身不需要作为标准功能来支持。可选协议包含了高级消息队列协议,面向文本的消息传递协议,互联网工程任务组约束应用协议,可扩展消息与存在协议,数据分发服务,OPC UA以及web 应用程序消息传递协议。 [1] 
收起全文
  • MQTT浅析

    千次阅读 2017-10-25 16:59:41
    出于工作需要,最近对MQTT进行了学习,在这里总结一下。 MQTT是“Message Queuing Telemetry Transport"的英文缩写,是IBM开发的一个即时通讯协议,是一个轻量级的,基于代理的”发布/订阅“模式的消息传输协议,...

    出于工作需要,最近对MQTT进行了学习,在这里总结一下。

    MQTT是“Message Queuing Telemetry Transport"的英文缩写,是IBM开发的一个即时通讯协议,是一个轻量级的,基于代理的”发布/订阅“模式的消息传输协议,截至现在的发布版本为V3.1.1,支持多种编程语言,如PHP,JAVA,Python,Node.js,C,C++等,而且特别适合应用于物联网通信领域,目前国内外也有很多物联网平台在部署应用。

    什么是”发布/订阅“模式?在MQTT协议中,有发布者,订阅者和代理(broker)三种角色,消息由发布者通过topic发布,由订阅者对感兴趣的topic进行订阅,一个发布者可以对应多个订阅者,一个订阅者也可以订阅多个topic,另外,订阅者也可以是发布者,发布者也可以是订阅者,这样就实现了"M2M"(Machine to Machine)的通信。broker类似于邮局或者说信差的角色,它的主要作用就是接收信件并投递给订阅信件的人。如果订阅者不在线,也就是说没有connected to the broker,那么消息会保留,等订阅者在线时投递,类似于QQ。

    MQTT比传统的通信方式(比如TCP/IP)有什么优势?或者说为什么选择MQTT?例如,我们之前项目中经常用socket基于TCP/IP或者UDP进行数据的上传,为什么不直接这样使用呢?事实上,MQTT就是基于TCP/IP之上建立通信的,其底层的connect机制就是TCP/IP,如果我们对物联网这种应用场景,采用TCP/IP进行自下而上的开发,需要做大量其它的工作,比如client客户端,服务器端程序,以及对网络延迟、即时性以及用户是否在线的处理,而这些MQTT都已经做了大量的工作和优化,这时采用MQTT,它的优势就显现出来了。


    MQTT提供了怎样的安全机制来确保消息传输的安全?MQTT在V3.1.1后,其在CONNECT消息里提供了user和password字段,但值得注意的是,MQTT只提供了这种用户名和密码的验证机制,具体实现需要借助第三方或另外开发,比如Auth0。此外,用户名和密码是明文传输的,可以通过TLS或SSL对用户名和密码进行加密传输。

    MQTT的QoS机制以及它们的应用场景?MQTT提供了三种QoS机制,第一种是至多一次传输(At most once delivery),这种方式可能会有数据丢包,适用于允许个别数据丢失的场景;第二种是至少一次传输(At least once delivery),这种方式可能会有数据包的重复;第三种是精准一次传输(Exactly once delivery),这种方式只能传输一次并且保证送达,适用于金融支付类不允许丢包和重复的应用场景。

    最后,在应用过程中,也总结了下目前比较活跃的基于MQTT的开源项目,如下:

    1.Mosquitto---https://mosquitto.org/

    2.Mosca---http://www.mosca.io/

    欢迎大家扫描下方二维码关注我的个人微信公众号,一起交流学习,谢谢。


    展开全文
  • 三分钟弄懂物联网流行协议——MQTT

    万次阅读 2018-10-15 10:44:24
    MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息...

     

    MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。

    为什么使用MQTT 协议?

    MQTT(英语全称,Message Queue Telemetry Transport),中文翻译过来就是遥测传输协议:其主要提供订阅/发布模式,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),属于物联网(Internet of Thing)的一个传输协议。设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此:

    • 特别适合于网络代价昂贵,带宽低、不可靠的环境。

    • 能在处理器和内存资源有限的嵌入式设备中运行。

    • 使用发布/订阅消息模式,提供一对多的消息发布,从而解除应用程序耦合。

    • 使用 TCP/IP 提供网络连接。

    • 提供Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

    对消息中间件,估计大家不得不关心的就是消息的可靠性,也就是消息的发布服务质量,可喜的是,MQTT支持三种消息发布服务质量(QoS):

    • “至多一次”(QoS==0),消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

    • “至少一次”(QoS==1),确保消息到达,但消息重复可能会发生。

    • “只有一次”(QoS==2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

    协议规范的版本

    MQTT的协议最新的三个版本是:3.1.1,3.1.0和5.0的协议。

    • 3.1.0的规范如下

      http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html

    • 3.1.1的规范如下

      http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029

    • 5.0 的规范如下

      http://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html

    其中5.0还只是一个提案(2017年7月13日发布的一个草稿版的提案),所以本篇文章暂时不涉及MQTT 5.0的协议,考虑到目前主流和成熟的MQTT协议的应用都是MQTT 3.1.1的协议,所以笔者还是以MQTT 3.1.1的协议为基准,给大家分享,只要这个会了,其他的自然不在话下。需要注意的是,MQTT 3.1.0和3.1.1 规范,还是有小部分的区别的。比如可变头部中,在3.1.0的规范中,其关键字是,“MQISdP”。

    支持MQTT协议消息中间件产品?

    目前有很多的MQTT消息中间件服务器,如下,都是MQTT协议的服务器端的实现。

    • IBM Websphere

    • MQ Telemetry

    • IBM MessageSight

    • Mosquitto

    • Eclipse Paho

    • emqttd Xively

    • m2m.io

    • webMethods

    • Nirvana Messaging

    • RabbitMQ

    • Apache ActiveMQ

    • Apache Apollo

    • Moquette

    • HiveMQ

    • Mosca

    • Litmus Automation Loop

    • JoramMQ

    • ThingMQ

    • VerneMQ

    支持一对多的消息订阅

    MQTT协议,支持一对多的基于消息主题(Topic)的消息订阅,也就是一个MQTT的客户端,发送一条特定主题的消息,

    能同时支持多个订阅者同时订阅。

    如下图所示意,笔记本和手机都订阅了消息主题为temperature的消息,当温度传感器发布了temperature的消息(当前温度为21 C), 笔记本和手机都会受到温度传感器发布的温度。

    三分钟弄懂物联网流行协议——MQTT

    MQTT客户端的语言支持

    目前市面上的主流语言都支持。

    • Java

    • Javascript

    • C/C++

    • Python

    • Ruby

    • Objective-C

    展开全文
  • MQTT协议详解,非常易懂

    万次阅读 热门讨论 2016-02-18 11:37:19
    MQTT协议详解一 协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百度一下,不过个人感觉不是官网上的字体和排版最舒服。 那么这个协议...

    MQTT协议详解一


    协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html

    当然也有PDF版的,百度一下,不过个人感觉不是官网上的字体和排版最舒服。

    那么这个协议是用做什么或有什么特色呢?下面是mqtt.org上的首段介绍:

    It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is
    required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios.
    It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers

    MQTT轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。例如通过卫星和代理连接,通过拨号和医疗保健提供者连接,以及在一些自动化或小型设备上,而且由于小巧,省电,协议开销小和能高效的向一和多个接收者传递信息,故同样适用于称动应用设备上。

    相信在想深入学习这协议必是奔着解决某个问题而来的,上面给出了适用的场景,我之所以想深入的学习和了解这个协议,理由如下:

    1、可以实现手机消息推送(PUSH)

    2、协议简单,最小的头部只需2个字节,特别适合于嵌入式中。

    3、这是个了解什么是协议绝好的例子。相比于其它复杂的协议例如tcp,http协议,至少说明文档看的下去。

    在这里,我以推送为例子说明,虽然现在现成的推送解决方案已经比较成熟,但是这个Repeat ReInvent the Whell还是要做一下,什么都是拿来主义,和搬运工有什么区别。

    一、需要的环境:

    1、PHP+Apache或Nginx

    2、安装开源代理程序Mosquitto,这里用其做为代理服务器,负责连接和分发。

    安装方法很简单,http://mosquitto.org/files/   binary是编译好的,source是源码安装需要的(make & make install 就行)

    唯 一要配置的就是在解压后的config.mk,安装完后设置文件是mosquitto.conf

    当然主要是设置是否支持ssl,还有就是config.mk最下面的安装位置的设定。这里一切默认。

    默认启动是绑定的IP是本地IP,端口是1883可以在mosquitto.conf里设置(要去掉前面的#字注释),linux 中 -c 可以指定设置文件并运行

    比 如: mosquitto -c /etc/mosquitto.conf

    二、协议初解

    先说一下整个协议的构造,整体上协议可拆分为:

                        固定头部+可变头部+消息体

    协议说白了就是对于双方通信的一个约定,比如传过来一段字符流,第1个字节表示什么,第2个字节表示什么。。。。一个约定。

    所以在固定头部的构造如下:

    1、MessageType(0和15保留,共占4个字节)

    public $operations=array(
             "MQTT_CONNECT"=>1,//请求连接
             "MQTT_CONNACK"=>2,//请求应答
             "MQTT_PUBLISH"=>3,//发布消息
             "MQTT_PUBACK"=>4,//发布应答
             "MQTT_PUBREC"=>5,//发布已接收,保证传递1
             "MQTT_PUBREL"=>6,//发布释放,保证传递2
             "MQTT_PUBCOMP"=>7,//发布完成,保证传递3
             "MQTT_SUBSCRIBE"=>8,//订阅请求
             "MQTT_SUBACK"=>9,//订阅应答
             "MQTT_UNSUBSCRIBE"=>10,//取消订阅
             "MQTT_UNSUBACK"=>11,//取消订阅应答
             "MQTT_PINGREQ"=>12,//ping请求
             "MQTT_PINGRESP"=>13,//ping响应
             "MQTT_DISCONNECT"=>14//断开连接
            ); 

    2、DUP flag

     其是用来在保证消息传输可靠的,如果设置为1,则在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。

    3、Qos

    主要用于PUBLISH(发布态)消息的,保证消息传递的次数。

    00表示最多一次 即<=1

    01表示至少一次  即>=1

    10表示一次,即==1

    11保留后用

    4、Retain

     主要用于PUBLISH(发布态)的消息,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它。如果不设那么推送至当前订阅的就释放了。

    5、固定头部的byte 2

    是用来保存接下去的变长头部+消息体的总大小的。

    但是不是并不是直接保存的,同样也是可以扩展的,其机制是,前7位用于保存长度,后一部用做标识。

    我举个例了,即如果计算出后面的大小为0<length<=127的,正常保存

    如果是127<length<16383的,则需要二个字节保存了,将第一个字节的最大的一位置1,表示未完。然后第二个字节继续存。

    拿130来说,第一个字节存10000011,第二个字节存000000001,也就是0x83,0x01,把两个字节连起来看,第二个字节权重从2的8次开始。

    同起可以加第3个字节,最多可以加至第4个字节。故MQTT协议最多可以实现268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)将近256M的数据。可谓能伸能缩。

     可变头部

    这个是可变头部的全貌。

    1、首先最上面的8个字节是Protocol Name(编码名),UTF编码的字符“MQIsdp”,头两个是编码名提长为6。

    这里多说一些,接下去的协议多采用这种方式组合,即头两个字节表示下一部分的长,然后后面跟上内容。这里头两个字节长为6,下面跟6个字符“MQIsdp”。

    2、Protocol Version,协议版本号,v3 也是固定的。

    3、Connect Flag,连接标识,有点像固定头部的。8位分别代表不同的标志。第1个字节保留。

    Clean Session,Will flag,Will Qos, Will Retain都是相对于CONNECT消息来说的。

    Clean Session:0表示如果订阅的客户机断线了,那么要保存其要推送的消息,如果其重新连接时,则将这些消息推送。

                                1表示消除,表示客户机是第一次连接,消息所以以前的连接信息。

    Will Flag表示如果客户机在不是在发送DISCONNECT消息中断,比如IO错误等,将些置为1,要求重传。并且下且的WillQos和WillRetain也要设置,消息体中的Topic和MessageID也要设置,就是表示发生了错误,要重传。

    Will Qos,在CONNECT非正常情况下设置,一般如果标识了WillFlag,那么这个位置也要标识。

    Will RETAIN:同样在CONNECT中,如果标识了WillFlag,那么些位也一定要标识

    usename flag和passwordflag,用来标识是否在消息体中传递用户和密码,只有标识了,消息体中的用户名和密码才用效,只标记密码而不标记用户名是不合法的。

    4、Keep Alive,表示响应时间,如果这个时间内,连接或发送操作未完成,则断开tcp连接,表示离线。

    5、Connect Return Code即通常于CONNACK消息中,表示返回的连接情况,我可以通过此检验连接情况。

    6、Topic Name,订阅消息标识,MQTT是基于订阅/发布的消息,那么这个就是消息订阅的标识,像新闻客户端里的订阅不同的栏目一样。用于区别消息的推送类别。

    主要用于PUBLISH和SUBSCRIBE中。最大可支持32767个字符,即4个字节。

    消息体(PayLoad)

    只有3种消息有消息体CONNECT,SUBSCRIBE,SUBACK

    CONNECT主要是客户机的ClientID,订阅的Topic和Message以及用户名和密码,其于变长头部中的will是对应的。

    SUBSCRIBE是包含了一系列的要订阅的主题以及QOS。

    SUBACK是用服务器对于SUBSCRIBE所申请的主题及QOS进行确认和回复。

    PUBLISH是消息体中则保存推送的消息,以二进制形式,当然这里的编辑可自定义。

    7、Message Identifier

    包含于PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.

    其为16位字符表示,用于在Qos为1或2时标识Message的,保证Message传输的可靠性。

    至于具体的消息例子,我们在后面的代码中慢慢体现。

    展开全文
  • MQTT再学习 -- 搭建MQTT服务器及测试

    万次阅读 多人点赞 2019-04-23 11:59:35
    最近在搞 PM2.5 采集,需要用到 MQTT 传输协议。协议部分看了几天的,讲的七七八八。本身在 intel 上有 写好的MQTT 的源码,现在的工作其实也就是移植到单片机上或者DM368板卡上。不过,对于之前没有接触过的我来说...

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/76680646

    最近在搞 PM2.5 采集,需要用到 MQTT 传输协议。协议部分看了几天的,讲的七七八八。本身在 intel 上有 写好的MQTT 的源码,现在的工作其实也就是移植到单片机上或者DM368板卡上。不过,对于之前没有接触过的我来说,还是从头开始,搭建服务器及测试一下为好。

    MQTT服务器有好多种,参看:Servers/Brokers 

    Apache-Apollo:一个代理服务器,在ActiveMQ基础上发展而来,可以支持STOMP、AMQP、MQTT、Openwire、SSL和WebSockets等多种协议,并且Apollo提供后台管理页面,方便开发者管理和调试。
    EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器。
    HiveMQ:一个企业级的MQTT代理,主要用于企业和新兴的机器到机器M2M通讯和内部传输,最大程度的满足可伸缩性、易管理和安全特性,提供免费的个人版。HiveMQ提供了开源的插件开发包。
    Mosquitto:一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式。

     

    这篇文章我们只讲两种,一种是 Mosquitto、另一种是 Apollo,以及它们在 linux 下和 Windows 下的安装。

    我们本篇都会来一一做讲解。

    参看:【MQTT】在Ubuntu下搭建MQTT服务器

    一、Ubuntu 下 MQTT 服务器搭建之Apollo

    (1) 首先要搞清楚什么是 Apollo 

    参看:ActiveMQ's next generation of messaging

    ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.

    翻译一下:

    ActiveMQ Apollo是从原始ActiveMQ的基础构建的更快,更可靠,更易于维护的消息代理。 它使用完全不同的线程和消息调度架构来实现。 像ActiveMQ一样,Apollo是一个多协议代理,支持STOMP,AMQP,MQTT,Openwire,SSL和WebSockets。

     

    看到没,有支持 MQTT  

    下载:Download it today!

    (2)安装

    先解压

    # sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz 

    查看 bin/apollp.cmd

    # cat apollo.cmd 
    @REM
    @REM Licensed to the Apache Software Foundation (ASF) under one or more
    @REM contributor license agreements.  See the NOTICE file distributed with
    @REM this work for additional information regarding copyright ownership.
    @REM The ASF licenses this file to You under the Apache License, Version 2.0
    @REM (the "License"); you may not use this file except in compliance with
    @REM the License.  You may obtain a copy of the License at
    @REM
    @REM      http://www.apache.org/licenses/LICENSE-2.0
    @REM
    @REM Unless required by applicable law or agreed to in writing, software
    @REM distributed under the License is distributed on an "AS IS" BASIS,
    @REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    @REM See the License for the specific language governing permissions and
    @REM limitations under the License.
    @REM
    @echo off
    
    setlocal
    
    if NOT "%APOLLO_HOME%"=="" goto CHECK_APOLLO_HOME
    PUSHD .
    CD %~dp0..
    set APOLLO_HOME=%CD%
    POPD
    
    :CHECK_APOLLO_HOME
    if exist "%APOLLO_HOME%\bin\apollo.cmd" goto CHECK_JAVA
    
    :NO_HOME
    echo APOLLO_HOME environment variable is set incorrectly. Please set APOLLO_HOME.
    goto END
    
    :CHECK_JAVA
    set _JAVACMD=%JAVACMD%
    
    if "%JAVA_HOME%" == "" goto NO_JAVA_HOME
    if not exist "%JAVA_HOME%\bin\java.exe" goto NO_JAVA_HOME
    if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
    goto RUN_JAVA
    
    :NO_JAVA_HOME
    if "%_JAVACMD%" == "" set _JAVACMD=java.exe
    echo.
    echo Warning: JAVA_HOME environment variable is not set.
    echo.
    
    :RUN_JAVA
    
    set CLASSPATH=%APOLLO_HOME%\lib\apollo-boot.jar
    
    set BOOTDIRS=%APOLLO_HOME%\lib
    if NOT "x%APOLLO_BASE%" == "x" set BOOTDIRS=%APOLLO_BASE%\lib;%BOOTDIRS%
    
    if "%JVM_FLAGS%" == "" set JVM_FLAGS=-server -Xmx1G -XX:-UseBiasedLocking
    
    if "%APOLLO_ASSERTIONS%"=="false" goto noAPOLLO_ASSERTIONS
      set JVM_FLAGS=-ea %JVM_FLAGS%
    :noAPOLLO_ASSERTIONS
    
    if "x%APOLLO_OPTS%" == "x" goto noAPOLLO_OPTS
      set JVM_FLAGS=%JVM_FLAGS% %APOLLO_OPTS%
    :noAPOLLO_OPTS
    
    if "x%APOLLO_DEBUG%" == "x" goto noDEBUG
      set JVM_FLAGS=%JVM_FLAGS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
    :noDEBUG
    
    if "x%APOLLO_PROFILE%" == "x" goto noPROFILE
      set JVM_FLAGS=-agentlib:yjpagent %JVM_FLAGS%
    :noPROFILE
    
    if "%JMX_OPTS%" == "" set JMX_OPTS=-Dcom.sun.management.jmxremote
    rem set JMX_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
    set JVM_FLAGS=%JVM_FLAGS% %JMX_OPTS%
    
    set JVM_FLAGS=%JVM_FLAGS% -Dapollo.home="%APOLLO_HOME%"
    if NOT "x%APOLLO_BASE%" == "x" set JVM_FLAGS=%JVM_FLAGS% -Dapollo.base="%APOLLO_BASE%"
    set JVM_FLAGS=%JVM_FLAGS% -classpath "%CLASSPATH%"
    
    "%_JAVACMD%" %JVM_FLAGS% org.apache.activemq.apollo.boot.Apollo "%BOOTDIRS%" org.apache.activemq.apollo.cli.Apollo %*
    
    :END
    endlocal
    GOTO :EOF
    
    :EOF
    

    由于搭建 Apollo 环境变量需要有 JAVA_HOME,这个时候需要安装 JDK

    安装 JDK

    下载:Java SE Development Kit 8 Downloads

    从上图可以看到,这个Linux版本有 x86 和 x64 等版本。如果查看你的 Ubuntu 是什么版本呢?

    参看:如何判断Linux是32位还是64位

    方法一:getconf LONG_BIT
    在linux终端输入 getconf LONG_BIT 命令
    如果是32位机器,则结果为32

    [root@localhost ~]# getconf LONG_BIT  
    32  

    如果是64位机器,则结果为64

    [root@localhost ~]# getconf LONG_BIT  
    64  

    方法二:uname -a
    如果是64位机器,会输出x86_64

    [chenzhou@testweb01 ~]$ uname -a  
    Linux testweb01 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:00 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux  

    可以看到,uname-a执行后的结果中输出了x86_64,说明该机器是64位的,否则代表该机器是32位的

    [root@localhost ~]# uname -a  
    Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux  

    方法三:file /sbin/init 或者 file /bin/ls
    示例:32位机器
    file /sbin/init

    [root@localhost ~]# file /sbin/init  
    /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped  

    file /bin/ls

    [root@localhost ~]# file /bin/ls  
    /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped  

    示例:64位机器
    file /sbin/init

    [chenzhou@testweb01 ~]$ file /sbin/init  
    /sbin/init: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped  

    file /bin/ls

    [chenzhou@testweb01 ~]$ file /bin/ls  
    /bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped  

    可以通过命令结果中的64-bit或者32-bit来判断该机器是64位还是32位

     

    最后如下经过测试,我的Ubuntu是32位的,下载  jdk-8u144-linux-i586.tar.gz

    # uname -a
    Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux
    
    #getconf LONG_BIT  
    32

     

    通过终端在/usr/local目录下新建java文件夹,命令行:

    sudo mkdir /usr/local/java

    然后进入java目录,命令行:

    cd /usr/local/java
    

    解压压缩包:

    sudo tar xvf jdk-8u25-linux-x64.tar.gz
    

    设置jdk环境变量:

    # gedit /etc/profile
    在最后添加下面代码:
    
    export JAVA_HOME=/usr/local/java/jdk1.8.0_144
    export JRE_HOME=${JAVA_HOME}/jre  
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
    export PATH=${JAVA_HOME}/bin:$PATH
    
    使用 source /etc/profile 使它立即生效

    检验是否安装成功:

    # java -version
    java version "1.8.0_144"
    Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
    Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)

    配置 Apollo

    参看:Getting Started Guide

    进入apache-apollo-1.7.1/bin目录
    cd apache-apollo-1.7.1/bin/
    输入 ./apollo 可以查看帮助

    # ./apollo 
    usage: apollo [--log <log_level>] <command> [<args>]
    
    The most commonly used apollo commands are:
        create           creates a new broker instance
        disk-benchmark   Benchmarks your disk's speed
        help             Display help information
        version          Displays the broker version
    
    See 'apollo help <command>' for more information on a specific command.
    

    创建一个Broker示例:/apollo create mybroker,MQTT服务器都是叫Broker。

    # ./apollo create mybroker
    Creating apollo instance at: mybroker
    Generating ssl keystore...
    
    You can now start the broker by executing:  
    
       "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker" run
    
    Or you can setup the broker as system service and run it in the background:
    
       sudo ln -s "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service" /etc/init.d/
       /etc/init.d/apollo-broker-service start

    后面会有提示怎么启动服务器,以及创建一个service。
    启动Apollo :

    # ./mybroker/bin/apollo-broker run
    
        _____                .__  .__
       /  _  \ ______   ____ |  | |  |   ____
      /  /_\  \\____ \ /  _ \|  | |  |  /  _ \
     /    |    \  |_> >  <_> )  |_|  |_(  <_> )
     \____|__  /   __/ \____/|____/____/\____/
             \/|__|  Apache Apollo (1.7.1)
    
    
    Loading configuration file '/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml'.
    INFO  | OS     : Linux 3.2.0-23-generic-pae (Ubuntu 12.04 LTS)
    INFO  | JVM    : Java HotSpot(TM) Server VM 1.8.0_144 (Oracle Corporation)
    INFO  | Apollo : 1.7.1 (at: /home/tarena/project/MQTT/apache-apollo-1.7.1)
    INFO  | OS is restricting the open file limit to: 100000
    INFO  | Accepting connections at: tcp://0.0.0.0:61613
    INFO  | Accepting connections at: tls://0.0.0.0:61614
    INFO  | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data
    INFO  | Accepting connections at: ws://0.0.0.0:61623/
    INFO  | Accepting connections at: wss://0.0.0.0:61624/
    INFO  | Administration interface available at: https://127.0.0.1:61681/
    INFO  | Administration interface available at: http://127.0.0.1:61680/

    之后查看打印信息即可知道MQTT要连接的端口和管理页面端口。

     

    然后打开Ubuntu浏览器,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/

    即可进入 Apollo Console 窗口。

     

    默认的登录id和密码是 admin password

    二、Windows 下 MQTT 服务器搭建之Apollo

    (1)下载 Apollo

    下载:Download it today!

    (2)安装

    解压得到如下文件。

    这里需要注意了,解压 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格,后面会提到出现什么错误。

    进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹

    按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。

     

    然后在 cmd 窗口执行 apollo.cmd。然后就可以看到发生错误。上面Ubuntu下安装时已经提到,还需要安装 JDK。

    (3)安装 JDK

    下载:Java SE Development Kit 8 Downloads

    Windows 系统是多少位的,这个应该很清楚吧。查看 我的电脑->属性,查看有关计算机的基本信息。

    我的电脑为 win 10 64位,下载并安装 jdk-8u144-windows-x64.exe

    然后配置 JDK 环境变量

    我的电脑->属性->高级系统设置->高级->环境变量

     

    这部分我们之前将 FFmpeg 的Windows安装说明时有提到过的。可看到有用户变量和系统变量。

    修改“用户变量”为当前用户使用,其他 Windows 用户不能够使用。如果要使每个用户都能够使用,你需要修改 "系统变量" 。

    注意,不要够删除在变量中原来已有的内容。如果之前已存在变量,则在其之后用分号“;”分隔,然后添加。

     

    我们只让当前用户可用,修改用户变量即可。

    在用户环境变量中新建变量 JAVA_HOME,设置变量值 F:\Program Files\Java\jdk1.8.0_144

    新建PATH,设置变量值%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

    新建CLASSPATH,设置变量值.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar注意前面的.表示当前目录。然后点击“确定”按钮。

    到此,配置完成。打开 cmd 测试一下配置是否成功。

    输入java -version,显示版本java version "1.8.0_144",输入javac -version,也显示javac 1.8.0_144,说明JDK安装及环境变量配置成功。

     

    然后接着上面来讲。进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹

    按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。

    再次在 cmd 窗口执行 apollo.cmd,可以看到如下的信息,这就和 Ubuntu 下安装对上了。

    (4)创建服务器实例

    参看:Getting Started Guide

    在 CMD 命令窗口输入 apollo create mybroker ,当然 mybroker 这个名字可以随便起。

     

    然后查看 mybroker 可以发现里面包含有很多信息,其中etc\apollo.xml文件下是配置服务器信息的文件,etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,可以修改原始的admin=password,可以接着换行添加新的用户名密码。

    bin:保存与该实例关联的执行脚本。
    etc:保存实例配置文件
    data:保存用于存储持久消息的数据文件
    日志:保存旋转日志文件
    tmp:保存在代理运行之间安全删除的临时文件

     

    打开cmd,运行 apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker.cmd run 开启服务器,如下图所示:

     

    这里需要注意了,所在 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格。因为我上面的是存放在 360安全浏览下载 这个目录下了。导致出现系统找不到指定的路径。

     

    然后打开浏览器上,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/

    即可进入 Apollo Console 窗口。

    默认的登录id和密码是 admin 和 password 

    三、MQTT 客户端测试

    Apollo 服务器安装已经讲完,接下来简单测试一下发布订阅。

    这里面网上有 MQTT协议之Apache Apollo 安装使用 这种文章用的是 java,在Android上测试的。

    这就不太适合我了,不懂 Android 蓝瘦香菇啊!

     

    再有一种是用 谷歌浏览器上的 扩展程序 mqttlens

    首先添加该插件

     

    点击 获取更多扩展程序

     

    搜索 mqttlens ,最后添加至 CHROME

     

    安装完成!!

    下面进行测试

    先运行 Apollo 服务器

     

    然后启动 mqttlens 

     

    然后点击 Connections+

     

    出现下图,并填写好相关的信息

    然后就进入了,订阅发布界面

    OK,到此结束

    四、Ubuntu 下 MQTT 服务器搭建之Mosquitto

    Mosquitto 是一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式。现在我们开始搭建服务器。

    参看:CentOS 安装Mosquitto及测试

    参看:MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

    (1)下载相关文件

    下载:index : libwebsockets

    下载:mosquitto-1.4.14.tar.gz (319kB) (GPG signature)

    (2)安装编译

    《1》安装 libwebsockets-2.0.2.tar.gz

    解压:

    tar -zxvf libwebsockets-2.0.2

    进入该目录:

    cd libwebsockets-2.0.2/

    新建目录 build

    mkdir build

    进入 build

    cd build

    跨平台编译

    cmake .. -DLIB_SUFFIX=64

    编译:

    make && make install

     

    这里需要注意,cmake .. 提示 程序“cmake”尚未安装

    安装 sudo apt-get install cmake

     

    《2》安装

    解压:mosquitto-1.4.14

    tar -zxvf mosquitto-1.4.14.tar.gz

    进入该目录:

    cd mosquitto-1.4.14/

    更改config.mk 让其支持 websockets
    WITH_WEBSOCKETS:=no

    WITH_WEBSOCKETS:=yes

    编译:

    make && make install

     

    这里会出现两处错误:

    致命错误: ares.h:没有那个文件或目录

        解决方法:sudo apt-get install libc-ares-dev libc-ares2

    致命错误:uuid/uuid.h: 没有这个文件或目录 

        解决方法:sudo apt-get install uuid-dev

     

    至此程序已经安装完毕!
    程序文件将默认安装到以下位置
    路径 程序文件
    /usr/local/sbin mosquiotto server
    /etc/mosquitto configuration
    /usr/local/bin utility command
    
     

     

     

     

     

     

    修正链接库路径
    由于操作系统版本及架构原因,很容易出现安装之后的链接库无法被找到,如启动mosquitto客户端可能出现找不到
    libmosquitto.so.1文件,因此需要添加链接库路径

    修正链接库
    vim /etc/ld.so.conf.d/liblocal.conf
    /usr/local/lib64
    /usr/local/lib

    再执行 ldconfig 

     

    cp mosquitto.conf /etc/mosquitto
    修改mosquitto.conf文件
    在 /etc/mosquitto/mosquitto.conf 的 Default Listener 一节添加如下几行:

    # =================================================================
    # Default listener
    # =================================================================
    
    # IP address/hostname to bind the default listener to. If not
    # given, the default listener will not be bound to a specific 
    # address and so will be accessible to all network interfaces.
    # bind_address ip-address/host name
    #bind_address
    
    # Port to use for the default listener.
    pid_file /var/run/mosquitto.pid
    user tarena
    port 1883
    max_connections -1
    allow_anonymous true
    listener 8080
    protocol websockets

    这里有出现两个问题:

    Error: Invalid user 'mosquitto'.

    解决方法:修改配置文件 mosquitto.conf ,增加登录的用户,例如当前登录用户为root

    因此在上面添加  user root

    但是运行 mosquitto 时会出现警告

    1502156001: Warning: Mosquitto should not be run as root/administrator.

    所以改为普通用户 user tarena  (改成你自己的)

    下面测试时打开 mosquitto 会出现错误
    # mosquitto -c /etc/mosquitto/mosquitto.conf
    1502415109: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
    1502415109: Config loaded from /etc/mosquitto/mosquitto.conf.
    1502415109: Opening websockets listen socket on port 8080.
    1502415109: Error: Unable to create websockets listener on port 8080.
    解决方法:

    重装了好几遍,网上查了好久。最后发现,是修改上面的mosquitto.conf文件时有空格,将空格删掉就好了。

    居然还有这种操作,醉醉哒...  

    (3)测试

    《1》打开mosquitto

     打开一个终端输入

    mosquitto -c /etc/mosquitto/mosquitto.conf

    # mosquitto -c /etc/mosquitto/mosquitto.conf
    1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
    1502159482: Config loaded from /etc/mosquitto/mosquitto.conf.
    1502159482: Opening websockets listen socket on port 8080.
    1502159482: Opening ipv4 listen socket on port 1883.
    1502159482: Opening ipv6 listen socket on port 1883.

    mosquitto 选项介绍:

    参看:mosquitto Options

    -c,--config文件
        从文件加载配置。 如果没有给出,则使用mosquitto.conf(5)中描述的默认值。
    -d,--daemon
        在后台运行蚊子作为守护进程。 所有其他行为保持不变。
    -p,--port
        在指定的端口上监听,而不是默认的1883.除了配置文件中的端口设置外,还会起作用。 可以指定多次以打开在不同端口上侦听的多个套接字。 该套接字将绑定到所有网络接口。
    -v,--verbose
        使用详细日志记录。 这相当于在配置文件中将log_type设置为全部。 这种覆盖和记录选项在配置文件中给出。

    《2》订阅主题

    打开另一个终端输入:

    mosquitto_sub -t test 

    此时第一个终端多了一行信息
    # mosquitto -c /etc/mosquitto/mosquitto.conf
    1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
    1502159482: Config loaded from /etc/mosquitto/mosquitto.conf.
    1502159482: Opening websockets listen socket on port 8080.
    1502159482: Opening ipv4 listen socket on port 1883.
    1502159482: Opening ipv6 listen socket on port 1883.
    1502159601: New connection from 127.0.0.1 on port 1883.
    1502159601: New client connected from 127.0.0.1 as mosqsub|2431-ubuntu (c1, k60)

    mosquitto_sub 选项介绍

    参看:mosquitto_sub Options

    下面的选项可以在命令行中给出,但也可以放置在位于$ XDG_CONFIG_HOME / mosquitto_sub或$ HOME / .config / mosquitto_sub的配置文件中,每行一对 - 吸附值。配置文件中的值将被用作默认值,并且可以通过使用命令行来覆盖。这个例外是-t和-T,如果在配置文件中给出,将不会被覆盖。还要注意,目前一些选项不能被否定,例如-S。具有#作为第一个字符的配置文件行将被视为注释,不会进一步处理。
    -a
    将输出连接绑定到本地IP地址/主机名。如果需要将网络通信限制在特定接口上,请使用此参数。
    -c,--disable-clean-session
    禁用“'clean session”标志。这意味着客户端的所有订阅将在断开连接后维护,以及到达的后续QoS 1和QoS 2消息。当客户端重新连接时,它将接收所有排队的消息。如果使用此选项,建议使用 -id 手动设置客户机ID
    --cafile
    定义包含受信任的PEM编码的CA证书的文件的路径。用于启用SSL通信。另请参见--capath
    --capath
    定义包含受信任的PEM编码的CA证书的目录的路径。用于启用SSL通信。
    为了--capath正常工作,证书文件必须具有“.crt”作为文件结束,您必须在每次添加/删除证书时运行“c_rehash <path to capath>”。另请参见--cafile
    --cert
    如果服务器需要,定义包含此客户端的PEM编码证书的文件的路径。另请参阅--key。
    --ciphers
    在客户端支持的TLS密码的openssl兼容列表。有关详细信息,请参阅密码(1)。
    -C
    在接收到给定的消息数后立即断开并退出程序。例如,在需要单个状态值的shell脚本中这可能很有用。
    结合-R来仅打印第一组新消息(即,没有设置保留标志),或者使用 -T 来过滤哪些主题被处理。
    -d,--debug
    启用调试消息。
    - help
    显示使用信息。
    -h,--host
    指定要连接的主机。默认为localhost。
    -i,--id
    该客户端使用的id。如果没有给出,默认为mosquitto_sub_附加客户端的进程ID。不能与-id-prefix参数同时使用。
    -I,-id-prefix
    通过追加客户端的进程标识来提供客户端ID的前缀。这在代理使用clientid_prefixes选项时很有用。不能与-id参数同时使用。
    --insecure
    使用基于证书的加密时,此选项将禁用对服务器证书中服务器主机名的验证。这在测试初始服务器配置时可能很有用,但是通过DNS欺骗可以让恶意第三方冒充您的服务器。仅在测试中使用此选项。如果您需要在生产环境中使用此选项,则您的设置会出现故障,并且无需使用加密。
    -k,--keepalive
    发送PING命令到经纪人以通知它之前的秒数仍然是连接和运行的。默认为60秒。
    - key
    如果服务器需要,定义包含此客户端的PEM编码私钥的文件的路径。另请参见--cert。
    -N
    打印时,不要在有效负载上附加行尾符号。这允许将来自多个消息的有效载荷数据直接传输到另一个应用程序。只有在不使用-v的时候才真正有意义。
    -p,--port
    连接到指定的端口而不是默认端口1883。
    -P, - pw
    提供用于与经纪人进行认证的密码。在不指定用户名的情况下使用此参数是无效的。这需要一个支持MQTT v3.1的代理。另请参阅--username选项。
    - proxy
    指定要连接的SOCKS5代理。支持“无”和“用户名”身份验证类型。 socks-url必须是形式socks5h:// [username [:password] @] host [:port]。协议前缀socks5h表示主机名由代理解析。符号%25,%3A和%40分别被URL解码为%,...和@,如果存在于用户名或密码中。
    如果没有给出用户名,则不会尝试认证。如果没有给出端口,则使用默认值为1080。
    根据需求,将来可能会有更多SOCKS版本,并且将使用不同的协议前缀,如卷曲(1)所述。
    --psk
    提供与代理使用的十六进制(无前导0x)预共享密钥,以使用TLS-PSK加密支持。还必须提供--psk身份以启用TLS-PSK。
    --psk身份
    使用TLS-PSK支持的客户端身份。这可以用来代替用户名

    《3》发布内容

    再打开一个终端输入:

    mosquitto_pub -t test -m "hello world" 

    此时第二个终端多了一行信息
    # mosquitto_sub -v -t test
    hello world

    mosquitto_pub 选项介绍

    参看:mosquitto_pub Options

    下面的选项可以在命令行中给出,但是也可以放置在位于$ XDG_CONFIG_HOME / mosquitto_pub或$ HOME / .config / mosquitto_sub的配置文件中,每行一对 - 吸附值。配置文件中的值将被用作默认值,并且可以通过使用命令行来覆盖。这个例外是消息类型选项,其中只能指定一个。还要注意,目前一些选项不能被否定,例如-S。具有#作为第一个字符的配置文件行将被视为注释,不会进一步处理。
    -a
    将输出连接绑定到本地IP地址/主机名。如果需要将网络通信限制在特定接口上,请使用此参数。
    --cafile
    定义包含受信任的PEM编码的CA证书的文件的路径。用于启用SSL通信。另请参见--capath
    --capath
    定义包含受信任的PEM编码的CA证书的目录的路径。用于启用SSL通信。
    为了--capath正常工作,证书文件必须具有“.crt”作为文件结束,您必须在每次添加/删除证书时运行“c_rehash <path to capath>”。另请参见--cafile
    --cert
    如果服务器需要,定义包含此客户端的PEM编码证书的文件的路径。另请参阅--key。
    --ciphers
    在客户端支持的TLS密码的openssl兼容列表。有关详细信息,请参阅密码(1)。
    -d,--debug
    启用调试消息。
    -f,--file
    发送文件的内容作为消息。
    - help
    显示使用信息。
    -h,--host
    指定要连接的主机。默认为localhost。
    -i,--id
    该客户端使用的id。如果没有给出,默认为mosquitto_pub_附加客户端的进程ID。不能与-id-prefix参数同时使用。
    -I,-id-prefix
    通过追加客户端的进程标识来提供客户端ID的前缀。这在代理使用clientid_prefixes选项时很有用。不能与-id参数同时使用。
    --insecure
    使用基于证书的加密时,此选项将禁用对服务器证书中服务器主机名的验证。这在测试初始服务器配置时可能很有用,但是通过DNS欺骗可以让恶意第三方冒充您的服务器。仅在测试中使用此选项。如果您需要在生产环境中使用此选项,则您的设置会出现故障,并且无需使用加密。
    -k,--keepalive
    发送PING命令到经纪人以通知它之前的秒数仍然是连接和运行的。默认为60秒。
    -key
    如果服务器需要,定义包含此客户端的PEM编码私钥的文件的路径。另请参见--cert。
    -l,--stdin-line
    发送从stdin读取的消息,将单独的行分成单独的消息。请注意,空行不会被发送。
    -m, - 消息
    从命令行发送一条消息。
    -n, - 消息
    发送null(零长度)消息。
    -p,--port
    连接到指定的端口而不是默认端口1883。
    -P, - pw
    提供用于与经纪人进行认证的密码。在不指定用户名的情况下使用此参数是无效的。这需要一个支持MQTT v3.1的代理。另请参阅--username选项。
    -proxy
    指定要连接的SOCKS5代理。支持“无”和“用户名”身份验证类型。 socks-url必须是形式socks5h:// [username [:password] @] host [:port]。协议前缀socks5h表示主机名由代理解析。符号%25,%3A和%40分别被URL解码为%,...和@,如果存在于用户名或密码中。
    如果没有给出用户名,则不会尝试认证。如果没有给出端口,则使用默认值为1080。
    根据需求,将来可能会有更多SOCKS版本,并且将使用不同的协议前缀,如卷曲(1)所述。
    --psk
    提供与代理使用的十六进制(无前导0x)预共享密钥,以使用TLS-PSK加密支持。还必须提供--psk身份以启用TLS-PSK。
    --psk身份
    使用TLS-PSK支持的客户端身份。如果代理配置为这样做,则可以使用这可以替代用户名。
    -q,--qos
    指定消息的使用质量,从0,1和2.默认为0。
    - quiet
    如果给出此参数,则不会打印运行时错误。这排除了在无效用户输入的情况下给出的任何错误消息(例如使用 - 没有端口的端口)。
    -r, - 保存
    如果保留被赋予,则该消息将被保留为经纪人的“最后已知的良好”值。有关更多信息,请参阅mqtt(7)。
    -s,--stdin-file
    发送从stdin读取的消息,将整个内容作为单个消息发送。
    -S
    使用SRV查找来确定要连接的主机。当我们执行查询_mqtt._tcp

     

    不过如果直接将第一个终端关闭再打开 mosquitto 会出现一个问题

    Error: Address already in use

    解决方法:重启...   别的方法暂时不知道呢

    (4)取消匿名登录

    参看:MQTT服务器搭建--Mosquitto用户名密码配置

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/76680646

     

    展开全文
  • mqtt协议

    千次阅读 2018-12-20 16:02:54
    物联网下,物理设备内存CPU有限、4G网络不可靠、网络带宽小等,公司设备准备用MQTT协议实现P/S模式的消息传递,目前有emqttd、mosquitto、activemq等支持mqtt协议。对于点对点的消息传递直接使用一般的通信方式不...
  • MQTT

    万次阅读 多人点赞 2018-09-16 05:24:46
    MQTT-Learning-Note 简介:MQTT由IBM公司开发,是一个即时通讯协议,也是一个物联网传输协议,主要用于轻量级的订阅/发布式的消息传输。其设计目的主要是为低带宽和不稳定网络环境下的物联网设备提供服务。 MQTT...
  • MQTT与HTTP:哪一个最适合物联网?

    千次阅读 2019-04-16 10:07:34
    但在过去几年中,MQTT迅速获得了牵引力。当我们谈论物联网开发时,开发人员必须在它们之间做出选择。 设计和消息传递 MQTT以数据为中心,而HTTP是以文档为中心的。HTTP是用于客户端 – 服务器计算的请求 – 响应协议...
  • mqtt服务器—web服务器——web页面

    千次阅读 2019-04-01 17:01:30
    核心:mqtt服务器------>mqtt客户端--------->数据库----------->web服务器------------>web页面 详情:mqtt服务器发布主题之后,客户端订阅主题,通过回调类拿到数据保存到数据库,接着web服务器读取...
  • Qt开发技术:mqtt介绍、QtMqtt编译和开发环境搭建

    万次阅读 热门讨论 2020-06-04 20:29:50
    原博主博客地址:https://blog.csdn.net/qq21497936 ... 目录 MQTT协议简介 设计原则 特点 发布/订阅者模式 MQTT服务器 MQTT协议中的方法 Qt搭建MQTT编程环境 介绍 下载mqtt 编译mqtt(注意:使...
  • 一篇搞定MQTT

    2019-12-27 15:25:05
    MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及...
  • MQTT--入门

    万次阅读 多人点赞 2019-07-26 17:53:12
    一、简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点...
  • MQTT 简单介绍与实现

    万次阅读 2018-08-02 20:04:59
    1. MQTT 介绍 它是一种 机器之间通讯 machine-to-machine (M2M)、物联网 Internet of Things (IoT)常用的一种轻量级消息传输协议 适用于网络带宽较低的场合 包含发布、订阅模式,通过一个代理服务器(broker),...
  • MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

    万次阅读 多人点赞 2016-10-01 20:51:53
    MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式...
  • 本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制。本文中使用了两个工具——Mosquitto paho-python,其中...
  • MQTT协议-MQTT协议简介及协议原理

    万次阅读 多人点赞 2016-02-04 15:34:36
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以...
  • MQTT】在Windows下搭建MQTT服务器

    万次阅读 多人点赞 2019-10-27 23:05:31
    最近在项目中要使用MQTT协议,需要搭建一个MQTT服务器来进行调试,在网络上找了一天,找到的大多数都是MQTT客户端,最后发现这篇博客写的教程可以使用,特此记录。
  • MQTTClient的使用介绍

    万次阅读 2017-08-08 15:04:33
    开篇最近在使用MQTTClient实现一个类似于消息推送的服务,说实话,真没怎么使用过MQTTClient,也不知道这是个啥? 上网了解了一下,发现MQTT功能挺强(牛)大(逼),既能做即时通讯,又能搞消息推送等功能。这里我...
  • java 实现mqtt发送和接收消息 客户端代码

    万次阅读 热门讨论 2019-11-29 09:00:32
    mqtt的特点就是可以用很少的网络和硬件资源来保证高并发量的数据传输,其传输的稳定性也可以手动设置Qos(消息质量)。 mqtt服务器多种多样,常见的有ActiveMqtt EMQ 等,不过无论是什么服务器,其底层机制都是一样...
  • Android开发之MQTT的使用

    万次阅读 多人点赞 2018-06-16 17:46:16
    首先MQTT是啥子东西?新的项目要用到这个,不过我之前从来没有听说过啊。 没办法,许多事情是不能等你准备就绪才可以去做的,生活就是这样。 好了,接下来通过上网查阅资料,关于MQTT的初步认识已经形成了,...
  • MQTT基础(报文结构)

    万次阅读 2018-08-17 13:32:21
    官网中文地址:https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/02-ControlPacketFormat.html 报文结构:固定报头+可变报头+有效载荷 1.固定报头 1.1 固定报头总览: 1.2.MQTT控制报文类型 1.3.指定...
1 2 3 4 5 ... 20
收藏数 26,752
精华内容 10,700
关键字:

mqtt