在做MQTT时遇到了很多困难,从无到有,也收获了许多,下面就来总结一下我做本项目的心得;
一丶学会了使用yEd Graph Editor软件作图,(虽然做的很丑!),以前在写程序的时候就是闷头写,根本不画流程图,出现了bug解决不了又不知道从哪里改起,所以现在学会了画流程图写代码变得轻松了,该软件的下载地址:https://www.yworks.com/products/yed
二丶学习了许多关于MQTT的函数,下面就来介绍一下这些函数:
1丶MQTTClient_message:客户端的信息函数。
typedef struct
{
char struct_id[4];//结构体的识别序列,为MQTM
int struct_version;//结构体的版本,为0
int payloadlen;//MQTT消息负载的长度
void* payload;//指向消息负载的指针
int qos;//服务质量
int retained;//保留标志
int dup;dup//标志指示这个消息是否是重复的。 只有在收到QoS1消息时才有意义。 如果为true,则客户端应用程序应采取适当的措施来处理重复的消息。
int msgid;//消息标识符通常保留供MQTT客户端和服务器内部使用。
} MQTTClient_message;
2丶MQTTClient_create:创建MQTT客户端函数
DLLExport int MQTTClient_create(
MQTTClient * handle,//指向MQTT客户端句柄的指针。句柄被成功从函数中返回的客户端引用所填充
const char * serverURI,//以空结尾的字符串,其指定客户端将连接到的服务器。
const char * clientId,//客户端标识符(clientId)是一个以空结尾的 UTF-8 编码字符串,客户端连接到服务器时将它传递过去。
int persistence_type,//客户端所使用的持久类型。
void * persistence_context// 如果应用程序使用的是MQTTCLIENT_PERSISTENCE_NONE持久化,该参数不使用,而且值应该设置为NULL。对于MQTTCLIENT_PERSISTENCE_DEFAULT持久化,应该设置持久化目录的位置(如果设置为NULL,则使用工作目录作为持久化目录)。使用MQTTCLIENT_PERSISTENCE_USER持久化,则将此参数指向有效的MQTTClient_persistence结构。
)
3丶MQTTClient_setCallbacks:该函数为特定的客户端创建回调函数
DLLExport int MQTTClient_setCallbacks (
MQTTClient handle,//指向MQTT客户端句柄的指针。句柄被成功从函数中返回的客户端引用所填充
void * context,//指向任何应用程序特定上下文的指针。 上下文指针被传递给每个回调函数,以提供对回调中的上下文信息的访问。
MQTTClient_connectionLost * cl,//指向MQTTClient_connectionLost()回调函数的指针。 如果您的应用程序不处理断开连接,您可以将其设置为NULL。
MQTTClient_messageArrived * ma,//指向MQTTClient_messageArrived()回调函数的指针。 当您调用MQTTClient_setCallbacks()时,必须指定此回调函数。
MQTTClient_deliveryComplete * dc //指向MQTTClient_deliveryComplete()回调函数的指针。 如果您的应用程序同步发布,或者您不想检查是否成功发送,则可以将其设置为NULL。
)
4丶MQTTClient_connect:将先前创建的客户端连接到MQTT服务器。
DLLExport int MQTTClient_connect (
MQTTClient handle,//指向MQTT客户端句柄的指针。句柄被成功从函数中返回的客户端引用所填充
MQTTClient_connectOptions * options //options 指向有效的MQTTClient_connectOptions结构的指针。
> 返回值
0 连接成功
1 拒绝连接:不可接受的协议版本。
2 拒绝连接:标识符被拒绝。
3 拒绝连接:服务器不可用。
4 拒绝连接:用户名或密码错误。
5 拒绝连接:未经授权。
6 保留给未来用。
)
5丶DLLExport int MQTTClient_subscribe:尝试将客户订阅到单个主题,该主题可能包含通配符。 此函数还指定服务质量。
DLLExport int MQTTClient_subscribe (
MQTTClient handle,//指向MQTT客户端句柄的指针。句柄被成功从函数中返回的客户端引用所填充
const char * topic,//订阅的主题,可使用通配符
int qos //订阅的请求服务质量
)
6丶MQTTClient_publishMessage:尝试将客户订阅到单个主题,该主题可能包含通配符。 此函数还指定服务质量
DLLExport int MQTTClient_publishMessage (
MQTTClient handle,//指向MQTT客户端句柄的指针。句柄被成功从函数中返回的客户端引用所填充
const char * topicName,//与信息相关的主题。
MQTTClient_message * msg,//指向有效的 MQTTClient_message 结构的指针, 其中包含要发布消息的有效负载和属性
MQTTClient_deliveryToken * dt //指向MQTTClient_deliveryToken的指针。当函数成功返回时,dt会被赋值为代表消息的token。如果程序中没有使用传递token,将其设置为NULL。
)
7丶MQTTClient_waitForCompletion:客户端应用程序调用此函数来将主线程的执行与消息的完成发布同步。 被调用时,MQTTClient_waitForCompletion()阻塞执行,直到消息成功传递或已超过指定的时间。
DLLExport int MQTTClient_waitForCompletion (
MQTTClient handle,//指向MQTT客户端句柄的指针。句柄被成功从函数中返回的客户端引用所填充
MQTTClient_deliveryToken dt,//代表消息的MQTTClient_deliveryToken用来检测是否成功传递。传递token由发布函数MQTTClient_publish () 和 MQTTClient_publishMessage ()所产生。
unsigned long timeout //等待的最大毫秒数
)
8丶MQTTClient_receive:接收函数。
int MQTTClient_receive(
MQTTClient handle,//是执行函数MQTTClient_create函数返回的有效句柄
char** topicName,//指向主题的指针的地址。这个函数为主题分配内存并将其返回给应用程序通过设置topicName指向主题。
int* topicLen, //主题的长度。
MQTTClient_message** message,//得到的message指针的地址
unsigned long timeout)