MQTT:window作为server,板子client发送数据

1.MQTT.fx 下载

GitHub - SeppPenner/mqttfx171-backup: Mqtt.fx Backup just backups the page https://www.jensd.de/apps/mqttfx/1.7.1/ (Internet Archive link: https://web.archive.org/web/20210514230412/https://www.jensd.de/apps/mqttfx/1.7.1/) and its MQTT.fx client, version 1.7.1.

2.案例demo 在模拟机或者真机上面

GitHub - AIXIN698/my_mqtt-android_task: MQTT+Android_APP_task

3.linux 安装mosquitto 作为server

操作在windows差不多

Linux搭建MQTT服务器(mosquitto)并使用

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
);

5.imx6ull板子上的mqtt小项目:板子将温度传感器的数据上传,其他client接收数据。

5.1 将本地电脑(连接局域网时的ip地址)作为server,在mosquitto.conf 中打开Listener 监听port 1883

5.2 板子中加入了动态库,以及编译生成的应用软件。将板子作为client。

5.3 通过mqtt协议将板子中温度传感器的数据,传输给server,并且其他的client也能读到数据。ubuntu(连接到局域网)及本地电脑(连接到局域网)作为client。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值