mosquitto(windows)作为broker,paho作为client

本文介绍如何使用Paho MQTT C客户端库进行消息发布与订阅操作。通过同步发布消息和异步接收消息的例子,展示了如何连接MQTT代理、发送消息及接收消息的完整流程。

环境: client :ubuntu

broker:windows 32bit

下载mosquitto 的exe版本,直接安装运行,如果不过,请自行上网搜索安装过程以及解决办法;

本文主要讲解paho的demo过程,而且还是参考其他人的博客,博客地址:https://blog.youkuaiyun.com/qingdujun/article/details/71055759#mqtt-c-client%E5%AE%9E%E6%88%98

1.首先现在paho的C版本,在github上搜索即可,或者https://github.com/eclipse/paho.mqtt.c,打开源码可以看到里面包含了makefile,所以我没有使用cmake,直接make;可以看到在当前路径下多处了一个build的文件夹,进去可以看到里面有好几个动态库文件。这几个就是我们需要的库文件,(原生的哦,没有裁剪的)。


2.新建demo文件夹(用来实现例子,随便什么地方存放都行),在demo下新建lib、src、include文件夹,将paho源码中的src文件夹中的MQTTClient.h 、 MQTTClientPersistence.h拷贝到include文件夹下,将源码中build文件夹下libpaho-mqtt3c.so.1拷贝到lib下,新建软链接ln -sf libpaho-mqtt3c.so.1.0 libpaho-mqtt3c.so.1         ln -sf libpaho-mqtt3c.so.1 libpaho-mqtt3c.so

3.参考上边大神的博客,直接用几个函数搞定:

同步pub的:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"
#define ADDRESS     "tcp://192.168.1.103:1883"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L
int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;
    int rc;
    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    pubmsg.payload = PAYLOAD;
    pubmsg.payloadlen = strlen(PAYLOAD);
    pubmsg.qos = QOS;
    pubmsg.retained = 0;
    MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
    printf("Waiting for up to %d seconds for publication of %s\n"
            "on topic %s for client with ClientID: %s\n",
            (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
    rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
    printf("Message with delivery token %d delivered\n", token);
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

异步sub:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"
#define ADDRESS     "tcp://192.168.1.103:1883"
#define CLIENTID    "ExampleClientSub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L
volatile MQTTClient_deliveryToken deliveredtoken;
void delivered(void *context, MQTTClient_deliveryToken dt)
{
    printf("Message with token value %d delivery confirmed\n", dt);
    deliveredtoken = dt;
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    int i;
    char* payloadptr;
    printf("Message arrived\n");
    printf("     topic: %s\n", topicName);
    printf("   message: ");
    payloadptr = message->payload;
    for(i=0; i<message->payloadlen; i++)
    {
        putchar(*payloadptr++);
    }
    putchar('\n');
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}
void connlost(void *context, char *cause)
{
    printf("\nConnection lost\n");
    printf("     cause: %s\n", cause);
}
int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;
    int ch;
    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
           "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
    MQTTClient_subscribe(client, TOPIC, QOS);
    do 
    {
        ch = getchar();
    } while(ch!='Q' && ch != 'q');
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

makefile:

CC :=gcc
SRC :=./src/sub.c 
FLAG := -I./include -L./lib
LDFLAGS :=  -lpaho-mqtt3c
all:
	${CC}   ${FLAG}  ${SRC}  -g  -o   sub   ${LDFLAGS}  
.PYTHON:clean
clean:
	-rm -rf demo1  *.o
	

开启windows上的mosquito:dos下进入mosquitto的安装目录,执行:mosquitto -c mosquitto.conf

上图:


### 三、嵌入式开发板连接本地MQTT Mosquitto Broker的配置教程 为了将嵌入式开发板连接到本地的MQTT Mosquitto Broker,需要完成以下关键步骤:配置Broker、部署Mosquitto到开发板、编写客户端代码以实现订阅和发布消息。以下是详细说明。 #### 1. 配置本地MQTT Mosquitto Broker 在本地计算机上安装并运行Mosquitto Broker,确保其能够正常接收和转发消息。可以通过以下命令启动Broker[^2]: ```bash mosquitto -c /etc/mosquitto/mosquitto.conf ``` 如果未指定配置文件路径,则默认使用系统路径下的配置文件。为确保安全性和功能扩展,可以在`mosquitto.conf`中设置以下参数: - `allow_anonymous`: 是否允许匿名连接。 - `listener`: 指定监听端口,默认为1883。 - `password_file`: 如果需要认证,可以指定密码文件路径。 #### 2. 部署Mosquitto到嵌入式开发板 在嵌入式开发板上运行Mosquitto需要完成交叉编译,并将生成的二进制文件部署到目标设备。具体步骤包括: - 安装依赖库(如OpenSSL、cJSON等)[^3]。 - 修改`config.mk`文件,禁用不必要的功能(如WebSockets支持)以减少资源消耗[^3]。 - 使用交叉编译工具链生成适用于目标平台的可执行文件。 - 将生成的文件复制到开发板,并确保所有依赖库路径正确配置。 #### 3. 示例代码:嵌入式开发板作为MQTT客户端 以下是一个简单的C语言示例,展示如何在嵌入式开发板上实现MQTT客户端功能。此代码基于Paho MQTT C库[^1]。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #define ADDRESS "tcp://localhost:1883" // Broker地址 #define CLIENTID "ExampleClient" #define TOPIC "test/topic" #define PAYLOAD "Hello, MQTT!" #define QOS 1 #define TIMEOUT 10000L int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; MQTTClient_message pubmsg = MQTTClient_message_initializer; MQTTClient_deliveryToken token; int rc; MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); conn_opts.keepAliveInterval = 20; conn_opts.cleanSession = 1; if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code %d\n", rc); exit(EXIT_FAILURE); } pubmsg.payload = PAYLOAD; pubmsg.payloadlen = strlen(PAYLOAD); pubmsg.qos = QOS; pubmsg.retained = 0; MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); printf("Waiting for up to %d seconds for publication of %s\n" "on topic %s for client with ClientID: %s\n", (int)(TIMEOUT / 1000), PAYLOAD, TOPIC, CLIENTID); rc = MQTTClient_waitForCompletion(client, token, TIMEOUT); printf("Message with delivery token %d delivered\n", token); MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; } ``` #### 4. 注意事项 - 确保嵌入式开发板与本地计算机在同一网络下,或者通过路由器进行通信。 - 如果Broker运行在远程服务器上,需将代码中的`ADDRESS`替换为实际的IP地址和端口号。 - 根据实际需求调整QoS值,通常选择0(至多一次)、1(至少一次)或2(仅一次)[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值