Linux编程MQTT实现主题发布订阅

2023-10-30

【物联网阿里云平台开发项目实战|附课件资料】智能硬件开发-数据上云,零基础入门
4G模块连接阿里云教程
MQTT通信协议(mosquitto)在Linux上的环境构建与测试
MQTT通信协议(mosquitto)发布订阅例子C语言实现
MQTT客户端软件(MQTT.fx)的使用详解
各类MQTT代理服务器特性对比
Web技术(七):如何使用并实现MQTT 消息订阅-发布模型? 本机抓包等

物联网从云到端实战开发

参考:【物联网云端项目实战】物联网从云到端实战开发(附课程资料&项目源码)
地址:https://www.bilibili.com/video/BV1hf4y1b731?p=10&spm_id_from=pageDriver

实现功能技术介绍

​ 物联网通信技术流程图

在这里插入图片描述

​ 上图中的物联网通信环境包括以太网、Wi-Fi、RFID、NFC、ZigBee、6LoWPAN,蓝牙、GSM、GPRS、3G、4G等。

​ 每种通信的应用协议都有到一定的适用范围,AMQP、JMS、REST/HTTP都是工作在以太网,COAP协议是专门为资源受限设备开发的协议,而DDS和MQTT兼容性是最强的,下面逐一介绍各类通信协议的特点。

REST/HTTP

适用范围:

  • REST/HTTP主要为了简化互联网中的系统架构,快速实现客户端和服务器之间交互的松耦合,降低了客户端和服务器之间的交互延迟。因此适合在物联网的应用层面,通过REST开放物联网中资源,实现服务被其他应用所调用。

特点:

  • REST 指的是一组架构约束条件和原则。

  • 客户端和服务器之间的交互在请求之间是无状态的。

  • 在服务器端,应用程序状态和功能可以分为各种资源,它向客户端公开,每个资源都使用 URI 得到一个唯一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。

  • 使用的是标准的 HTTP 方法,比如:GET、PUT、POST 和 DELETE。

  • REST/HTTP其实是互联网中服务调用API封装风格,物联网中数据采集到物联网应用系统中,在物联网应用系统中,可以通过开放REST API的方式,把数据服务开放出去,被互联网中其他应用所调用。

在这里插入图片描述

CoAP(Constrained Application Protocol)

适用范围:

​ CoAP是简化了HTTP协议的RESTful API,CoAP是6LowPAN协议栈中的应用层协议,它适用于在资源受限的通信的IP网络。

特点:

  • 报头压缩:CoAP包含一个紧凑的二进制报头和扩展报头。它只有短短的4Bit的基本报头,基本报头后面跟扩展选项。一个典型的请求报头为10~20Bit。

  • 方法和URIs:为了实现客户端访问服务器上的资源,CoAP支持GET、PUT、POST和DELETE等方法。CoAP还支持URIs,这是Web架构的主要特点。

  • 传输层使用UDP协议:CoAP协议是建立在UDP协议之上,以减少开销和支持组播功能。它也支持一个简单的停止和等待的可靠性传输机制。

  • 支持资源发现:为了自主的发现和使用资源,它支持内置的资源发现格式,用于发现设备上的资源列表,或者用于设备向服务目录公告自己的资源。它支持RFC5785中的格式,在CoRE中用/.well—known/core的路径表示资源描述。

  • 支持缓存:CoAP协议支持资源描述的缓存以优化其性能。

CoAP和6LowPan,这分别是应用层协议和网络适配层协议,其目标是解决设备直接连接到IP网络,也就是IP技术应用到设备之间、互联网与设备之间的通信需求。因为IPV6技术带来巨大寻址空间,不光解决了未来巨量设备和资源的标识问题,互联网上应用可以直接访问支持IPV6的设备,而不需要额外的网关。

在这里插入图片描述

MQTT (Message Queuing Telemetry Transport )

适用范围:

​ 在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。

​ MQTT协议一般适用于设备数据采集到端(Device-》Server,Device-》Gateway),集中星型网络架构(hub-and-spoke),不适用设备与设备之间通信,设备控制能力弱,另外实时性较差,一般都在秒级。

特点:

  • 使用基于代理的发布/订阅消息模式,提供一对多的消息发布
  • 使用 TCP/IP 提供网络连接
  • 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量
  • 支持QoS,有三种消息发布服务质量:“至多一次”, “至少一次”, “只有一次”

在这里插入图片描述

DDS协议(Data Distribution Service for Real-Time Systems)

适用范围:

分布式高可靠性、实时传输设备数据通信。目前DDS已经广泛应用于国防、民航、工业控制等领域。

特点:

  • 以数据为中心

  • 使用无代理的发布/订阅消息模式,点对点、点对多、多对多

  • 提供多大21种QoS服务质量策略

协议主要实现:

  • OpenDDS 是一个开源的 C++ 实现
  • OpenSplice DDS

DDS很好地支持设备之间的数据分发和设备控制,设备和云端的数据传输,同时DDS的数据分发的实时效率非常高,能做到秒级内同时分发百万条消息到众多设备。DDS在服务质量(QoS)上提供非常多的保障途径,这也是它适用于国防军事、工业控制这些高可靠性、可安全性应用领域的原因。但这些应用都工作在有线网络下,在无线网络,特别是资源受限的情况下,没有见到过实施案例。

AMQP协议(互操作性)

AMQP(Advanced Message Queuing Protocol),先进消息队列协议,用于业务系统例如PLM,ERP,MES等进行数据交换。

适用范围:

最早应用于金融系统之间的交易消息传递,在物联网应用中,主要适用于移动手持设备与后台数据中心的通信和分析。

特点:

  • Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流

  • 面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全

协议实现:

· Erlang中的实现有 RabbitMQ

· AMQP的开源实现,用C语言编写OpenAMQ

· Apache Qpid

· stormMQ

XMPP协议(即时通信)

​ XMPP(Extensible Messaging and Presence Protocol)可扩展通讯和表示协议,一个开源形式组织产生的网络即时通信协议。

适用范围:

即时通信的应用程序,还能用在网络管理、游戏、远端系统监控等。

特点:

  • 客户机/服务器通信模式

  • 分布式网络

  • 简单的客户端,将大多数工作放在服务器端进行

  • 标准通用标记语言的子集XML的数据格式

XMPP是基于XML的协议,由于其开放性和易用性,在互联网及时通讯应用中运用广泛。相对HTTP,XMPP在通讯的业务流程上是更适合物联网系统的,开发者不用花太多心思去解决设备通讯时的业务通讯流程,相对开发成本会更低。但是HTTP协议中的安全性以及计算资源消耗的硬伤并没有得到本质的解决。

JMS

JMS (Java Message Service),即消息服务,这是JAVA平台中著名的消息队列协议。

Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ。 JMS 能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

基础宏观设计框架搭建

​ 从宏观到围观,掌握全局设计及技术筛选和代码实现,同时体验面向对象的思维理念,先整体后局部,物联网通信技术多数采用MQTT的通信方式,同时MQTT服务器又提供了多种的服务插件,在整体交互过程中,MQTT通信协议将被作为中心点进行延申对接其他服务,如数据库,WEB。。。。

在这里插入图片描述

1、整体简易框架示意图:

在这里插入图片描述

2、终端框架示意图

在这里插入图片描述

3、MQTT服务框架

在这里插入图片描述

4、数据库框架示意图

在这里插入图片描述

5、WEB框架示意图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J83nB8ne-1645366912425)(1.2基础宏观设计框架搭建.assets/image-20210318101601547.png)]

基础环境搭建

开发主机:win10_64位操作系统、16G内存、CPU 4Ghz x 8

开发环境:Vmware16、Ubuntu20.04

开发工具:VsCode、Pycharm、git

镜像下载:http://releases.ubuntu.com/20.04/

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

Linux编程MQTT实现主题发布订阅 的相关文章

  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do

随机推荐

  • 【zookeeper】zookeeper 启动 源码解读

    文章目录 1 概述 2 QuorumPeerMain 3 单机模式 4 集群模式 4 1 createFactory 4 2 getQuorumPeer 4 3 LearnerType 4 4 start 4 4 1 loadDataBas
  • OpenWrt设置.端口转发和远程访问路由器

    到Luci界面 网络 gt 防火墙 首先 先来说下如何设置端口转发 点击上方的 端口转发 新建端口转发 处填写名称 随便 外网端口 内部IP地址 内网端口 图中的设置表示将外网82端口上的TCP数据转发到内网192 168 1 11的80端
  • 【Lua学习】Lesson5.程序的时序、线程及任务同步

    基本时序 先把分析一下上一笔记中的代码 function LedRunning do something sys timerStart LedRunning 200 200ms定时执行此函数 end LedRunning 首先是定义了一个功
  • 各大工作室都在用的视觉特效软件,开启你的虚拟制作之旅

    为您的虚拟制作设置的免费视觉特效工具 使用领先工作室们所信任的创意资源管理软件 免费开始您的下一个虚拟制作项目 花更多时间在创作上 更少时间在设置上 增强型Studio包 现已可以部署在微软 Azure 上使用 包含了您所需要的所有工具 包
  • 超详细教程-Linux服务器安装jenkins

    2 一 步骤目录 1 安装JDK 2 安装Jenkins 3 修改Jenkins配置 4 启动Jenkins 5 服务器开放端口 打开浏览器 6 获取管理员密码 7 自定义Jenkins 8 创建第一个管理员用户 二 具体操作 1 安装JD
  • Postman如何进行参数化

    前言 Postman作为一款接口测试工具 受到了非常多的开发工程师的拥护 那么做为测试 了解Postman这款工具就成了必要的了 这篇文章就是为了解决Postman怎么进行参数化的 全局变量 全局变量是将这个变量设置成整个程序的都可以用 不
  • 暴力枚举、全排列

    1 带分数 题目分析 假设待求的数 num a b c 对于样例1 100 3 69258 714 a 3 b 69258 c 714 我们首先对 123456789 进行全排列 然后对于其中的每个全排列进行分段 比如样例中涉及的排列之一
  • 哔哩哔哩能下游戏?B站游戏下载

    哔哩哔哩不仅可以看视频和社区活动 还可以下载游戏 你知道吗 哔哩哔哩要如何下载游戏呢 本期教程就来教教大家B站游戏下载的方法 哔哩哔哩下载游戏方法教程 1 打开b站之后 点击游戏中心图标 2 进去哔哩哔哩游戏中心之后 点击底部我的 3 在我
  • 使用UmiJS开发项目(上)

    目录 一 Umi是什么 二 项目初始化 三 配置prettier eslint stylelint 四 配置文件 五 多环境多配置文件 前段时间公司重构的项目中选用Umi框架 使用的过程中整理并封装了一些Umi常用的功能 由于文章篇幅较长
  • 解压文件win10自动删除

    解压文件 包含一个破解软件 被win10自动删除 复制也会提示 无法完成操作 因为文件包含病毒或潜在的垃圾软件 解决办法 找到病毒和威胁防护 找到被隔离的威胁 操作允许在设备上即可
  • Java 11 升Java 17 重要特性必读(摘录)

    1 JDK 17 在 2021 年 9 月 14 号正式发布了 根据发布的规划 这次发布的 JDK 17 是一个长期维护的版本 LTS SpingFramework 6 和SpringBoot 3中默认将使用JDK 17 所以JDK 17必
  • vue封装组件之上传图片组件(el-upload)

    vue封装组件之上传图片组件 el upload 未上传状态 上传状态 其他状态 查看 删除 自定义组件文件名称 这里叫UploadImg vue
  • 子串判断

    链接 https www nowcoder com questionTerminal 917a800d4de1423394827932f4725c68 orderByHotValue 1 done 0 pos 10 onlyReferenc
  • 亲身经历提醒大家,工作千万不要太快做完,快了领导就会认为你很能干,把最急、最难的任务分给你!...

    职场上 如何合理把握工作节奏 一位网友用亲身经历提醒大家 上班的时候千万不要搞太快了 搞快了领导就会认为你很能干 分任务的时候 永远把最多 最急 最难 最复杂的业务都交给你 然后别人搞完都下班了 唯独你一个人坐那加班 真是讽刺 许多网友都有
  • JavaScript中的类型详解

    一 JavaScript中的类型 JavaScript中的类型可以分为基本数据类型和引用类型两种 基本类型值 指的是保存在栈内存中的简单数据段 引用类型值 指的是那些保存在堆内存中的对象 意思是 栈内存中保存的实际上只是一个指针 这个指针指
  • 五位杰出的中国女科学家--巾帼不让须眉,见证科技中的“她力量”

    今年一月 英国广播公司 BBC 公布 20世纪最具标志性人物 票选活动 中国首位诺贝尔生理学或医学奖得主屠呦呦与居里夫人 爱因斯坦等一同入围 BBC还专门制作了介绍短片 讲述屠呦呦发现青蒿素的传奇故事 去年也是科研女性表现亮眼的一年 中国科
  • FBX动画导入Unity

    Unity动画 1 1 第一章 Unity导入FBX模型动画但不能动 文章目录 Unity动画 前言 一 FBX模型动画 二 Unity导入后设置参数 1 设置材质 2 设置动画 总结 前言 随着AR VR等技术发展 摸一手Unity动画总
  • 拷贝构造函数和赋值运算符区别

    只有在赋值时 才调用赋值函数 当在声明变量时 B b3 b1和B b4 b3 调用的函数是一样的 均为拷贝构造函数 一 拷贝构造 是一个的对象来初始化一边内存区域 这边内存区域就是你的新对象的内存区域赋值运算 对于一个已经被初始化的对象来进
  • pyecharts运用——对数据进行可视化处理

    pyecharts运用 对数据进行可视化处理 前言 本博客记录这学期关于数据可视化的一些学习 由于我是一个菜鸟 编程能力很弱 希望路过的大佬多多海涵 一 为什么要数据可视化 数据可视化的根本目的就是教会我们如何去分析一段数据 并让非专业的人
  • Linux编程MQTT实现主题发布订阅

    物联网阿里云平台开发项目实战 附课件资料 智能硬件开发 数据上云 零基础入门 4G模块连接阿里云教程 MQTT通信协议 mosquitto 在Linux上的环境构建与测试 MQTT通信协议 mosquitto 发布订阅例子C语言实现 MQT