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 一致。如果一致,设备影子服务端才会执行更新设备影子流程。

Logo

更多推荐