在蓝牙mesh1.0中,设备发出的unprovisioned beacon中有一个可选的字段URI hash,这个设计
的意图是什么呢?该如何应用?
关于URI的用法
首先,URI的全称为Uniform Resource Indicator,即统一资源标识,好像这样的翻译有点生硬和奇怪。但是目前对此也没有更好的一个词语来替代它了。
说到作用,我们可以从Mesh Spec的8.4.2章看出,就是让provisoner知道现在这个unprovisoned beacon是什么东西,灯?插座?
这个值是如何计算的,从Mesh Spec可知:
URI Hash = s1(URI Data)[0-3]
结合Spec的8.4.2就可以很清楚了,但是至于这个s1的算法,目前还找不到我也不建议去找,因为意义不大。
说到应用,我们只需要将这个URI data填充进mesh beacon包中即可,接下来就交给mesh协议栈去处理了
希望以上的回答能帮到你
感谢你的回复,非常的感谢!
目前,还是对统一资源标识符,这其中的资源到底是什么含义搞不清楚,仅仅粗略的知道,资源并不仅仅是指设备本身,可以是各种形式,可以是文件,可以是一个名字,等等,这个资源用一个字符串来命名,但是必须按照一定的规范来命名, 这就是统一资源标识符,
在mesh设备编程的时候,如果想让provisioner能对自己的某些性能进行配置,就自己定义一个资源的名字,一个字符串,然后,变换成URI hash ,放到unprovisioned beacon中,provisioner要能够解析这个hash值,并还原出来这个字符串,就是资源的名字,然后到自己的资源库中去查找,看看该如何配置它,然后调用对应的程序完成配置
这个用法,就给某些具有特殊资源的设备,一个特别的配置方法!!!!
在nordic提供的例子中,用了URI来标识了不同的设备,比如:URI for LS Client example" "URI for Dimming Client example" ,在provisioner中,根据这个标识符,就能知道这是什么设备,设备中应该有什么模型,然后,就按不同的程序来配置设备
如果,不是有没URI,那么provisioner就要去查composition data,才能知道这个设备有什么模型,就比较复杂了,在nordic的provisoneer例子中,用URI 完成不同设备的配置,但是不具备实际的意义 ,仅仅演示是可以的。
jxingl 从Mesh Spec中看,这个URI Hash域是可选的,至于这个URI是什么内容,你可以参考Core Specification Supplement (CSS) v6 or later,而表示的具体内容就如你所说形态各异,文字,名字,某个文件等等,应该世间万物都可以被表示
重新理解URI的用法
在设备开通配置阶段,为了能够识别不同设备独特的资源,这里的资源可以暂时理解成它拥有不同于其他设备的模型,公匙,输入输出等,我们需要一个字符串来标识它,为了做到在蓝牙通讯这个范围内的通用性,其他的设备看到这个标识符的时候能够认识它, 解析它,采用了统一资源标识符的概念
统一资源标识符是SIG专门定义的一个字符串,被称为一个代码点,也就是说它由多个
unicode构成,用这样的一个专门定义的字符串去表示另外的一个字符串,比如一个统一资源标识符的例子:
#define URI_SCHEME_EXAMPLE "\xb9" /**< URI Scheme code point for "example:". */
这里的"\xb9"就是所有的蓝牙设备都能解析的一个统一资源标识符,它被翻译成"example:".
当我们需要一个字符串来标识设备的资源的时候,这个字符串其实是有两个部分构成的:统一资源标识符 + 作为参数的字符串
举个例子:
一个灯,在nordic的例子中,想用一个字符串来标识它,
“example:URI for LS Client exampl”, 那么,为了能够让其他设备能够解析它,我们通常不会把这个字符串发出去,而是变换成:"\xb9"“URI for LS Client exampl”
任意长度的字符串都可以变换成4个字节的hash值,这样就把unprovisioned beacon的字节数固定下来了
当接收设备,比如provisioner收到beacon,并把hash值变换回对应的字符串,根据字符串中的"\xb9",就能解析这是一个作为例子的设备,后面的字符串就是这个设备的标识符
因此,当provisioner知道这个是一个client的设备的时候,而且这个设备中仅仅有一个onoff client模型的时候,就可以根据onoff模型的ID对这个模型进行配置,根据我们期望的那样的配置方式来配置它
这就是URI在设备provision时的应用
结论:
在mesh1.0中,unprovisoned beacon中引入URI字段,其主要的目的是为了能够对千差万别的设备实现配置,以实现互操作性
因为设备都具有不同的资源特点,可以采用不同的统一资源标识符进行标识
所谓的资源,可以理解成不同的设备中部署了不同的模型 ,这是其中的一个意思,还有别的意思,有待进一步的理解
正是因为统一资源标识符中,有了标准的代码点,所以,provisioner中可以根据这个代码点去对设备进行配置,这是一个标准的处理程序,可以确保各个厂家设备的兼容性
完成了设备的配置,URI信息就没有用了。
jxingl 真大佬