我们先看一下搭建mqtt的基本流程图吧(不是项目的流程图,我简单画的一个)。
关于调用mosquitto库中的函数的学习,可以参考一下我写的常见mosquitto库中函数的学习:https://blog.csdn.net/makunIT/article/details/107283260
在写代码的时候,我用到了iniparser库和cJSON库,我们要先明白iniparser库以及cJSON库,为什么要学习这个呢?首先iniparser库可以对ini文件进行解析、设置、删除等操作,我们知道当我们与阿里云进行通信时,需要很多参数,比如要知道阿里云的域名,端口、以及username、passwd、客户端id以及发布的主题、服务质量都需要进行配置,所以使用iniparsesr库可以解决很多配置的问题。如下图是我写的ini文件
关于iniparser库的学习可以参考以下我之前写的博客,博客链接为:
https://blog.csdn.net/makunIT/article/details/107209915
那么我们为什么还需要学习cJSON库那,cJSON是一个超轻巧,携带方便,单文件,简答的可以作为ANSI-C标准的解析器。而json是一种在服务器端和客户端交换数据的轻量级数据格式,而对于阿里云的上报会比较严格,还需要相同的json格式发布阿里云平台才能收到,而cJSON库的使用可以创建josn格式的数据。
关于cJSON的学习可以参考一下我的博客:https://blog.csdn.net/makunIT/article/details/107199000
以上是我创建的json格式的数据,我们将把这个消息发送给阿里云。
我们先来看一下我这段代码的作用,这段代码是我写的通过传参的形式来配置连接阿里云之间的通信的,为什么我们用ini文件配置了为什么还要传连接时候的参数那,因为这样可以实现代码的利用率,这样我们再阿里云再创建一个设备时,我们可以直接通过参数来连接阿里云,这样也会更加方便一点。
int set_mqtt_conf(char *path_ini, char *host, int port, char *clientid, char *user, char *passwd, char *topic)
{
FILE *fp = NULL;
dictionary *ini = NULL;
char * mqtt_port;
char mqtt_pot[16];
if(port)
{
snprintf(mqtt_pot, sizeof(mqtt_pot), "%d" , port);
mqtt_port = mqtt_pot;
}
ini = iniparser_load(path_ini);
if(ini == NULL)
{
printf("iniparser failure \n");
return -1;
}
/*配置参数*/
iniparser_set(ini, "aly_address:host", host);
iniparser_set(ini, "aly_address:port", mqtt_port);
iniparser_set(ini, "clientId:id", clientid);
iniparser_set(ini, "user_passwd:username", user);
iniparser_set(ini, "user_passwd:passwd", passwd);
iniparser_set(ini, "pub_topic:topic", topic);
/*有些参数后面再配置*/
fp = fopen(path_ini, "w");
if(fp == NULL)
{
printf("stone: fopen error!\n");
return -2;
}
iniparser_dump_ini(ini, fp);
iniparser_freedict(ini);
return 0;
}
我们再来看这段代码,这段代码的功能就是解析ini文件,实现连接阿里云,实现两者的通信,我们使用iniparser库获取ini文件的配置,然后填充结构体,此结构体的内容将会在发布的时候要用到。
int gain_mqtt_conf(char *path_ini, mqtt_ctx_t *mqtt)
{
dictionary *ini = NULL;
const char *hostname;
int port;
const char *username;
const char *passwd;
const char *clientid;
const char *pubTopic;
int pubQos;
int keepalive;
const char *method;
const char *id;
const char *identifier;
const char *version;
if(!path_ini || !mqtt)
{
printf("Invalid input argument in %s!\n",__FUNCTION__);
return