void connlost(void *context, char *cause)
{
}
void onConnectFailure(void* context, MQTTAsync_failureData* response)
{
}
void onConnect(void* context, MQTTAsync_successData* response)
{
}
void onReconnected(void* context, char* cause)
{
}
int MqttInit(MQTTAsync* MqClientHandle, char * BrokerUrl, char * Username, char * Password, char * Clientid, unsigned int Timerval)
{
OutputDebugString("[INFO]MqttInit in");
int ret = 0;
MQTTAsync client;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
MQTTAsync * temp = MqClientHandle;
// 同步
// ret = MQTTClient_create(temp, BrokerUrl, Clientid, MQTTCLIENT_PERSISTENCE_NONE, NULL);
// 异步
ret = MQTTAsync_create(temp, BrokerUrl, Clientid, MQTTCLIENT_PERSISTENCE_NONE, NULL);
if (ret != MQTTCLIENT_SUCCESS)
{
OutputDebugString("[INFO] 33MQTTClient_create != MQTTCLIENT_SUCCESS");
return -1;
}
MQTTAsync_setCallbacks(temp, NULL, connlost, NULL, NULL);
conn_opts.username = Username;//mqtt用户名
conn_opts.password = Password;//密码
conn_opts.keepAliveInterval = 20;//长连接保活时间标识
conn_opts.cleansession = 1;
conn_opts.onSuccess = onConnect;//连接成功响应函数
conn_opts.onFailure = onConnectFailure;//连接失败响应函数
conn_opts.context = client;
//本章重点 设置重连
conn_opts.automaticReconnect = 1; //设置为true开启崇丽娜
conn_opts.minRetryInterval = 10; //重连间隔时间
conn_opts.maxRetryInterval = 365*24*60*60;//最大间隔时间,会累计的
//
if ((ret = MQTTAsync_connect(*temp, &conn_opts)) != MQTTASYNC_SUCCESS)
{
CString str;
str.Format("[INFO] Failed to start connect, return code %d\n", ret);
OutputDebugString(str);
//连接不成功
}
//每次重连都会进去onReconnected()函数
if ((ret = MQTTAsync_setConnected(*temp, *temp, onReconnected)) != MQTTASYNC_SUCCESS)
{
OutputDebugString("[INFO] Failed to MQTTAsync_setConnected, return code %d\n");
ret = EXIT_FAILURE;
}
if (Timerval > 7200) { Timerval = 7200; }
if (Timerval < 30) { Timerval = 30; }
conn_opts.username = Username;
conn_opts.password = Password;
conn_opts.cleansession = 1;
conn_opts.connectTimeout = 15;
conn_opts.keepAliveInterval = Timerval;
if (ret != MQTTCLIENT_SUCCESS)
{
OutputDebugString("[INFO](MQTTClient_connect != MQTTCLIENT_SUCCESS");
log.Format("[INFO]-%d",ret);
OutputDebugString(log);
return ret;
}
OutputDebugString("[INFO]MqttInit Out");
return 0;
}
此次开发采用的是paho-mqtt3a异步库,也采用过paho-mqtt3c同步库但是连接不上会阻塞住导致不断连接内存增加,也可能是代码问题,但是如果没有特殊要求建议采用异步库,如果有人需要代码或者通信库留言即可。
再推荐大家一个特别简单好用本地MQTT服务器使用方法只需要一行代码就行就可以启动服务。
界面展示(需要留言即可)
MQTT协议特点
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。
MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。
其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT协议当前版本为,2014年发布的MQTT v3.1.1。除标准版外,还有一个简化版MQTT-SN
,该协议主要针对嵌入式设备,这些设备一般工作于TCP/IP网络,如:ZigBee。
MQTT 与 HTTP 一样,MQTT 运行在传输控制协议/互联网协议 (TCP/IP) 堆栈之上。