精华内容
下载资源
问答
  • MQTT通信协议mosquittoLinux上的构建与测试一、MQTT简介简述通信模式二、Ubuntu搭建mosquitto方式一(apt-get命令安装)1、安装服务器端2、安装客户端3、查看运行状态4、重启服务器程序5、测试(默认配置)三、...

    一、MQTT简介

    参考链接1
    参考链接2
    参考链接3

    简述

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

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

    通信模式

    服务器端: MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等,我们主要研究Mosquitto。图一的Broker和图二的“代理”都属于服务器端,负责处理客户端的网络连接和订阅等请求。
    客户端: Publisher和Subscriber都属于客户端,连接服务器端进行发布/订阅消息。
      从上面图片可以看到,topic可以理解成主题/消息类型,payload可以理解为消息内容。那么从图二就可以很容易理解它的通信模式。订阅者先是订阅了topic主题的消息,而当发布端发布了topic主题的消息payload就会经过代理(服务器端)的“筛选”转发给匹配的topic的订阅者。
    在这里插入图片描述
    在这里插入图片描述

    二、Ubuntu搭建mosquitto方式一(apt-get命令安装)

    参考链接1
    参考链接2
    可以主机安装也可以虚拟机,本人使用的是VMware虚拟机的方式,Ubuntu版本为18.04

    1、安装服务器端

    sudo apt-get install mosquitto
    

    完成安装后,服务器就搭建好了,系统会自动运行mosquitto,默认端口为1883。

    2、安装客户端

    前面服务器端搭建好了,但是客户端还没有安装。这一步是可选的,如果需要在终端上测试MQTT订阅/发布的通信就需要执行这一步,这里我们也安装上去才有后续的这些测试。

    sudo apt install mosquitto-clients
    

    3、查看运行状态

    sudo systemctl status mosquitto
    

    4、重启服务器程序

    查看运行进程号:ps -aux | grep mosquitto
    执行命令杀死进程:kill -9 进程号
    启动:mosquitto -v
    -v 详细模式——启用所有日志记录类型。
    关于启动参数:可以通过 --help 查看

    lk@LK-PC:~/CODES/pubsubDemo$ mosquitto --help
    mosquitto version 1.6.10
    
    mosquitto is an MQTT v3.1.1 broker.
    
    Usage: mosquitto [-c config_file] [-d] [-h] [-p port]
    
     -c : specify the broker config file.
     -d : put the broker into the background after starting.
     -h : display this help.
     -p : start the broker listening on the specified port.
          Not recommended in conjunction with the -c option.
     -v : verbose mode - enable all logging types. This overrides
          any logging options given in the config file.
    See http://mosquitto.org/ for more information.
    

    5、测试(默认配置)

    首先打开三个终端,
    1、启动代理服务:mosquitto -v
          -v 详细模式 打印调试信息
    2、订阅主题:mosquitto_sub -v -t hello
          -t 指定订阅的主题,主题为:hello
          -v 详细模式 打印调试信息
    3、发布内容:mosquitto_pub -t hello -m world
          -t 指定订阅的主题,主题为:hello
          -m 指定发布的消息的内容
    具体运行效果如下图:
    在这里插入图片描述
    当发布者推送消息之后,订阅者获得其订阅的主题的内容,而代理服务器控制台中会出现——连接、消息发布和心跳等调试信息。通过代理服务器的调试输出可以对MQTT协议的相关过程有所了解。

    三、Ubuntu搭建mosquitto方式二(下载源码编译)

    1、安装mosquitto所需要依赖

    sudo apt-get install libssl-dev
    sudo apt-get install uuid-dev
    sudo apt-get install cmake
    

    2、下载源码包

    wget http://mosquitto.org/files/source/mosquitto-1.6.10.tar.gz
    

    或者直接点击链接下载:下载链接
    在这里插入图片描述

    3、解压源码

    tar -zxvf mosquitto-1.6.10.tar.gz
    

    进入源码目录:

    cd mosquitto-1.6.10/
    

    4、编译与安装源码

    make
    sudo make install
    

    可能遇到的问题:

    【1】编译找不到openssl/ssl.h
    【解决方法】——安装openssl

    sudo apt-get install libssl-dev
    

    【2】编译过程g++命令未找到:

    sudo apt-get install g++
    

    【3】编译过程找不到ares.h

    sudo apt-get install libc-ares-dev
    

    【4】编译过程找不到uuid/uuid.h

    sudo apt-get install uuid-dev
    

    【5】使用过程中找不到libmosquitto.so.1
    error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
    【解决方法】——修改libmosquitto.so位置
    创建链接

    sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
    

    更新动态链接库

    sudo ldconfig
    

    5、测试

    首先打开三个终端,
    1、启动代理服务:mosquitto -v
          -v 详细模式 打印调试信息
    2、订阅主题:mosquitto_sub -v -t hello
          -t 指定订阅的主题,主题为:hello
          -v 详细模式 打印调试信息
    3、发布内容:mosquitto_pub -t hello -m world
          -t 指定订阅的主题,主题为:hello
          -m 指定发布的消息的内容

    上面使用的都是默认配置,如需修改服务器的配置信息需要修改:
    mosquitto源码目录下的配置文件mosquitto.conf 或者/etc/mosquitto/mosquitto.conf文件
    在启动服务器时使用命令:mosquitto -c mosquitto.conf -d(在mosquitto安装目录下)

    通过源码下载编译安装,会生成一些供我们使用的测试程序和动态库,用来我们自己进行开发使用。

    附录

    如何利用MQTT一次订阅多个主题
    mosquitto.con配置文件详解:

    # =================================================================
     
    # General configuration
     
    # =================================================================
     
    # 客户端心跳的间隔时间
     
    #retry_interval 20
     
    # 系统状态的刷新时间
     
    #sys_interval 10
     
    # 系统资源的回收时间,0表示尽快处理
     
    #store_clean_interval 10
     
    # 服务进程的PID
     
    #pid_file /var/run/mosquitto.pid
     
    # 服务进程的系统用户
     
    #user mosquitto
     
    # 客户端心跳消息的最大并发数
     
    #max_inflight_messages 10
     
    # 客户端心跳消息缓存队列
     
    #max_queued_messages 100
     
    # 用于设置客户端长连接的过期时间,默认永不过期
     
    #persistent_client_expiration
     
    # =================================================================
     
    # Default listener
     
    # =================================================================
     
    # 服务绑定的IP地址
     
    #bind_address
     
    # 服务绑定的端口号
     
    #port 1883
     
    # 允许的最大连接数,-1表示没有限制
     
    #max_connections -1
     
    # cafile:CA证书文件
     
    # capath:CA证书目录
     
    # certfile:PEM证书文件
     
    # keyfile:PEM密钥文件
     
    #cafile
     
    #capath
     
    #certfile
     
    #keyfile
     
    # 必须提供证书以保证数据安全性
     
    #require_certificate false
     
    # 若require_certificate值为true,use_identity_as_username也必须为true
     
    #use_identity_as_username false
     
    # 启用PSK(Pre-shared-key)支持
     
    #psk_hint
     
    # SSL/TSL加密算法,可以使用“openssl ciphers”命令获取
     
    # as the output of that command.
     
    #ciphers
     
    # =================================================================
     
    # Persistence
     
    # =================================================================
     
    # 消息自动保存的间隔时间
     
    #autosave_interval 1800
     
    # 消息自动保存功能的开关
     
    #autosave_on_changes false
     
    # 持久化功能的开关
     
    persistence true
     
    # 持久化DB文件
     
    #persistence_file mosquitto.db
     
    # 持久化DB文件目录
     
    #persistence_location /var/lib/mosquitto/
     
    # =================================================================
     
    # Logging
     
    # =================================================================
     
    # 4种日志模式:stdout、stderr、syslog、topic
     
    # none 则表示不记日志,此配置可以提升些许性能
     
    log_dest none
     
    # 选择日志的级别(可设置多项)
     
    #log_type error
     
    #log_type warning
     
    #log_type notice
     
    #log_type information
     
    # 是否记录客户端连接信息
     
    #connection_messages true
     
    # 是否记录日志时间
     
    #log_timestamp true
     
    # =================================================================
     
    # Security
     
    # =================================================================
     
    # 客户端ID的前缀限制,可用于保证安全性
     
    #clientid_prefixes
     
    # 允许匿名用户
     
    #allow_anonymous true
     
    # 用户/密码文件,默认格式:username:password
     
    #password_file
     
    # PSK格式密码文件,默认格式:identity:key
     
    #psk_file
     
    # pattern write sensor/%u/data
     
    # ACL权限配置,常用语法如下:
     
    # 用户限制:user <username>
     
    # 话题限制:topic [read|write] <topic>
     
    # 正则限制:pattern write sensor/%u/data
     
    #acl_file
     
    # =================================================================
     
    # Bridges
     
    # =================================================================
     
    # 允许服务之间使用“桥接”模式(可用于分布式部署)
     
    #connection <name>
     
    #address <host>[:<port>]
     
    #topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]
     
    # 设置桥接的客户端ID
     
    #clientid
     
    # 桥接断开时,是否清除远程服务器中的消息
     
    #cleansession false
     
    # 是否发布桥接的状态信息
     
    #notifications true
     
    # 设置桥接模式下,消息将会发布到的话题地址
     
    # $SYS/broker/connection/<clientid>/state
     
    #notification_topic
     
    # 设置桥接的keepalive数值
     
    #keepalive_interval 60
     
    # 桥接模式,目前有三种:automatic、lazy、once
     
    #start_type automatic
     
    # 桥接模式automatic的超时时间
     
    #restart_timeout 30
     
    # 桥接模式lazy的超时时间
     
    #idle_timeout 60
     
    # 桥接客户端的用户名
     
    #username
     
    # 桥接客户端的密码
     
    #password
     
    # bridge_cafile:桥接客户端的CA证书文件
     
    # bridge_capath:桥接客户端的CA证书目录
     
    # bridge_certfile:桥接客户端的PEM证书文件
     
    # bridge_keyfile:桥接客户端的PEM密钥文件
     
    #bridge_cafile
     
    #bridge_capath
     
    #bridge_certfile
     
    #bridge_keyfile
    
    展开全文
  • 文章目录1、前言2、订阅端(sub.c)3、发布端(pub.c)4、编译5、执行程序查看测试结果6、程序运行情况如图7、服务器端输出信息 1、前言 前面两节讲了MQTT的简单介绍、mosquitto服务器端与客户端的两种搭建方式及其...

    1、前言

    前面两节讲了MQTT的简单介绍、mosquitto服务器端与客户端的两种搭建方式及其简单测试,但那些都是在命令行里面的操作,而我们需要写程序的时候总不能一直都是system函数来调用吧。

    上一篇文章里面使用的就是mosquitto官方源码,那么有了源码,能做的事情就比较多了,包括编写应用程序。在上一篇文章中讲了编译源码,成功之后会得到几个编写C/C++程序所需要的比较重要的文件:

    mosquitto-1.6.7/lib/libmosquitto.so.1
    mosquitto-1.6.7/lib/cpp/libmosquittopp.so.1
    mosquitto-1.6.7/lib/mosquitto.h
    mosquitto-1.6.7/lib/mosquittopp.h

    mosquitto有同步和异步两种通讯方式。这里的异步是一种非阻塞的方式,比同步通信性能更好,因为同步的方式是“通信+等待”的阻塞模式,不过接下来先编写一下mosquitto同步函数,下一篇再写异步函数。


    2、订阅端(sub.c)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "mosquitto.h"
    
    
    /* 设置打印开关 */
    #define DEBUG_PROCESS   printf
    #define DEBUG_ERROR     printf
    #define DEBUG_MSG       printf
    
    
    // 定义运行标志决定是否需要结束
    static int g_iRunFlag = 1;
    
    
    /* 回调函数里添加自己的额外操作即可,mosquitto_xx函数已实现底层操作 */
    void on_connect(struct mosquitto *mosq, void *obj, int rc);
    void on_disconnect(struct mosquitto *mosq, void *obj, int rc);
    void on_subscribe(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos);
    void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg);
    
    
    int main()
    {
            int ret;
            struct mosquitto *mosq;
    
    
            // 初始化mosquitto库
            ret = mosquitto_lib_init();
            if(ret){
                    DEBUG_ERROR("Init lib error!\n");
                    return -1;
            }
    
    
            // 创建一个实例
            // 参数:id(不需要则为NULL)、clean_start、用户数据
            mosq =  mosquitto_new("Rookie_sub", true, NULL);
            if(mosq == NULL){
                    DEBUG_ERROR("New error!\n");
                    mosquitto_lib_cleanup();
                    return -1;
            }
    
    
            // 设置连接的用户名与密码:,
            // 参数:句柄、用户名、密码
            ret = mosquitto_username_pw_set(mosq, "user_test", "123456");
            if(ret){
                    DEBUG_ERROR("Set username and password error!\n");
                    mosquitto_destroy(mosq);
                    mosquitto_lib_cleanup();
                    return -1;
            }
    
    
            // 设置回调函数
            // 参数:句柄、回调函数
            mosquitto_connect_callback_set(mosq, on_connect);
            mosquitto_disconnect_callback_set(mosq, on_disconnect);
            mosquitto_subscribe_callback_set(mosq, on_subscribe);
            mosquitto_message_callback_set(mosq, on_message);
    
    
            // 连接至服务器
            // 参数:句柄、ip(host)、端口、心跳
            ret = mosquitto_connect(mosq, "127.0.0.1", 2020, 60);
            if(ret){
                    DEBUG_ERROR("Connect server error!\n");
                    mosquitto_destroy(mosq);
                    mosquitto_lib_cleanup();
                    return -1;
            }
    
    
            // 开始通信:循环执行、直到运行标志g_iRunFlag被改变
            DEBUG_PROCESS("Start!\n");
            while(g_iRunFlag)
            {
                    mosquitto_loop(mosq, -1, 1);
            }
    
    
            // 结束后的清理工作
            mosquitto_destroy(mosq);
            mosquitto_lib_cleanup();
            DEBUG_PROCESS("End!\n");
    
            return 0;
    }
    
    
    void on_connect(struct mosquitto *mosq, void *obj, int rc)
    {
            DEBUG_PROCESS("Call the function: on_connect\n");
    
            if(rc){
                    // 连接错误,退出程序
                    DEBUG_ERROR("on_connect error!\n");
                    exit(1);
            }else{
                    // 订阅主题
                    // 参数:句柄、id、订阅的主题、qos
                    if(mosquitto_subscribe(mosq, NULL, "test/+", 2)){
                            DEBUG_ERROR("Set the topic error!\n");
                            exit(1);
                    }
            }
    }
    
    void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
    {
            DEBUG_PROCESS("Call the function: on_disconnect\n");
    
            g_iRunFlag = 0;
    }
    
    void on_subscribe(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos)
    {
            DEBUG_PROCESS("Call the function: on_subscribe\n");
    }
    
    void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg)
    {
            DEBUG_PROCESS("Call the function: on_message\n");
            DEBUG_MSG("Recieve a message: %s\n", (char *)msg->payload);
    
            if(0 == strcmp(msg->payload, "quit")){
                    mosquitto_disconnect(mosq);
            }
    }
    

    3、发布端(pub.c)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "mosquitto.h"
    
    #define DEBUG_PROCESS   printf
    #define DEBUG_ERROR     printf
    #define DEBUG_MSG       printf
    
    static int g_iRunFlag = 1;
    
    void on_connect(struct mosquitto *mosq, void *obj, int rc);
    void on_disconnect(struct mosquitto *mosq, void *obj, int rc);
    void on_publish(struct mosquitto *mosq, void *obj, int mid);
    
    
    int main()
    {
            int ret;
            struct mosquitto *mosq;
    
            ret = mosquitto_lib_init();
            if(ret){
                    DEBUG_ERROR("Init lib error!\n");
                    return -1;
            }
    
            mosq =  mosquitto_new("Rookie_pub", true, NULL);
            if(mosq == NULL){
                    DEBUG_ERROR("New error!\n");
                    mosquitto_lib_cleanup();
                    return -1;
            }
    
    		// 遗言设置,参数:描述符、主题、消息长度、消息内容、Qos、是否保留在服务器
            ret = mosquitto_will_set(mosq, "test/will", 
            						strlen("pub_will_message"), "pub_will_message", 
            						2, false);
            if(ret){
                    DEBUG_ERROR("Set will message error!\n");
                    return -1;
            }
    
            ret = mosquitto_username_pw_set(mosq, "user_test", "123456");
            if(ret){
                    DEBUG_ERROR("Set username and password error!\n");
                    mosquitto_destroy(mosq);
                    mosquitto_lib_cleanup();
                    return -1;
            }
    
            mosquitto_connect_callback_set(mosq, on_connect);
            mosquitto_disconnect_callback_set(mosq, on_disconnect);
            mosquitto_publish_callback_set(mosq, on_publish);
    
            ret = mosquitto_connect(mosq, "127.0.0.1", 2020, 60);
            if(ret){
                    DEBUG_ERROR("Connect server error!\n");
                    mosquitto_destroy(mosq);
                    mosquitto_lib_cleanup();
                    return -1;
            }
    
            DEBUG_PROCESS("Start!\n");
            while(g_iRunFlag)
            {
                    mosquitto_loop(mosq, -1, 1);
            }
    
            mosquitto_destroy(mosq);
            mosquitto_lib_cleanup();
            DEBUG_PROCESS("End!\n");
    
            return 0;
    }
    
    
    
    void on_connect(struct mosquitto *mosq, void *obj, int rc)
    {
            DEBUG_PROCESS("Call the function: on_connect\n");
    
            if(rc){
                    DEBUG_ERROR("on_connect error!\n");
                    exit(1);
            }else{
            		// 参数:句柄、id、主题、消息长度、消息、Qos、是否保留
                    if(mosquitto_publish(mosq, NULL, "test/common", strlen("hello"), "hello", 2, false)){
                            DEBUG_ERROR("Set the topic error!\n");
                            exit(1);
                    }
            }
    }
    
    void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
    {
            DEBUG_PROCESS("Call the function: on_disconnect\n");
    
            g_iRunFlag = 0;
    }
    
    void on_publish(struct mosquitto *mosq, void *obj, int mid)
    {
            DEBUG_PROCESS("Call the function: on_publish\n");
    
            // 休眠的时间内可以发信号中断测试遗言机制
            sleep(2);
    
            mosquitto_disconnect(mosq);
    }
    

    4、编译

    写完上面2个程序之后,我们需要将它们编译。在编译之前,我们看到2个c程序里面都有#include "mosquitto.h",所以我们就需要先将文章开头说的编译源码得到的函数声明(mosquitto.h)和函数动态库(libmosquitto.so.1)拷贝过来(当然也可以不拷贝而指定路径去编译链接)。

    头文件和动态库拷贝过来之后,我们就可以编译了,命令如下:

    gcc sub.c -o sub -lmosquitto -L ./ -I ./
    gcc pub.c -o pub -lmosquitto -L ./ -I ./
    

    5、执行程序查看测试结果

    我们先指定配置文件启动服务器端(见下文服务器输出信息),然后依次执行:

    • 启动接收消息的订阅端;
    • 启动发布消息的发布端,等待休眠2秒过后程序自动调用disconnect函数并退出,于此同时可以看到订阅端接收到了“hello”;
    • 再次启动发布消息的发布端,并在2秒内(调用disconnect函数之前)按下键盘“Ctrl+C”将程序关闭,由于程序属于非正常关闭,所以此时可以看到订阅端接收到了来自发布端的遗言消息。

    6、程序运行情况如图

    在这里插入图片描述
    需要注意的是,遗言机制并非强制要求使用的,只不过是在程序中遇到非正常关闭时可以采取一些必要的措施。


    7、服务器端输出信息

    book@Ubuntu:~$ mosquitto -c  /etc/mosquitto/conf.d/myMQTT.conf -v
    1594736235: mosquitto version 1.6.7 starting
    1594736235: Config loaded from /etc/mosquitto/conf.d/myMQTT.conf.
    1594736235: Opening ipv4 listen socket on port 2020.
    1594736235: Opening ipv6 listen socket on port 2020.
    
    1594736240: New connection from 127.0.0.1 on port 2020.
    1594736240: New client connected from 127.0.0.1 as Rookie_sub (p2, c1, k60, u'user_test').
    1594736240: No will message specified.
    1594736240: Sending CONNACK to Rookie_sub (0, 0)
    1594736240: Received SUBSCRIBE from Rookie_sub
    1594736240:     test/+ (QoS 2)
    1594736240: Rookie_sub 2 test/+
    1594736240: Sending SUBACK to Rookie_sub
    
    1594736248: New connection from 127.0.0.1 on port 2020.
    1594736248: New client connected from 127.0.0.1 as Rookie_pub (p2, c1, k60, u'user_test').
    1594736248: Will message specified (16 bytes) (r0, q2).
    1594736248:     test/will
    1594736248: Sending CONNACK to Rookie_pub (0, 0)
    1594736248: Received PUBLISH from Rookie_pub (d0, q2, r0, m1, 'test/common', ... (5 bytes))
    1594736248: Sending PUBREC to Rookie_pub (m1, rc0)
    1594736248: Received PUBREL from Rookie_pub (Mid: 1)
    1594736248: Sending PUBCOMP to Rookie_pub (m1)
    1594736248: Sending PUBLISH to Rookie_sub (d0, q2, r0, m1, 'test/common', ... (5 bytes))
    1594736248: Received PUBREC from Rookie_sub (Mid: 1)
    1594736248: Sending PUBREL to Rookie_sub (m1)
    1594736248: Received PUBCOMP from Rookie_sub (Mid: 1, RC:0)
    1594736250: Received DISCONNECT from Rookie_pub
    1594736250: Client Rookie_pub disconnected.
    1594736257: New connection from 127.0.0.1 on port 2020.
    1594736257: New client connected from 127.0.0.1 as Rookie_pub (p2, c1, k60, u'user_test').
    1594736257: Will message specified (16 bytes) (r0, q2).
    1594736257:     test/will
    1594736257: Sending CONNACK to Rookie_pub (0, 0)
    1594736257: Received PUBLISH from Rookie_pub (d0, q2, r0, m1, 'test/common', ... (5 bytes))
    1594736257: Sending PUBREC to Rookie_pub (m1, rc0)
    1594736257: Received PUBREL from Rookie_pub (Mid: 1)
    1594736257: Sending PUBCOMP to Rookie_pub (m1)
    1594736257: Sending PUBLISH to Rookie_sub (d0, q2, r0, m2, 'test/common', ... (5 bytes))
    1594736257: Received PUBREC from Rookie_sub (Mid: 2)
    1594736257: Sending PUBREL to Rookie_sub (m2)
    1594736257: Received PUBCOMP from Rookie_sub (Mid: 2, RC:0)
    1594736259: Socket error on client Rookie_pub, disconnecting.
    1594736259: Sending PUBLISH to Rookie_sub (d0, q2, r0, m3, 'test/will', ... (16 bytes))
    1594736259: Received PUBREC from Rookie_sub (Mid: 3)
    1594736259: Sending PUBREL to Rookie_sub (m3)
    1594736259: Received PUBCOMP from Rookie_sub (Mid: 3, RC:0)
    1594736319: Received PINGREQ from Rookie_sub
    1594736319: Sending PINGRESP to Rookie_sub
    1594736378: Received PINGREQ from Rookie_sub
    1594736378: Sending PINGRESP to Rookie_sub
    1594736438: Received PINGREQ from Rookie_sub
    1594736438: Sending PINGRESP to Rookie_sub
    1594736499: Received PINGREQ from Rookie_sub
    1594736499: Sending PINGRESP to Rookie_sub
    1594736559: Received PINGREQ from Rookie_sub
    1594736559: Sending PINGRESP to Rookie_sub
    1594736619: Received PINGREQ from Rookie_sub
    1594736619: Sending PINGRESP to Rookie_sub
    1594736679: Received PINGREQ from Rookie_sub
    1594736679: Sending PINGRESP to Rookie_sub
    1594736739: Received PINGREQ from Rookie_sub
    1594736739: Sending PINGRESP to Rookie_sub
    
    展开全文
  • mac上源码安装mosquitto

    千次阅读 2013-12-07 08:32:35
    本来自己一个项目用到了mosquitto,是在linux上安装的,后来入了mac,全部转到mac上装过0.15版本,但是只能运行mosquitto,不能运行mosquitto_pub和sub 后来一直耽搁没用mosquitto,今年又想起这个demo,就想用...

    本来自己一个项目用到了mosquitto,是在linux上安装的,后来入了mac,全部转到mac上装过0.15版本,但是只能运行mosquitto,不能运行mosquitto_pub和sub


    后来一直耽搁没用mosquitto,今年又想起这个demo,就想用pub和sub,所以重新安装了新版,发现装不上,在外文站上看到brew能安装,就安装了mosquitto,brew不是很了解,但是类似于sudo apt-get那种东西,有个软件仓库一样的,用brew方式安装的mosquitto能运行,pub和sub还是不能运行,但是看brew在安装mosquitto的过程中是先下载了cmake和几个其他软件,所以我就想肯定是先用cmake来编译mosquitto源码,再make install,果然...

    展开全文
  • mosquitto不能自动启动问题记录

    千次阅读 2020-03-06 14:57:11
    今天需要把mosquitto放到自动启动项中,启动脚本放在/etc/rc.local中了, ssh远程登录运行是可以的,但是自动运行就不行了. rc.local中运行的程序默认是root运行的...linux qt打包程序也是有的,原来都是自己手动复制. ...

    今天需要把mosquitto放到自动启动项中,启动脚本放在/etc/rc.local中了,
    ssh远程登录运行是可以的,但是自动运行就不行了.
    rc.local中运行的程序默认是root运行的,想到以某个用户运行使用su命令即可
    su - username -c “mosquitto -d”
    这样运行即可.

    linux qt打包程序也是有的,原来都是自己手动复制.

    展开全文
  • 运行三、mosquitto_pub和mosquitto_sub 命令参数说明四、Linux c编程使用mosquitto库中常见函数的使用 在了解Mosquitto之前大家可以参考我之前写的一篇博客学习一下MQTT协议的基本概念: https://blog.c
  • 前面对MQTT进行了简单的介绍,并了解了如何在Linux上搭建MQTT 的运行 环境,参考链接:MQTT通信协议(mosquitto)在Linux上的环境构建与测试,那些仅仅是通过命令去测试,现在我们来通过mosquitto的官方源码,编程实现...
  • ESP8266 mqtt 通过tls单向认证连接到mosquitto ...最近需要使用esp8266作为mqtt client,broker暂时使用mosquitto mqtt在linux运行。连接采用tls加密,client单向认证server。该过程有一些问题需要注意,在此列出。
  • #mysqlservice mysqld start (3306)mysql -u root -p#推送服务器/usr/src/libwebsockets-1.3-chrome37-firefox30/build/mosquitto-1.4.4/src/进入mosquitto目录下src文件夹:cd src (1883)启动mosquitto: ./...
  • mosquitto源码编译的时候需要依赖其他的库,使用mipsel-openwrt-linux-交叉编译,最终生成libmosquitto.so.1动态链接库,本方法同样适用于ARM交叉编译连,在配置时把mipsel相对应的交叉编译链换成ARM对应的即可, ...
  • <p>I have a php script that use Mosquitto client. I am using putty SSH to access to the server. I want to run the ...
  • 1.安装mosquitto软件和相应的开发文件 yum install mosquitto mosquitto-devel 2. 开启mosquitto服务 service mosquitto start 3. 测试 # 当前终端运行订阅测试 mosquitto_sub -t test1 # 另起一个终端运行...
  • mosquitto是一个第三方开源库,是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅...Broker(服务端, 代理者)---- 使用PC(192.168.100.33:1883)机 运行mosquitto程序即可 Subscriber(客户...
  • y install gcc gcc-c++ openssl-devel c-ares-devel libuuid-devel wget cmake2、为mosquitto增加websocket支持,安装文本socket库文件,解压缩# tar zxfv libwebsockets-v1.6-stable.tar.gz3、运行 websocket# ...
  • MQTT学习(四)-linux下交叉编译

    千次阅读 2017-12-28 20:33:43
    mosquitto运行的时候需要用到几个比较重要的动态库libmosquitto.so, libssl.so, libcrypto.so,需要参看用户的配置,可能不光光需要包含这么多库,本文章在设置是配置项如下: 其中libmosquitto.so是由...
  • /etc/centos-release CentOS Linux release 7.3.1611 (Core) [root@localhost mysql]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 50G 50G 20K 100% / devtmpfs 3.9G 0 3.9G 0% /dev ...
  • 文章目录1、编译 paho.mqtt.c1.1 步骤1.2 说明1.3 同步函数2、订阅端2.1 订阅端——MQTTClient_receive阻塞等待方式2.2 订阅端——MQTTClient_setCallbacks回调的异步方式3、发布端4、编译5、配置运行环境 ...
  • MQTT服务+客户端

    千次阅读 2017-09-04 15:17:34
    Linux下 配置文件 运行 客户端 Python Javascript cc 重点内容说明 消息质量 消息主题 subscribe订阅 数字符号 加号 订阅 publish发布 MQTT协议 服务器安装包和源码地址:http://mosquitto.org/downloa
  • python一个轻量级的MQTT服务器是:http://www.mosquitto.org,能够运行ARM/MIPS的嵌入式linux系统上。linux物联网常使用 “消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)” 协议订阅数据,这...
  • 码头工人MQTT INFLUX GRAFANA ESP2866 ...注意:Linux Mint Debian Edition分别在我的MAC上运行 更新25.03.2021-Docker-compose.yaml 我决定尝试使用更便捷的方法在Mac上使用Docker-Desktop和docker-compose设置SM
  • MQTT的学习

    2016-04-21 11:53:18
    百度都可以直接搜到,我这一篇主要讲下如何直观的先把MQTT服务器运行起来本文服务器用的 ActiveMQ 客户端用的 Eclipse Paho,简单的先实现下推送的功能如果你想实现linux下的mosquitto推送,也很简单,可以参见...
  • Python实现MQTT接收订阅数据

    千次阅读 2019-10-03 16:29:46
    一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运行ARM/MIPS的嵌入式linux系统上。 物联网常使用 “消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)” 协议订阅数据,这...
  • 一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运行ARM/MIPS的嵌入式linux系统上。物联网常使用 “消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)” 协议订阅数据,这里用Python实现从....
  • 一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运行ARM/MIPS的嵌入式linux系统上。物联网常使用 “消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)” 协议订阅数据,这里用Python实现从....
  • MQTT是一个轻量级的消息协议。从2014年12月IOIT大会上得到的消息,该协议已经被OASIS标准组织接收,成立了专门的...一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运行ARM/MIPS的嵌入式linux系统上,...
  • 文章目录web环境第1步:安装Apache第2步:安装MySQL第3步:安装PHP第4步:重新启动apache以使所有...Apache是一个免费开源软件,可运行世界上50%的Web服务器。 sudo apt-get update sudo apt-get install apache2 s

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

linuxmosquitto运行

linux 订阅