linux下MQTT服务器(EMQX)搭建及paho.mqtt.c客户端开发

2023-11-10

前言:

MQTT 是一种基于客户端服务端架构的发布 / 订阅模式的消息传输协议。它的设计思想是轻巧、开放、 简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与 机器的通信( M2M )以及物联网环境( IoT )。        ----MQTT 协议中文版

一.linux下EMQX服务器搭建

找对自己开发环境版本

1.下载deb包

wget https://www.emqx.com/zh/downloads/broker/4.4.19/emqx-4.4.19-otp24.3.4.2-1-ubuntu16.04-amd64.deb

2.安装

sudo apt install ./emqx-4.4.19-otp24.3.4.2-1-ubuntu16.04-amd64.deb

3.运行

sudo systemctl start emqx
此时在浏览器登录服务器IP   http://(server_ip):18083/#/

即可验证自己服务器安装的是否成功,用户名是 admin,初始密码 public

二.客户端工具MQTTX的安装

 我用的是windows下的,接着安装运行直接下一步走下去就行了。

name:客户端的名字
client ID:客户端ID
host:第一步里面服务器的IP地址
创建好了之后连接服务器,然后再创建一个客户端,相互收发验证。

三.linux下paho.mqtt.c的开发

1. paho.mqtt.c下载

git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
mkdir build
cd build
cmake ..
make 
make install

安装完成会在/usr/local/include和/usr/local/lib下看见mqtt的头文件和动态库。

 2.mqtt代码开发

#include <MQTTAsync.h>  //换成你自己的安装路径,不然回报错
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define  SERVERIP "xxx"  //换成你自己的服务器
#define Clientid "sza123"    //这个随便写
int isConnected=0;
//消息回调函数
int onMessrecv(void* context,char*topicName,int topicLen,MQTTAsync_message*message){
            printf("recv name:\ntopic:%s,payload:%s\n",topicName,(char*)message->payload);
            MQTTAsync_free(topicName);
            MQTTAsync_free(message);
            return 1;         
}
void onSubscribe(void* context,MQTTAsync_successData* response){
    printf("sub success!");
}
//连接mqtt服务器
void onConnect(void *context,MQTTAsync_successData* response)
{
    MQTTAsync client =(MQTTAsync)context;
    int ret;
    MQTTAsync_responseOptions response_opt=MQTTAsync_responseOptions_initializer;
    printf("Succeed in connecting to mqtt-server!\n");
    response_opt.onSuccess=onSubscribe;
    ret=MQTTAsync_subscribe(client,"/pub",1,&response_opt);//订阅/pub主题消息
    if(ret!=MQTTASYNC_SUCCESS){
        printf("fail to sub!\n");
    }
    isConnected=1;
}
void disConnect(void *context,MQTTAsync_failureData* response)
{
    printf("Failed to connect  mqtt-server!\n");
}
void onSend(void* context,MQTTAsync_successData* response){
    printf("send message to mqtt server success!\n");
}
int main()
{
    MQTTAsync client;
    int ret;
    MQTTAsync_connectOptions conn_opt = MQTTAsync_connectOptions_initializer;//初始化连接选项
    ret=MQTTAsync_create(&client,SERVERIP,Clientid,MQTTCLIENT_PERSISTENCE_NONE,NULL);
    if(ret!=MQTTASYNC_SUCCESS)
    {
        printf("Cannot create mqtt client!\n");
        return -1;
    }
    //初始化接收消息回调
    ret=MQTTAsync_setCallbacks(client,NULL,NULL,onMessrecv,NULL);
    if(ret!=MQTTASYNC_SUCCESS){
        printf("cannnot set call back function!\n");
        return  -1;
    }
    conn_opt.onSuccess=onConnect;
    conn_opt.onFailure=disConnect;
    conn_opt.automaticReconnect=1;
    conn_opt.context=client;
    conn_opt.cleansession=0;
    //conn_opt.username="xxx";//设置用户名密码换成自己的
    //conn_opt.password="xxx";
    ret=MQTTAsync_connect(client,&conn_opt);
    //因为是异步的,当MQTTAsync_connect返回的时候只是代表底层代码对参数进行了检查
    //当正确返回时,表示底层代码接收了该connect连接命令
    if(ret!=MQTTASYNC_SUCCESS)
    {
        printf("Cannot start a mqttt server connect!\n");
        return -1;
    }
    while (1){
        //1表示成功连接到我们的服务器
        if(isConnected==1){
            MQTTAsync_message message=MQTTAsync_message_initializer;
            MQTTAsync_responseOptions res_option=MQTTAsync_responseOptions_initializer;
            char buffer[200];
            static int temp=16;
            static int humid=58;
            sprintf(buffer," temp:%d,humid:%d ",temp++,humid++);
            message.payload=buffer;
            message.payloadlen=strlen(buffer);
            message.qos=1;
            res_option.onSuccess=onSend;
            printf("read the message is :");
            //发布消息
            ret=MQTTAsync_sendMessage(client,"/sensor/dht11/0",&message,&res_option);//发送消息
            if(ret!=MQTTASYNC_SUCCESS){
                printf("参数错误!");
            }
                   sleep(10);  
                   if(temp>30|humid>90){
                       temp=16;
                       humid=58;
                   }
        }
    }
    return 0;
}


 然后编译

gcc mqtt.c -o mqtt -I /usr/local/include/ -lpaho-mqtt3a

运行mqtt

 

 此时windows上的客户端工具就会接收相应的内容,也可以向linux客户端发送消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下MQTT服务器(EMQX)搭建及paho.mqtt.c客户端开发 的相关文章

  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设

随机推荐

  • Windows7访问Samba,总是提示 未知的用户名或错误密码

    这个问题纠结了好几天 在网上也查了好些资料都没有解决 现在终于解决了 必须要分享出来 环境配置 PC1 Linux Mint 19 2 在此电脑上配置Samba服务 我为了方便 是通过Mint的一个Samba插件配置的 PC2 Win7 6
  • 民安智库(北京第三方窗口测评)开展汽车消费者焦点小组座谈会调查

    民安智库近日开展了一场汽车消费者焦点小组座谈会 旨在深入了解目标消费者对汽车功能的需求和消费习惯 为汽车企业提供有针对性的解决方案 在焦点小组座谈会中 民安智库公司 第三方市容环境指数测评 邀请了一群具有代表性的汽车消费者作为参与者 他们来
  • 【计算机毕业设计】231论文投稿系统

    一 系统截图 需要演示视频可以私聊 本文介绍了论文投稿系统的开发全过程 通过分析企业对于论文投稿系统的需求 创建了一个计算机管理论文投稿系统的方案 文章介绍了论文投稿系统的系统分析部分 包括可行性分析等 系统设计部分主要介绍了系统功能设计和
  • 4-2 张量的数据运算

    张量数学运算主要有 标量运算 向量运算 矩阵运算 以及使用非常强大而灵活的爱因斯坦求和函数torch einsum 重难点 进行任意维的张量运算 此外还会介绍张量运算的广播机制 一 标量运算 操作的张量至少是0维 张量的数学运算符可以分为标
  • Java基础-继承

    子类继承父类后构造器的特点 子类中所有的构造器默认都会先访问父类中的无参的构造器 再执行自己 为什么 子类在初始化的时候 有可能会使用到父类中的数据 如果父类没有完成初始化 子类将无法使用父类的数据 子类初始化之前 一定要调用父类构造器先完
  • Topaz Video Enhance AI 2.3.0 for Mac专业级AI视频增强软件,详细图文安装教程。

    Topaz Video Enhance AI 2 3 0 for Mac是世界一流的AI视频质量增强软件 站长亲测有效 使用突破性的 AI 技术进行令人惊叹的视频放大 Topaz Video Enhance AI 接受了数千个视频的训练并结
  • IDEA常用插件介绍

    前言 插件名为笔者自用的IDEA2019 3 5所能搜索到的 若新版IDEA未能搜索到 可用括号内的插件名替代 一 Lombok 新版IDEA自带 Lombok能通过注解的方式 在编译时自动为属性生成构造器 getter setter eq
  • LeetCode-替换空格

    创建一个新的string 一边遍历原字符串的每一个字符 一边往新的字符串中写入 遇到空格替换为 20即可 class Solution public string replaceSpaces string str string res fo
  • Map和Set知识点

    目录 1 Map的使用 1 1 Map常用方法 2 Set的使用 2 1 Set常见方法 3 二叉搜索树 BST 4 哈希表 4 1 哈希冲突 4 2 避免哈希冲突 4 2 1 哈希函数的设计 4 2 2 负载因子调节 4 3 解决哈希冲突
  • mysql无法执行二进制文件_kail系统64,mysql64,出现-bash: bin/mysqld: 无法执行二进制文...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Linux localhost 3 10 72 1 SMP PREEMPT Thu Jun 16 13 34 40 CST 2016 aarch64 Kali GNU Linux Rolling
  • Ubuntu16.04 安装 ipython详细步骤

    ipython是一个不错的交互工具 调试Python代码很方便 安装ipython sudo apt get install ipython3 sudo pip install ipython 安装Qt console 工具 sudo pi
  • 【基于python+flask的车流量分析预测可视化-哔哩哔哩】 https://b23.tv/2q6251I

    基于python flask的车流量分析预测可视化 哔哩哔哩 https b23 tv 2q6251I https b23 tv 2q6251I
  • C++和C 混合编译链接时报错CMake Error: Cannot determine link language for target

    CMake Error Cannot determine link language for target 解决办法 project demo LANGUAGES C CXX CMake Error Cannot determine lin
  • 关于2的补码

    from http www ruanyifeng com blog 2009 08 twos complement html 问一个基本的问题 负数在计算机中如何表示 举例来说 8在计算机中表示为二进制的1000 那么 8怎么表示呢 很容易
  • torch 1.13.0 对应的torchvision版本

    torch最新的stable版本是1 13 0 奈何官网也没有说对应的torchvision版本是啥 如果想要whl下载的话 就非常麻烦 结论 torch 1 13 0对应torchvision 0 14 0 推导过程如下 首先看官网的 p
  • layer_factory.hpp:81] Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python

    这个问题我查了很多博客 里面很多都相近 但是不能用 首先这个问题的意思是 python层这个名字无法识别 然后给出了可以是别的例子 而这个层在trainval和text的prototxt中都有 解决方法 在caffe文件夹下找到makefi
  • Python---人生重开模拟器(简版)

    专栏 python 个人主页 HaiFan 专栏简介 本专栏主要更新一些python的基础知识 也会实现一些小游戏和通讯录 学时管理系统之类的 有兴趣的朋友可以关注一下 人生重开模拟器 思维导图 前言 一 设置初始属性 1 游戏标题 2 属
  • 一个useState学会React的主要思想

    正经学徒 佛系记录 不搞事情 皮毛React开发者 一个useState有什么好学的 hook那么多 哪个不比useState难 自身React开发者 学的不是如何使用 而是为什么会这样 直接进入主题 对React文档案例进行分析 可以先给
  • redis7知识点总结

    文章目录 1 redis单线程为啥会这么快 2 redis数据类型和底层存储结构 2 1 string类型 2 1 1 SDS 2 2 hash类型 2 3 list类型 2 4 set类型 集合 2 5 zset类型 有序集合 2 6 z
  • linux下MQTT服务器(EMQX)搭建及paho.mqtt.c客户端开发

    前言 MQTT 是一种基于客户端服务端架构的发布 订阅模式的消息传输协议 它的设计思想是轻巧 开放 简单 规范 易于实现 这些特点使得它对很多场景来说都是很好的选择 特别是对于受限的环境如机器与 机器的通信 M2M 以及物联网环境 IoT