1.MQTT.fx 下载
2.案例demo 在模拟机或者真机上面
GitHub - AIXIN698/my_mqtt-android_task: MQTT+Android_APP_task
3.linux 安装mosquitto 作为server
操作在windows差不多
3.移植mqtt_lib进板级/usr/lib( 类似于android studio引入jar包)
4.编写MQTT客户端应用程序
库函数都是定义在 MQTTClient.h 头文件中,也就是同步模式客户端库 API应用程序中需要包含头文件 MQTTClient.h。
MQTT|Windows + mosquitto|同一网段下的两台电脑联调_allow_anonymous true-CSDN博客
Windows下Mosquitto服务配置监听任何IP,搭配使用MQTTX-CSDN博客
物联网平台支持的MQTT协议特性以及与标准MQTT的区别_阿里云物联网平台(IoT)-阿里云帮助中心
4.1MQTTClient_message 结构体
客户端发送和接收消息都是围绕这个结构体;
该结构体描述了MQTT消息的负载和属性等相关信息。譬如 消息的负载,负载的长度,qos,消息的保留标志,dup标志,但是消息主题不是这里面的
示例代码 33.6.1 MQTTClient_message 结构体
typedef struct
{
int payloadlen; //负载长度
void* payload; //负载
int qos; //消息的 qos 等级
int retained; //消息的保留标志
int dup; //dup 标志(重复标志)
int msgid; //消息标识符,也就是前面说的 packetId
......
} MQTTClient_message;
客户端发布消息时,需要实例化一个message对象,收到消息时也是对象,实例化时需要用宏初始化 MQTTClient_message_initializer
4.2 创建一个客户端对象
连接服务器以前,需要创建一个客户端对象,使用MQTTClient_create函数创建:
int MQTTClient_create(MQTTClient *handle,
const char *serverURI,
const char *clientId,
int persistence_type,
void *persistence_context
);
MQTTClient client;
int rc;
/* 创建 mqtt 客户端对象 */
if (MQTTCLIENT_SUCCESS !=
(rc = MQTTClient_create(&client, "tcp://iot.ranye-iot.net:1883",
"dt_mqtt_2_id",
//"tcp://iot.ranye-iot.net:1883"地址中,第一个冒号前面的 tcp 表示我们使用的是 TCP 连接;后面的
//1883 表示 MQTT 服务器对应的端口号。
MQTTCLIENT_PERSISTENCE_NONE, NULL))) {
printf("Failed to create client, return code %d\n", rc);
return EXIT_FAILURE;
}
4.3连接服务端
客户端创建之后,便可以连接服务器了,调用 MQTTClient_connect 函数连接:
int MQTTClient_connect(MQTTClient handle,
MQTTClient_connectOptions *options
);
options:一个指针。指向一个 MQTTClient_connectOptions 结构体对象。MQTTClient_connectOptions 结构体中包含了 keepAlive、cleanSession 以及一个指向 MQTTClient_willOptions 结构体对象的指针 will_opts; MQTTClient_willOptions 结构体包含了客户端遗嘱相关的信息,遗嘱主题、遗嘱内容、遗嘱消息的 QoS 等 级、遗嘱消息的保留标志等。
示例代码 33.6.2 MQTTClient_connectOptions 和 MQTTClient_willOptions
typedef struct
{
int keepAliveInterval; //keepAlive
int cleansession; //cleanSession
MQTTClient_willOptions *will; //遗嘱相关
const char *username; //用户名
const char *password; //密码
int reliable; //控制同步发布消息还是异步发布消息
......
......
} MQTTClient_connectOptions;
typedef struct
{
const char *topicName; //遗嘱主题
const char *message; //遗嘱内容
int retained; //遗嘱消息的保留标志
int qos; //遗嘱消息的 QoS 等级
......
......
} MQTTClient_willOptions;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;
......
/* 连接服务器 */
will_opts.topicName = "dt2914/willTopic"; //遗嘱主题
will_opts.message = "Abnormally dropped"; //遗嘱内容
will_opts.retained = 1; //遗嘱保留消息
will_opts.qos = 0; //遗嘱 QoS 等级
conn_opts.will = &will_opts;
conn_opts.keepAliveInterval = 30; //客户端 keepAlive 间隔时间
conn_opts.cleansession = 0; //客户端 cleanSession 标志
conn_opts.username = "dt_mqtt_2"; //用户名
conn_opts.password = "dt291444"; //密码
if (MQTTCLIENT_SUCCESS !=
(rc = MQTTClient_connect(client, &conn_opts))) {
printf("Failed to connect, return code %d\n", rc);
return EXIT_FAILURE;
}
4.4 设置回调函数
调用 MQTTClient_setCallbacks 函数为应用程序设置回调函数,MQTTClient_setCallbacks 可设置多个回 调函数,包括:断开连接时的回调函数 cl(当客户端检测到自己掉线时会执行该函数,如果将其设置为 NULL 表示应用程序不处理断线的情况)、接收消息的回调函数 ma(当客户端接收到服务端发送过来的消息时执 行该函数,必须设置此函数否则客户端无法接收消息)、发布消息的回调函数 dc(当客户端发布的消息已 经确认发送时执行该回调函数,如果你的应用程序采用同步方式发布消息或者您不想检查是否成功发送时, 您可以将此设置为 NULL)。
int MQTTClient_setCallbacks(MQTTClient handle,
void *context,
MQTTClient_connectionLost *cl,
MQTTClient_messageArrived *ma,
MQTTClient_deliveryComplete *dc
);