0

据我了解,当客户端连接时,我必须检查会话是否持久,如果不是,则执行订阅感兴趣的主题。我正在使用 Mosquitto 1.5 版。

我没有找到使用 API 调用检查此属性的方法,但clean_session发现struct mosquitto. 但是当我尝试以这种方式访问​​它时:

void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
    log("Connected, session persistency",(int)(mosq->clean_session));

我收到错误取消引用指向不完整类型的指针。mosquitto.h只要没有定义内的字段,这似乎是正常的struct mosquitto。调用的文件mosquitto_internal.h确实有它,但它似乎不是为了包含在应用程序项目中而设计的。

这里有什么问题?

更新(在@hardillb 评论之后):( 1)我没有找到说明clean_session在 mosquitto 结构中的文档与我传递给的相同mosquitto_new;(2)这里的文档说

CONNACK 消息包含两个数据条目:

  • 会话呈现标志
  • 连接返回码

合乎逻辑的是,“会话存在标志”将位于连接回调数据或 mosquitto 结构本身的某个位置。因此我猜测clean_session结构中是连接函数返回的值。接下来,同样的消息来源说:

会话存在标志告诉客户端代理是否已经具有可从先前与客户端的交互中获得的持久会话。当客户端连接并将 Clean Session 设置为 true 时,会话存在标志始终为 false,因为没有可用的会话。如果客户端在 Clean Session 设置为 false 的情况下连接,则有两种可能性: 如果会话信息可用于 clientId。并且代理已存储会话信息,会话存在标志为 true

这个标志在哪里session_present- 以便应用程序知道当前连接是先前连接的延续并且不会重新订阅相同的主题?

4

1 回答 1

2

查看代码意味着您应该使用mosquitto_connect_with_flags_callback_set()而不是mosquitto_connect_callback_set()

并传递一个回调函数指针,该指针int在 args 末尾带有一个额外的字段。

int 字段将保存 CONNACK标志(基本上是 0 或 1)

看起来手册页中缺少该回调。

于 2021-12-01T13:58:33.833 回答