在蓝牙mesh1.0中,设备发出的unprovisioned beacon中有一个可选的字段URI hash,这个设计
的意图是什么呢?该如何应用?

    首先,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 真大佬

            23 天后
            2 年后

            jxingl

            jxingl没有URI,那么provisioner就要去查composition data,才能知道这个设备有什么模型,就比较复杂了
            这个复杂在哪里呢?和通过URI知道设备是什么模型相比

              撰写回复...