概述
在文章Paho - MQTT C Cient的实现中,我介绍了如何使用Paho开源项目创建MQTTClient_pulish客户端。但只是简单的介绍了使用方法,而且客户端的结果与之前介绍的并不吻合,今天我就结合新的例子,给大家讲解一下Paho使用MQTT客户端的主要过程。
如同前面介绍的,MQTT客户端分为同步客户端和异步客户端。今天主要讲解的是同步客户端,结构还是如同步客户端中介绍的:
1.创建一个客户端对象;
2.设置连接MQTT服务器的选项;
3.如果多线程(异步模式)操作被使用则设置回调函数(详见 Asynchronous >vs synchronous client applications);
4.订阅客户端需要接收的任意话题;
5.重复以下操作直到结束:
a.发布客户端需要的任意信息;
b.处理所有接收到的信息;
6.断开客户端连接;
7.释放客户端使用的所有内存。
实现
好,直接上代码,MQTT简单的同步客户端。
1 #include
2 #include
3 #include
4 #include
5 #include "MQTTClient.h"
6 #if !defined(WIN32)
7 #include
8 #else
9 #include
10 #endif
11
12 #define NUM_THREADS 2
13 #define ADDRESS "tcp://localhost:1883" //更改此处地址
14 #define CLIENTID "aaabbbccc_pub" //更改此处客户端ID
15 #define SUB_CLIENTID "aaabbbccc_sub" //更改此处客户端ID
16 #define TOPIC "topic01" //更改发送的话题
17 #define PAYLOAD "Hello Man, Can you see me ?!" //
18 #define QOS 1
19 #define TIMEOUT 10000L
20 #define USERNAME "test_user"
21 #define PASSWORD "jim777"
22 #define DISCONNECT "out"
23
24 int CONNECT = 1;25 volatileMQTTClient_deliveryToken deliveredtoken;26
27 void delivered(void *context, MQTTClient_deliveryToken dt)28 {29 printf("Message with token value %d delivery confirmed\n", dt);30 deliveredtoken =dt;31 }32
33 int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)34 {35 inti;36 char*payloadptr;37
38 printf("Message arrived\n");39 printf("topic: %s\n", topicName);40 printf("message:");41
42 payloadptr = message->payload;43 if(strcmp(payloadptr, DISCONNECT) == 0){44 printf("\n out!!");45 CONNECT = 0;46 }47
48 for(i=0; ipayloadlen; i++)49 {50 putchar(*payloadptr++);51 }52 printf("\n");53
54 MQTTClient_freeMessage(&message);55 MQTTClient_free(topicName);56 return 1;57 }58
59 void connlost(void *context, char *cause)60 {61 printf("\nConnection lost\n");62 printf("cause: %s\n", cause);63 }64
65 void *subClient(void *threadid){66 longtid;67 tid = (long)threadid;68 printf("Hello World! It's me, thread #%ld!\n", tid);69
70 MQTTClient client;71 MQTTClient_connectOptions conn_opts =MQTTClient_connectOptions_initializer;72 intrc;73 intch;74
75 MQTTClient_create(&client, ADDRESS, SUB_CLIENTID,76 MQTTCLIENT_PERSISTENCE_NONE, NULL);77 conn_opts.keepAliveInterval = 20;78 conn_opts.cleansession &