• SIG MESH 问答
  • 关于节点(node)主动给配置者(provisioner)主动发送当前状态的问题

1.我的provisioner作为网关,节点为一盏灯,节点能够做到主动向provisioner发送当前的亮度等状态吗?(像是server主动给client上报状态,而非client使用get获取状态)
2.大概同样的问题是,作为provisioner,我是不是也可以订阅一个组播地址?
3.在一个设备中,我能否既作为配置者也作为节点?是不是无法做到?因为我在看另外一个帖子https://bbs.wireless-tech.cn/d/612-provisionernode/6看您的解答说配置者只能是configuration client

    darkerb 1.我的provisioner作为网关,节点为一盏灯,节点能够做到主动向provisioner发送当前的亮度等状态吗?(像是server主动给client上报状态,而非client使用get获取状态)

    可以啊,只要是入网了,所有节点都是平等的,你想发给谁都可以,即使它是Provisioner

    darkerb 2.大概同样的问题是,作为provisioner,我是不是也可以订阅一个组播地址?

    spec没有做出这样强制的规定,理论上只要你provisioner节点也有非configuration的Server模型,那是可以的。但是一般没看到有人这样做,你想要做的目的是啥?

    darkerb 在一个设备中,我能否既作为配置者也作为节点?是不是无法做到?因为我在看另外一个帖子https://bbs.wireless-tech.cn/d/612-provisionernode/6看您的解答说配置者只能是configuration client

    可能我的表达有误,理由同上。因为Provisioner仅仅是使用到了Configuration Client 来配置其他的节点,但是spec没有规定具有configuration client的节点不能拥有其他的模型。所以说如果只做为配置者,那只能是configuration client model.

      13 天后

      {
      "$schema":"file:\/\/\/BlueZ\/Mesh\/local_schema\/mesh.jsonschema",
      "meshName":"BT Mesh",
      "netKeys":[
      {
      "index":0,
      "keyRefresh":0
      }
      ],
      "appKeys":[
      {
      "index":0,
      "boundNetKey":0
      },
      {
      "index":1,
      "boundNetKey":0
      }
      ],
      "node":{
      "composition":{
      "cid":"0002",
      "pid":"0010",
      "vid":"0001",
      "crpl":"000a",
      "features":{
      "relay":false,
      "proxy":true,
      "friend":false,
      "lowPower":false
      },
      "elements":[
      {
      "elementIndex":0,
      "location":"0001",
      "models":[
      "0000",
      "0001",
      "1001"
      ]
      }
      ]
      },
      "configuration":{
      "netKeys":[
      0
      ],
      "appKeys":[
      0,
      1
      ],
      "defaultTTL":10,
      "elements":[
      {
      "elementIndex":0,
      "unicastAddress":"0077",
      "models":[
      {
      "modelId":"1001",
      "bind":[
      1
      ]
      }
      ]
      }
      ]
      },
      "IVindex":5,
      "IVupdate":0,
      "sequenceNumber":807
      }
      }

      感谢回复。
      上面的这段json数据是从bluez的meshctl中取出来的(运行平台为树莓派),可以看到这是树莓派作为provisioner的信息。其中的models中有000000011001。所以我作为provisioner也是可以既有configuration client也可以有configuration server嘛?

        darkerb 不是,你这个只是Provisioner存放包括节点的所有信息。

          1 个月后

          感谢回复,这个帖子过的时间有点久了,我现在有时间重新看这部分的内容之后,上面的json内容可能会有误解。我重新贴一下:

          {
          	"$schema":"file:\/\/\/BlueZ\/Mesh\/local_schema\/mesh.jsonschema",
          	"meshName":"BT Mesh",
          	"netKeys":[
          		{
          			"index":0,
          			"keyRefresh":0
          		}
          	],
          	"appKeys":[
          		{
          			"index":0,
          			"boundNetKey":0
          		},
          		{
          			"index":1,
          			"boundNetKey":0
          		}
          	],
          	"node":{
          		"composition":{
          			"cid":"0002",
          			"pid":"0010",
          			"vid":"0001",
          			"crpl":"000a",
          			"features":{
          				"relay":false,
          				"proxy":true,
          				"friend":false,
          				"lowPower":false
          			},
          			"elements":[
          				{
          					"elementIndex":0,
          					"location":"0001",
          					"models":[
          						"0000",
          						"0001",
          						"1001"
          					]
          				}
          			]
          		},
          		"configuration":{
          			"netKeys":[
          				0
          			],
          			"appKeys":[
          				0,
          				1
          			],
          			"defaultTTL":10,
          			"elements":[
          				{
          					"elementIndex":0,
          					"unicastAddress":"0077",
          					"models":[
          						{
          						"modelId":"1001",
          						"bind":[
          							1
          						]
          						}
          					]
          				}
          			]
          		},
          		"IVindex":5,
          		"IVupdate":0,
          		"sequenceNumber":807
          	}
                }

          上面这一块是我上个回复的json内容(排版容易看点)。这个我看了一下确实是provisioner(树莓派(bluez))的数据。另外我用它作为provisioner添加了两个节点,node_1和node_2,它们的内容是下面的json:

          {
          	"$schema":"file:\/\/\/BlueZ\/Mesh\/schema\/mesh.jsonschema",
          	"meshName":"BT Mesh",
          	"netKeys":[
          		{
          			"index":0,
          			"keyRefresh":0,
          			"key":"18eed9c2a56add85049ffc3c59ad0e12"
          		}
          	],
          	"appKeys":[
          		{
          			"index":0,
          			"boundNetKey":0,
          			"key":"4f68ad85d9f48ac8589df665b6b49b8a"
          		},
          		{
          			"index":1,
          			"boundNetKey":0,
          			"key":"2aa2a6ded5a0798ceab5787ca3ae39fc"
          		}
          	],
          	"provisioners":[
          		{
          			"provisionerName":"BT Mesh Provisioner",
          			"unicastAddress":"0077",
          			"allocatedUnicastRange":[
          				{
          					"lowAddress":"0100",
          					"highAddress":"7fff"
          				}
          			]
          		}
          	],
          	"nodes":[
          		{
          			"deviceKey":"74e7f645e438863d95a6d8e05df5e9ea",
          			"configuration":{
          				"netKeys":[
          					"0000"
          				],
          				"elements":[
          				{
          					"elementIndex":0,
          					"unicastAddress":"0100",
          					"models":[
          						{
          							"modelId":"1000",
          							"bind":[
          							1
          							],
          							"subscribe":[
          							"c000"
          							]
          						}
          					]
          				}
          				],
          				"appKeys":[
          					"0001"
          				]
          			},
          			"composition":{
          				"cid":"08b4",
          				"pid":"0006",
          				"vid":"000f",
          				"crpl":"0020",
          				"features":{
          					"relay":true,
          					"proxy":true,
          					"friend":false,
          					"lpn":false
          				},
          				"elements":[
          					{
          						"elementIndex":0,
          						"location":"0000",
          						"models":[
          							"0000",
          							"0002",
          							"1000",
          							"1300",
          							"1301",
          							"1303",
          							"1304",
          							"1306",
          							"1307",
          							"01710004"
          						]
          					}
          				]
          			},
          			"IVindex":5,
          			"sequenceNumber":13
          		},
          		{
          		"deviceKey":"440ea50edf6f5bb2bc08ef87e97983ea",
          		"configuration":{
          			"netKeys":[
          				"0000"
          			],
          			"elements":[
          			{
          				"elementIndex":0,
          				"unicastAddress":"0101",
          				"models":[
          					{
          						"modelId":"1000",
          						"bind":[
          							1
          						],
          						"subscribe":[
          							"c000"
          						],
          						"publish":{
          							"address":"c000",
          							"index":"0001",
          							"ttl":255
          						}
          					}
          				]
          			}
          			],
          			"appKeys":[
          			"0001"
          			]
          		},
          		"composition":{
          			"cid":"08b4",
          			"pid":"0006",
          			"vid":"000f",
          			"crpl":"0020",
          			"features":{
          				"relay":true,
          				"proxy":true,
          				"friend":false,
          				"lpn":false
          			},
          			"elements":[
          				{
          					"elementIndex":0,
          					"location":"0000",
          					"models":[
          						"0000",
          						"0002",
          						"1000",
          						"1300",
          						"1301",
          						"1303",
          						"1304",
          						"1306",
          						"1307",
          						"01710004"
          					]
          				}
          			]
          		},
          		"IVindex":5,
          		"sequenceNumber":21
          		}
          	],
          	"IVindex":5,
          	"IVupdate":0
          }
          1. 从上面结果看下来的话provisioner确实既有configuration client也有configuration server了。
          2. 我还想额外提一个问题,假设这里有两个灯设备,我的网关作为配置者(provisioner)也能够控制这两个灯。在不使用组播的前提下,我用单播控制两个灯,那在网关这边只需要在主元素里定义一个generic on-off client就够了吧?有没有必要在主元素定义一个generic on-off client控制灯A,在次元素A定义一个generic on-off client控制灯B?提这个问题的目的主要是想是否可以在client端这边只用主元素,不额外用次元素定义这么多client,毕竟控制端不会保存状态。

            darkerb 从上面结果看下来的话provisioner确实既有configuration client也有configuration server了。

            你从哪里得出这样的判断?

            #从浅到深了解Bluetooth LE #Bluetooth LE广播的基本概念 (一)?}“灯设备,我的网关作为配置者(provisioner)也能够控制这两个灯。在不使用组播的前提下,我用单播控制两个灯,那在网关这边只需要在主元素里定义一个generic on-off client就够了吧?有没有必要在主元素定义一个generic on-off client控制灯A,在次元素A定义一个generic on-off client控制灯B?提这个问题的目的主要是想是否可以在client端这边只用主元素,不额外用次元素定义这么多client,毕竟控制端不会保存状态

            可以的。改目标地址就可以了

              Wireless-Tech 你从哪里得出这样的判断?

              在我第二个json里面有这一部分,贴出了配置者的单播地址是0x0077,我单独贴出来这一部分:

              "provisioners":[
              		{
              			"provisionerName":"BT Mesh Provisioner",
              			"unicastAddress":"0077",
              			"allocatedUnicastRange":[
              				{
              					"lowAddress":"0100",
              					"highAddress":"7fff"
              				}
              			]
              		}
              	],

              对比我第一个json里面的元素,它的单播地址也是0x0077:

              "elements":[
              				{
              					"elementIndex":0,
              					"unicastAddress":"0077",
              					"models":[
              						{
              						"modelId":"1001",
              						"bind":[
              							1
              						]
              						}
              					]
              				}
              			]

              这应该可以认为它是配置者的设置。

              补充一下,网上用bluez测试mesh的资料太少了,所以我不怎么清楚从哪下手,为数不多的资料可能就是官方的一个pdf了https://www.bluetooth.com/wp-content/uploads/2020/04/Developer-Study-Guide-How-to-Deploy-BlueZ-on-a-Raspberry-Pi-Board-as-a-Bluetooth-Mesh-Provisioner.pdf有兴趣可以玩一下。

                darkerb Model ID:1001不是Configuration Server Model,它是Generic OnOff Client

                  Wireless-Tech Model ID:1001不是Configuration Server Model,它是Generic OnOff Client

                  是的,但是再看看第一个json,虽然configuration里没有出现0x0000和0x0001这两个configuration client和server,但是在composition中出现了。感觉上是bluez的example也给client明确定义了。相当于它虽然是配置者,但是也给配置者赋予了node的一系列数值(正常来用的话配置者应该不会有composition保存吧?只是configuration server才会存)。

                  从第一个json里抓出来的内容,可以看到这个node的value值如下。它们是一起的

                  "node":{
                  		"composition":{
                  			"cid":"0002",
                  			"pid":"0010",
                  			"vid":"0001",
                  			"crpl":"000a",
                  			"features":{
                  				"relay":false,
                  				"proxy":true,
                  				"friend":false,
                  				"lowPower":false
                  			},
                  			"elements":[
                  				{
                  					"elementIndex":0,
                  					"location":"0001",
                  					"models":[
                  						"0000",
                  						"0001",
                  						"1001"
                  					]
                  				}
                  			]
                  		},
                  		"configuration":{
                  			"netKeys":[
                  				0
                  			],
                  			"appKeys":[
                  				0,
                  				1
                  			],
                  			"defaultTTL":10,
                  			"elements":[
                  				{
                  					"elementIndex":0,
                  					"unicastAddress":"0077",
                  					"models":[
                  						{
                  						"modelId":"1001",
                  						"bind":[
                  							1
                  						]
                  						}
                  					]
                  				}
                  			]
                  		},
                  		"IVindex":5,
                  		"IVupdate":0,
                  		"sequenceNumber":807
                  	}

                    那个是节点的数据,不是provisoner

                      撰写回复...