目录
1.连接树莓派
配置新的树莓派请参考
刚拿到树莓派,该怎么使用(折腾)呢?_树莓派拿到后做什么-优快云博客
本人连接树莓派用的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-优快云博客
之后进行安装
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客户端进行远程跨网段通信,具体阿里云服务器的部署可参考我的上一篇文章。