一、 阿里云MQTT服务器搭建
1、阿里云平台注册及认证
登录阿里云平台网址:阿里云物联网平台-阿里云帮助中心 并要注册与认证, 注册与认证,注册与认证。
2、添加平台
进入”控制台“
选择“物联网平台”,并且开通,开通之后进入”管理控制台”(因为我已经开通了,这里的步骤就展示不出来了)
进入“管理控制台”后点击“公共实例中的“已开通”
3、产品和设备创建
在“设备管理”中选择”产品“,可以看到右边有”创建产品“的选项
接下来直接看图操作
产品名按自己的需求填写就行了
添加设备
可以添加”功能定义“
这个按自己需求自行设定,设定以后记得点击确认,然后“发布”
到这里基本产品和设备的创建都已完成,接下来就是获取MQTT的相关信息
4、查看MQTT 接入参数
进入”管理设备“
点击设备中的”查看“
查看MQTT 参数
有关MQTT 的接入内容大家可以看一下这篇官网内容
如何使用MQTT协议模拟设备快速接入物联网平台_物联网平台-阿里云帮助中心
5、查找topic
在产品的设备中点击”查看“
点击”Topic 类列表“就可以查看系统给定的topic,当然也可以自行定义topic
二、完整代码
这里会涉及到mosquitto 的内容,大家可以学习一下
CSDN
完整代码
#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,这样可以显示我们上报的数据。