我使用 CC1312R7作为边界路由器、 该路由器位于定制设计的 PCB 上、 程序为 ns_br_CC1312R7_tirtos7_tclang SDK 7.10.00.98、可构成具有70个节点的网络、所有这些节点都具有 ns_CoAP_nations_src_LP_CC1312R7_tirtos7_tclang SDK 7.10.98。 边界路由器位于其自己的 PCB 上、连接到运行 Linux 的 Toradex CPU、该 CPU 使用 wfantund 启动接口和 Wi-SUN 层、并查询网络树、它使用 wdexttl 和"Set dodagroutedest + get dodagroute"命令。 在测试过程中,我们发现一些由 wdextl 生成的树由于无效的 IPv6地址和大于网络中节点数的路径成本而不正确,如下所示。
2020:abcd:0000:0000:0212:4b00:2964:5dd8
2020:abcd:0000:0000:0212:4b00:29c6:df59
2020:abcd:0000:0000:0212:4b00:29c6:df5c
0ddf:037d:915d:609c:15b9:636f:6e6e:6563
7465:6410:ff44:4d50:4139:3939:3933:3030
3837:457b:59ac:0cdf:f7dd:8186:0e00:59c2
3015:398d:fbde:5652:e5d3:963E:1167:35b4
835c:ac69:98ab:66b2:23b7:8928:7bbb:66fe
0233:3520:5324:d935:3b23:abfc:08eb:66dc
52c1:8c92:28bb:b583:839e:c754:d9d5:6aa2
9253:3ad6:5d3b:4cd9:351e:0020:ddb6:e01a
30c1:dd1a:7971:391a:98cd:331a:da2b:9d7f
8185:856d:c2dc:286d:6531:56ae:a997:043E
8c83:668e:35e1:3f5c:20cd:ffdd:78f1:266e
aedb:5fc8:55db:6b50:ae40:8e15:1109:39f0
3f00:7673:e475:0b91:f1e9:2290:b588:9823
d12a:13a7:10c3:ab50:dd57:d14b:0489:1244
3dc1:D525:ad79:4ee9:e303:17b7:8d4c:4b18
3d80:9a8d:3997:38ba:f72b:01c8:5fad:0a08
f98f:5dbd:1e65:8037:9bdd:1f02:c489:c664
e2dd:dac9:4e5e:9a35:3d84:f89e:52ba:9ab6
7930:22cd:c99e:20a3:9506:3624:0f27:a9b6
0274:efe1:6ada:062A:9a62:aa66:16d1:0feb
1b3a:84dd:fc64:e692:af71:739d:b50c:d397
c069:cf5f:8812:3bc0:ca2c:e320:6bb9:0521
00e5:a6ec:79e7:c347:d18c:82c4:dd80:eb1e
6c58:fe23:e99a:268c:67f1:537e:b7b9:2717
95cb:a26f:85e8:0a6d:c4ed:65cb:9585:09f6
1828:d89b:22b3:aa1b:bffc:6ab7:5aea:bb30
fc9e:a137:4b6e:8982:c276:d5cf:e12d:A170
c53f:c027:85b6:64ea:a921:3a05:f3f5:8336
39de:3fa4:5f54:71b8:9c3d:8f8c:13bb:1386
3653:dabb:c6f7:b5d2:d80d:616b:DDC1:56e2
DEE4:13a2:8d82:d72a:ea41:f3f7:0394:8e8f
2bf4:3d3a:CC24:6867:8fef:a38b:C8D5:5ef8
e436:8d49:4529:acc0:041A:95da:1609:620e
ee82:8980:2423:100d:5ee2:D125:2573:df80
e3eb:5cd0:522d:06fa:7591:9354:e77c:20b7
07b9:c9cd:fabc:3095:0147:2649:7255:fb07
ac68:71dB:8fe1:9eec:ffdd:db30:d23b:a08c
1e1b:cf8a:5ab2:64db:c7ef:EFEC:8e02:c8d0
69e8:b860:34be:8a60:80d5:884b:9db3:d35c
f31c:e184:5b84:4743:cec5:ffed:dd22:f467
a637:b3dd:b791:749c:1676:8c09:3b58:80eb
6518:2d75:fbf0:2031:58b0:9394:ae60:e894
22e5:b2a3:ca6c:558a:1a0c:f623:db11:b97d
14bd:00a6:a056:1b7e:0ca8:5901:Babb:17d6
c085:511d:7b53:750c:c0a4:abef:9c3b:8075
4aa1:b9b9:33f1:efa5:5f3b:57d0:0cda:bf97
c494:e8f4:dd95:c843:f69c:0945:c496:aec0
fb3c:7023:99df:3246:eb1c:2b8b:1dde:1d08
6906:fec:f35a:6c8e:a8e3:bb0c:0bF1:8763
deea:010d:7de2:45b1:a95e:2a0d:e676:15c7
9c36:969c:a302:688c:d960:e29d:53eb:f0CF
6b59:4136:f4c7:0ed0:9961:a4a3:c9b4:8e65
d5db:2cef:041F:b8a5:e8be:90cb:cf5d:844c
3f8a:11a8:ed2b:17c4:409f:a414:5100:4d06
CB16:6e64:4118:2ec0:14a9:8a6a:64aa:55ea
60a9:9d47:7d98:7f60:6d6b:3d70:4865:cd81
6790:7b8b:b0f6:31c0:79ce:be97:1fa0:7a0d
4e97:473a:c88e:fdc8:534f:396d:a5cc:2196
a579:cec6:a186:6b07:389d:318e:55d5:d77e
70c5:4f1c:6c2b:ebde:bd60:d87c:c4e5:a5a5
2771:DA70:c03a:805e:ca60:4cc9:99f3:17bd
3210:314c:3514:0300:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
8700:3400:0000:0000:0000:0000:0000:0000:0000
0000:0ddf:0000:0087:0260:2020:abcd:0000
0000:0212:4b00:29c6:df5c:0000:0212:4b00
2964:5dd8:2020:abcd:0000:0000:0212:4b00
29c6:df65:1633:1633:0010:45b4:5444:7d91
5d60:9c15:61ff:4449:4d45:4333:0212:4b00
29c6:df2d:2020:abcd:0000:0000:0212:4b00
2964:5dd8:1633:98da:0021:dfee:6045:5599
c0ff:0149:6e67:7265:736f:2073:6f6c:6363
6974:7564:0a00:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0000:0000:0000
查找生成树的函数( github.com/.../SpinelNCPInstance.cpp行724)、可以观察到在 for 循环中、用于迭代的条件 条目 PTR 是" x < DODAG_ROUT_SIZE *(PATH_COSUITE + 1) "而不是使用的值 长度 。
静态 int
UNPACK_DODAG_ROUTE (const uint8_t * data_in、spinel_size_t data_len、boost::any& value)
{
uint8_t * entry_ptr = NULL;
spinel_size_t entry_len = 0;
spinel_size_t len = 0;
len = spinel_datatype_packed (data_in、data_len、"D"、&entry_ptr、&entry_len);
int path_cost = entry_ptr[0];
std::string ret_str ="\n 路径成本:"+ ANY_TO_STRING (path_cost)+"\n";
int count = 0;
std::string last_ip_str ="";
for (int x = 1;x < DODAG_route_size*(path_cost + 1);x+=2){
字符 str_to_add[4];
sprintf (str_to_add、"%02x"、entry_ptr[x]);
//我们想获取列表中的最后一个 IP 地址,17到32
if (((16*(path_cost))< x)&&(x <((16*(path_cost + 1))))
{
last_ip_str += str_to_add;
}
RET_str.append (str_to_add);
sprintf (str_to_add、"%02x:"、entry_ptr[x + 1]);
if (((16*(path_cost))< x)&&(x <((16*(path_cost + 1))))
{
last_ip_str += str_to_add;
}
RET_str.append (str_to_add);
计数+= 2;
if ((count % 16 == 0)&&(count!= 0)){
RET_str.pop_back ();
RET_str.append ("\n");
}
}
值= ret_str;
int ret = kWPANT45g Status_Ok;
if (webserver_app ==1)
{
//删除最后一个字符:从 last_ip_str
if (!last_ip_str.empty ())
{
last_ip_str.erase (std::prev (last_ip_str.end ()));
}
//将:替换为_
//:在 Linux 中的文件名在技术上是有效的,但在 Windows 中不是有效的
for (int i = 0;i < last_ip_str.length ();++i)
{
if (last_ip_str[i]==':')
last_ip_str[i]='_';
}
//将第一个 IP 地址转换为文件的名称
std::string dodpg_route_file_name = app_path + last_ip_str +'-'+ dodpg_route_beg_str;
std::ofstream myfile (dodarg_route_file_name);
myfile <<(ret_str)<< std:endl;
myfile.close();
}
返回支架;
}
我更改了此条件、现在可以正确打印了。 此外、我使用了 len 变量来重新计算 path_cost =((len -1)/16)- 1 ,获得正确的结果,从而解决不正确的网络树生成问题。 但是、我想知道为什么边界路由器为 路径成本 。
您以前是否曾观察过此行为?