MQTTClient g_MqttClient; //MQTT客户端
MQTTClient_createOptions g_MqttCreateOptions = MQTTClient_createOptions_initializer;
MQTTClient_connectOptions g_MqttConnOpts = MQTTClient_connectOptions_initializer;
MQTTClient_message g_MqttPubMsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken g_MqttToken; //声明消息token
#define MQTT_SERVER_ADDRESS "tcp://localhost:1883"
#define MQTT_CLIENTID "MQTT_ClientID"
#define MQTT_QOS 0x01
#define MQTT_TIMEOUT 10000L //超时时间
#define MQTT_KEEP_ALIVE_INTERVAL 20
#define MQTT_CLEACN_SESSION 1
#define MQTT_USERNAME "admin"
#define MQTT_PASSWD "admin"
#define MQTT_RETAINED 0
#define MQTT_SUB_CONFIG_TOPIC "test-topic"
void MQTT_Sub_Delivered(void *context, MQTTClient_deliveryToken dt)
{
g_MqttDeliveredToken = dt;
}
int MQTT_Sub_Msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
char *payloadptr = NULL;
payloadptr = message->payload;
printf("Mqtt Sub Msg Arrived.\nTopic:\n%s\nMsg:\n%s\n", topicName, payloadptr);
MQTTClient_freeMessage(&message);
MQTTClient_free(topicName);
return 0;
}
void MQTT_Sub_Connlost(void *context, char *cause)
{
return;
}
//创建客户端
void NSM_MQTTClient_Creat(void)
{
int rc;
//创建一个客户端MQTT_CLIENTID
rc = MQTTClient_create(&g_MqttClient, MQTT_SERVER_ADDRESS, MQTT_CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
if (rc != MQTTCLIENT_SUCCESS)
{
printf("MQTT Failed to create client, return code %d\n", rc);
}
//设置订阅回调函数:先设置回调再进行客户端连接
rc = MQTTClient_setCallbacks(g_MqttClient, NULL, MQTT_Sub_Connlost, MQTT_Sub_Msgarrvd, MQTT_Sub_Delivered);
if (rc != MQTTCLIENT_SUCCESS)
{
printf("MQTT Client Failed to set callbacks, return code %d\n", rc);
}
g_MqttConnOpts.keepAliveInterval = MQTT_KEEP_ALIVE_INTERVAL; //todo 宏定义
g_MqttConnOpts.cleansession = MQTT_CLEACN_SESSION;
g_MqttConnOpts.username = MQTT_USERNAME;
g_MqttConnOpts.password = MQTT_PASSWD;
//客户端连接服务器
rc = MQTTClient_connect(g_MqttClient, &g_MqttConnOpts);
if (rc != MQTTCLIENT_SUCCESS)
{
printf("MQTT Client Connect Fail,Error Code:%d", rc);
}
}
//判断是否已经建立连接,若没有则进行连接
void NSM_MQTTClient_AutoConncet(void)
{
int rc ;
//连接服务器
if(!MQTTClient_isConnected(g_MqttClient))
{
rc = MQTTClient_connect(g_MqttClient, &g_MqttConnOpts);
if (rc != MQTTCLIENT_SUCCESS) //连接超时时间
{
printf("MQTT Client Connect Fail,Error Code:%d", rc);
}
}
}
//订阅处理
void NSM_MQTTClient_Subscribe(void)
{
int rc;
rc = MQTTClient_subscribe(g_MqttClient, MQTT_SUB_CONFIG_TOPIC, MQTT_QOS);
//rc = MQTTClient_subscribeMany(g_MqttClient, MQTT_CLIENT_SUB_TOPIC_CNT, g_MqttClientSubTopic, g_MqttClientSubQos); //订阅消息
if (rc != MQTTCLIENT_SUCCESS)
{
printf("Failed to subscribe, return code %d\n", rc);
}
}
//取消订阅,断开连接并清除客户端
void NSM_MQTTClient_DestoryAndDisconnect(void)
{
int rc;
rc = MQTTClient_unsubscribe(g_MqttClient, MQTT_SUB_CONFIG_TOPIC);
if (rc != MQTTCLIENT_SUCCESS) //取消订阅
{
printf("MQTT Client Failed to unsubscribe, return code %d\n", rc);
}
MQTTClient_disconnect(g_MqttClient, MQTT_TIMEOUT); //断开连接
MQTTClient_destroy(&g_MqttClient); //清除客户端
}
int main()
{
NSM_MQTTClient_Creat();
while (1)
{
NSM_MQTTClient_AutoConncet();
NSM_MQTTClient_Subscribe();
}
NSM_MQTTClient_DestoryAndDisconnect();
return 0;
}
现在出现一个问题,就是,在msg arrived函数里收到的数据,有些并不是订阅的topic发来的数据,一直接收打印其他无效的数据,影响了正常数据的接收处理,一时找不到原因,很苦恼。
疯狂打印这个东西
Topic:
Msg:B
Mqtt Sub Msg Arrived.
Topic:nload/paho.mqtt.c/src/LinkedList.c
Msg:\
Mqtt Sub Msg Arrived.
Topic:
Msg:B
Mqtt Sub Msg Arrived.
Topic:nload/paho.mqtt.c/src/LinkedList.c
Msg:\
Mqtt Sub Msg Arrived.
Topic:
Msg:B
Mqtt Sub Msg Arrived.
Topic:nload/paho.mqtt.c/src/LinkedList.c
Msg:\
Mqtt Sub Msg Arrived.
Topic:
Msg:B
Mqtt Sub Msg Arrived.
Topic:nload/paho.mqtt.c/src/LinkedList.c
Msg:\