目前的智能家居行业使用解决方案众多,相互之间隔离严重,有WiFi、蓝牙、ZigBee、蜂窝或者有线等等不同通讯协议的设备。不仅不同协议之间的设备不能互通,而且连相同通讯协议之间的设备也不能互通。例如谷歌助手控制谷歌产品,亚马逊语音设备可以用于亚马逊的设备,苹果使用Siri来驱动其产品,而国内小米、阿里等物联网平台也都有自己的生态。而Matter协议就是为了解决这些兼容性问题而诞生的, 并且在2022年十月CSA(连接标准联盟)正式发布了Matter标准协议1.0版本。

Matter标准规范基于互联网协议,使智能物联网设备、移动应用程序和云服务能够进行通信并定义一组特定的基于 IP 的网络技术以进行设备认证。以经典的协议栈层级做类比,最底层是物理和媒介层,包括当前主流无线标准WiFi、Thread、Zigbee、BLE等;往上是网络层,包括IP协议;再往上为传输层,有TCP和UDP协议;最上层是应用层。Matter就设计在应用层,相当于创造了一个通用语言,使不同厂家、不同协议的产品可以彼此听懂对方的表达。智能物联网设备可以通过蓝牙加入到Matter网络中,通过整合Thread、Zigbee、BLE等协议实现互联,还能通过网桥连接到其他协议的设备,大大简化智能物联网设备商的开发成本、用户的使用成本以及安装落地的服务成本。
简单地说,Matter是一个综合了不同设备和生态系统的总体标准。这是一种开源标准,任何智能设备都可以采用它来创造更无缝的体验。通过Matter,可以购买任何兼容的智能家居设备,比如灯泡或门锁,并将其设置为可在任何平台上使用。换句话说,Matter将其他智能家居生态系统连接在一起,以便于在所有智能家居设备上使用。可以在任何智能家居生态系统中设置任何Matter支持的产品,从Apple Home Kit到谷歌Assistant、AmazonAlexa等等。
那Matter标准协议的诞生是不是用来替代其他的协议比如WiFi、蓝牙、ZigBee等协议呢?其实不是的,Matter是一个基于IPV6的上层协议,而底层协议就是基于现有的协议。从下图Matter协议的框架图可以看到,Matter协议的底层协议目前支持的有WiFi,Thread和以太网三种协议,而蓝牙是Matter标准规定的用来配网的协议。


Matter标准协议的分层如上图所示,最上层是应用层,最下层是基于IP的协议管理,下面分别对每一层做简单的介绍。
Application layer : 应用层 对应于设备的具体业务交互逻辑。例如一个灯的应用里面包含了开关、颜色调节等具体的特性。
Data Model layer: 数据模型层 对应于 支持应用功能的一些基础数据和元素模型。当需要有设备进行交互的时候,应用就会通过操作这些数据模型来实现。
Interaction Model layer: 交互模型层定义了一组在客户端和服务器设备之间执行的交互。 例如读取或写入服务器设备上的属性将对应于设备上的应用程序行为。 这些交互作用于数据模型层定义的元素。
Action Framing layer: 动作框架层 一旦使用交互模型层构造了一个动作,它就会被序列化为一个二进制的数据包,以便为网络传输进行编码传输。 此过程在动作框架层中处理。
Security Layer:上面编码后的数据需要经过安全层处理编码的动作帧:消息会被加密并附加消息验证码。 这些操作确保数据在消息的发送者和接收者之间传输是安全的,保证数据不会被篡改。
Message Framing + Routing: 通过上面的交互之后,现在的数据应是序列化、加密和签名,消息层使用必需和可选的标头字段构造有效负载格式,这些字段指定消息的属性以及逻辑路由信息。
IP Framing + Transport Management: 在消息层构建最终有效负载后,将其发送到底层传输协议(TCP 或Matter的消息可靠性协议)以对数据进行 IP 管理。
一旦在对等设备上接收到数据,它就会沿着协议栈向上传播,在协议栈中,各个层反转发送方对数据执行的操作,最终将消息传递给应用程序以供使用。
Matter 网络是基于IPV6的链路上架设的一种局域网协议,目前支持的链路层有Wifi、Threa、以太网这三种网络链路。Matter将网络视为一种开放的网络资源,所以Matter中并没有规定专有的网络所有权或访问权限。 因此,可以在同一组 IP 网络上覆盖多个 Matter 网络。
Matter底层不同通讯协议的设备之间如果需要互相通讯,则需要使用一个边界路由器来桥接。 Matter通过边界路由器实现网络内不同链路设备之间的互相通讯,例如WiFi设备和Thead设备之间的通讯。
如果Matter网络内的设备都是基于Thread链路,则Matter网络结构如下图:

如果Matter网络内的设备都是基于WiFi链路,则Matter网络结构如下图:

如果Matter网络内的设备有基于WiFi链路的也有基于Thread链路的,则需要使用一个边界路由器来桥接两种类型的设备。设备通过边界路由器来加入到网络中,通过边界路由器节点可以Thread设备可以与WiFi设备互相通讯以及进行设备之间的联动。Matter网络结构如下图: BR表示的就是边界路由器

Matter的愿景是很好的,希望打破目前智能家居不同设备之间割裂的局面,并且Matter智能家居协议在成立之初就承诺,使用Matter协议的设备将可以兼容Alexa、Google Home和HomeKit生态, 这也是各个巨头愿意大力支持Matter协议的原因之一。目前Matter的标准协议1.0已经发布,谷歌、亚马逊、苹果等巨头本身就是其中的重要成员并且已经率先开始支持。谷歌的安卓系统、苹果的IOS系统,后面都会支持Matter协议。 亚马逊的Alexa音箱也已经支持了Matter设备。所以目前各个巨头对Matter的支持和推动力度还是很大的,Matter的生态还是比较容易起来的。
当然,Matter目前也有一些缺点,其中最重要的一点就是价格较高。Matter产品价格较高的原因,主要有两个方面:
总体上讲,Matter的发展还是要依赖各个巨头的推动,巨头大力推动,积极接入,Matter前期的生态就比较容易起来,这时候其他的中小厂商就愿意跟进,毕竟做的设备可以直接接入Alexa、Google Home和HomeKit生态还是非常吸引人的。当然如果巨头不再推动Matter标准,那Matter的互联互通就基本没有意义了,厂商也不会为这个而花费更高的成本来开发Matter产品了。目前巨头对Matter的支持力度还是很大的,非常期待Matter能够打破智能家居的碎片化,实现真正的互联互通。
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or