MQTT客户端(基于mosquitto库)上报温度到腾讯云

Linux C MQTT上报温度到腾讯云(基于mosquitto库)

一、创建产品

1.进入腾讯云官网,登陆或注册账号
在这里插入图片描述
2.进入控制台
在这里插入图片描述
3.鼠标滑到云产品,进入物联设备服务中的物联网通信
在这里插入图片描述
4.点击创建新产品,现在我们来创建一个上报温度产品
在这里插入图片描述
5.产品创建信息如下,点击确定
在这里插入图片描述

二、创建设备

1.我们已经创建好了一个产品,如下,现在来创建设备。(设备是产品的实例,一个产品下可以有多个设备。)
在这里插入图片描述

2.进入产品页面后点击设备列表,此时该产品下还没有任何设备,点击添加新设备,我们来创建一个设备来实现温度上报的功能
在这里插入图片描述

3.设备创建信息如下,点击保存,点击开始管理设备
在这里插入图片描述
在这里插入图片描述

三、获取MQTT连接信息

1.设备已经创建好了,现在我们收集一下MQTT连接腾讯云的信息。将红线框住的信息保存在txt文件中。
在这里插入图片描述

2.现在我们已经知道了Client ID、MQTT Username和MQTT Password还需要知道腾讯云MQTT服务端口、服务器地址、消息通信的topic。在Topic列表中选择图中的topic(选择这个topic的原因有关设备影子,下面会解释)同样保存到刚才的txt文件中
在这里插入图片描述

3.在右上角物联网通信帮助文档中有服务器地址选择,文档链接:https://cloud.tencent.com/document/product/634/61228,将替换后的地址:FQ87P6RD9P.iotcloud.tencentdevices.com保存在刚才的txt文件中
在这里插入图片描述
在这里插入图片描述

4.同样根据腾讯云提供的文档:https://cloud.tencent.com/document/product/634/32546,由于我们创建产品时选择的是密钥认证,故连接端口应为1883,将端口保存在刚才的txt文件中
在这里插入图片描述

5.现在我们txt文件中的内容如下,有了这些信息,我们的MQTT客户端已经可以连接上腾讯云,激活设备了,但要想腾讯云正确解析我们上报的消息还需要了解消息主体格式。
在这里插入图片描述

四、消息主体

先了解一下设备影子文件,帮助文档“设备影子详情”:https://cloud.tencent.com/document/product/634/11918。设备影子文档是服务器端为设备缓存的一份状态和配置数据。

1.如下图,左边部分就是我们可以配置的设备文档,可以向其中添加设备状态,desired是期待的设备状态,reported是设备上报的状态。现在预备向设备文档中添加temperature属性来记录设备上报的温度,每次上报都会更新该文档。

现在文档版本是0,每次更新该文档版本都会自增1。
在这里插入图片描述
在这里插入图片描述

2.更改后的设备影子文档如下
在这里插入图片描述

3.根据帮助文档“设备影子数据流”:https://cloud.tencent.com/document/product/634/14072

我们可以知道,如果要将temperature属性值由初设的21.5更改为10,则消息主体应该如下

{
	"type": "update",
	"state": {
		"reported": {
			"temperature": 27
		}
	},
	"version": 1,
	"clientToken": "clientToken"
}

clientToken是用来标识这个消息会话的id,可以由我们自己设为任意值。

五、连接腾讯云

现在我们在Linux下运行我们的C程序客户端来修改设备影子文件。

1.这里展示MQTT客户端相关登录数据传递和消息上报的Linux C代码

char    *hostname = "FQ87P6RD9P.iotcloud.tencentdevices.com";
char    *topic = "$shadow/operation/FQ87P6RD9P/TGT-DS18B20-1";
char    *clientId = "FQ87P6RD9PTGT-DS18B20-1";
char    *username = "FQ87P6RD9PTGT-DS18B20-1;12010126;BEWMO;1677010298";
char    *password = "259854990dbf546fbf48d57841b5f1a6b4d759511b39522dbc05b7cfb87e45bb;hmacsha256";
int     port = 1883;
char	*payload = "{\"type\": \"update\",\"state\": {\"reported\": {\"temperature\": %.2f}},\"version\": 1,   
    \"clientToken\": \"clientToken\"}";

mosq = mosquitto_new(clientId, ture, NULL);
mosquitto_username_pw_set(mosq, username, password);
mosquitto_connect(mosq, serv_ip, port, 60);//serv_ip是经过hostname的DNS解析所得
mosquitto_publish(mosq, NULL, topic, strlen(payload)+1, payload, 0, 0);

在这里插入图片描述
在这里插入图片描述

查看设备影子文件,temperature的值已修改成功,版本自增1证明温度上报已成功
在这里插入图片描述

注意:当设备影子服务端收到此消息时,首先判断消息中的 version 是否与设备影子服务端中的 version 一致。如果一致,设备影子服务端才会执行更新设备影子流程。

在C++中,要使用Mosquitto实现MQTT客户端并设置定时上报数据,首先你需要安装 Mosquitto C++客户端,可以在其GitHub仓找到相关的SDK:https://github.com/eclipse/mosquitto-cpp 以下是基本步骤: 1. **添加依赖**: - 在你的项目中添加`mosquittopp`作为构建依赖。如果你使用的是CMake,可以在CMakeLists.txt文件中添加如下: ```cmake find_package(Mosquitto REQUIRED) target_link_libraries(your_target_name Mosquitto::mosquittopp) ``` 2. **创建连接**: ```cpp #include <mosquitto.h> mosquitto_client client; mosquitto_connect_result result = mosquitto_connect(&client, "your_broker_address", 1883, 60); // 连接到MQTT服务器 if (result != MOSQ_ERR_SUCCESS) { // 处理错误... } ``` 3. **订阅主题**: ```cpp mosquitto_message_callback_data message_data; mosquitto_message_callback_set(&client, on_message, &message_data); mosquitto_subscribe(&client, NULL, "your_topic", 1); // 订阅需要上报数据的主题 ``` 4. **设置定时任务**: C++标准本身并不直接支持定时任务,你可以考虑使用第三方如`std::chrono`配合`std::thread`来实现定期上报,或者使用专门的定时任务框架如`asio::deadline_timer`。 5. **发送消息**: ```cpp void on_message(mosq$username_t* client, const struct mosquitto_message* msg) { if (msg->payloadlen > 0) { // 每次接收到消息时处理数据并发送上报 mosquitto_publish(&client, NULL, "report_topic", msg->payload, msg->payloadlen, true); } } // 定义周期性的上报函数 void report_data() { // 生成并打包数据 std::string data_to_report = generate_and_pack_data(); mosquitto_publish(&client, NULL, "report_topic", data_to_report.c_str(), data_to_report.size(), true); // 设置下一次上报的时间间隔,这里只是一个示例,实际使用时需替换为你选择的计时器机制 std::this_thread::sleep_for(std::chrono::seconds(60)); // 每隔60秒上报 } // 调用函数启动定时上报 std::thread reporter(report_data); reporter.detach(); // 线程独立运行 ``` 6. **关闭连接**: ``` mosquitto_disconnect(&client); mosquitto_destroy(&client); ``` 记得在适当的地方处理异常,并在程序结束时清理资源。这是个基础示例,实际应用可能需要更复杂的错误处理和性能优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值