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

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

    MQTT

    简介:MQTT由IBM公司开发,是一个即时通讯协议,也是一个物联网传输协议,主要用于轻量级的订阅/发布式的消息传输。其设计目的主要是为低带宽和不稳定网络环境下的物联网设备提供服务。

    MQTT中的概念

    • 订阅(Subscribtion):
      订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
    • 会话(Session):
      每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
    • 主题名(Topic Name):
      连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
      需要注意的是,MQTT中消息主题按照层级命名,使用 ‘/’ 进行分割
      此外,主题中可以使用通配符进行多个主题或多层级的订阅,有两种常见的通配符:
      1. 单层通配符 +:单层通配符只能匹配一层的主题,例如:China/Beijing/+,可以匹配的只有Beijing这个主题下面一层的主题,例如Xicheng, DongCheng, Xuanwu等等。
      2. 多层通配符 #:顾名思义,多层通配符就是可以匹配多个层级的主题,例如:China/#,可以匹配到的主题可能有:China/Beijing/Dongcheng, China/Shanghai/PuDong,等等。
    • 主题筛选器(Topic Filter):
      一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
    • 负载(Payload):
      消息订阅者所具体接收的内容。

    MQTT中的角色

    MQTT

    • Publisher和Subscriber为客户端,Broker为服务器端,消息主题为消息类型,Broker根据Topic过滤消息,并将消息向客户端推送。
    • MQTT中用QoS表示服务质量,MQTT协议中有三种服务质量(QoS):
      1. QoS =0,至多一次,可能会出现丢包的情况,使用在对实时性要求不高的情况,例如,将此服务质量与通信环境传感器数据一起使用。 对于是否丢失个别读取或是否稍后立即发布新的读取并不重要。
      2. QoS =1,至少一次,保证包会到达目的地,但是可能出现重包。
      3. QoS =2, 刚好一次,保证包会到达目的地,且不会出现重包的现象。

    客户端

    • Publisher和Subscriber都属于客户端。
    • 发布应用消息给其它相关的客户端。
    • 订阅以请求接受相关的应用消息。
    • 取消订阅以移除接受应用消息的请求。
    • 从服务端断开连接。

    服务器端

    • 服务器端即所谓的MQTT Broker服务器。
    • 接受来自客户端的网络连接。
    • 接受客户端发布的应用消息。
    • 处理客户端的订阅和取消订阅请求。
    • 转发应用消息给符合条件的已订阅客户端。
    • MQTT提供的公共服务器端(Broker)有:
      • test.mosquitto.org
      • broker.hivemq.com
      • iot.eclipse.org

    配置私有的MQTT服务器

    通常情况,出于安全考虑,一般使用私有的MQTT服务器端,MQTT的本地服务由Mosquitto支持。设置MQTT私有服务器端的方法如下(环境为Ubuntu16.04):

    # Install Mosquitto and Mosquitto-clients(optional)
    sudo apt-get install mosquitto
    
    # 默认情况下,ubuntu会自动启动Mosquitto服务,所以无需显式启动服务,此时可以查看mosquitto状态:
    sudo systemctl satus mosquitto

    mqtt test

    如果你只是想运行一个本地的MQTT服务,现在已经OK了。在mosquitto服务启动之后,你可以使用服务器的域名或者IP地址访问,MQTT服务器默认端口为1883。问题很明显,虽然我们设置了本地的私有MQTT服务器端,但是任何人都可以通过IP访问这台服务器,所以我们需要为mosquitto设置用户名和密码,只有拥有用户名和密码的客户端才可连接到服务器。

    Mosquitto客户端提供了为mosquitto设置密码的命令 mosquitto_passwd,这个命令其实就是将我们设置的用户名和密码copy进/etc/mosquitto/passwd这个文件:

    sudo mosquitto_passwd -c /etc/mosquitto/passwd <username>
    # 执行上面命令的时候会提示输入两次密码

    在生成了密码文件之后,我们需要告诉mosquitto服务,以后如果有客户端想创建连接请验证用户名和密码,具体操作如下:

    sudo bash -c 'sudo echo -e "allow_anonymous false\npassword_file /etc/mosquitto/passwd" > /etc/mosquitto/conf.d/default.conf'

    上面的命令创建default.conf并输入引号里面的命令,可以看到我们禁止了anonymous连接,并且指定了密码所在的文件。

    然后,重启mosquitto服务,让设置生效

    sudo systemctl restart mosquitto

    重新测试一下
    MQTT with username and password

    从上面的测试结果看出,现在我们的mosquitto服务器已经有了username和password的feature了。

    MQTT Python API(paho-mqtt)

    pip install paho-mqtt

    注: paho-mqtt这个库提供的函数主要是客户端的函数
    另外,在paho-mqtt库中,有一种重要的函数–回调函数。简单说一下回调函数,通常情况下,我们写应用程序代码时经常引入一些API,我们主动调用这些API里的函数,称为直调。反过来,如果让API调用我们定义好的函数,这就称为回调。在phao-client这个库中,on_connect, on_message, on_subscribe, on_publish等等这些均为回调函数, 这些回调函数由中间函数调用。简单看一下paho-client中的callback 是如何实现的(以subscribe为例):

    # 假设我们自定义的on_subscribe回调函数如下
    # 先不要管为什么要在函数中指定这些参数,后面会用到
    def on_subscribe(client, userdata, mid, granted_qos):
        print('Subscribed message: ', str(mid))
    
    # 然后我们使用如下语句设置回调
    client.on_subscribe = on_subscribe
    
    # 下面解释上面这行代码,查看paho-mqtt源码
    @property
    def on_subscribe(self):
        """If implemented, called when the broker responds to a subscribe
        request."""
        return self._on_subscribe
    
    @on_subscribe.setter
    def on_subscribe(self, func):
        """ Define the suscribe callback implementation.
    
        Expected signature is:
            subscribe_callback(client, userdata, mid, granted_qos)
    
        client:         the client instance for this callback
        userdata:       the private user data as set in Client() or userdata_set()
        mid:            matches the mid variable returned from the corresponding
                        subscribe() call.
        granted_qos:    list of integers that give the QoS level the broker has
                        granted for each of the different subscription requests.
        """
        with self._callback_mutex:
            self._on_subscribe = func

    从上面的代码可以看出, subscribe为Client类的一个property,我们使用的是subscribe属性的setter方法,设置类成员变量_on_subscribe的值。
    接下来,我们发出subscribe请求,下面paho-client处理subscribe请求的函数,函数的前半部分基本是对客户端传入参数topic的检查,忽略。从最后三行代码可以看出,客户端发送了topic_qos_list这条消息给了MQTT服务器端。

        def subscribe(self, topic, qos=0):
            topic_qos_list = None
    
            if isinstance(topic, tuple):
                topic, qos = topic
    
            if isinstance(topic, basestring):
                ...
            elif isinstance(topic, list):
                ...
    
            if topic_qos_list is None:
                raise ValueError("No topic specified, or incorrect topic type.")
    
            if any(self._filter_wildcard_len_check(topic) != MQTT_ERR_SUCCESS for topic, _ in topic_qos_list):
                raise ValueError('Invalid subscription filter.')
    
            if self._sock is None:
                return (MQTT_ERR_NO_CONN, None)
    
            return self._send_subscribe(False, topic_qos_list)

    在paho-mqtt中有一个函数_handle_suback来处理服务器返回给客户端subscribe请求的响应消息。具体消息接收的过程有好几个步骤,大体经过的函数有:loop –> loop_read –> _packet_read –> _packet_handle –> _handle_suback

    def _handle_suback(self):
         self._easy_log(MQTT_LOG_DEBUG, "Received SUBACK")
         pack_format = "!H" + str(len(self._in_packet['packet']) - 2) + 's'
         (mid, packet) = struct.unpack(pack_format, self._in_packet['packet'])
         pack_format = "!" + "B" * len(packet)
         granted_qos = struct.unpack(pack_format, packet)
    
         with self._callback_mutex:
             if self.on_subscribe:
                 with self._in_callback:  # Don't call loop_write after _send_publish()
                     self.on_subscribe(self, self._userdata, mid, granted_qos)
    
         return MQTT_ERR_SUCCESS

    好了,终于看到了在哪里调用了回调函数,现在明白了为什么要在创建on_subscribe的时候指定那些参数了吧。因为这些参数可能对回调函数本身没什么用,BUT,中间函数(也就是这里的_handle_suback)认为它们有用,并且在调用回调函数的时候传入了这些参数,所以我们定义的时候需要有这些参数。

    下面简单介绍paho-client的一些基本操作,只是简单列举一些函数,具体更多的可以查看官方Documentation

    # import mqtt客户端
    import paho.mqtt.client as mqtt
    
    # 创建客户端, client_id为必须参数,其余为可选参数
    client = mqtt.Client(client_id=””, clean_session=True, userdata=None, protocol=MQTTv311, transport=”tcp”)
    
    
    '''
    # 当客户端与服务器端连接成功后,服务器端会给客户端返回一个Ack消息,这个Ack会调用回调方法on_connect()来显示连接状态,用户可以自定义回调方法的内容
    params:
        rc: return code,表示服务器端返回的连接状态, 可能的值有:
            0: 连接成功
            1: 连接拒绝 --– 协议版本错误
            2. 连接拒绝 --- 客户端身份验证错误
            3. 连接拒绝 --- 服务器不存在
            4. 连接拒绝 --- 用户名/密码错误
            5. 连接拒绝 --- 未授权错误
            6-255. 连接拒绝 --- 当前不可用
    '''
    def on_connect(client, userdata, flags, rc):
        if rc==0:
            client.connected_flag = True
            print("connected OK Returned code=",rc)
        else:
            client.connected_flag = False
            print("Bad connection Returned code=",rc)
    
    # 设定自定义的on_connect回调函数
    client.on_connect = on_connect
    
    '''
    on_message()回调函数
    当订阅者收到Broker发布的消息之后,on_message()被调用
    params:
        message:
            :type MQTTMessage
            :attrs topic, payload, qos, retain
    '''
    def on_message(client, userdata, message):
        print("message received " ,str(message.payload.decode("utf-8")))
        print("message topic=",message.topic)
        print("message qos=",message.qos)
        print("message retain flag=",message.retain)
    
    client.on_message = on_message
    
    '''
    连接服务器端, host为broker的IP或者domain name
    params:
        host: 服务器端的IP地址或者Domain name
        keepalive: 客户端和服务器端交互的最长时间,当客户端和Broker之间没有交互的时候,客户端ping服务器端的频率,单位为秒
        bind_address: 在多网卡情况下,将客户端和某一局部网卡的IP地址绑定
    '''
    cient.connect(host, port=1883, keepalive=60, bind_address="")
    
    '''
    Loop Start
    loop_start()函数调用一次loop()函数
    loop()函数的作用为:读取、写入接收缓存区的或者发送缓冲区中的数据,并调用对应的回调函数。此外,loop函数还可以在连接断开的时候,重新建立与服务器端的连接.
    '''
    client.loop_start()
    
    # 此外,可以通过connect_flag来标记连接状态,主要用于等待连接成功
    while client.connected_flag is False:
        time.sleep()
    
    '''
    Publish Message
    只有topic和payload为必须参数,其余可选
    当客户端调用publish()方法时,会返回MQTTMessageInfo对象,该对象包含的属性和方法有:
        attr:
            rc(return code):
                MQTT_ERR_SUCCESS, MQTT_ERR_NO_CONN, MQTT_ERR_QUEUE_SIZE
            mid(message id)
            is_published
        function:
            wait_for_publish()
    当消息被发送给Broker之后,on_publish()回调方法会被调用
    '''
    client.publish(topic='$topic', payload='$payload', qos=0, retain=False)
    
    '''
    Subscribe Message
    此函数的参数有三种类型:
    1. Simple string and integer
        example: subscribe('my/topic', 0)
    2. String and integer tuple
        example: subscribe(('my/topic', 0))
    3. List of string and integer tuples
        exmaple: subscribe([('my/topic1', 0), ('my/topic', 2)])
    
    return: (result, mid)
        :type tuple
    
    当Broker收到订阅者的订阅请求之后,on_subscribe()回调函数会被调用
    '''
    client.subscribe(topic, qos=0)
    
    # 结束loop
    client.loop_stop()
    展开全文
  • mqtt

    2020-09-10 13:58:43
    使用mqtt协议的场景:iot 智慧屏幕、共享单车、智能家居、这些场景其实都是基于物本身带有简易的os,os联网,os安装对应程序,程序启动mqtt等服务,因此才会被服务端控制。在这里,智慧屏幕、共享单车、智能家居...

    使用mqtt协议的场景:iot

    智慧屏幕、共享单车、智能家居、这些场景其实都是基于物本身带有简易的os,os联网,os安装对应程序,程序启动mqtt等服务,因此才会被服务端控制。在这里,智慧屏幕、共享单车、智能家居统一称为mqtt客户端。

    mqtt客户端:

    知道服务器的ip/port/user/password,像任何一种客户端,例如mysql,redis,只不过在实际场景中,需要我们写代码去建立mqtt客户端,mqtt客户端会接收mqtt服务器的消息,并且去执行对应动作,执行的动作可能是调用系统的服务,从技术层面,mqtt客户端和mqtt服务端始终会维持一个连接,连接是不稳定的,因此需要客户端做自动重连机制,

    如果mqtt客户端始终在线,但是也要保证他能收到mqtt服务端的消息,那就得让他离线收到mqtt消息也是可以保证的

    mqtt服务端:主要和mqtt客户端进行通信,给客户端发消息

    https://www.runoob.com/w3cnote/mqtt-intro.html

    展开全文
  • MQTT协议-MQTT协议简介及协议原理

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

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

    1. MQTT协议特点
    2. MQTT协议原理

     

    1. MQTT协议特点

    MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

    MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备,这些设备一般工作于百TCP/IP网络,如:ZigBee。

    MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。其特点包括:

    1. 使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。
    2. 对负载内容屏蔽的消息传输机制。
    3. 对传输消息有三种服务质量(QoS):
      • 最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
      • 最少一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
      • 只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
    4. 数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量
    5. 通知机制,异常中断时通知传输双方

     

    2. MQTT协议原理

    2.1 MQTT协议实现方式

    • 实现MQTT协议需要:客户端服务器端
    • MQTT协议中有三种身份:发布者(Publish)代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
    • MQTT传输的消息分为:主题(Topic)负载(payload)两部分
      • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload
      • payload,可以理解为消息的内容,是指订阅者具体要使用的内容

     

    2.2 网络传输与应用消息

    MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。

    当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。

     

    2.3 MQTT客户端

    一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

    • 发布其他客户端可能会订阅的信息
    • 订阅其它客户端发布的消息
    • 退订或删除应用程序的消息
    • 断开与服务器连接

     

    2.4 MQTT服务器

    MQTT服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者订阅者之间,它可以:

    • 接受来自客户的网络连接
    • 接受客户发布的应用信息
    • 处理来自客户端的订阅和退订请求
    • 向订阅的客户转发应用程序消息

     

    2.5 MQTT协议中的订阅、主题、会话

    订阅(Subscription)

    订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

    会话(Session)

    每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

    主题名(Topic Name)

    连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

    主题筛选器(Topic Filter)

    一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

    负载(Payload)

    消息订阅者所具体接收的内容

     

    2.6 MQTT协议中的方法

    MQTT协议中定义了一些方法(也被称为动作), 来于表示对确定资源所进行操作。 这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。

    Connect,等待与服务器建立连接

    Disconnect,等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话

    Subscribe,等待完成订阅

    UnSubscribe,等待服务器取消客户端的一个或多个topics订阅

    Publish,MQTT客户端发送消息请求,发送完成后返回应用程序线程

    http://itbilu.com/other/relate/4kHBsx_Pg.html

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

    万次阅读 多人点赞 2017-08-04 13:56:07
    最近在搞 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】在Windows下搭建MQTT服务器

    万次阅读 多人点赞 2016-09-29 18:15:02
    最近在项目中要使用MQTT协议,需要搭建一个MQTT服务器来进行调试,在网络上找了一天,找到的大多数都是MQTT客户端,最后发现这篇博客写的教程可以使用,特此记录。
  • 目录 MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载) MQTT(二)在windows64位上安装Python环境 ...MQTT(五)EMQ开源MQTT消息服务器 1 什么是 MQTTMQTT(Message Que...
  • MQTT MQTTnet 实现

    2019-01-02 13:54:28
    MQTTnet .NET库实现的MQTT 客户端和服务端代码,源程序。可以执行。
  • MQTT--入门

    万次阅读 多人点赞 2017-10-24 00:27:13
    一、简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点...
  • MQTT调试工具,用于MQTT协议联调联试,使用方便,画面简洁清晰,需要键入地址及端口号,ID/用户名及密码后连接,能够用来进行十六进制显示和ASCII显示,可以订阅MQTT topic!
  • MQTT源码库:eclipse-paho-mqtt-c-src-1.2.0 测试工具:MQTTBox MQTT服务器:阿里云部署EMQX VC MFC程序运行图示: 一、编译MQTT生成dll lib 1、下载MQTT源码库:eclipse-paho-mqtt-c-src 下载github地址:...
  • MQTT客户端

    2019-01-31 09:20:59
    MQTT客户端工具,用于MQTT协议调试,数据对比等,该客户端为64位
  • C#使用 MQTTnet 快速实现 MQTT 通信 Demo

    热门讨论 2019-03-14 10:15:44
    此Demo对应本人博客文章《MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信》 开发环境Win7 + vs2017
  • Mqtt客户端

    2018-04-27 16:04:47
    方便用户进行推送的Mqtt客户端,非常好用。。。。。。。。
  • java连接MQTT服务器(Springboot整合MQTT)

    千次阅读 热门讨论 2020-01-13 19:38:18
    硬件采集的数据传入EMQX平台(采用MQTT协议),java通过代码连接MQTT服务器,进行采集数据接收、解析、业务处理、存储入库、数据展示。 MQTT 是基于发布(Publish)/订阅(Subscribe)模式来进行通信及数据交换的。 二、...
  • mqtt.js库,下载后可以用找我要源码和压缩文件(mqtt.min.js),有问题随时请教
  • MQTT协议 C#客户端(基于M2MQTT)

    万次阅读 热门讨论 2016-07-13 12:14:41
    1、引入M2MQTT的dll库文件 点击此处下载M2Mqtt.Net.dll 2、建立客户端连接并订阅 //创建客户端实例 MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); //主机为IP时 MqttClient ...
  • 使用ssl连接腾讯MQTT服务器,使用了cert验证,可根据自己需要编写回调函数,操作lcd或者其他的硬件,注释比较少,功能完全没问题,不适合新手阅读,适合对框架有一定了解的人使用。
  • MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

    万次阅读 多人点赞 2014-09-13 16:30:12
    MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,298
精华内容 12,919
关键字:

mqtt