MQTT遗愿(last will) paho.mqtt实现

2023-11-03

一、 MQTT遗嘱

MQTT 可以设置遗嘱,客户端在连接Broker的时候将遗嘱内容(也是topic + payload形式,遗嘱也有一个主题)发送给Broker并保存在Broker中,当客户端因为非正常原因断开与Broker的连接时,Broker会将遗嘱信息发送给订阅了该主题(订阅遗嘱的主题)的客户端。

客户端正常调用DISCONNECT断开连接时属于正常断开连接,Broker不会发送遗嘱,而且会将遗嘱从Broker中删除。

遗嘱消息发布的条件,包括但不限于:

  • 服务端检测到了一个I/O错误或者网络故障。
  • 客户端在爆出连接(Keep Alive)的时间内未能通讯。
  • 客户端没有发送DISCONNECT保温直接关闭了网络连接。
  • 由于协议错误服务端关闭了网络连接。

一旦被发布或者服务端收到了客户端发送的DISCONNECT报文,遗嘱消息就必须从存储的会
话状态中移除。

二、基于paho.mqtt.c实现遗嘱功能

网上关于遗嘱的介绍不少,但是实际的例子却很少,按理说 paho.mqtt.c 这个库用的挺多的,但是也没找到相关的例子,自己写了一个,其实也挺简单的,代码如下:

// mqtt-last-will.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <MQTTClient.h>


#define ADDRESS     "tcp://127.0.0.1:1883"   // broker 地址
#define CLIENTID    "mqtt_test_client"  // client id
#define TOPIC       "MQTT Examples"     // 正常发布测试的主题
#define PAYLOAD     "Hello World!"      //正常发布时的payload
#define QOS         1
#define TIMEOUT     10000L

// last will topic and payload
#define LAST_WILL_TOPIC "Iamdie"           // 遗嘱主题
#define LAST_WILL_MSG "I am really die."   //遗嘱的内容


int main()
{
	MQTTClient client;
	MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
	//MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;  //不使用ssl加密
	MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;

	int nRet = MQTTCLIENT_SUCCESS;
	nRet = MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
	if(nRet != MQTTCLIENT_SUCCESS)
	{
         printf("Failed to create client, return code %d\n", nRet);
		 return -1;
    }
	conn_opts.keepAliveInterval = 20;
	conn_opts.cleansession = 1;
	//conn_opts.ssl = &ssl_opts;    // ssl config   //不使用ssl加密

	// last will config  遗嘱设置
	//will_opts.retained = 1;  //retained = 1 时, broker会一直保留消息,这里不需要,使用默认的0就行
	will_opts.topicName = LAST_WILL_TOPIC;
	will_opts.message = LAST_WILL_MSG;
	conn_opts.will = &will_opts;

	// 连接broker
	nRet = MQTTClient_connect(client, &conn_opts);
	if (nRet != MQTTCLIENT_SUCCESS)
	{
		printf("Failed connect to broker, return code %d\n", nRet);
		return -1;
	}

	// 测试发布消息
	MQTTClient_message PubMsg = MQTTClient_message_initializer;
	MQTTClient_deliveryToken token;
	PubMsg.payload = (void*)PAYLOAD;
	PubMsg.payloadlen = (int)strlen(PAYLOAD);
	PubMsg.qos = QOS;
	PubMsg.retained = 0;
	if ((nRet = MQTTClient_publishMessage(client, TOPIC, &PubMsg, &token)) != MQTTCLIENT_SUCCESS)
	{
		printf("Failed to publish message, return code %d\n", nRet);
		return -1;
	}

	nRet = MQTTClient_waitForCompletion(client, token, TIMEOUT);

	// 这里正常执行 MQTTClient_disconnect 时是不发送遗嘱的,需要测试发送遗嘱的时候将disconnect 屏蔽掉,直接destroy就可以
	if ((nRet = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS)
	{
		printf("Failed to disconnect, return code %d\n", nRet);
	}

	MQTTClient_destroy(&client);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT遗愿(last will) paho.mqtt实现 的相关文章

  • 图片压缩网站-免费压缩网站

    https tinypng com 图片压缩网站 重点是免费 免费 免费 重要的事情说3遍
  • Walking Around the Country 【OpenJ_POJ - C17E】【欧拉通路】

    题目链接 题意 有N个点 M条边 给出 u v w 表示u到v要至少经过w次 并且整张图是完全连通图 有向图 问的是最少的次数走完所有大额M条边 思路 由于 所以我们完全可以当作只有条边 我们要跑完这条边 所以既然是跑完所有边的做法 那么不
  • 使用c语言函数指针和结构体实现动态绑定(面向对象写法)

    概述 无意中在某个地方看到这样的写法 为此做下笔记 C语言面向对象写法 有点像C 味道 科普一下函数指针知识 其实函数指针可以类比一般的变量 如下所示 int a lt gt void haha void int p lt gt void
  • 服务器机房维护彩页宣传,服务器机柜宣传彩页-090317.pdf

    服务器机柜宣传彩页 090317 Integrated Cabinet Solutions for Business Critical ConTinuityTM Contents 01 Knurr 02 F 03 F 04 M 05 M 0
  • 博客笔记大汇总

    关于我的博客大汇总整理 目录介绍 01 Java博客大汇总 02 Android博客大汇总 03 开源项目推荐 04 bug分析大汇总 05 技术问题整理 06 算法 07 Python学习笔记 08 Go学习笔记 09 生活博客汇总 10
  • MyISAM 和 InnoDB 的区别

    对比项 MyISAM InnoDB 主外键 不支持 支持 事务 不支持 支持 锁 表锁 操作一条记录也会锁住整个表 不适合高并发 行锁 操作只锁一行 不影响其他行 适合高并发 缓存 只缓存索引 不缓存数据 缓存索引和数据 对内存要求高 表空
  • 个人小程序借助免费插件实现智能语音问答功能

    目标 个人小程序实现智能语音问答功能 实现 小程序免费插件chatbot 微信智能开发平台 微信同声传译插件 免费 借助tenserflow js的小程序插件 tenserflow免费训练库 代办 示例 智能对话小程序
  • angular:富文本编辑器推荐ngx-quill

    npm网址ngx quill npm 官方网址Quill Your powerful rich text editor 使用 npm install ngx quill npm i save dev types quill 1 3 10 2
  • Qt导入ui文件的方法

    1 首先对项目Test 0右键点击 添加现有文件 选择要添加的新的Design 5 ui文件 导入新的ui文件 2 打开Test 0 pro文件 会有以下形式的代码 确保其中有导入的ui文件Design 5 ui FORMS a ui b
  • Spring ioc容器创建过程(1)BeanFactory初始化

    文章目录 一 ApplicationContext 二 常见的ApplicationContext 三 ioc容器的初始化 1 AbstractApplicationContext prepareRefresh 2 AbstractAppl
  • PYTHON学习:numpy初探

    1 size itemsize size 矩阵元素数目 itemsize 矩阵每个元素的字节数 2 non zero 返回非0元素的索引 3 mean 返回矩阵所有元素的平均值 4 nan np nan值np中的空值 空值和isNone不是
  • DOS命令(windows)

    DOS命令 windows 目录 1 打开命令提示符 2 切换至根 3 当前路径 4 切换至上级路径 5 查看当前目录 6 查看文件内容 7 删除文件 8 进入长文件夹名时缩写 9 复制文件 10 移动文件 1 打开命令提示符 命令 win
  • 【opencv】Python-OpenCV自学自用笔记-上篇

    前言 本文是我在学习opencv时记录的笔记 内容较为简洁 会记录从入门到做项目这段时间的内容 最终目的是完成我的毕业设计 欢迎大家给予批评指正 本篇为第一本书 Python OpenCV从入门到精通 的笔记 前两章为安装 略过 第六章到第
  • 基于Jekyll创建免费的静态博客站点

    完整版请参考 https mazhaoxin github io 2018 08 04 Create Free Static Blog Base On Jekyll http 483v7j coding pages com 2018 08
  • JavaScript & ES6 部分面试题汇总

    1 js数据类型有哪些 基本类型 字符串 String 数字 Number 布尔 Boolean 空 Null 未定义 Undefined Symbol 唯一值 引用类型 对象 Object 数组 Array 函数 Function Set
  • 在Form窗体中,this的应用

    背景 在BHHT Bill界面中点击某个按钮时 弹出BHZX界面 并在BHZX界面中输入值 然后将BHZX界面中输入的值传递回BHHT Bill界面 在BHHT Bill界面中 属性 public string vsBZ string Em
  • Seaborn的使用以及调色板的设置

    Seaborn的使用以及调色板的设置 1 Seaborn简介 Seaborn是基于Python并且非常受欢迎的图形可视化库 并且在matplotlib的基础上进行了更高级的封装 使用作图更加方便快捷 可以通过极简的代码做出十分具有价值并且非
  • 【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入

    目录 0x00 前言 0x02 解决 0x00 前言 本篇博文可能会有一点点的超级呆 0x02 解决 你是不是也会想 使用pyrhon将指定文件夹位置里面的1 txt中数据全部删除以后 gt 然后再将参数req text的值写入到1 txt
  • 前端小白HTML——1.html基础

    HTML语言的基本规则 1 1 HTML基本结构 内是头部信息 不显示在网页上 内是网页内容
  • vs2019断点调试设置断点条件

    系列文章目录 文章目录 系列文章目录 前言 一 使用条件断点 二 使用步骤 1 示例代码 前言 使用vs2019调试代码时 如果遇到for while do while逊汗语句时 而且循环次数很多时 改怎么办呢 一 使用条件断点 二 使用步

随机推荐

  • Ubuntu18.04使用阿里源镜像安装Docker并配置镜像加速【图文详细】

    官方安装文档 https docs docker com engine install ubuntu 阿里源安装文档 推荐 https developer aliyun com mirror docker ce spm a2c6h 1365
  • Unable to build Cython components. Please make sure Cython is installed if the torch.hub

    在我使用torch hub的时候报了如下一个错误 解决方法 参考 https github com h5py h5py issues 535 先安装 h5py 再安装 Cython pip install h5py pip install
  • 概率论中高斯分布(正态分布)介绍及C++11中std::normal_distribution的使用

    高斯分布 最常用的分布是正态分布 normal distribution 也称为高斯分布 Gaussian distribution 正态分布N x 2 呈现经典的 钟形曲线 的形状 其中中心峰的x坐标由 给出 峰的宽度受 控制 正态分布由
  • c++ 提取字符串前面数字stoi和atoi

    stoi和atoi 包含在 include lt cstdlib gt 作用是将字符串转化为int型 区别是stoi的形参是string 而atoi的形参是char 注 只是将字符串前面是数字的部分提取出来 代码可以看这篇文章 https
  • ChatGPT无限卡Cloudflare 验证你是真人

    问题 我的情况是这样 在Chrome里 打开chatGPT的网页 会无限验证你是真人 打开无痕浏览页面可以正常登录 2023 04 20 更新 新的解决方案 github上有一个油猴脚本 KeepChatGPT 可以解决这个问题 至少目前我
  • 02Tcpdump命令详解-网络抓包工具

    1 概述 今天我们要介绍的是一款网络抓包工具tcpdump 重点讨论并介绍一些有用的命令及最佳实践 tcpdump是一个功能最强大 应用最广泛的命令行数据包嗅探器或包分析工具 用于抓取或过滤制定接口接受或发送的TCP IP数据包 tcmpd
  • 42-Docker-Docker命令详解-docker build

    Docker命令详解 docker build 前言 docker build 原理 语法格式 options说明 使用示例 前言 本篇来学习下制作docker镜像的命令 docker build docker build 原理 docke
  • 环境文件复制

    1 yaml复制 package com ybw yaml demo generate import com alibaba fastjson2 JSON import lombok extern slf4j Slf4j import or
  • linux android studio 快捷方式,Android Studio 使用小技巧和快捷键

    Android Studio 使用小技巧和快捷键 Published by xiaosixi on 2016年12月19日 1 书签 Bookmarks 描述 这是一个很有用的功能 让你可以在某处做个标记 书签 方便后面再跳转到此处 调用
  • 【论文速览】ICLR23 - 将图像视为一组点集 Image as Set of Points

    文章目录 研究背景 解决思路 部分实验效果 思考 参考资料 收录于ICLR2023 oral notable top 5 代码地址 https github com ma xu Context Cluster 研究背景 目前计算机视觉领域最
  • 循环代码模型构建方法

    循环结构是源代码程序的重要结构 然而即使是简单的循环程序 也很容易出错 循环中的很多错误往往需要执行多次或者在某些特定的情况下才能被发现 检测这些错误的代价很高 所以需要重点开展对软件循环代码的安全性分析研究 而对循环代码结构进行研究的重要
  • 2018年Android面试题含答案--适合中高级

    1 java中 和equals和hashCode的区别 基本数据类型的 比较的值相等 类的 比较的内存的地址 即是否是同一个对象 在不覆盖equals的情况下 同比较内存地址 原实现也为 如String等重写了equals方法 hashCo
  • 如何学会读论文?送你滑铁卢大学S. Keshav的三轮阅读法

    来源 专知 本文约3100字 建议阅读6分钟 本文为你介绍三轮阅读法 教你如何高效读论文 导读 读论文是从事科学研究与工程等必不可少环节 但是如何高效读论文却有一番讲究 滑铁卢大学S Keshav 撰写了 How to Read a Pap
  • 80 后女程序员拒当「码农」:“转行小说家后,我用 AI 写了 16 本书!”

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • 终止关闭服务端口号 8080为例

    Identify and stop the process that s listening on port 8080 or configure thi 当我们遇到服务器端口号被占用的时候 下一个服务器就带不开了 让人很是烦躁 下面猿猿总结
  • 【华为OD机试真题 python】事件推送【2022 Q4

    题目描述 事件推送 同一个数轴X上有两个点的集合A A1 A2 Am 和B B1 B2 Bn Ai和Bj均为正整数 A B已经按照从小到大排好序 A B均不为空 给定一个距离R 正整数 列出同时满足如下条件的所有 Ai Bj 数对 1 Ai
  • oracle单实例客户端连接的failover功能

    今天测试了一下单实例数据库客户端连接的failover功能 操作系统为red hat 5 5 root localhost cat etc issue Red Hat Enterprise Linux Server release 5 5
  • vue项目树状图的实现

    1 实现背景 项目需要直观的展示元素之间的关系 需要实现一个树状图 数据可视化可以用Echarts HighCharts 但是相关树状图的示例不够直观 且不美观 几种工具之间比较 选择了蚂蚁金服的G6来实现 在开发期间有树状图的示例 之后再
  • 快速排序基本思想及代码实现-史上最通俗易懂的

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1236 1 算法思想 快速排序是C R A Hoare于1962年提出的一种划分交换排序 它采用了一种分治的策略 通常称其为分治法 Divi
  • MQTT遗愿(last will) paho.mqtt实现

    一 MQTT遗嘱 MQTT 可以设置遗嘱 客户端在连接Broker的时候将遗嘱内容 也是topic payload形式 遗嘱也有一个主题 发送给Broker并保存在Broker中 当客户端因为非正常原因断开与Broker的连接时 Broke