MQTT客户端(基于mosquitto)上报温度到阿里云 ——DS18B20发布订阅温度(Linux C编程)

本文详细介绍了如何在阿里云上搭建MQTT服务器,包括注册认证、开通物联网平台、创建产品和设备、获取MQTT接入参数。同时,提供了一个使用mosquitto库的C语言代码示例,展示了设备如何连接和发布/订阅消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 阿里云MQTT服务器搭建

1、阿里云平台注册及认证

登录阿里云平台网址:阿里云物联网平台-阿里云帮助中心 并要注册与认证, 注册与认证,注册与认证。

2、添加平台

进入”控制台“

选择“物联网平台”,并且开通,开通之后进入”管理控制台”(因为我已经开通了,这里的步骤就展示不出来了)

进入“管理控制台”后点击“公共实例中的“已开通”

3、产品和设备创建

在“设备管理”中选择”产品“,可以看到右边有”创建产品“的选项

接下来直接看图操作

产品名按自己的需求填写就行了

添加设备

可以添加”功能定义“

这个按自己需求自行设定,设定以后记得点击确认,然后“发布”

到这里基本产品和设备的创建都已完成,接下来就是获取MQTT的相关信息

4、查看MQTT 接入参数

进入”管理设备“

点击设备中的”查看“

查看MQTT 参数

有关MQTT 的接入内容大家可以看一下这篇官网内容

如何使用MQTT协议模拟设备快速接入物联网平台_物联网平台-阿里云帮助中心

5、查找topic

在产品的设备中点击”查看“

点击”Topic 类列表“就可以查看系统给定的topic,当然也可以自行定义topic

二、完整代码

这里会涉及到mosquitto 的内容,大家可以学习一下

优快云

完整代码

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <mosquitto.h>


typedef struct  s_conn_para{
	char     *hostname;
	char     *pub_topic;
	char     *clientId;
	char     *username;
	char     *password;
	int       port;
	char     *payload;
	char     *sub_topic;
	int       keepalive;
	int       qos;
}conn_para_t;


void mqtt_clean(struct mosquitto *mosq);
static void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg);



int main(int argc, char **argv)
{
	struct mosquitto     *mosq;
	int                   mid, mid1;
	int                   retain = 0;
	int session = true;

	conn_para_t           conn_para = {
			"a1nJJhI9sTT.iot-as-mqtt.cn-shanghai.aliyuncs.com",
			"/sys/a1nJJhI9sTT/....../thing/event/property/post", 
			"a1nJJhI9sTT.Raspberry_DS18B2......0425320779|",
			"Ra....ry_D......&a1nJJhI9sTT",
			"4c2f8513509d0774a2......bc5f2a54589d28607448",		
			1883,
			"{\"params\":{\"temperature\":27.32, \"Humidity\":87.37}}",
			"/a1nJJhI9sTT/...../user/get",
			60,
			0
   };



	mosquitto_lib_init();

	mosq = mosquitto_new(conn_para.clientId, session, NULL);

	if (mosquitto_username_pw_set(mosq, conn_para.username, conn_para.password) != MOSQ_ERR_SUCCESS)
    {
        printf("connect server failure: %s", strerror(errno));
		goto cleanup;
    }
	printf("mqtt connect parameters set OK\n");
	
	if (mosquitto_connect(mosq, conn_para.hostname, conn_para.port, conn_para.keepalive) != MOSQ_ERR_SUCCESS)
    {
        printf("connect server failure: %s\n", strerror(errno));
		goto cleanup;
    }
	printf("connect OK\n");

    if (mosquitto_loop_start(mosq) != MOSQ_ERR_SUCCESS)
    {
        printf("mosquitto_loop_start_failure: %s", strerror(errno));
		goto cleanup;
    }


	//sub  messages callback
    mosquitto_message_callback_set(mosq, my_message_callback);

	if (mosquitto_subscribe(mosq, &mid, conn_para.sub_topic, conn_para.qos) != MOSQ_ERR_SUCCESS)
    {
        printf("mosquitto subsribe failure: %s", strerror(errno));
		goto cleanup;
    }
	printf("sub OK\n");

	while(1)
	{

		if (mosquitto_publish(mosq, &mid1, conn_para.pub_topic, strlen(conn_para.payload), conn_para.payload, conn_para.qos, retain) != MOSQ_ERR_SUCCESS)
		{
			printf("mosquitto publish data failure: %s", strerror(errno));
			continue;
		}
		printf("pub messages: %s\n", conn_para.payload);
		sleep(3);
	}
		
cleanup:
    mqtt_clean(mosq);
    return 0;	
}



void mqtt_clean(struct mosquitto *mosq)
{
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup;
}


static void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg)
{
    printf("sub messages: %s\n", (char *)msg->payload);
}



订阅的 topic 最好使用自己自定义的 Topic ,这样下发命令的时候写的命令内容比较自由一点。

对于上报数据的 topic 我们最好是使用物模型通信 Topic,这样可以显示我们上报的数据。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值