我无法使用适用于 C++ v2 的 AWS IOT 开发工具包为主题创建 LWT。没有一个示例演示如何完成此操作,文档也不完全清楚。
我曾尝试SetWill()
在调用之前调用连接上的函数Connect()
,但这只会导致连接失败。
我们的代码基于 AWS simple pub sub 代码,并且基本稳定(除了由于未知原因遇到超时和重新连接)。
我们的目标是嵌入式系统,我们当前的 AWS SDK 版本是 1.12.8。如果这是此问题的根本原因(也是我们观察到的断开连接和超时问题),我们可以升级我们的 SDK 版本。
我一直在努力设置一个规则,以正确地将消息重新发布到影子/更新主题,但我确实看到 AWS IOT 在我的应用程序退出时未执行正常断开连接的情况下发布 LWT 消息。我在 Connect 之前调用 SetWill() 并将保留参数设置为“false”。如果我将 retain 设置为“true”,那么 AWS 会在我连接后立即关闭连接。
此代码可能不是创建 JSON 消息的最有效方式,但它确实以正确的格式发布数据以进行影子更新,前提是您可以获得将其转发到正确的影子主题的规则。
JsonObject jsonLWT;
JsonObject jsonState;
JsonObject jsonReported;
String sLWT;
jsonReported.WithString("connected", "false");
jsonState.WithObject("reported", jsonReported);
jsonLWT.WithObject("state", jsonState);
sLWT = jsonLWT.View().WriteReadable();
ByteBuf bbufLWT = ByteBufFromArray((const uint8_t*)sLWT.data(), sLWT.length());
if ( !connection->SetWill("sdk/test/update", AWS_MQTT_QOS_AT_MOST_ONCE, false, bbufLWT) ) {
fprintf(stdout, "ERROR: failed to set LWT\n");
return -1;
}
我在 Windows PC 上使用适用于 C++ v2 的 AWS IOT SDK。我不知道它是什么版本,但它是从最新的 git 源构建的。