#codec #bundle #data-encoding #protocols #decoding #rfc #dtn

bin+lib bp7

Rust 实现的 dtn 包协议第 7 版 ([RFC 9171]

87 个版本

0.10.6 2023 年 11 月 24 日
0.10.5 2022 年 2 月 10 日
0.9.3 2022 年 2 月 3 日
0.9.2 2021 年 9 月 10 日
0.3.7 2019 年 7 月 29 日

#283编码

Download history 30/week @ 2024-04-22 6/week @ 2024-05-06 2/week @ 2024-05-13 83/week @ 2024-05-20 120/week @ 2024-05-27 20/week @ 2024-06-03 40/week @ 2024-06-10 22/week @ 2024-06-17 26/week @ 2024-06-24 42/week @ 2024-07-01 50/week @ 2024-07-08 54/week @ 2024-07-15 10/week @ 2024-07-22 98/week @ 2024-07-29 134/week @ 2024-08-05

每月 298 次下载
3 crate 中使用

MIT/Apache

140KB
3K SLoC

bp7-rs

Crates.io Docs.rs Build status License: MIT License: Apache 2.0 Chat

Rust 实现的 dtn 包协议第 7 版 (RFC 9171)

此库只处理包的编码和解码,不处理数据的传输或其他处理。使用此库的完整守护进程可以在此处找到:https://github.com/dtn7/dtn7-rs

通过提供的 FFI 接口,此库也可以从 C/C++、nodejs 或 flutter 使用。

基准测试

此库附带一个简单的基准测试。它使用主要块、包年龄块和包含内容(b"ABC")的负载块(反)序列化包。此基准测试可用于比较 rust 实现、golang、python 或 java 实现。

cargo run --release --example benchmark
    Finished release [optimized] target(s) in 0.29s
     Running `target/release/examples/benchmark`
Creating 100000 bundles with CRC_NO: 	510059 bundles/second
Creating 100000 bundles with CRC_16: 	293399 bundles/second
Creating 100000 bundles with CRC_32: 	291399 bundles/second
Encoding 100000 bundles with CRC_NO: 	1090996 bundles/second
Encoding 100000 bundles with CRC_16: 	436836 bundles/second
Encoding 100000 bundles with CRC_32: 	432774 bundles/second
Loading 100000 bundles with CRC_NO: 	564817 bundles/second
Loading 100000 bundles with CRC_16: 	473768 bundles/second
Loading 100000 bundles with CRC_32: 	462013 bundles/second

这些数字是在 MBP 13" 2018 搭载 i5 CPU 和 16GB 内存的情况下生成的。

bp7 辅助工具

为了调试,提供了一个小型辅助工具,提供以下基本功能:

  • 随机包生成(作为十六进制和原始字节)
  • 标准包编码(作为十六进制和原始字节)
  • 包解码(从十六进制和原始字节)
  • 导出解码包的原始负载
  • 时间转换辅助工具

以下 shell 会话中给出了一些示例

$ cargo install bp7
[...]
$ bp7
usage "bp7" <cmd> [args]
        encode <manifest> <payloadfile | - > [-x] - encode bundle and output raw bytes or hex string (-x)
        decode <hexstring | - > [-p] - decode bundle or payload only (-p)
        dtntime [dtntimestamp] - prints current time as dtntimestamp or prints dtntime human readable
        d2u [dtntimestamp] - converts dtntime to unixstimestamp
        rnd [-r] - return a random bundle either hexencoded or raw bytes (-r)
        benchmark - run a simple benchmark encoding/decoding bundles
$ bp7 rnd
dtn://node81/files-680971330872-0
9f88071a000200040082016e2f2f6e6f646531382f7e74656c6582016e2f2f6e6f646538312f66696c657382016e2f2f6e6f646538312f66696c6573821b0000009e8d0de538001a0036ee80850a020000448218200085010100004443414243ff

$ bp7 decode 9f88071a000200040082016e2f2f6e6f646531382f7e74656c6582016e2f2f6e6f646538312f66696c657382016e2f2f6e6f646538312f66696c6573821b0000009e8d0de538001a0036ee80850a020000448218200085010100004443414243ff

[src/main.rs:101] &bndl = Bundle {
    primary: PrimaryBlock {
        version: 7,
        bundle_control_flags: 131076,
        crc: CrcNo,
        destination: Dtn(
            1,
            DtnAddress(
                "//node18/~tele",
            ),
        ),
        source: Dtn(
            1,
            DtnAddress(
                "//node81/files",
            ),
        ),
        report_to: Dtn(
            1,
            DtnAddress(
                "//node81/files",
            ),
        ),
        creation_timestamp: CreationTimestamp(
            680971330872,
            0,
        ),
        lifetime: 3600s,
        fragmentation_offset: 0,
        total_data_length: 0,
    },
    canonicals: [
        CanonicalBlock {
            block_type: 10,
            block_number: 2,
            block_control_flags: 0,
            crc: CrcNo,
            data: HopCount(
                32,
                0,
            ),
        },
        CanonicalBlock {
            block_type: 1,
            block_number: 1,
            block_control_flags: 0,
            crc: CrcNo,
            data: Data(
                [
                    65,
                    66,
                    67,
                ],
            ),
        },
    ],
}

$ echo -e "source=dtn://node1/bla\ndestination=dtn://node2/incoming\nlifetime=1h" > /tmp/out.manifest
$ echo "hallo welt" | bp7 encode /tmp/out.manifest - -x
9f880700008201702f2f6e6f6465322f696e636f6d696e6782016b2f2f6e6f6465312f626c61820100821b0000009e8d137d23001a0036ee8085010100004c4b68616c6c6f2077656c740aff

$ bp7 decode 9f880700008201702f2f6e6f6465322f696e636f6d696e6782016b2f2f6e6f6465312f626c61820100821b0000009e8d137d23001a0036ee8085010100004c4b68616c6c6f2077656c740aff -p
hallo welt

生成的十六进制字符串也可以直接在 awesome cbor.me 网站上显示为原始 cbor,例如 http://cbor.me/?bytes=9f88071a000200040082016e2f2f6e6f646531382f7e74656c6582016e2f2f6e6f646538312f66696c657382016e2f2f6e6f646538312f66696c6573821b0000009e8d0de538001a0036ee80850a020000448218200085010100004443414243ff

ffi 支持

此库只处理包的编码和解码,不处理数据的传输或其他处理。

此库可以作为共享库使用,或将其静态链接到其他应用程序中。借助 cbindgen (cargo install cbindgen),可以生成此 crate 的头文件

$ cbindgen -c cbindgen.toml > target/bp7.h

examples/ffi中可以找到Linux系统上使用C调用bp7以及nodejs的示例。

支持wasm(已废弃,不再维护的stdweb crate)

尽管只有少数函数被导出,但该库应该能够在wasm上构建。示例基准测试也可以通过cargo-web crate在浏览器中使用。

cargo web start --target wasm32-unknown-unknown --example benchmark --release

结果应显示在http://127.0.0.1:8000的javascript控制台中。

性能与本地性能相当。

Creating 100000 bundles with CRC_NO: 	441696 bundles/second
Creating 100000 bundles with CRC_16: 	416484 bundles/second
Creating 100000 bundles with CRC_32: 	405022 bundles/second
Encoding 100000 bundles with CRC_NO: 	1647039 bundles/second
Encoding 100000 bundles with CRC_16: 	908059 bundles/second
Encoding 100000 bundles with CRC_32: 	867603 bundles/second
Loading 100000 bundles with CRC_NO: 	401727 bundles/second
Loading 100000 bundles with CRC_16: 	388394 bundles/second
Loading 100000 bundles with CRC_32: 	384186 bundles/second

一些函数可以轻松地从javascript中使用(cargo web deploy --release

Rust.bp7.then(function(bp7) {
  var b = bp7.rnd_bundle_now(); 
  var enc = bp7.encode_to_cbor(b); 
  var payload = bp7.payload_from_bundle(b)
  console.log(payload); 
  console.log(String.fromCharCode.apply(null, payload));
  console.log(bp7.cbor_is_administrative_record(enc)); 
  console.log(bp7.sender_from_cbor(enc)); 
  console.log(bp7.recipient_from_bundle(b)); 
  console.log(bp7.valid_bundle(b)); 
});

请注意,目前所有函数都有一个在二进制包上工作的变体和一个在解码包结构上工作的变体。

认可这项工作

如果您在科学出版物中使用此软件,请引用以下论文

@INPROCEEDINGS{baumgaertner2019bdtn7,
  author={L. {Baumgärtner} and J. {Höchst} and T. {Meuser}},
  booktitle={2019 International Conference on Information and Communication Technologies for Disaster Management (ICT-DM)},
  title={B-DTN7: Browser-based Disruption-tolerant Networking via Bundle Protocol 7},
  year={2019},
  volume={},
  number={},
  pages={1-8},
  keywords={Protocols;Browsers;Software;Convergence;Servers;Synchronization;Wireless fidelity},
  doi={10.1109/ICT-DM47966.2019.9032944},
  ISSN={2469-8822},
  month={Dec},
}

许可证

根据您的选择,受Apache License,版本2.0或MIT许可证的许可。Apache License, Version 2.0MIT license

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交给bp7-rs的任何贡献,都应按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~1.4–2.9MB
~60K SLoC