mosquitto发布端和订阅端代码范例

我也是复制的,没有测试。应该能正常工作中。

发布端

/*********************************************************************************
 *      Copyright:  (C) 2022 Ye Xingwei<2929273315@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  subscribe.c
 *    Description:  This file MQTT_pub
 *                 
 *        Version:  1.0.0(2022年01月04日)
 *         Author:  Ye Xingwei <2929273315@qq.com>
 *      ChangeLog:  1, Release initial version on "2022年01月04日 15时08分27秒"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <mosquitto.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <signal.h>
#include <ctype.h>

#include "cJSON.h"


#define HOST           "localhost"
#define PORT            1883
#define KEEP_ALIVE      60
#define MSG_MAX_SIZE    512


static int  g_stop = 0;


void mqtt_connect_callback(struct mosquitto *mosq, void *obj, int rc);
void mqtt_disconnect_callback(struct mosquitto *mosq, void *obj, int rc);
int get_time(char *datetime, int bytes);
int get_temperature(float *temp);
int get_ipaddr(char *interface,char *ipaddr,int ipaddr_size);
void sig_handle(int signum);

int main (int argc, char **argv)
{
    int                 rv;
    struct mosquitto    *mosq = NULL;

    /*安装信号*/
    signal(SIGUSR1,sig_handle);
    
    
    
    
    /* MQTT 初始化 */
    rv = mosquitto_lib_init();
    if(rv != MOSQ_ERR_SUCCESS)
    {
        printf("mosquitto lib int failure:%s\n", strerror(errno));
        goto cleanup;
    }
    
    /* 创建新的客户端 */
    mosq = mosquitto_new(NULL,true,NULL);
    if(!mosq)
    {
        printf("create client failure:%s\n",strerror(errno));
        goto cleanup;
    }
    
    /* 回调函数 */
    mosquitto_connect_callback_set(mosq, mqtt_connect_callback);
    
    
    
    while(!g_stop)
    {
        /*  连接MQTT服务器,ip,端口,时间 */ 
        if(mosquitto_connect(mosq,HOST,PORT,KEEP_ALIVE) != MOSQ_ERR_SUCCESS)
        {
            printf("mosquitto_connect() failed: %s\n",strerror(errno));
            goto cleanup;
        }
        printf("connect successfully\n");

        /* 无阻塞 断线连接 */
        mosquitto_loop_forever(mosq,-1,1);


        sleep(10);

    }

cleanup: 
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();
    return 0;
} 

/*确认连接回函数*/
void mqtt_connect_callback(struct mosquitto *mosq, void *obj, int rc)
{
    char                    ipaddr[16];
    char                    *interface="eth0";
    char                    datetime[64];
    cJSON                   *root;
    cJSON                   *item;
    char                    *msg;
    struct mqtt_user_data   *mqtt;


    printf("Connection successful cJSON call packaging\n");

    float temper = 0.000000;

    if(get_temperature(&temper) < 0)
    {
        printf("get_temperature failed.\n");
        return;
    }

    if(get_time(datetime,sizeof(datetime))<0)
    {
        printf("get_time failure\n");
        return ;
    }

    memset(ipaddr,0,sizeof(ipaddr));
    if(get_ipaddr(interface,ipaddr,sizeof(ipaddr))<0)
    {
        printf("ERROR:get ip address failure\n");
        return ;
    }


    root = cJSON_CreateObject();
    item = cJSON_CreateObject();

    /* cJSON打包 */
    cJSON_AddItemToObject(root,"id",cJSON_CreateString(ipaddr));
    cJSON_AddItemToObject(root,"time",cJSON_CreateString(datetime));
    cJSON_AddItemToObject(root,"Temperature",cJSON_CreateNumber(temper));
   
    msg = cJSON_Print(root);
    //printf("%s\n",msg);


    if(!rc)
    {
        if(mosquitto_publish(mosq,NULL,"temp",strlen(msg),msg,0,NULL) != MOSQ_ERR_SUCCESS)
        {
            printf("mosquitto_publish failed: %s\n",strerror(errno));
            return;
        }
    }

    mosquitto_disconnect(mosq);
}

/* 获取时间 */
int get_time(char *datetime, int bytes)
{
    time_t              now;
    struct tm          *t;

    time(&now);
    t = localtime(&now);

    snprintf(datetime, bytes, "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, (t->tm_hour)+8, t->tm_min, t->tm_sec);

    return 0;
}
/* 安装信号 */
void sig_handle(int signum)
{
    if(SIGUSR1 == signum)
    {
        g_stop = 1;
    }
}

/* 获取温度 */
int get_temperature(float *temp)
{
    int     fd = -1;
    char    buf[128];
    char    *ptr=NULL;
    DIR     *dirp = NULL;
    struct dirent *direntp = NULL;
    char    w1_path[64]="/sys/bus/w1/devices/";
    char    chip_sn[32];
    int     found = 0;


    dirp=opendir(w1_path);
    if(!dirp)
    {
        printf("open foldir %s failure:%s\n",w1_path,strerror(errno));
        return -1;
    }

    while(NULL!=(direntp=readdir(dirp)))
    {
        if(strstr(direntp->d_name,"28-"))
        {
            strncpy(chip_sn, direntp->d_name,sizeof(chip_sn));
            found = -1;
        }
    }
    closedir(dirp);
    if(!found)
    {
        printf("can not find ds18b20 chipset\n");
        return  -2;
    }


    strncat(w1_path,chip_sn,sizeof(w1_path)-strlen(w1_path));
    strncat(w1_path,"/w1_slave",sizeof(w1_path)-strlen(w1_path));

    if((fd = open(w1_path,O_RDONLY))<0)
    {
        printf("File opened successfully:%s\n",strerror(errno));
        return -3;
    }

    memset(buf, 0, sizeof(buf));
    if(read(fd, buf, sizeof(buf))<0)
    {
        printf("read data from fd=%d failure:%s\n",fd,strerror(errno));
        return -4;
    }

    ptr = strstr(buf,"t=");
    if(!ptr)
    {
        printf("t=string\n");
        return -5;

    }

    ptr+= 2;
    *temp = atof(ptr)/1000;
    close(fd);
    return 0;

}


/* 获取IP地址 */
int get_ipaddr(char *interface,char *ipaddr,int ipaddr_size)
{
    char            buf[1024];
    char            *ptr;
    char            *ip_start;
    char            *ip_end;
    FILE            *fp;
    int             len;
    int             rv;

    if(!interface || !ipaddr || ipaddr_size <16)
    {
        printf("Invalid input argument\n");
        return -2;
    }

    memset(buf, 0 , sizeof(buf));

    snprintf(buf,sizeof(buf),"ifconfig %s",interface);
    fp = popen(buf,"r");
    if(NULL==fp)
    {
        printf("popen() to extern command\"%s\"failure:%s\n",buf,strerror(errno));
        return -2;
    }
    rv = -3;
    while(fgets(buf,sizeof(buf),fp))
    {
        if(strstr(buf,"netmask"))
        {
            ptr = strstr(buf,"inet");
            if(!ptr)
            {
                break;
            }
            ptr +=strlen("inet");

            while(isblank(*ptr))
                ptr++;
            ip_start = ptr;
            while(!isblank(*ptr))
                ptr++;
            ip_end = ptr;
            memset(ipaddr,0,sizeof(ipaddr));

            len = ip_end-ip_start;
            len = len>ipaddr_size ? ipaddr_size:len;

            memcpy(ipaddr,ip_start,len);
            rv = 0;

            break;
        }
    }
    pclose(fp);
    return rv;
}

订阅端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mosquitto.h>

#include "cJSON.h"


#define HOST "localhost"
#define PORT  1883
#define KEEP_ALIVE 60
#define MSG_MAX_SIZE  512

static int running = 1;


/* 确认连接回调函数 */
void mqtt_connect_callback(struct mosquitto *mosq, void *obj, int rc)
{
    printf("Confirm the connection to the client\n");
    if(rc)
    {
        printf("on_connect error!\n");
        exit(1);
    }
    else
    {
        if(mosquitto_subscribe(mosq, NULL, "temp", 2))
        {
            printf("Set the topic error!\n");
            exit(1);
        }
    }
}


/*获取到订阅的内容*/
void mqtt_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg)
{

        printf("Obtaining content successfully\n");
        printf("\n");
        printf("Succeeded in obtaining the time and temperature:%s\n", (char *)msg->payload);
}



int main (int argc, char **argv)
{
    int                 ret;
    struct mosquitto    *mosq;

    /* MQTT 初始化 */
    ret = mosquitto_lib_init();
    if(ret)
    {
        printf("Init lib error!\n");
        goto cleanup;
        return -1;
    }

    /* 创建新的客户端 */
    mosq = mosquitto_new(NULL,true, NULL);
    if(mosq == NULL)
    {
        printf("Create a new client failure\n");
        goto cleanup;
        return -1;
    }
    /* 回调函数 */
    mosquitto_connect_callback_set(mosq, mqtt_connect_callback);
    mosquitto_message_callback_set(mosq, mqtt_message_callback);

    /* 连接代理 */
    ret = mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE);
    if(ret)
    {

        printf("Connect server error!\n");
        goto cleanup;
        return -1;
    }
    printf("connection client is OK\n");

    while(running)
    {
        mosquitto_loop(mosq, -1, 1);
    }
    

/* 释放 清空 */
cleanup:
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();
    return 0;
} 

相关推荐

  1. mosquitto发布订阅代码范例

    2024-01-08 09:46:02       43 阅读
  2. Nacos 服务发现订阅)源码分析(客户

    2024-01-08 09:46:02       20 阅读
  3. udp(无连接)客户服务代码

    2024-01-08 09:46:02       68 阅读
  4. epoll服务客户示例代码

    2024-01-08 09:46:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 09:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 09:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 09:46:02       82 阅读
  4. Python语言-面向对象

    2024-01-08 09:46:02       91 阅读

热门阅读

  1. WKWebView访问时不携带Cookie的解决方案

    2024-01-08 09:46:02       131 阅读
  2. 如何在vscode下,启动jupyter连接远程服务器

    2024-01-08 09:46:02       59 阅读
  3. ObjectInputStream、ObjectOutputStream在TCP的使用

    2024-01-08 09:46:02       47 阅读
  4. 数据结构:STL:vector

    2024-01-08 09:46:02       48 阅读
  5. Spring和Spring Boot的区别

    2024-01-08 09:46:02       56 阅读
  6. SWUSTOJ 133: 水王争霸

    2024-01-08 09:46:02       55 阅读
  7. Vim 快速指南:高效删除文本行

    2024-01-08 09:46:02       54 阅读
  8. 函数指针

    2024-01-08 09:46:02       54 阅读
  9. Sentinel

    Sentinel

    2024-01-08 09:46:02      59 阅读
  10. qt第三天快速回顾

    2024-01-08 09:46:02       63 阅读
  11. 【软件测试】学习笔记-如何做好测试计划

    2024-01-08 09:46:02       54 阅读
  12. 前端工程师的未来

    2024-01-08 09:46:02       51 阅读
  13. 微软开源.net core如何在linux系统搂钱?

    2024-01-08 09:46:02       48 阅读
  14. 10-单例模式(Singleton)

    2024-01-08 09:46:02       59 阅读
  15. C++动态内存

    2024-01-08 09:46:02       51 阅读
  16. Excel4:数据匹配与连接

    2024-01-08 09:46:02       54 阅读
  17. C语言基本语句介绍

    2024-01-08 09:46:02       59 阅读
  18. 如何判断服务器是否被入侵了

    2024-01-08 09:46:02       58 阅读