通信协议 订阅
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。 展开全文
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
信息
外文名
Communication Protocol
中文名
通信协议
通信协议定义
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。 在计算机通信中,通信协议用于实现计算机与网络连接之间的标准,网络如果没有统一的通信协议,电脑之间的信息传递就无法识别。 通信协议是指通信各方事前约定的通信规则,可以简单地理解为各计算机之间进行相互会话所使用的共同语言。两台计算机在进行通信时,必须使用的通信协议。
收起全文
精华内容
下载资源
问答
  • 充电桩BMS通信协议

    2018-09-04 14:46:22
    直流充电桩最新BMS通信协议,发布与2015年,2016之后售卖的新能源车都已更新为最新BMS通信协议
  • 北斗2.1通信协议

    2016-09-20 17:15:22
    北斗通信协议2.1版本
  • 计算机网络协议——通信协议综述

    万次阅读 多人点赞 2019-09-03 23:20:58
    通信协议综述概述一、为什么学习网络协议1.1 常见的网络协议二、网络分层的真正含义2.1 为什么网络要分层?2.2 浏览点击请求过程2.3 揭秘层与层之间的关系三、ifconfig 命令行的由来3.1 ip地址3.2 无类型域间选路...

    这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,绝对物超所值,本文就是对自己学习专栏的总结,评论区可以留下你的问题,咱们一起讨论!


    概述

    本文也是根据专栏里的板块,对通信网络协议做一个综述,共分为四节去进行介绍;

    • 为什么学习网络协议?
    • 网络协议分层的真正含义;
    • ifconfig命令行的背后;
    • DHCP和PXE:ip的由来;

    一、为什么学习网络协议

    协议

    协议的三要素是:语法、语义、顺序
    连通互联网世界,只教给一台电脑做什么是不够的,需要教会一大片机器做什么,这就是网络协议。只有通过网络协议,才能够使得一大片机器互相协作、共同完成一件事。

    1.1 常见的网络协议

    采用一个下单购物的场景,看看整个过程运用了哪些网络协议。


    首先,在浏览器中输入一个网址www.taobao.com URL,浏览器只知道名字是www.taobao.com,但是不知道具体的地点,所以不知道该如何访问;

    于是,打开地址簿去查找,可以使用一般的地址簿DNS去查找,也可以采用更为精确的地址簿查找协议HTTPDNS

    无论哪一种查找,最后都会得到一个地址:106.114.134.24(任意赋值),这个是IP地址,相当于你在互联网世界中的“门牌号”。知道了目标地址,浏览器开始打包他们的请求。对于普通的浏览请求,往往会采用HTTP协议;但是对于购物的请求,往往需要进行加密传输,因而使用HTTPS协议。无论是什么协议,里面都会声明“你要买什么和买多少”。HTTP头中包含了请求的信息:

    HTTP
    DNS、HTTP、HTTPS所在的层为应用层;


    经过封装以后,浏览器会将应用层的包交给下一层去完成,然后通过socket编程来实现。下一层是传输层,传输层有两种协议:

    • 无连接的协议UDP
    • 面向连接的协议TCP

    对于支付来说,往往采用TCP协议,所谓的面向连接就是,TCP会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达;TCP协议中有两个端口,一个是浏览器监听的端口,一个是电商服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程;
    TCP协议


    传输层封装完之后,浏览器会将包交给操作系统的网络层。网络层的协议是IP协议,在IP协议里面会有源IP地址,即浏览器的所在的机器的IP地址和目标IP地址,也就是电商所在的IP地址
    IP地址
    目标IP就是电商地址的门牌号,操作系统知道了目的地的门牌号,就要想着该如何找到目的地;

    首先先判断,目的地是在本地还是在外地;电商系统一般都在那遥远的地方,就比如你到国外要去海关一样,去外地就要经过网关。操作系统启动以后,就会被DHCP协议配置IP地址,以及默认的网关IP地址192.168.1.1;

    如果是本地通信就是靠吼——ARP协议,操作系统大吼一声,谁是192.168.1.1啊?网关会回答它,我就是。这个本地地址就是MAC地址,吼靠的就是ARP协议;

    IP包

    于是操作系统将IP包交给了下一层,也就是MAC层。网卡再将包发出去,包里面包含MAC地址,因此可以到达网关。网关收到包以后,会根据自己的知识,判断下一步该怎么走。网关往往是一个路由器,到了某个IP地址应该怎么走,这个叫作路由表

    路由器就像唐僧西天取经路过的一个个国家之间的城关,每个城关都连接着两个国家,每一个国家都相当于一个局域网,每个国家的内部都可以使用MAC地址进行通信;

    一旦跨越城关,就需要拿出IP头来,里面记录着IP源地址(东土大唐),欲前往西天拜佛取经(目的IP地址),路过宝地,借宿一晚,请问接下来该如何走?
    在这里插入图片描述
    城关与城关之间的沟通协议叫做路由协议,常用的由OSPF和BGP

    城关与城关之间是一个国家,网络包知道了要去哪个城关的时候,还是要使用国家内部的MAC地址,通过下一个城关的MAC地址,找到下一个城关,然后在问下一步该怎么走,一直走到最后一个城关。最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标IP啊?目标服务器就会回复一个MAC地址。网络包过关后,通过这个MAC地址就能找到目标服务器;


    目标服务器发现MAC地址对上了以后,取下MAC头来,发送给操作系统的网络层,发现IP地址对上了,在取下IP头。IP头里会写上一层封装的TCP协议,然后交给传输层,即TCP层

    在这一层中,对于收到的每个包,都会有一个回复说明收到了。这个回复的包绝非这次单次请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是TCP层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安,防止在传输过程中造成的丢包等。

    如果过一段时间还没有收到的话,发的端TCP层会重新发送这个包,还是上面的请求,直到收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次。对于浏览器来讲,就发送了一次下单请求,TCP层不断自己闷头重试。除非TCP这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

    当网络包平安到达TCP层之后,TCP头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个Tomcat,将这个包发给电商网站。

    电商网站的进程得到的是HTTP请求知道要买什么东西,买多少。往往一个电商网站最初接待请求的这个Tomcat只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。

    如何告诉相关的进程呢?往往通过RPC调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由RPC框架统一处理。RPC框架有很多种,有基于HTTP协议放在HTTP的报文里面的,有直接封装在TCP报文里面的。

    当接待员发现相应的部门都处理完毕,就回复一个HTTPS的包,告知下单成功。这个HTTPS的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功;

    看到这里相信你对于自己之前学过的计算机网络知识有一个连串的感觉了吧,很多公司的面试题都会问在浏览器中输入一个URL的整个过程? 把这一连串说完,相信你的面试官也会觉得你学的很扎实;
    网络协议

    二、网络分层的真正含义

    计算机网络知识点需要背诵,但是更是要理解透彻;

    2.1 为什么网络要分层?

    因为不同层次之间有不同的沟通方式,叫做协议。就像一家公司也是分“层次”,分为总经理、经理、组长、员工,每个人之间都有不同的沟通方式;

    因为复杂的程序都要分层,想象网络包就是一段Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去;

    当然网络包的格式很复杂,这个程序也很复杂,复杂的程序都要分层,这是程序设计的要求。

    2.2 浏览点击请求过程

    浏览点击请求过程如下所示:
    在这里插入图片描述
    在这里插入图片描述
    假设你发现这个包的MAC地址和你的相符,那说明就是发给你的,于是需要调用process_layer3(buffer):这个时候,Buffer里面往往就没有二层的头了,因为已经在上一个函数的处理过程中拿掉了,或者将开始的偏移量移动了一下。在这个函数里面,摘掉三层的头,看看到底是发送给自己的,还是希望自己转发出去的;

    如果IP地址不是自己的,那就应该转发出去;如果IP地址是自己的,那就是发给自己的。根据IP头里面的标识,拿掉三层的头,进行下一层的处理,到底是调用process_tcp(buffer)呢,还是调用process_udp(buffer)呢?

    假设地址是TCP,就会调用process_tcp(Buffer)。这时候,Buffer里面没有三层的头,就需要查看四层的头,看这是一个发起,还是一个应答,又或者是一个正常的数据包,然后分别由不同的逻辑进行处理。如果是发起或者应答,接下来可能要发送一个回复包;如果是一个正常的数据包,就需要交给上层了。交给谁呢?是不是有**process_http(buffer)**函数呢?

    如果你是一个网络包处理程序,你不需要有process_http(buffer),而是应该交给应用去处理。交给哪个应用呢?在四层的头里面有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口,那你发给浏览器就行了。至于浏览器怎么处理,和你没有关系;

    浏览器是解析HTML,显示出页面来。当你再次点击鼠标,点击动作被浏览器捕获,于是浏览器知道又会发起另一个HTTP请求了,于是使用端口号,将请求发送给你。

    你应该调用send_tcp(buffer)。不用说,Buffer里面就是HTTP请求的内容。这个函数里面加一个TCP的头,记录下源端口号。浏览器会给你目的端口号,一般为80端口;

    然后调用send_layer3(buffer)。Buffer里面已经有了HTTP的头和内容,以及TCP的头。在这个函数里面加一个IP的头,记录下源IP的地址和目标IP的地址;随后调用send_layer2(buffer),**Buffer里面已经有了HTTP的头和内容、TCP的头,以及IP的头。这个函数里面要加一下MAC的头,记录下源MAC地址,得到的就是本机器的MAC地址和目标的MAC地址。**不过,这个还要看当前知道不知道,知道就直接加上;不知道的话,就要通过一定的协议处理过程,找到MAC地址。反正要填一个,不能空着;

    2.3 揭秘层与层之间的关系

    现实生活中,往往是员工说一句,组长补充两句,然后经理补充两句,最后总经理再补充两句。但是在网络世界,应该是总经理说话,经理补充两句,组长补充两句,员工再补充两句。

    TCP在三次握手时,TCP每一个消息都会带着IP层和MAC层。因为,TCP每次发送一个消息,IP层和MAC层的所有机制都要重新运行一次,所以TCP在三次握手时,IP和MAC也运行了好久。

    只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层;如果一个HTTP协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,它都是完整的。所谓的二层设备、三层设备只是跑在设备上的程序不同;

    • 二层设备:只把MAC头摘下来,看看到底是丢弃、转发,还是自己留着;
    • 三层设备:把MAC头摘下来之后,再把IP头摘下来,看看到底是丢弃、转发,还是自己留着;

    三、ifconfig 命令行的由来

    ifconfig是linux系统中查询ip地址的一个命令,windows是ipconfig;

    3.1 ip地址

    IP地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号。
    例如:10.100.122.2就是一个IP地址,地址被分为四个部分,每个部分8个bit,所以IP地址总共是32位;

    IP地址被分成了5类,A-E类
    IP地址
    在网络地址中,A、B、C类主要分为两个部分,前一部分是网络号,后一部分是主机号。大家都是六单元1001号,你是小区A的,我是小区B的;

    ip地址范围

    3.2 无类型域间选路(CIDR)

    无类型域间选路,简称CIDR,将IP地址一分为二,前面是网络号,后面是主机号。10.100.122.2/24,这个IP地址中有一个斜杠,斜杠后面有个数字24,这种地址表示形式,就是CIDR,后面24的意思是,32位中,前24位是网络号,后8位是主机号。

    伴随着CIDR存在的,一个是广播地址,10.100.122.125,如果发送这个地址,所有10.100.122网络内的机器都可以收到,另一个是子网掩码,255.255.255.0

    将子网掩码和IP地址按位计算AND,就可以得到网络号,那么上面的ip地址与子网掩码按位取AND,网络号就是10.100.122.0;(1和任意数值取AND,值不变;0和任意数值取AND,即为0);

    3.3 公有IP地址和私有IP地址

    在这里插入图片描述
    平时我们在办公室、学校、家里的IP地址,一般都是私有IP地址,因为这些地址,允许组织内部的IP地址自己管理、自己分配,因此可以重复。就比如你们学校可能由六单元一号,我们学校可能也有六单元1号。

    但是,一旦离开学校就需要使用公有IP地址,就像上海市南京西路88号,这个是国家同统一分配的。公有IP地址,由相关的组织去分配,如果使用,需要购买。

    192.168.0.x,是最常见的私有IP地址,家里有wifi,对应就有一个ip地址,但是一般家庭中的上网设备不会超过256个,所以/24基本就够用了。

    举例:CIDR中容易犯错的点
    16.158.165.91/22,这个CIDR,求网络中的第一个地址、子网掩码和广播地址
    16.158的部分不会动,它占了前16位。中间的165,变为二进制为‭10100101‬。除了前面的16位,还剩6位。所以,这8位中前6位是网络号,16.158.<101001>,而**<01>.91是机器号**;所以第一个地址是16.158.<101001><00>.1,即16.158.164.1,子网掩码是255.255.<111111><00>.0,即255.255.252.0,广播地址是16.158.<101001><11>.255,即16.158.167.255.

    这五类地址中,还有一类D类是组播地址,使用这一类地址,属于某个组的机器都能够收到,这就有点类似于公司中大家加入了一个邮件组,发送邮件,加入这个组的大家都能收到;

    IP地址的后面有个scope对于eth0这张网卡来讲,是global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于lo来讲,是host,说明这张网卡仅仅可以供本机相互通信;

    lo又被称为loopback,又称环回接口,往往会被分配到127.0.0.1这个地址,这个地址可以用于本机通信,经过内核处理以后直接返回,不会在任何网络中出现;

    3.4 MAC地址

    在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为MAC地址,是一个网卡的物理地址,用十六进制,6个byte表示。既然已经知道了MAC地址,是不是意味着直接可以通过MAC地址进行通信啊?

    个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的IP地址,才是有远程定位功能的。

    比如:你要去某某大学某某学院找小明,你在路上问,有些人不知道某某学院,但是可以给你说某某学校在哪里,但是你直接根据 小明的身份证号 问别人知不知道他在哪个学院,那么肯定没人知道;

    MAC地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识

    MAC地址是有一定的定位功能的,你可以根据ip地址找到某某学校某某学院某号楼某个实验室,当你到了以后,大吼一声,小明 是哪位,那么他听到了 就会回应你;

    MAC地址的通信范围比较小,局限在一个子网里面。例如,从192.168.0.2/24访问192.168.0.3/24是可以用MAC地址的。一旦跨子网,即从192.168.0.2/24到192.168.1.2/24,MAC地址就不行了,需要IP地址起作用了

    总结:

    • ip是地址,有定位功能;MAC是身份证,无定位功能;
    • CIDR可以用来判断是不是本地人;
    • IP分为公有地址IP和私有地址IP

    四、DHCP和PXE:ip的由来

    只要是在网络上跑的包可以有下层没上层,但是不可以有上层没下层;当一个数据包有自己的ip地址,有目的地的ip地址,但是包发不出去的原因是因为,MAC层还没有填写。

    Linux的默认逻辑是,如果是一个跨网段的调用,它便不会将包直接发送到网络上,而是企图将包发送到网关。网关要和当前的网络至少一个网卡是同一个网段;

    4.1 动态主机配置协议(DHCP)

    动态主机配置协议(Dynamic Host Configuration Protocol),简称DHCP

    有了这个协议,网络管理员就轻松多了。他只需要配置一段共享的IP地址。每一台新接入的机器都通过DHCP协议,来这个共享的IP地址里申请,然后自动配置好就可以了。等人走了,或者用完了,还回去,这样其他的机器也能用。

    如果是数据中心里面的服务器,IP一旦配置好,基本不会变,这就相当于买房自己装修。DHCP的方式就相当于租房。你不用装修,都是帮你配置好的。你暂时用一下,用完退租就可以了。

    4.2 解析DHCP的工作方式

    当一台机器加入一个新的网络的时候,只知道自己的mac地址,先吼一句,有人吗?这一步就是DHCP Discover

    新来的机器使用IP地址0.0.0.0发送了一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,UDP封装了BOOTP。其实DHCP是BOOTP的增强版,但是如果你去抓包的话,很可能看到的名称还是BOOTP协议;

    在这个广播包里,新人喊一句:我是新来的(Boot request),我的MAC地址是多少,但是我还没有ip地址,谁能给我一个?
    在这里插入图片描述
    网络管理员在网络配置了DHCP server,就相当于IP管理员,MAC地址是其唯一的身份。只有MAC地址唯一,IP管理员才能知道这是一个新人,需要租给它一个新的IP地址,这个过程就是DHCP Offer.

    DHCP Offer格式如下:
    里面会有给新人分配的地址;
    DHCP Offer
    DHCP Server仍然使用广播地址作为目的地址。如果同时收到多个IP地址,那么会选择最先到达的DHCP Offer,并且会向网络发送一个DHCP Request广播数据包,其中包含客户端的MAC地址、接受的租约中的IP地址,提供租约的DHCP服务器地址等,并且告诉所有的DHCP Offer,它将接受哪一台服务器所提供的IP地址,感谢其他DHCP服务器,并且请求撤销他们提供的ip地址,以便提供给下一个租用者。

    在这里插入图片描述
    由于还没有收到DHCP server的最后确认,客户端依然使用自己的源ip地址0.0.0.0、255.255.255.255为目标地址进行广播。在BOOTP里面,接受某个DHCP Server的分配 ip;

    当DHCP Server接收到客户机的DHCP request之后,会广播返回给客户机的一个DHCP ACK消息包,表明已经接受客户机的选择,并且将这一IP地址合法租用信息和其他的配置信息都放到该广播包中,发送给客户机,欢迎它加入网络大家庭;

    在这里插入图片描述
    租约达成以后,还是要广播一下,让大家都知道呢

    ip地址的收回和续租

    如果需要续租的话,需要提前租期的50%,客户机会在租期过去50%的时候,直接向为其提供ip地址的DHCP Server发送DHCP Request消息包,客户机收到该服务器的DHCP ACK消息包之后,会根据包中提供的新的租期,以及其他的已经更新的TCP/IP参数更新自己的配置,这样,ip的租用更新就已经完成了。

    网络管理员不仅能自动分配IP地址,还能帮你自动安装操作系统;

    4.3 预启动执行环境(PXE)

    普通的笔记本一般不会有这种雪球,已经预装好了操作系统。但是数据中心的管理员,可能一下子拿到了几百台空的机器,一台一台装就累死了。

    管理员们不仅希望可以分配好ip地址,还可以自动安装系统,装好系统之后会自动分配IP地址,直接启动最好了。

    安装操作系统的过程,只能插在BIOS启动之后了。因为没安装系统之前,连启动扇区都没有。因而这个过程叫做预启动执行环境(Pre-boot Execution Environment),简称PXE。

    默认的DHCP Server是需要配置的,无非是我们配置IP的时候所需要的IP地址段、子网掩码、网关地址、租期等。如果想使用PXE,则需要配置next-server,指向PXE服务器的地址,另外要配置初始启动文件filename。

    这样PXE客户端启动之后,发送DHCP请求之后,除了能得到一个IP地址,还可以知道PXE服务器在哪里,也可以知道如何从PXE服务器上下载某个文件,去初始化操作系统。

    解析PXE的工作过程

    首先是启动PXE客户端第一步是通过DHCP协议告诉DHCP Server,我啥都没有,DHCP Server便租给它一个ip地址,同时给他PXE服务器的地址、启动文件pexlinux.0;

    其次,PXE客户端知道要去PXE服务器下载这个文件后,就可以初始化机器。于是便开始下载,下载的时候使用的是TFTP协议。所以PXE服务器上,往往还需要有一个TFTP服务器。PXE客户端向TFTP服务器请求下载这个文件,TFTP服务器说好啊,于是就将这个文件传给它;

    然后,PXE客户端收到这个文件后,就开始执行这个文件。这个文件会指示PXE客户端,向TFTP服务器请求计算机的配置信息pxelinux.cfg。TFTP服务器会给PXE客户端一个配置文件,里面会说内核在哪里、initramfs在哪里。PXE客户端会请求这些文件;

    最后,启动Linux内核,一旦启动了操作系统,啥都好办。

    在这里插入图片描述

    总结


    本文是对通信协议综述的总结,共分为四节去介绍:

    1. 为什么学习网络协议?
      通过一个简简单单的下单过程,中间牵扯到这么多的协议,展开介绍;

    2. 网络协议分层的真正含义
      始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;
      始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层;

    3. ifconfig命令行的背后;
      IP是地址,有定位功能;MAC是身份证,无定位功能;
      CIDR可以用来判断是不是本地人;
      IP分公有的IP和私有的IP。后面的章节中我会谈到“出国门”,就与这个有关。

    4. DHCP和PXE:ip的由来;
      DHCP协议主要是用来给客户租用IP地址,和房产中介很像,要商谈、签约、续租,广播还不能“抢单”;
      DHCP协议能给客户推荐“装修队”PXE,能够安装操作系统,这个在云计算领域大有用处;

    展开全文
  • 关于电力行业的那些通信协议(376.1/376.2/376.3/645/698)
  • 一款常用的DLT/645规约 1997/2007通信协议调试器,非常适合车间生产与技术调试用。 其中, DLT645-1997_2007多功能电能表通信协议调试器2012-02-07发行.rar 包含: DLT645-1997_2007多功能电能表通信协议调试器...
  • 1 “通信”与“通讯”傻傻分得清 传统意义上的“通讯”主要指电话、电报、电传。通讯的“讯”指消息(Message),媒体讯息通过通讯网络从一端传递到另外一端。媒体讯息的内容主要是话音、文字、图片和视频图像。其...

    1  “通信”与“通讯”傻傻分得清

    传统意义上的“通讯”主要指电话、电报、电传。通讯的“讯”指消息(Message),媒体讯息通过通讯网络从一端传递到另外一端。媒体讯息的内容主要是话音、文字、图片和视频图像。其网络的构成主要由电子设备系统和无线电系统构成,传输和处理的信号是模拟的。所以,“通讯”一词应特指采用电报、电话、网络等媒体传输系统实现上述媒体信息传输的过程。“通讯”重在内容形式,因此通讯协议主要集中在ISO七层协议中的应用层。

    “通信”仅指数据通信,即通过计算机网络系统和数据通信系统实现数据的端到端传输。通信的“信”指的是信息(Information),信息的载体是二进制的数据,数据则是可以用来表达传统媒体形式的信息,如声音、图像、动画等。“通信”重在传输手段或使用方式,从这个角度,“通信”的概念包括了信息“传输”。因此通信协议主要集中在ISO七层协议中的物理层、数据链路层、网络层和传输层。

    在物联网应用中,通信技术包括Wi-Fi、RFID、NFC、ZigBee、Bluetooth、LoRa、NB-IoT、GSM、GPRS、3/4/5G网络、Ethernet、RS232、RS485、USB等。

    相关的通信协议(协议栈、技术标准)包括Wi-Fi(IEEE 802.11b)、RFID、NFC、ZigBee、Bluetooth、LoRa、NB-IoT、CDMA/TDMA、TCP/IP、WCDMA、TD-SCDMA、TD-LTE、FDD-LTE、TCP/IP、HTTP等。注:3GPP将5G技术标准制定分为两个阶段,原计划中第一阶段的标准将在2018年底作为R15的一部分公布,将仅针对NR。第二阶段的标准将在2019年底作为R16的一部分,包括整个5G架构(包括核心网络)。

    物联网技术框架体系中所使用到的通讯协议主要有:AMQP、JMS、REST、HTTP/HTTPS、COAP、DDS 、MQTT等。

    2 通讯协议

    2.1  HTTP/HTTPS

    一、HTTP

    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

    HTTP协议的主要特点可概括如下:

    (1)支持客户/服务器模式。

    (2)简单快速。客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    (3)灵活。HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    (4)无连接。无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    (5)无状态。HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    二、HTTPS

    HTTPS(Hypertext TransferProtocol over Secure Socket Layer,基于SSL的HTTP协议)使用了HTTP协议,但HTTPS使用不同于HTTP协议的默认端口及一个加密、身份验证层(HTTP与TCP之间)。这个协议的最初研发由网景公司进行,提供了身份验证与加密通信方法,现在它被广泛用于互联网上安全敏感的通信。

    客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。

    (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

    (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

    (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

    (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

    (5)Web服务器利用自己的私钥解密出会话密钥。

    (6)Web服务器利用会话密钥加密与客户端之间的通信。

    2.2  WebService/REST

    首先说明下,WebService和REST都不是一种协议,他们是基于HTTP/HTTPS的一种技术方式或风格,之所以放在这里,是因为在物联网应用服务对外接口方式常采用WebService和RESTful API。

     

    一、WebService

    WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

    XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。

    (1)XML+XSD

    WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。

    XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。

    (2)SOAP

    WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。

    SOAP协议 = HTTP协议 + XML数据格式

    SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的高速公路。

    (3)WSDL

    好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。

    WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。

    WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

    二、REST

    REST (Representational State Transfer),表征状态转换,是基于HTTP 协议开发的一种通信风格,目前还不是标准。

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

    (1)REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful;

    (2)客户端和服务器之间的交互在请求之间是无状态的;

    (3)在服务器端,应用程序状态和功能可以分为各种资源,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态;

    (4)使用的是标准的HTTP方法,比如GET、PUT、POST 和DELETE。

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

    2.3  CoAP 协议

    CoAP (Constrained Application Protocol),受限应用协议,应用于无线传感网中协议。

    适用范围:CoAP 是简化了HTTP 协议的RESTfulAPI,CoAP 是6LowPAN 协议栈中的应用层协议,它适用于在资源受限的通信的IP 网络。它有以下特点:

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

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

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

    (4)支持异步通信。HTTP 对M2M(Machine-to-Machine)通信不适用,这是由于事务总是由客户端发起。而CoAP 协议支持异步通信,这对M2M 通信应用来说是常见的休眠/唤醒机制。

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

    (6)支持缓存。CoAP 协议支持资源描述的缓存以优化其性能。

     

    CoAP协议主要实现:

    (1)libcoap(C 语言实现)

    (2)Californium(java 语言实现)

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

    2.4  MQTT 协议(低带宽)

    MQTT (Message Queuing Telemetry Transport ),消息队列遥测传输,由IBM 开发的即时通讯协议,相比来说比较适合物联网场景的通讯协议。MQTT 协议采用发布/订阅模式,所有的物联网终端都通过TCP 连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与设备之间消息的转发。

    MQTT 在协议设计时就考虑到不同设备的计算性能的差异,所以所有的协议都是采用二进制格式编解码,并且编解码格式都非常易于开发和实现。最小的数据包只有2个字节,对于低功耗低速网络也有很好的适应性。有非常完善的QOS 机制,根据业务场景可以选择最多一次、至少一次、刚好一次三种消息送达模式。运行在TCP 协议之上,同时支持TLS(TCP+SSL)协议,并且由于所有数据通信都经过云端,安全性得到了较好地保障。

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

    它具有以下特点:

    (1)使用基于代理的发布/订阅消息模式,提供一对多的消息发布;

    (2)使用TCP/IP 提供网络连接;

    (3)小型传输,开销很小(固定长度的头部是2 字节),协议交换最小化,以降低网络流量;

    (4)支持QoS,有三种消息发布服务质量:“至多一次”, “至少一次”, “只有一次”。

    协议主要实现和应用:

    (1)已经有PHP,JAVA,Python,C,C#等多个语言版本的协议框架;

    (2)IBM Bluemix 的一个重要部分是其IoTFoundation 服务,这是一项基于云的MQTT实例;

    (3)移动应用程序也早就开始使用MQTT,如Facebook Messenger 和com 等。

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

    2.5  DDS 协议(高可靠性、实时)

    DDS(Data Distribution Service for Real-Time Systems),面向实时系统的数据分布服务,这是大名鼎鼎的OMG 组织提出的协议,其权威性应该能证明该协议的未来应用前景。

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

    它具有以下特点:

    (1)以数据为中心;

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

    (3)提供多大21 种QoS服务质量策略。

    协议主要实现:

    (1)OpenDDS 是一个开源的C++ 实现;

    (2)OpenSplice DDS;

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

    2.6  AMQP 协议(互操作性)

    AMQP(Advanced Message Queuing Protocol),先进消息队列协议,这是OASIS 组织提出的,该组织曾提出OSLC(Open Source Lifecyle)标准,用于业务系统例如PLM,ERP,MES等进行数据交换。

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

    它有以下特点:

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

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

    协议实现:

    (1)Erlang 中的实现有RabbitMQ

    (2)AMQP 的开源实现,用C 语言编写OpenAMQ

    (3)Apache Qpid

    (4)stormMQ

    2.7  XMPP 协议(即时通信)

    XMPP(Extensible Messaging and Presence Protocol)可扩展通讯和表示协议,XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF 国际标准组织完成了标准化工作。

    适用范围:即时通信的应用程序,还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。

    它有以下特点:

    (1)客户机/服务器通信模式;

    (2)分布式网络;

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

    (4)标准通用标记语言的子集XML的数据格式。

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

    2.8  JMS (JavaMessage Service)

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

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

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

    2.9 通讯协议比较

     

    展开全文
  • 各种通信协议整理

    万次阅读 多人点赞 2020-07-02 10:19:35
    无论是做硬件还是软件,每天都在接触一些通信相关的名词,若不认真整理这些概念,就很可能会混淆或忘记具体的含义与区别,因为最近正好在做项目用到了SPI协议传输数据,接下来我打算整理一下各种通信协议的区别。...

    一个做嵌入式的工程师,无论是做硬件还是软件,每天都在接触一些通信相关的名词,若不认真整理这些概念,就很可能会混淆或忘记具体的含义与区别,因为最近正好在做项目用到了SPI协议传输数据,接下来我打算整理一下各种通信协议的区别。

    目录

    一、串行通信与并行通信的概念

    1、串行通信

    2、并行通信

    二、UART

    三、TTL电平

    1、标准TTL电平逻辑

    2、CMOS电平

    四、RS-232

    1、RS-232电平逻辑

    2、D型9针接口定义

    3、USB转RS-232

    4、TTL和RS-232互转

    五、RS-485

    1、RS-485电平逻辑

    2、TTL和RS-485转换

    3、RS-232和RS-485转换

    六、USB

    1、USB速率

    2、USB接口定义

    七、CAN总线

    1、CAN电平逻辑

    八、I2C

    九、SPI


    一、串行通信与并行通信的概念

    1、串行通信

    串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。串口可以算是一个泛称,一般指代的是串口时序标准。UART、RS232、RS485、TTL都遵循着类似的通信时序协议,因此都被通称为串口。

    串行通信(serial communication)是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。串行通信按照发送时钟源和接收时钟源是否需要保持一致,又可分为同步通信异步通信两种。参考链接:异步串行通讯和同步串行通讯区别_CSDN-MarkYang-CSDN博客

    在这里插入图片描述

    2、并行通信

    并行通信(Parallel communication)就是指数据的每一位同时在多根数据线上发送或者接收。可以以字或字节为单位并行进行。并行通信速度快,但用的通信线多、成本高,故不宜进行远距离通信。计算机或PLC各种内部总线就是以并行方式传送数据的。

    在这里插入图片描述

    总结:串行通信是一种概念,是指一个bit一个bit的收发数据,相对于并行通信可一次性可以同时收发n个bit而言。包括普通的串口通信,包括IIC,包括SPI等等。串口通信是一种通信手段/方式,是相对于以太网方式、红外方式、蓝牙方式、usb方式(usb广义也算串行通信)等而言,是一种比较低级的通信手段。


    二、UART

    UART(Universal Asynchronous Receiver/Transmitter),意为通用异步收发传输器,该总线双向通信,可以实现全双工传输和接收。UART包含TTL电平的串口和RS-232电平的串口,使用UART通信的双方设备都需要遵从UART协议。

    UART是串行通信的一种,重点是异步,和同步相对应,意思是不需要同步的时钟,通信两端预先约定bit的传输速率(每秒传多少bit),而不是由时钟触发的。

    在嵌入式设计中,UART用于主机与辅助设备通信。UART是实现串口收发的逻辑电路(硬件形式),这部分可以独立成芯片,也可以作为模块嵌入到其他芯片里,单片机、SOC、PC里都会有UART模块,例如STM32单片机里有两种UART模块,USART和UART,前者可以同步通信,而后者只能异步通信。一般电脑是没有uart接口的(ttl电平),我们可以通过电脑的usb接口和单片机通信,只需一个usb转串口模块插到usb接口上,装上驱动,另一边接单片机即可。有很多可以usb协议转为串口协议的芯片,如ch340,cp2102,pl2303等。
    1、TX -- 数据发送接口
    2、RX -- 数据接受接口
    两个设备间将TX与RX相连,RX与TX相连即可正常工作。


    三、TTL电平

    TTL是Transistor-Transistor Logic的简写,是一种电平逻辑,晶体管-晶体管逻辑。通常我们采用二进制来表示数据,为了表示二进制,需要用高低电平表示这些二进制数,3.3V/5V等价于逻辑“1”,0V等价于逻辑“0”。UART特指单片机的UART端口,使用的就是TTL电平。嵌入式里面说的串口,一般是指UART口,而TTL、RS-232、RS-485是指的电平标准(电信号)。

    1、标准TTL电平逻辑

    输出电路:电压大于等于(≥)2.4V为逻辑1;电压小于等于(≤)0.8V为逻辑0;
    输入电路:电压大于等于(≥)2.0V为逻辑1;电压小于等于(≤)1.2V为逻辑0;

    2、CMOS电平

    输出电路:电压大于等于(≥)0.9×Vcc为逻辑1;电压小于等于(≤)0.1×Vcc为逻辑0;
    输入电路:电压大于等于(≥)0.7×Vcc为逻辑1;电压小于等于(≤)0.3×Vcc为逻辑0;


    四、RS-232

    RS-232接口符合美国电子工业联盟(EIA)制定的串行数据通信的接口标准,全双工,其中 RS 为英文 “Recomend Standard” 的缩写,中文翻译为“推荐标准”,232为标识号。原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接,连接电缆和机械、电气特性、信号功能及传送过程,其输出的电平称为 RS232 电平。

    1、RS-232电平逻辑

    RS-232不同于TTL的电平逻辑,为负逻辑,最简单的RS232通信由三条数据线组成,即 TxD、RxD 和GND。负12V代表高电平,即-15V ~ -3V为逻辑1,正12V代表低电平,即+3V ~ +15V为逻辑0,电压也有标准范围。这里的电平,是TXD线(或者RXD线)相对于 GND 的电压。

    2、D型9针接口定义

    记住一点,这种接口的协议只有两种:RS-232和RS-485。不会是TTL电平的(除非特殊应用)。

    一般用的最多的是RXD、TXD、GND,三个信号。

    9针串口的定义可以参考这里:9针串口定义 - 百度文库

    3、USB转RS-232

    USB转232,可以先将USB转换为TTL,再将TTL转换为RS232,市面上也有很多USB直接转RS232的线材,线材内部集成转换电路,下图为USB转RS-232串口:

    在这里插入图片描述

    4、TTL和RS-232互转

    在实际中由于需要,有时候会要将TTL电平转化为RS232电平,有时候也会要将RS232电平转化为TTL电平,因为单片机接口一般是TTL电平,如果需要接232电平的外设,就需要加TTL转RS232的模块,转换方向是双向的。能实现TTL和RS232电平互相转换最常用的芯片是MX232。框图如下


    五、RS-485

    RS-485和RS-232一样,都是串行通信标准,现在的标准名称是TIA/EIA-485-A,习惯称为RS-485标准,半双工,使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。RS-485使得廉价本地网络以及多支路通信链路的配置成为可能,而且增加了联网功能。

    1、RS-485电平逻辑

    RS-485和RS-232单端传输不一样,是差分传输,使用一对双绞线,其中一根线定义为A,另一个定义为B,一般收发器内部是一个发送器加一个收发器组成。对于使能信号,字母上面加一横的为低电平有效,不加的为高电平有效。逻辑“1”以两线间的电压差为+(2 ~ 6)V表示;逻辑“0”以两线间的电压差为-(2 ~ 6)V表示,使能端起作用和其他状态时为高阻态。

    2、TTL和RS-485转换

    TTL转成RS-485很常见,收发器芯片市面上很多,比如MAX485,用起来也很简单,一般左边接MCU的GPIO,用来控制。

    3、RS-232和RS-485转换

    RS-232和RS-485之间可以转换,一个方法是RS-232转换成TTL,再由TTL转换为RS-485,当然也有芯片支持将RS-232支持转换成RS-485,双向转换。


    六、USB

    USB是Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术,USB接口的特点是传输速度快,支持热插拔,可连接多个设备。

    一条USB传输线分别由地线、电源线、D+和D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500mA(可以在编程中设置)。USB设备可以直接和HOST通信,或者通过Hub和Host通信。一个USB系统中仅有一个USB 主机,设备包括USB功能设备和USB HUB,最多支持127个设备。物理连接指的是USB传输线。在USB 2.0系统中要求使用屏蔽双绞线。

    1、USB速率

            USB1.0:低速模式(low speed):传输速率为1.5Mbps;
            USB1.1:全速模式(full speed):传输速率为12Mbps;
            USB2.0:向下兼容,高速模式(high speed):25~480Mbps;
            USB3.0:向下兼容,(super speed):理论上最高达5Gbps,实际中,也就是high speed 的10倍左右;                                     

            USB3.1:Gen2 超高速(SuperSpeed+)传输速率为 10Gbps。

    2、USB接口定义

    常见的Type-A型USB接口定义如下。

    pin#Name颜色
    1VBUS/+5V红色
    2D-/DM白色
    3D+/DP绿色
    4GND黑色

    在这里插入图片描述

     USB是普遍使用的一种高速通信接口,和串口完全是两个概念。虽然也是串行方式通信,但由于USB的通信时序和逻辑电平标准都和串口完全不同,因此和串口无关。USB是高速的通信接口,用于PC连接各种外设,U盘、键鼠、移动硬盘、当然也包括“USB转串口”的模块。参考链接:USB协议基本知识_u010142953的博客-CSDN博客_usb协议栈


    七、CAN总线

    CAN是Controller Area Network的简称,是一种有效支持分布式控制或实时控制的串行通信网络,现在是汽车网络的标准协议。参考链接:CAN总线入门(硬件部分)_记得诚-CSDN博客

    1、CAN电平逻辑

    显性电平:逻辑0       典型值 CAN_H = 3.5V,CAN_L = 1.5V;

    隐性电平:逻辑1       典型值 CAN_H = 2.5V,CAN_L = 2.5V;

    总结:TTL电平一般用于芯片与芯片之间的通信;RS232采用了正负逻辑电平,提高线路的抗干扰性最远可以达到15米左右;如果更远的距离会采样RS485,它使用两线制的差分信号传输,最远可至1200米;RS232全双工只支持点对点通讯(1:1),RS485半双工单双工支持总线形式通讯(1:N)。当我们在做电路工作时,应该注意下外设的串口是Uart类型的还是RS232类型的,如果不匹配,应当找个转换线(通常这根转换线内有块类似于Max232的芯片做电平转换工作的),不能盲目地将两串口相连。

    1、RS232、RS-485最终结果都是转换为TTL电平方式与单片机通信(CAN收发器把差分信号转化为TTL-->CAN控制器(MCU))。其目的都是提高通信质量,提高抗干扰能力。

    2、TTL、RS232是逻辑电平信号。RS-485、CAN为差分信号


    八、I2C

    I2C总线是由Philips公司开发的一种简单、半双工、双向二线制同步串行总线。它只需要两根线(SDA、SCL)即可在连接于总线上的器件之间传送信息。同一时刻可以单主机多从机单主机单从机,I2C总线上的任意设备都可以当主机,一般主机是MCU,当有多个主机时,会通过总线仲裁的方式选出一个主机,其他退出作从机。

    Mode标准模式快速模式高速模式
    Rate100Kbit/s400Kbit/s3.4Mbit/s

    SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平。IIC参考资料:I2C 时序详解,精确到每一个时钟_谁de如花的博客-CSDN博客

    主机用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从机,在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从机,则主机首先寻址从机,然后主动发送数据至从机,最后由主机终止数据传送;如果主机要接收从机的数据,首先由主机寻址从机。然后主机接收从机发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。


    九、SPI

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,意为串行外围接口,是摩托罗拉首先在其MC68HCXX系列处理器上定义的,SPI是一种高速的,全双工,同步的通信总线,SPI的速率比I2C高,一般可以到几十Mbps,不同的器件当主机和当作从机的速率一般不同。SPI最典型的应用是单主机单从机,下图是接线方式,当然也可以多从机。

    SPI协议详细参考:SPI通信协议(SPI总线)学习 - 涛少& - 博客园

    展开全文
  • 自定义串口通信协议

    千次阅读 多人点赞 2020-05-28 22:24:46
    试设计一个通信协议,用于温度采集器与上位计算机的串行通信协议,可实现温度采集数据上传、上位机控制每路温度测量通的开启功能。 作业提交方式:文档,详细说明设计思路及具体协议格式。 题目分析 根据原题内容,...

    原题叙述

    有若干个温度采集器,每个温度采集器可实现8路温度的测量。试设计一个通信协议,用于温度采集器与上位计算机的串行通信协议,可实现温度采集数据上传、上位机控制每路温度测量通的开启功能。
    作业提交方式:文档,详细说明设计思路及具体协议格式。

    题目分析

    根据原题内容,可以按照如下步骤来实现:

    1. 选择硬件层通信协议
    2. 设计相应的通信协议,注意有多个传感器且有多路温度采集
    3. 编写相关的下位机程序
    4. 编写相关的上位机程序
    5. 测试通信协议收发机制
      按照上述的步骤内容,以下将分为四个章节来叙述。

    通信协议设计

    选择串口通信作为底层通信协议,故而需要设计基于串口的通信协议。

    数据帧格式定义

    表 3 1协议数据帧格式

    起始标志协议版本数据长度控制字符真实数据CRC32校验结束标志
    1Byte1Byte1Byte1Byte不定4Byte1Byte

    起始标志 协议版本 数据长度 控制字符 真实数据 CRC32校验 结束标志
    1Byte 1Byte 1Byte 1Byte 不定 4Byte 1Byte

    如上表 3 1所示即为数据帧的格式,现结合温度采样问题对具体数据叙述如下:

    1. 起始标志。协议数据帧开始的标志,保留字为0xFE。
    2. 协议版本。同其他设备通信时首要的一致性保证,此次为0x01,即第一版。
    3. 数据长度。表示当前数据包的大小。
    4. 控制字符。可以自定义,对于温度采样问题,该为温度采集器序号。
    5. 真实数据。发送的数据内容,对于温度采样问题,该为温度采样序号(1Byte)与温度真实数据,关于温度真实数据的换算如下式所示:
      T r = ( D a t a [ 1 ] ∗ 256 + D a t a [ 2 ] ) / 100 T_r=(Data[1]*256+Data[2])/100 Tr=(Data[1]256+Data[2])/100
      式中, Tr为实际温度值,为一浮点型数据
      Data为采集到的数据,在未进行转义时,应为3位,其中第一位表示温度采样序号,后两位为实际数据,计算如上式(从0开始)
    6. CRC32校验。根据前述数据所得的CRC32校验码。
    7. 结束标志。协议数据结束的标志,保留字为0xFF。

    保留字与转义问题

    数据打包时只有包头为0xFE,只有包尾为0xFF,对于其中的数据段若出现上述保留字,则应进行相关的转义处理:
    表 3 2 字符转义

    保留字0xFE START0xFF END0xFD ESC
    保留字符0xFDDE0xFDDF0xFDDD

    如上表所示,即为将相应的数据转义之后得到的数据,实际上是相关的数据与0x20作异或之后的结果。

    下位机程序

    基本简介

    使用STM32芯片作为MCU,并采用FreeRTOS嵌入式系统,编写了相关的协议收发函数,并新建了一个线程做相关的测试,测试内容如下:
    只有一个温度采集器,有三路温度测量数据。第一路为固定的11.11℃,第二路一开始为0℃,每隔1s增加0.01℃,第三路一开始为0℃,每隔1s减少0.01℃,即成负数。

    协议C文件

    /* include files *************************************************/
    #include "usart_protocol.h"
    
    
    /* System defines ***********************************************/
    #define Protocol_Version 0x01
    #define Start_Fram 0xFE
    #define End_Fram   0xFF
    static uint8_t start_Identi = Start_Fram;
    static uint8_t end_Identi   = End_Fram;
    uint8_t test = 0xfe;
    
    /* Protocol command value ***************************************/
    
    
    /* System global variable ***************************************/
    handle_uart_proto huart_proto; // Send status machine
    extern CRC_HandleTypeDef hcrc;
    
    
    /**
     * @brief init for the usart protocol
     * @param hproto handle of protocol
     */
    void usart_proto_init(handle_uart_proto* hproto)
    {
        hproto->Current = -1;
        hproto->Len = 0;
    }
    
    
    /**
     * @brief store a new data to the send status machine
     * @param hproto handle of the send status machine
     * @param Command the command data
     * @param Data the pointer to the real data
     * @param length the length of the real data
     * @return ok, error, full, overlength
     */
    UART_PROTO_StatusTypeDef usart_proto_store(handle_uart_proto* hproto,
        uint8_t Command, uint8_t* Data, uint8_t length)
    {
        uint8_t position;
        uint8_t DataPosition = 0;
        uint32_t crc_checkCode;
    
        // if thData[16]de status machine is full, return error
        if(hproto->Len >= MAX_LEN) return uart_proto_FULL;
        
        // if the data length is overlength, return error
        if(length > MAX_Data_LEN) return uart_proto_OVERLEN;
        
        /* Update the data status machine ***************************************/
        // Update the length and position of status machine
        hproto->Len ++;
        if(hproto->Current == (MAX_LEN-1))
            hproto->Current = 0;
        else
        {
            hproto->Current++;
            position = hproto->Current;
        }
        // Update the command data
        hproto->Command[position] = Command;
        // check for the escape character and store the position if any
        for(position=0; position<length; position++)
            if(Data[position]==0xFF || Data[position]==0xFE || Data[position] == 0xFD)
            {
                hproto->Data[hproto->Current][DataPosition] = 0xFD;
                DataPosition++;
                hproto->Data[hproto->Current][DataPosition] = Data[position]^0x20;
                DataPosition++;
            }
            else
            {
                hproto->Data[hproto->Current][DataPosition] = Data[position];
                DataPosition++;
            }
        // Calculate the crc check code
        crc_checkCode = HAL_CRC_Calculate(&hcrc, (uint32_t*)hproto->Data[hproto->Current],
            position/4+1);
        hproto->Data[hproto->Current][DataPosition] = crc_checkCode/0x1000000;
        DataPosition++;
        hproto->Data[hproto->Current][DataPosition] = crc_checkCode%0x1000000/0x10000;
        DataPosition++;
        hproto->Data[hproto->Current][DataPosition] = crc_checkCode%0x10000/0x100;
        DataPosition++;
        hproto->Data[hproto->Current][DataPosition] = crc_checkCode%0x100;
        DataPosition++;
        // Update the Data lenth;
        hproto->DataLength[hproto->Current] = DataPosition;
        
        return uart_proto_OK;
    }
    
    
    /**
     * @brief Send one data data package from the send status machine
     * @param hproto handle of protocol
     * @param huart handle of usart which will send the data
     * @return ok, error
     */
    UART_PROTO_StatusTypeDef usart_proto_sendOneData(handle_uart_proto* hproto,
        UART_HandleTypeDef* huart)
    {
        // Calculate the data package length. Include:
        // 1.Start Fram; 2.protocol version; 3.package length; 4.command data; 
        // 5.Real data; 6.crc data; 7.End Fram
        uint8_t length = 1 + 1 + 1 + hproto->DataLength[hproto->Current] + 1;
        uint8_t protocol_version = Protocol_Version;
        
        // if there is no data in the machine, return error
        if(hproto->Current == -1) return uart_proto_EMPTY;
    
        // 1.Send the start fram
        if(HAL_UART_Transmit(huart, &test, 1, 100)!=HAL_OK)
            return uart_proto_ERROR;
    
        // 2.Send the protocol version
        if(HAL_UART_Transmit(huart, &protocol_version, 1, 100)!=HAL_OK)
            return uart_proto_ERROR;
        
        // 3.Send the data length
        if(HAL_UART_Transmit(huart, &length, 1, 100)!=HAL_OK)
            return uart_proto_ERROR;
        
        // 4.Send the command data
        if(HAL_UART_Transmit(huart, &hproto->Command[hproto->Current], 1, 100)!=HAL_OK)
            return uart_proto_ERROR;
    
        // 5&6.Send the data AND CRC check code
        if(HAL_UART_Transmit(huart, hproto->Data[hproto->Current],
            hproto->DataLength[hproto->Current],100)!=HAL_OK)
            return uart_proto_ERROR;
    
        // 7.Send the end indentifiler
        if(HAL_UART_Transmit(huart, &end_Identi, 1, 100)!=HAL_OK)
            return uart_proto_ERROR;
        
        // Update the current position.
        hproto->Len--;
        if(hproto->Len == 0) hproto->Current = -1;
        else if (hproto->Current == 0) hproto->Current = MAX_LEN-1;
        else hproto->Current--;
    
        return uart_proto_OK;
    }
    

    协议头文件

    #ifndef __USART_PROTOCOL_H
    #define __USART_PROTOCOL_H
    
    #ifdef __cplusplus
     extern "C" {
    #endif
    
    
    /* include files *****************************************************/
    #include "main.h"
    
    /* System Define *****************************************************/
    #define MAX_LEN 10 // maximum length the send data length.
    #define MAX_Data_LEN 16 // maximum data length
    #define MAX_Data_Send_LEN 20 // contain the crc check code
    
    /* Command Data */
    #define Protocol_CMD_TEMP 0x01
    #define Protocol_CMD_TIME 0X02
    
    
    /* specified structure ***********************************************/
    /**
     * @brief status machine real status
     */
    typedef enum
    {
        uart_proto_OK      = 0x00U,
        uart_proto_ERROR   = 0x01U,
        uart_proto_FULL    = 0x02U,
        uart_proto_EMPTY   = 0x03U,
        uart_proto_OVERLEN = 0x04U
    } UART_PROTO_StatusTypeDef;
    
    /* This is the send status machine which store the data will be sent */
    typedef struct{
        uint8_t Len; // status machine data length
        int8_t Current; // current position
        uint8_t Command[MAX_LEN]; // store the command data
        uint8_t DataLength[MAX_LEN]; // store the data length
        uint8_t Data[MAX_LEN][MAX_Data_Send_LEN]; // store the pointer of real data
    }handle_uart_proto;
    
    
    /* function define ********************************************************/
    void usart_proto_init(handle_uart_proto* hproto);
    
    UART_PROTO_StatusTypeDef usart_proto_store(handle_uart_proto* hproto,
        uint8_t Command, uint8_t* Data, uint8_t length);
    
    UART_PROTO_StatusTypeDef usart_proto_sendOneData(handle_uart_proto* hproto,
        UART_HandleTypeDef* huart);
    
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    发送程序

    /* USER CODE BEGIN Header_StartTask_Test02 */
    /**
    * @brief Function implementing the myTask_Test02 thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_StartTask_Test02 */
    void StartTask_Test02(void *argument)
    {
      /* USER CODE BEGIN StartTask_Test02 */
      float temp[3] = {11.11, 0, 0};
      uint8_t TempData[3] = {0x01, 0x00, 0x00};
      uint8_t i;
      uint16_t temp_swap;
      /* Infinite loop */
      for(;;)
      {
        for(i=0;i<3;i++)
        {
          if(temp[i]>0) temp_swap = temp[i]*100;
          else temp_swap = temp[i]*100 + 0x10000;
          TempData[0] = i+1;
          TempData[1] = temp_swap/0x100;
          TempData[2] = temp_swap%0x100;
          usart_proto_store(&huart_proto, Protocol_CMD_TEMP, TempData, 3);
        }
        temp[1] += 0.1;
        temp[2] -= 0.1;
        osDelay(1000);
      }
      /* USER CODE END StartTask_Test02 */
    }
    

    上位机程序

    基本叙述

    采用自制的串口通信上位机,并新增了相关的协议处理功能。

    协议处理函数

    def Protocol_Receive(self, data):
        for c in data:
            if c == 0xfe:
                # if it is receiving now, it means that there is no end identifier, so return error!
                if self.protocol_status == Proto_Sta.Receiving:
                    self.protocol_status = Proto_Sta.Waiting
                    return -1  # error
                else:
                    self.protocol_status = Proto_Sta.Receiving
                    self.protocol_receiveLen = 1
            elif c == 0xff:
                # same error: get a end identifier when the machine is waiting
                if self.protocol_status == Proto_Sta.Waiting:
                    return -1
                else:
                    self.protocol_status = Proto_Sta.Waiting
                    print('version:', self.protocol_version)
                    print('length:', self.protocol_length)
                    print('command:', self.protocol_cmd)
                    print('data:', self.protocol_data)
                    print('crc:', self.protocol_crc)
                    self.Protocol_Deploy()
                    self.protocol_version = 0xff
                    self.protocol_receiveLen = 0
                    self.protocol_data = []
                    self.protocol_crc = []
                    self.protocol_cmd = 0xff
                    self.protocol_length = 0xff
            else:
                if self.protocol_status == Proto_Sta.Receiving:
                    if self.protocol_receiveLen == 1:
                        self.protocol_version = c
                        self.protocol_receiveLen += 1
                    elif self.protocol_receiveLen == 2:
                        self.protocol_length = c
                        self.protocol_receiveLen += 1
                    elif self.protocol_receiveLen == 3:
                        self.protocol_cmd = c
                        self.protocol_receiveLen += 1
                    elif 4 <= self.protocol_receiveLen <= self.protocol_length-5:
                        self.protocol_data.append(c)
                        self.protocol_receiveLen += 1
                    elif self.protocol_receiveLen > self.protocol_length-5:
                        self.protocol_crc.append(c)
                        self.protocol_receiveLen += 1
    
    def Protocol_Deploy(self):
        if self.protocol_version != 0x01:
            return -1
        # should add the crc check program here
        if self.protocol_cmd == 0x01:  # temperature
            number = self.protocol_data[0]
            temp = self.protocol_data[1]*256 + self.protocol_data[2]
            if temp >= 32768:
                temp = (temp - 65536)/100
            else:
                temp = temp/100
            if number == 1:
                self.lineEdit_Temp_1.setText(str(temp))
            elif number == 2:
                self.lineEdit_Temp_2.setText(str(temp))
            elif number == 3:
                self.lineEdit_Temp_3.setText(str(temp))
        if self.protocol_cmd == 0x02:  # date and time
            year = self.protocol_data[0]
            month = self.protocol_data[1]
            day = self.protocol_data[2]
            hour = self.protocol_data[3]
            minute = self.protocol_data[4]
            second = self.protocol_data[5]
    

    实验测试

    如下图所示,图6-1位下位机通信图,其中为自制的STM32通信板。图6-2为上位机通信图,为通过PYQT及PYSERIAL模块编写的上位机程序。
    附件中有相关的演示视频。
    在这里插入图片描述
    图 6 1 下位机通信实验
    在这里插入图片描述
    图 6 2上位机通信

    实验演示

    展开全文
  • 通信协议(一)

    万次阅读 2019-05-17 10:46:18
    4、 用于定义通信过程及细节规则的协议称为通信协议 通信系统之间为了完成通信所必须遵循的规则和约定 (数据包格式/字段的内容/字段的含义/发送的时间/接收的时间等细节) 所有通信系统之间通信,需要相同的协议 5...
  • CANopen的CiA301应用层和通信协议,中文版
  • 嵌入式的那些通信协议

    千次阅读 2019-06-14 20:08:13
    通用同步/异步串行接收/发送器,USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。 区别于UART,UART是通用异步收发传输器,USART属于UART的增强型,在异步传输时没有啥区别,...
  • 通信协议格式

    千次阅读 2019-03-26 14:32:03
    其中sioconnector基于socket.io,使用json作为其通信格式,hybridconnector则用于tcp/websocket的通信,它底层使用的是二进制协议。虽然在sioconnector中,socket.io的实现很好,对于超时、握手等都做了处理,并且...
  • 工业控制网络常用通信协议

    千次阅读 2020-06-17 09:47:32
    工业控制网络常用通信协议 工业控制网络常用通信协议............................................................................................. 1 1. 传统控制网络.........................................
  • RS485通信和Modbus通信协议汇总

    万次阅读 多人点赞 2018-08-06 16:31:21
    RS-485上的软件层协议ModBus主要依赖于主从模式。主从模式是指在半双工通讯方式上,2个或者2个以上的设备组成的通讯系统中: (1) 至少且只有一个主机,其他的都是从机 (2) 不管任何时候,从机都不能主动向主机发送...
  • 单片机各种通信协议详解

    万次阅读 多人点赞 2019-04-12 16:23:21
    一、IIC通信协议 ** (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由 NXP(原 PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个...
  • Http通信协议

    千次阅读 2018-12-12 11:32:50
    HTTP是一个基于TCP / IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。 HTTP是一个属于应用层的面向对象的协议,由于其简捷,快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与...
  • IoT—物联网通信协议解析

    千次阅读 2020-07-01 07:41:49
    摘要 随着物联网设备数量的持续增加,这些设备之间的通信或连接已成为一个重要的思考课题。 通信对物联网来说十分常用且关键...其中一些通信协议只适合小型家用电器,而其他一些通信协议则可以用于大型智慧城 市项目。
  • 物联网通信协议全解析

    千次阅读 2020-06-30 19:01:24
    来源:软件新视界、IoT科技物语随着物联网设备数量的持续增加,这些设备之间的通信或连接已成为一个重要的思考课题。通信对物联网来说十分常用且关键,无论是近距离无线传输技术还是移动通信技术,...
  • 光纤模块通信协议——FC协议

    热门讨论 2011-06-16 10:39:50
    光纤模块通信协议——FC协议 光纤模块通信协议——FC协议
  • 微服务:通信协议:Restful,RPC(Dubbo、Motan、gRPC)

    万次阅读 多人点赞 2019-08-22 15:32:37
    简介 在单体式应用中,各个模块之间的调用是通过编程语言级别的方法或者函数来实现的。 但是一个基于微服务的分布式... 因此,微服务必须使用进程内通信协议(如 HTTP、AMQP)或二进制协议(如 TCP)进行交互,...
  • 通信方式、通信接口、通信总线、通信协议的关系
  • Redis通信协议

    万次阅读 2019-07-02 23:25:08
    对于redis的通信协议基本上都没怎么留意过。了解相对底层的东西,有助于我们更好的使用redis以及排查错误。 2.redis通信协议的基本内容   协议,无外乎就是信息内容的格式要client和server端遵守的某种...
  • 自己动手写一个通信协议

    万次阅读 2019-01-21 17:44:05
    什么是通信协议 我们常用的聊天软件比如:微信,都是基于一组通信协议进行服务端与客户端数据交互。协议指的就是客户端与服务端事先约定好的,每个二进制数据包中,每一段字节分别代表什么含义的规则。如下图所示一...
  • 物联网通信协议(接入协议)

    千次阅读 2020-08-24 17:26:25
    RFID的空中接口通信协议规范基本决定了RFID的工作类型,RFID读写器和相应类型RFID标签之间的通讯规则,包括:频率、调制、位编码及命令集。ISO/IEC制定五种频段的空中接口协议。 【1】ISO/IEC 18000-1 【2】ISO/IEC ...
  • 西门子PLC各个通信协议解析,分析

    千次阅读 2021-04-17 16:08:18
    (1)低端PLC ,S7-200 ,支持的通信协议有这些 一、PPI通讯(点对点) PPI协议是专门为S7-200开发的通信协议。S7-200 CPU的通信口(Port0、Port1)支持PPI通信协议,S7-200的一些通信模块也支持PPI协议。Micro/...
  • 局域网中的通信协议及选择。

    千次阅读 2019-06-16 13:16:59
    局域网中一般使用NetBEUI、IPX/SPX和TCP/IP这3种协议。 NetBEUI协议 NetBEUI(NetBIOSExtendedUserInterface,用户扩展接口)由...议,所以它被称为微软所有产品中通信协议的“母语”。微软在其早期产品如DOS、 L...
  • RS232串口通信协议

    热门讨论 2011-05-21 10:52:05
    串口通讯协议,所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称...
  • 软件常用通信协议模板

    千次阅读 2019-04-11 10:17:31
    通信协议是软件的重要组成部分,是系统中软件交互信息的桥梁和标准。 我接触过的通信协议主要用于三种场合,对应三种形式的数据形式: 1)上位机和下位机各模块之间 这种场合下通常是通过串口或网口传输状态、控制、...
  • 如何自定义一个通信协议

    万次阅读 多人点赞 2018-01-21 14:07:27
    借鉴简单的OSI和TCP/IP通信模型来讨论如何自定义一个适应自己的通信协议 前言 经典的OSI七层模型 1TCPIP模型解析 11整体介绍 22数据链路层 23网络层 24传输层 25应用层 不同类型的通信方式的总结 1从上述模型...
  • 六种常用的物联网通信协议

    千次阅读 2020-07-02 17:52:25
    我们常用的物联网通信协议有很多种,它们具备着不同的性能、数据速率、覆盖范围、功率和内存,并且每一种协议都有着各自的有点和或多或少的缺点。其中一些通信协议只适合于小型家用电器,而一些协议则可以用于大型的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 781,456
精华内容 312,582
关键字:

通信协议