Blog

Blog

PHODAL

IoT CoAP 块传输——使用Block传输数据

IoT-CoAP中我们使用到了一个Block2的东西,于是便整理相关的一些资料,作一个简单的介绍,以及在代码中的使用。

CoAP Block

简单地翻译了一下(谷歌 + 理解)

CoAP是一个RESTful传输协议用于受限设备的节点和网络。基本的CoAP消息对于小型载荷——如温度传感器,光开关,和相似的楼宇自动化设备是相当不错的。然而,有时应用将需要传输更大的有效载荷,例如——更新固件。同HTTP,TCP做繁重工作将大型有效载荷分成多个数据包,并确保他们所有到达并以正确的顺序被处理。

CoAP是同UDP与DLTS一样是基于数据报传输的,这限制了资源表示(resource representation)的最大大小,使得传输不需要太多的分割。虽然UDP支持通过IP分片传输更大的有效载荷,且仅限于64KiB,更重要的是,并没有真正很好地约束应用和网络。

而不是依赖于IP分片,这种规范基本COAP了对“块”选项,用于传输信息从多个资源区块的请求 - 响应对。在许多重要的情况下,阻止使服务器能够真正无状态:服务器可以处理每块分开传输,而无需建立连接以前的数据块传输的其他服务器端内存。

综上所述,块(Block)选项提供了传送一个最小的在分块的方式更大的陈述。

CoAP Post Block

看看在IoT CoAP中的post示例。

const coap     = require('coap')
      ,request  = coap.request
      ,bl       = require('bl')
      ,req = request({hostname: 'localhost',port:5683,pathname: '',method: 'POST'});

req.setOption('Block2',  [new Buffer('1'),new Buffer("'must'"), new Buffer('23'), new Buffer('12')]);
req.setHeader("Accept", "application/json");
req.on('response', function(res) {
    res.pipe(bl(function(err, data) {
        console.log(data);
        process.exit(0);
    }));

});

req.end();

Block2中一共有四个数据,相应的数据结果应该是

{ name: 'Block2', value: <Buffer 31> }
{ name: 'Block2', value: <Buffer 27 6d 75 73 74 27> }
{ name: 'Block2', value: <Buffer 32 33> }
{ name: 'Block2', value: <Buffer 31 32> }

这是没有解析的Block2,简单地可以用

 _.values(e).toString()

将结果转换为

Block2,1
Block2,'must'
Block2,23
Block2,12

接着按","分开,

_.values(e).toString().split(',')[1]

就有

[ '1', '\'must\'', '23', '12' ]

便可以很愉快地将其post到数据库中了,

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Developer, Consultant, Writer, Designer

ThoughtWorks 高级咨询师

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 与我沟通

标签