mosquitto c语言编程,MQTT通讯协议(mosquitto)发布订阅例子C语言实现

1、前言

前面对MQTT进行了简单的介绍,并了解了如何在Linux上搭建MQTT 的运行 环境,参考连接:MQTT通讯协议(mosquitto)在Linux上的环境构建与测试,那些仅仅是经过命令去测试,如今咱们来经过mosquitto的官方源码,编程实现MQTT协议的发布订阅。

上一章中经过源码编译安装后,将会有几个咱们须要用到的文件。对应路径以下:html

mosquitto-1.6.10/lib/libmosquitto.so.1

mosquitto-1.6.10/lib/cpp/libmosquittopp.so.1

mosquitto-1.6.10/lib/mosquitto.h

mosquitto-1.6.10/lib/mosquittopp.h

下面的程序是使用标准C语言来实现,因此咱们只须要用到mosquitto.h和libmosquitto.so.1两个文件就能够了。web

2、同步函数

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

具体函数以下:

6762bf5c0b70056171794cf485771094.png对mosquitto的函数说明能够参照官方网站的API解释:参考连接如:mosquitto_connect

44cbb8451a6fb4f53e140f9330ac8ff4.png编程

具体代码

订阅端(sub.c)api

#include

#include

#include

#include "mosquitto.h"

#define HOST "localhost"

#define PORT 1883

#define KEEP_ALIVE 60

#define MSG_MAX_SIZE 512

// 定义运行标志决定是否须要结束

static int running = 1;

void my_connect_callback(struct mosquitto *mosq, void *obj, int rc)

{

printf("Call the function: on_connect\n");

if(rc){

// 链接错误,退出程序

printf("on_connect error!\n");

exit(1);

}else{

// 订阅主题

// 参数:句柄、id、订阅的主题、qos

if(mosquitto_subscribe(mosq, NULL, "topic1", 2)){

printf("Set the topic error!\n");

exit(1);

}

}

}

void my_disconnect_callback(struct mosquitto *mosq, void *obj, int rc)

{

printf("Call the function: my_disconnect_callback\n");

running = 0;

}

void my_subscribe_callback(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos)

{

printf("Call the function: on_subscribe\n");

}

void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg)

{

printf("Call the function: on_message\n");

printf("Recieve a message of %s : %s\n", (char *)msg->topic, (char *)msg->payload);

if(0 == strcmp(msg->payload, "quit")){

mosquitto_disconnect(mosq);

}

}

int main()

{

int ret;

struct mosquitto *mosq;

// 初始化mosquitto库

ret = mosquitto_lib_init();

if(ret){

printf("Init lib error!\n");

return -1;

}

// 建立一个订阅端实例

// 参数:id(不须要则为NULL)、clean_start、用户数据

mosq = mosquitto_new("sub_test", true, NULL);

if(mosq == NULL){

printf("New sub_test error!\n");

mosquitto_lib_cleanup();

return -1;

}

// 设置回调函数

// 参数:句柄、回调函数

mosquitto_connect_callback_set(mosq, my_connect_callback);

mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);

mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);

mosquitto_message_callback_set(mosq, my_message_callback);

// 链接至服务器

// 参数:句柄、ip(host)、端口、心跳

ret = mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE);

if(ret){

printf("Connect server error!\n");

mosquitto_destroy(mosq);

mosquitto_lib_cleanup();

return -1;

}

// 开始通讯:循环执行、直到运行标志running被改变

printf("Start!\n");

while(running)

{

mosquitto_loop(mosq, -1, 1);

}

// 结束后的清理工做

mosquitto_destroy(mosq);

mosquitto_lib_cleanup();

printf("End!\n");

return 0;

}

发布端(pub.c)bash

#include

#include

#include

#include

#include "mosquitto

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值