在树莓派中编写mqtt客户端

目录

1.连接树莓派

2.在树莓派安装paho的库

3.编写mqtt客户端代码


1.连接树莓派

配置新的树莓派请参考

刚拿到树莓派,该怎么使用(折腾)呢?_树莓派拿到后做什么-CSDN博客

本人连接树莓派用的NVC可以显示图形化界面,下载VNC

链接: https://pan.baidu.com/s/1IILrcjdCIErBwDWdcv3lPg?pwd=tb63 提取码: tb63

跟着指导一步一步next即可

安装好后点击File--》new connect

(若遇到登录,点击取消即可)

点击它,输入账号密码

连接成功后即可操作树莓派可视化界面

2.在树莓派安装paho的库

因为mqtt需要用paho的库,所以要安装库

在windows下下载该文件并解压

链接: https://pan.baidu.com/s/1sTmDhjWqQrSN2A3DdgOtnw?pwd=z123 提取码: z123

因为windows不可以直接拖动文件到树莓派中,要下载WINscp软件

链接: https://pan.baidu.com/s/1EEkpGfmXh24MYEAp5flHwg?pwd=xegm 提取码: xegm

按步骤安装后,连接树莓派

连接成功后可以将解压的paho.mqtt.c-1.3.0文件复制或直接拖到树莓派桌面上

桌面创建mqtt文件夹

该文件夹创建文件mqtt.c以及makefile文件

将复制过来的paho.mqtt.c-1.3.0文件放到mqtt文件夹中

进入到该文件右击打开终端

输入以下命令并回车进行编译

make

编译paho.mqtt.c-1.3.0若提示 openssl 错误解决方法

树莓派(Raspberry Pi)安装使用 Eclipse paho C库_树莓派 安装 matt paho c-CSDN博客

之后进行安装

sudo make uninstall(去掉前面有错的安装,之前未安装可不加)

sudo make install(重新安装

3.编写mqtt客户端代码

mqtt.c代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
//以下头文件引入注意路径写错
#include "./paho.mqtt.c-1.3.0/paho.mqtt.c-1.3.0/src/MQTTClient.h"

#define ALIYUN_MQTT_HOST      "tcp://xxx.xxx.xxx.xxx:1883"//你的mqtt代理服务器ip
#define ALIYUN_MQTT_CLIENT_ID ""
#define ALIYUN_MQTT_USERNAME  ""
#define ALIYUN_MQTT_PASSWORD  ""
#define TOPIC_S               "up"//订阅话题
#define TOPIC_P               "down"//发布话题

#define QOS         1
char buf[1024]={0};

void connection_lost(void *context, char *cause) {
    printf("\nConnection lost\n");
    printf("     cause: %s\n", cause);
}
 
int messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
    printf("Message arrived\n");
    strcpy(buf,message->payload);
    printf("%s\n",buf);
    return 1;
}


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, ALIYUN_MQTT_HOST, ALIYUN_MQTT_CLIENT_ID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
 
    MQTTClient_setCallbacks(client, NULL, connection_lost, messageArrived, NULL);
 
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    conn_opts.username = ALIYUN_MQTT_USERNAME;
    conn_opts.password = ALIYUN_MQTT_PASSWORD;
 
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    MQTTClient_subscribe(client, TOPIC_S, QOS);

    while (1)
    {
        scanf("%s",buf);
        pubmsg.payload = buf;
        pubmsg.payloadlen = strlen((char *)pubmsg.payload);
        pubmsg.qos = QOS;
        pubmsg.retained = 0;
        MQTTClient_publishMessage(client, TOPIC_P, &pubmsg, &token);
        MQTTClient_waitForCompletion(client, token, 10000L);
        printf("Message sent\n"); 
    }
    MQTTClient_unsubscribe(client, TOPIC_S);
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);

    return rc;
}


makefile文件代码

#指定生成的文件名
OJB_OUT = mqtt.out

#指定每一个c文件对应的.o文件
OBJS =mqtt.o

#指定编译器
CC = gcc

#指定需要的库
ULDFLAGS = -l m -l paho-mqtt3c

###########################################
#以下的内容不需要修改
###########################################
all:$(OJB_OUT)

$(OJB_OUT):$(OBJS)
	$(CC) -o $@ $^ $(ULDFLAGS)

dep_files := $(foreach f,$(OBJS),.$(f).d)
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)
  include $(dep_files)
endif

%.o:%.c
	$(CC) -Wp,-MD,.$@.d -c $< -o $@
    
clean:
	rm -rf .*.o.d *.o $(OJB_OUT)

之后右击mqtt文件在终端打开

输入以下命令并回车进行编译

make

之后会生成这几个文件,其中的mqtt.out即为生成的可执行文件

然后运行可执行文件即可启动mqtt客户端

./mqtt.out

本项目是用树莓派充当下位机,其中的mqtt客户端通过阿里云服务器的公网mqtt代理服务器与上位机qt的mqtt客户端进行远程跨网段通信,具体阿里云服务器的部署可参考我的上一篇文章。

阿里云+EMQX+MQTT broker+MQTTFX-CSDN博客

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值