当前位置:首页 » 编程语言 » c语言mqtt
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言mqtt

发布时间: 2022-10-03 09:53:55

Ⅰ 关于stm32与服务器通信的问题

你是想用web远程监控单片机的运行,但是不知道怎么把单片机的信息上传到服务器,转化成web页面展示出来,我做过一个是通过阿里云IOT实现的

单片机内加入MQTT协议,与阿里云服务器通信,可以通过IOT studio快速配置生成web

官方给到历程是都是通过ESP的WiFi来联网。我做的是通过W5500联网的

c语言Link Kit SDK移植到stm32单片机中,web由IOT studio生成。

Ⅱ 嵌入式方向要学习什么课程

1.1 有哪些设备使用单片机或Linux

所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。我们说的单片机不使用操作系统,但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业,日常生活中,有哪些产品使用单片机、Linux呢?下面举一些例子:

  • 下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。
    从上图可以知道:

  • 组成:嵌入式Linux系统= bootloader + linux内核 + 根文件系统(里面含有APP)。

  • bootloader:它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。

  • Linux内核:Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。

  • 不仅如此,Linux内核还有进程调度能力、内存管理等功能。

  • 所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。

2.3 要学习bootloader吗

  • Bootloader有很多种,常用的叫u-boot。

  • 在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。

  • 花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。

  • 所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。

  • 如果你的工作就是修改、完善bootloader,那么再去研究它吧。

2.4 要学习Linux内核、要学习驱动程序吗

  • 之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。

  • 但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。

  • 作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。

  • 所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。

  • LED驱动程序:这是最简单的驱动程序。

  • 按键驱动程序:它也比较简单,从它引入“中断”。

  • 中断:从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。

  • 所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。

  • 入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。

  • 摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。

2.5 要学习Linux应用程序吗?先学一些基础技能

  • 要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:

  • 基本设备的访问,比如LCD、输入设备

  • 进程、线程、进程通信、线程同步与互斥

  • 休眠-唤醒、POLL机制、信号

  • 网络编程

  • ①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。

  • 掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。

2.6 应用程序是怎么启动的?要了解一下根文件系统

  • 你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?

  • 你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?

  • 怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?

  • 这些都需要我们了解一下根文件系统。

  • 先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。

  • 了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。

第3章 学习方法

3.1 先不要打破砂锅问到底

  • 嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。

  • 嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。

  • 比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。

  • 不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?

  • 比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。

  • 甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去网络一下这些命令就可以了。

  • 不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。

3.2 思路要清晰,不怕抄代码

  • 视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,

  • 每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。

  • 记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。

  • 但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。

  • 有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。

3.3 对自己的方向很了解,我只能带你到这里了

  • 我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。

  • 如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。

  • 比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。

  • 当你想从事某个行业时,就需要深入研究行业相关的知识。

  • 比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。

  • 想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。

  • 每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。

Ⅲ 物联网开发需要什么技术呢

物联网开发需要的技术
一:单片机/嵌入式开发
智能硬件,哎,不就是单片机吗?说到底就是一个微控制器,现在出现的智能手表,调光LED灯,蓝牙开锁,WiFi插座等等,说到底不就是单片机开发嘛?单片机,电子和通信专业一般都会教51或AVR、计算机系接触不到。现在流行的Arino也是单片机开发的一种。
但是要做一款智能硬件,技术上只会单片机编程还是不行的。哎呀嘛什么智能硬件,本质上就是一个电子产品!。所以你要开发一款能拿得出手的智能硬件,电子系统设计必须要会的!
二:网络通信协议
智能硬件与传统的电子产品最大的差别,就是智能硬件连上了网络。要连上网络,就需要用到网络通信模块及学习网络通信协议——TCP/IP。
TCP/IP是一个技术的总称,里面包含两种协议TCP、UDP,位于网络通信分层模型的传输层,同时也是由操作系统管理。而HTTP、DNS、URI等这些技术,属于应用层,位于TCP/UDP之上。同样,最近物联网比较流行的,针对计算能力有限的通讯设备而出的MQTT协议,也属于TCP之上。
为了让电子产品有联网的能力,只要在电路设计上给主控芯片连接一个通信模块,写好收发网络指令的代码,剩下的就是电子产品设计了。
三:服务端开发框架
Client/Server架构,即客户端/服务器架构。智能硬件连上后台服务器后,其就是一个客户端,一个终端。由于单片机中资源受限,实际上是不太可能用HTTP协议的,所以互联网中通用的Web服务器开发并不适合这里。有的厂家会在TCP之上自定义协议,有的就移植别人做好的协议比如MQTT,CoAP等等。
服务端开发就比较复杂了。单片机/嵌入式软件开发还好,只要学习好C语言即可打遍天下无敌手,而服务端开发,用Java呢还是Python还是PHP?反正Java和Python选一个就好了,嵌入式出身的工程师,一般都会学Python。
Python服务器端的开发框架种类繁多,Web开发的有Django、FlaskTornado WebServer,TCP服务器可以用Twisted,等等。MQTT有已经做好的服务器,像这样的服务器不用自己开发,直接部署即可。

Ⅳ 学习物联网应用工程师有什么要求

要想成为系统的的物联网工程师需要系统学习。由浅入深地对嵌入式物联网技术以及Linux平台全面掌握,能够独立胜任物联网开发、嵌入式Linux应用开发、5G周边产品开发、底层系统开发、设备驱动开发、从终端到云技术开发以及Linux衍生产品等多方面工作。可以更加系统的了解嵌入式物联网相关行业知识。具体所学知识包括:1.嵌入式C语言高级编程及行业应用2.各常用数据结构与算法相关知识,以及面向接口的编程3.GUI图形库应用开发技术4.Linux操作系统使用5.Linux系统编程6.Linux系统网络编程7.Linux网络路由及数据交换技术8.嵌入式数据库9.嵌入式C++语言编程,以及面向模板库的应用开发10.OpenCV、OpenGL等图像处理11.AI模型训练及场景定位识别应用12.RFID场景应用13.zigbee低功耗网络技术14.Bluebooth组网技术15.MQTT云平台搭建技术16.NB-IOT各大云平台通信技术17.基于5G技术的嵌入式物联网行业应用18.ARM体系结构19.Bootloader启动过程20.常见Bootloader源码及平台移植21.嵌入式Linux内核裁减以及移植 22.嵌入式Linux平台搭建技术及技巧

Ⅳ MQTT和Websocket的区别是什么

简单回答一下, MQTT ( MQ Telemetry Transport ) 是针对物联网而设计的, 如手机对家里的智能开关, 而 WebSocket 是针对浏览器与服务器之间而设计的. 两者基本上是两个世界的东西.

MQTT 只是一个接口, 让两个 "物件" 能够透过 TCP 协议通讯, 但并没有规定(在应用层面上)通讯中要怎样"对答", 如 pop3 邮件服务器会有:
S: 220 我是 xxx 服务器

C: HELO myServer
S: 250 Nice to meet you
C: auth login
....
这些是没有硬性被定义的, 两个 "物件" 之间要怎么"聊天", 由你自己来定.

WebSocket 则是一个 http 协议中的伸延 (先这麼理解吧!), 而 http 协议, 基本上就是一个请求, 一个回答, 然后就自动挂线, 客端和服务器端不会婆婆妈妈. 但即使就前面说的, 一问一答, 当中便有大量的 header 字串来往, 如果要处理串流这样大的数据再 + 一大堆 header, 这样就是很庞大的负担, websocket 就开了这个婆妈之门, 客端和服务器端可以以 full plex 的形式做大量 binary 的数据传输, 决省了一大堆 header, 其中一些安全机制也保证了大堆资料不被搞乱. 但无论如何, WebSocket 离不开 HTTP!!!

以上, 只是很概念的说法, 便于你理解, 详细你得自己翻下文献了.

Ⅵ 如何在windows上用C语言实现MQTT协议

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

Ⅶ 3. MQTT简要介绍

——

[1.MQTT项目工程](https://github.com/LiamBindle/MQTT-C)

[2.MQTT API说明文档](https://liambindle.ca/MQTT-C/group__api.html)

[3.MQTT协议中文版](https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introction.html)

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

MQTT协议通过交换预定义的MQTT控制报文来通信。

报文格式: 固定包头+可变包头+payload。

固定包头: 由两个字节组成

                byte1 高四位表示控制报文的类型,低四位表示控制报文类型的标志位。

                byte2表示剩余长度,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

可变包头:

                某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标(Packet Identifier)字段存在于在多个类型的报文里。

有效载荷:

                对于PUBLISH来说有效载荷就是应用消息。

——1. 网络建立连接后,客户端发送的第一个报文必须是CONNECT报文

——2. 客户端只能发送一次CONNECT 报文,发送两次会当作协议违规处理,并断开连接。

——3. 有效载荷包括:客户端唯一标识符,will主题,will消息,用户名和密码。

——4.可变包头:协议名(protocol name)+协议级别(protocol level)+连接标志(connect flags)+保持连接(keep alive)。

——5. 协议名: MQTT的UTF-8编码的字符串。(MSB+LSB +MQTT 六个字节)

——6. 协议级别:一个字节

——7. 连接标志:一个字节,包含一些用于指定MQTT连接行为的参数。同时还指出有效载荷中的字段是否存在。服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。

——8. 清理会话:byte8 的bit1位标志。

        这个二进制位指定了会话状态的处理方式。客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输。这个标志位用于控

       制会话状态的生存时间。

        标志设置为0:服务端必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信。

        标志设置为1:客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。会话仅持续和网络连接同样长的时间。

——9. 遗嘱标志 WILL FLAG: byte8的bit2位标志。

        遗嘱标志(Will Flag)被设置为1,表示如果连接请求被接受了,遗嘱(Will Message)消息必须被存储在服务端并且与这个网络连接关联。之后网络连接关闭时,服务端必须发布这个遗嘱消息,除非服务端收到DISCONNECT报文时删除了这个遗嘱消息。

服务端发送CONNACK报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第一个报文必须是CONNACK。

如果客户端在合理的时间内没有收到服务端的CONNACK报文,客户端应该关闭网络连接。合理 的时间取决于应用的类型和通信基础设施。

CONNACK报文没有有效载荷。

PUBLISH控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。

固定包头:

注意byte1的bit3为重发标志DUP。

如果DUP标志被设置为0,表示这是客户端或服务端第一次请求发送这个PUBLISH报文。如果DUP标志被设置为1,表示这可能是一个早前报文请求的重发。

服务端发送PUBLISH报文给订阅者时,收到(入站)的PUBLISH报文的DUP标志的值不会被传播。发送(出站)的PUBLISH报文与收到(入站)的PUBLISH报文中的DUP标志是独立设置的,它的值必须单独的根据发送(出站)的PUBLISH报文是否是一个重发来确定。

可变包头:

主题名 :topic name

报文标识符 :packet identitfier。

有效载荷 :有效载荷包含将被发布的应用消息。数据的内容和格式是应用特定的。有效载荷的长度这样计算:用固定报头中的剩余长度字段的值减去可变报头的长度。包含零长度有效载荷的PUBLISH报文是合法的。

响应:PUBLISH报文的接收者必须按照根据PUBLISH报文中的QoS等级发送响应。

PUBACK报文是对QoS 1等级的PUBLISH报文的响应。

PUBACK报文没有有效载荷。

PUBREC报文是对QoS等级2的PUBLISH报文的响应。它是QoS 2等级协议交换的第二个报文。

PUBREC报文没有有效载荷。

PUBREL报文是对PUBREC报文的响应。它是QoS 2等级协议交换的第三个报文。

PUBREL报文没有有效载荷。

PUBCOMP报文是对PUBREL报文的响应。它是QoS 2等级协议交换的第四个也是最后一个报文。

PUBCOMP报文没有有效载荷。

客户端向服务端发送 SUBSCRIBE 报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文给客户端。SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端。

有效载荷:

SUBSCRIBE报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。SUBSCRIBE报文的有效载荷必须包含至少一对主题过滤器 和 QoS等级字段组合。没有有效载荷的SUBSCRIBE报文是违反协议的。

响应:

服务端收到客户端发送的一个SUBSCRIBE报文时,必须使用SUBACK报文响应,SUBACK报文必须和等待确认的SUBSCRIBE报文有相同的报文标识符。

服务端发送SUBACK报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文。SUBACK报文包含一个返回码清单,它们指定了SUBSCRIBE请求的每个订阅被授予的最大QoS等级。

有效载荷:

有效载荷包含一个返回码清单。每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同。

客户端发送UNSUBSCRIBE报文给服务端,用于取消订阅主题。

有效载荷 :

UNSUBSCRIBE报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。

UNSUBSCRIBE报文中的主题过滤器必须是连续打包的、按照定义的UTF-8编码字符串 

UNSUBSCRIBE报文的有效载荷必须至少包含一个消息过滤器。没有有效载荷的UNSUBSCRIBE报文是违反协议的。

响应:

UNSUBSCRIBE报文提供的主题过滤器(无论是否包含通配符)必须与服务端持有的这个客 户端的当前主题过滤器集合逐个字符比较。如果有任何过滤器完全匹配,那么它(服务端)自己的订阅将被删除,否则不会有进一步的处理。

如果服务端删除了一个订阅:

——它必须停止分发任何新消息给这个客户端 []。

——它必须完成分发任何已经开始往客户端发送的QoS 1和QoS 2的消息 []。

——它可以继续发送任何现存的准备分发给客户端的缓存消息。

            服务端必须发送UNSUBACK报文响应客户端的UNSUBSCRIBE请求。UNSUBACK报文必须包含和UNSUBSCRIBE报文相同的报文标识符 。即使没有删除任何主题订阅,服务端也必须发送一个UNSUBACK响应 。

            如果服务端收到包含多个主题过滤器的UNSUBSCRIBE报文,它必须如同收到了一系列的多个UNSUBSCRIBE报文一样处理那个报文,除了将它们的响应合并到一个单独的UNSUBACK报文外。 

服务端发送UNSUBACK报文给客户端用于确认收到UNSUBSCRIBE报文。

UNSUBACK报文没有有效载荷。

客户端发送PINGREQ报文给服务端的。用于:

1. 在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。

2. 请求服务端发送 响应确认它还活着。

3. 使用网络以确认网络连接没有断开。

保持连接(Keep Alive)处理中用到这个报文。

——PINGREQ报文没有可变报头。

——PINGREQ报文没有有效载荷。

响应:

服务端必须发送 PINGRESP报文响应客户端的PINGREQ报文。

服务端发送PINGRESP报文响应客户端的PINGREQ报文。表示服务端还活着。

保持连接(Keep Alive)处理中用到这个报文。

PINGRESP报文没有可变报头。

PINGRESP报文没有有效载荷。

DISCONNECT报文是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。

DISCONNECT报文没有可变报头。

DISCONNECT报文没有有效载荷。

响应:

客户端发送DISCONNECT报文之后:

—— 必须关闭网络连接 [MQTT-3.14.4-1]。

——不能通过那个网络连接再发送任何控制报文。

服务端在收到DISCONNECT报文时:

——必须丢弃任何与当前连接关联的未发布的遗嘱消息。

——应该关闭网络连接,如果客户端 还没有这么做。

为了提供服务质量保证,客户端和服务端有必要存储会话状态。在整个会话期间,客户端和服务端都必须存储会话状态 。会话必须至少持续和它的活跃网络连接同样长的时间。服务端的保留消息不是会话状态的组成部分。服务端应该保留那种消息直到客户端删除它。

MQTT协议要求基础传输层能够提供有序的、可靠的、双向传输(从客户端到服务端 和从服务端到客户端)的字节流。

无连接的网络传输协议如UDP是不支持的,因为他们可能会丢失数据包或对数据包重排序。

MQTT按照这里定义的服务质量 (QoS) 等级分发应用消息。分发协议是对称的,在下面的描述中,客户端和服务端既可以是发送者也可以是接收者。分发协议关注的是从单个发送者到单个接收者的应用消息。服务端分发应用消息给多个客户端时,每个客户端独立处理。分发给客户端的出站应用消息和入站应用消息的QoS等级可能是不同的。

qos0:最多分发一次

qos1:至少分发一次

qos2:仅分发一次

客户端设置清理会话(CleanSession)标志为0重连时,客户端和服务端必须使用原始的报文标识符重发任何未确认的PUBLISH报文(如果QoS>0)和PUBREL报文 [MQTT-4.4.0-1]。这是唯一要求客户端或服务端重发消息的情况。

服务端接管入站应用消息的所有权时,它必须将消息添加到订阅匹配的客户端的会话状态。正常情况下,客户端收到发送给它的订阅的消息。客户端也可能收到不是与它的订阅精确匹配的消息。如果服务端自动给客户端分配了一个订阅,可能发生这种情况。正在处理UBSUBSCRIBE请求时也可能收到消息。客户端必须按照可用的服务质量(QoS)规则确认它收到的任何PUBLISH报文,不管它选择是否处理报文包含的应用消息 。

实现本章定义的协议流程时,客户端必须遵循下列规则:

重发任何之前的PUBLISH报文时,必须按原始PUBLISH报文的发送顺序重发(适用于QoS 1和QoS 2消息)[MQTT-4.6.0-1]。

——必须按照对应的PUBLISH报文的顺序发送PUBACK报文(QoS 1消息)。

——必须按照对应的PUBLISH报文的顺序发送PUBREC报文(QoS 2消息。

——必须按照对应的PUBREC报文的顺序发送PUBREL报文(QoS 2消息)。

服务端必须默认认为每个主题都是有序的。它可以提供一个管理功能或其它机制,以允许将一个或多个主题当作是无序的 。

服务端处理发送给有序主题的消息时,必须按照上面的规则将消息分发给每个订阅者。此外,它必须按照从客户端收到的顺序发送PUBLISH报文给消费者(对相同的主题和QoS)。

斜杠(‘/’ U+002F)用于分割主题的每个层级,为主题名提供一个分层结构.

数字标志(‘#’ U+0023)是用于匹配主题中任意层级的通配符。

加号 (‘+’ U+002B) 是只能用于单个主题层级匹配的通配符。

服务端不能将 $ 字符开头的主题名匹配通配符 (#或+) 开头的主题过滤器.

$SYS/ 被广泛用作包含服务器特定信息或控制接口的主题的前缀。

应用不能使用 $ 字符开头的主题。

订阅 “#” 的客户端不会收到任何发布到以 “$” 开头主题的消息。

订阅 “+/monitor/Clients” 的客户端不会收到任何发布到 “$SYS/monitor/Clients” 的消息。

订阅 “$SYS/#” 的客户端会收到发布到以 “$SYS/” 开头主题的消息。

订阅 “$SYS/monitor/+” 的客户端会收到发布到 “$SYS/monitor/Clients” 主题的消息。

如果客户端想同时接受以 “$SYS/” 开头主题的消息和不以 $ 开头主题的消息,它需要同

时订阅 “#” 和 ““$SYS/#”。

除非另有说明,如果服务端或客户端遇到了协议违规的行为,它必须关闭传输这个协议违规控制报文的网络连接.

MQTT方案通常部署在不安全的通信环境中。在这种情况下,协议实现通常需要提供这些机制:

——用户和设备身份认证

——服务端资源访问授权

——MQTT控制报文和内嵌应用数据的完整性校验

——MQTT控制报文和内嵌应用数据的隐私控制

作为传输层协议,MQTT仅关注消息传输,提供合适的安全功能是实现者的责任。使用TLS[RFC5246] 是比较普遍的选择。

广泛采用高级加密标准 [AES] 数据加密标准 [DES] 。

推荐使用为受限的低端设备特别优化过的轻量级加密国际标准 ISO 29192 [ISO29192] 。

如果MQTT在WebSocket [RFC6455] 连接上传输,必须满足下面的条件:

——MQTT控制报文必须使用WebSocket二进制数据帧发送。如果收到任何其它类型的数据帧,接收者必须关闭网络连接 。

——单个WebSocket数据帧可以包含多个或者部分MQTT报文。接收者不能假设MQTT控制报文按WebSocket帧边界对齐 。

——客户端必须将字符串 mqtt 包含在它提供的WebSocket子协议列表里 。

——服务端选择和返回的WebSocket子协议名必须是  。

——用于连接客户端和服务器的WebSocket URI对MQTT协议没有任何影响。

MQTT规范定义了MQTT客户端实现和MQTT服务端实现的一致性要求

MQTT实现可以同时是MQTT客户端和MQTT服务端。接受入站连接和建立到其它服务端的出站连接的服务端必须同时符合MQTT客户端和MQTT服务端的要求 。

为了与任何其它的一致性实现交互操作,一致性实现不能要求使用在本规范之外定义的任何扩展 。

附录:

控制报文类型

byte1:标志位flags:

Ⅷ 关于mosquitto怎么用c语言实现消息的订阅和发送(mqtt)

1.目标:测试Mosquitto使用MQTT协议发消息的相关性能指标,包含发送速度,并发负载能力,资源占用,消息到达率。
2.MQTT协议简介:
1).建立长连接。客户端发起请求和服务端建立长连接,建立成功后,服务端会返回ACK(CONNACK)
2).客户端订阅:客户端发起订阅,订阅成功后,服务端会返回ACK(SUBACK)
3).发消息:发布者会给服务端发消息,服务端在把消息给合适的客户端。
Qos=0(服务质量):客户端消息收到后,不会发出ACK给服务端(PUBACK)。
Qos =1:服务端会发ACK给发布者,客户端收到消息后会发ACK给服务端。
4).取消订阅:客户端发起取消订阅,服务端返回ACK(UNSUBACK)
5)Pingreq&Pingresp:客户端和服务端会保持心跳。
3.存在问题:
1. 如何模拟出40W的用户
2. 如何长连接,订阅,发消息,取消订阅,Pingreq行为如何实现。
4. python开源库 Mosquitto.py,解决所有问题
1. 模拟40W用户
a)可以使用虚拟机和Mosquitto.py实现,具体为:一般一台虚拟机最多是6W+的模拟数据(需要修改句柄数,我使用5W),方法是Client_id可以简单的做出5W个来,然后调用Mosquitto里面的connect方法,建立长连接。准备8台虚拟机就可以实现40W客户端的模拟
2.行为的模拟
a)订阅:Mosquitto.subscribe / 发消息:Mosquitto.publish / 取消订阅:Mosquitto.unsubscribe。 简单一句话 Mosquitto库实现所有的行为.
5. 指标:发送速度,到达率,并发负载,资源占用。
a. 发送速度:服务端日志记录,分析解决
b. 到达率: 1.客户端记录下收到消息,分析计算。2.计算服务端收到的PUBACK(客户端收到消息返回的ACK),进行计算
c. 并发负载:5W 用户不断增加,注意观察服务端的负载情况。
e.资源占用:其实主要是cpu/mem/带宽:cpu多核的话需要观察top命令下的_id字段, mem可以观察free -h命令的剩余mem, 带宽可以使用mpstat进行观察
6. 可以遇见问题:
a. 模拟客户端的虚拟机需要修改句柄数才能支持5W的客户端模拟数量
b. 要先吃透MQTT协议的流程,吃透了进行测试会非常的方便
c. Clear session,设置为true则不为客户端保留休息,设置为false保留消息。其实就是客户端离线后在连接上可以收到之前推出的消息。

Ⅸ 物联网工程师需要学习什么技术

物联网工程师需要掌握:物联网产业与技术导论、物联网工程概论、、Java程序设计、单片机原理及应用、无线传感网络概论、移动通信技术、蜂窝物联网技术等技术。

物联网是基于互联网、广播电视网、传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络又称为物联网域名。

物联网理念最早可追溯到比尔·盖茨1995年《未来之路》一书。在《未来之路》中,比尔·盖茨已经提及物互联,只是当时受限于无线网络、硬件及传感设备的发展,并未引起重视。


(9)c语言mqtt扩展阅读:

物联网专业毕业生需掌握的知识与技能:

1、掌握和计算机科学与技术相关的基本理论知识;掌握物联网工程的分析和设计的基本方法。

2、了解文献检索、资料查询的基本方法,具有一定的科学研究和实际工作能力。

3、了解与物联网工程有关的法规。

4、能够运用学习知识和外文阅读能力查阅外文资料。

5、掌握文献检索、资料查询的基本方法,具有获取信息的能力。

参考资料来源:网络—物联网工程专业