#include
#include
#include
#include
#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;
}
// 设置MQTT遗言信息
// 参数:句柄、主题、消息长度、消息内容、qos、是否保留
ret = mosquitto_will_set(mosq, "will_test", strlen("sub_will_message"), "sub_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_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);
ret = mosquitto_connect_async(mosq, "127.0.0.1", 2020, 60);
if(ret){
DEBUG_ERROR("Connect server error!\n");
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return -1;
}
ret = mosquitto_loop_start(mosq);
if(ret){
DEBUG_ERROR("Start loop error!\n");
mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return -1;
}
// 开始通信:循环执行、直到运行标志g_iRunFlag被改变
DEBUG_PROCESS("Start!\n");
while(g_iRunFlag)
{
//mosquitto_loop(mosq, -1, 1);
sleep(1);
DEBUG_PROCESS("Do something!\n");
}
// 结束后的清理工作
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);
}
}