zoukankan      html  css  js  c++  java
  • linux下搭建mqtt服务器(mosquitto)

    一、mosquitto源码下载
    下载地址:https://mosquitto.org/download/
    或者不下载,直接在linux命令行下载:后面的版本可以根据自己的需要去更换。

    $ wget https://mosquitto.org/files/source/mosquitto-1.6.10.tar.gz
    
    执行第二步(安装依赖库)再来执行以下安装部分
    //解压--> 进入目录 --> make 编译 --> 安装
    $ sudo apt install g++
    $ tar zxvf mosquitto-1.6.10.ar.gz
    $ cd mosquitto-1.6.10
    $ sudo make &&make install(没有make命令的就sudo apt install make)
    

    二、安装依赖库

    $ sudo apt-get install libssl-dev
    $ sudo apt-get install libc-ares-dev
    $ sudo apt-get install uuid-dev
    

    检测是否安装成功:
    在安装mosquitto成功后,可以在/usr/local/lib文件夹中有libmosquitto.so.1等文件
    如果实现源码安装不了的话,建议使用apt直接安装把。

    sudo apt-get install mosquitto mosquitto-clients
    
    $ cd /usr/local/lib
    $ ls
    

    三、链接动态库

    //创建链接
    $ sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
    //更新链接
    $ sudo ldconfig
    

    四、测试使用
    启动服务:

    mosquitto -v
    

    订阅主题

    mosquitto_sub -h localhost -t test -v
    

    发布主题和消息:

    mosquitto_pub -t topic -m hello
    

    我们就可以看到消息的通信了,只不过你没有购买云服务器,所以你只能在本地端进行消息通信。三个终端实现

    五、设置用户名和密码,建立安全连接
    先按照下面操作:

    cd /etc/mosquitto/conf.d
    sudo vi my.conf
    输入文件内容:
    allow_anonymous false
    password_file /etc/mosquitto/pwfile
    输完之后保存即可
    新建新的用户名和密码:
    在/etc/mosquitto目录下执行命令:
    sudo   mosquitto_passwd   -c   pwfile   用户名
    回车输入两次密码即可
    后台模式启动mosquitto
    sudo mosquitto  -d  -c   /etc/mosquitto/mosquitto.conf
     此时就启动服务了,这时就要你输入正确的用户名和密码才可以进行连接服务了。
    

    测试工具:mqttbox

    像上面一样,输入你自己的信息,点击save即可连接到你的mqtt服务。
    我来试试消息的通信。


    如图所示,消息通信成功。
    自此完成了mosquitto的搭建工作了。
    附赠mosquitto的选项知识

    -c 是指定配置文件的路径,默认不需要配置文件。
    -d 表示作为守护进程运行在后台。
    -p 用来指定监听的端口,默认是 1883 ,使用 TCP 连接,如果要使用 UDP 连接,需要设为 1884。
    -v 表示生成详细的运行日志,等价于配置文件中将 log_type 设为 all 。
    

    客户端接代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <mosquitto.h>
    #include <string.h>
     
    #define HOST "localhost"  //可以改为自己MQTT的服务器地址 如:#define HOST "106.xxx.xxx.xxx"  
    #define PORT  1883        //端口号
    #define KEEP_ALIVE 60
     
    bool session = true;
     
    void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
    {
        if(message->payloadlen){
            printf("%s %s", message->topic, message->payload);
        }else{
            printf("%s (null)
    ", message->topic);
        }
        fflush(stdout);
    }
     
    void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
    {
        int i;
        if(!result){
            /* Subscribe to broker information topics on successful connect. */
            mosquitto_subscribe(mosq, NULL, "pu", 2); //topic 主题:"pu"
        }else{
            fprintf(stderr, "Connect failed
    ");
        }
    }
     
    void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos)
    {
        int i;
        printf("Subscribed (mid: %d): %d", mid, granted_qos[0]);
        for(i=1; i<qos_count; i++){
            printf(", %d", granted_qos[i]);
        }
        printf("
    ");
    }
     
    void my_log_callback(struct mosquitto *mosq, void *userdata, int level, const char *str)
    {
        /* Pring all log messages regardless of level. */
        printf("%s
    ", str);
    }
     
    int main()
    {
        struct mosquitto *mosq = NULL;
        //libmosquitto 库初始化
        mosquitto_lib_init();
        //创建mosquitto客户端
        mosq = mosquitto_new(NULL,session,NULL);
        if(!mosq){
            printf("create client failed..
    ");
            mosquitto_lib_cleanup();
            return 1;
        }
        //设置回调函数,需要时可使用
        //mosquitto_log_callback_set(mosq, my_log_callback);
        mosquitto_connect_callback_set(mosq, my_connect_callback);
        mosquitto_message_callback_set(mosq, my_message_callback);
        //mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);
        //客户端连接服务器
        if(mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE)){
            fprintf(stderr, "Unable to connect.
    ");
            return 1;
        }
        //循环处理网络消息
        mosquitto_loop_forever(mosq, -1, 1);
     
        mosquitto_destroy(mosq);
        mosquitto_lib_cleanup();
     
        return 0;
    }
    

    客户端发代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <mosquitto.h>
    #include <string.h>
     
    #define HOST "localhost"  //可以改为自己MQTT的服务器地址 如:#define HOST "l06.xxx.xxx.xxx" 
    #define PORT  1883        //端口号
    #define KEEP_ALIVE 60
    #define MSG_MAX_SIZE  512
     
    bool session = true;
     
    int main()
    {
        char buff[MSG_MAX_SIZE];
        struct mosquitto *mosq = NULL;
        //libmosquitto 库初始化
        mosquitto_lib_init();
        //创建mosquitto客户端
        mosq = mosquitto_new(NULL,session,NULL);
        if(!mosq){
            printf("create client failed..
    ");
            mosquitto_lib_cleanup();
            return 1;
        }
        //连接服务器
        if(mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE)){
            fprintf(stderr, "Unable to connect.
    ");
            return 1;
        }
        //开启一个线程,在线程里不停的调用 mosquitto_loop() 来处理网络信息
        int loop = mosquitto_loop_start(mosq);
        if(loop != MOSQ_ERR_SUCCESS)
        {
            printf("mosquitto loop error
    ");
            return 1;
        }
        while(fgets(buff, MSG_MAX_SIZE, stdin) != NULL)
        {
                    /*发布消息*/
                    mosquitto_publish(mosq,NULL,"pu",strlen(buff)+1,buff,0,0);
                                            //topic 主题:"pu"
                    memset(buff,0,sizeof(buff));
        }
        mosquitto_destroy(mosq);
        mosquitto_lib_cleanup();
        return 0;
    }
    

    编译:

    gcc -o mosquitto_client_sub mosquitto_client_sub.c -lmosquitto
    
    一键三连呀!
  • 相关阅读:
    Cannot get a NUMERIC value from a STRING cell? 已解决
    Android Studio快捷键大全
    mysql索引
    eclipse中出现错误 Syntax error, insert "}" to complete Block
    function
    IGS OPC UA 配置
    IFIX 5.9 历史数据 曲线 (非SQL模式)
    IFIX 5.9 报警存sql
    IFIX 数据源 节点 标签 域名
    IFIX 目录结构
  • 原文地址:https://www.cnblogs.com/jee-cai/p/14095358.html
Copyright © 2011-2022 走看看