【开发者portal在线开发插件系列四】数组 及 可变长度数组

举报
Lily_w 发表于 2019/09/12 14:57:40 2019/09/12
【摘要】 基础篇【开发者portal在线开发插件系列一】profile和基本上下行消息 【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)基础场景见上面两个帖子,这里单独说明数组和可变长度数组的用法。话不多说,开始今天的演(表)示(演)================我是“下方内容基本都是图,看图操作就好”的分隔线================Profile和插件开发...

基础篇


基础场景见上面两个帖子,这里单独说明数组和可变长度数组的用法
话不多说,开始今天的演(表)示(演)
================我是“下方内容基本都是图,看图操作就好”的分隔线================

Profile和插件开发
添加一个string类型的属性:
image.png
在插件里添加一条数据上报消息:已添加一个messageId,值为0x02
image.png

再添加一个固定长度的数组型字段,长度为5个字节
image.png
与profile里的属性关联起来
image.png
再添加一条数据上报消息:已添加一个messageId,值为0x03
image.png
再添加一个长度字段:
image.png
添加一个可变长度数组,并关联长字段:
image.png
与profile里的属性关联起来:
image.png
最后部署插件即可。

调测:
注册一个新设备:
image.png
使用NB设备模拟器,绑定后上报数据:先上报3条02开头的码流
image.png

查看设备历史数据:


说明:数组类型使用base64进行编解码。数据上报是平台使用base64进行编码,所以应用收到推送消息后,如要知道原始码流是什么,得使用base64解码。base64编解码规则见本帖后面的介绍和总结


image.png

再上报03开头的码流:
image.png
查看设备历史数据:
image.png
命令下发:

在profile里添加一个命令和命令字段
image.png

插件中添加一个命令下发消息,其中messageId为04

image.png
info字段内容如下:

image.png
部署插件后开始在线测试。先上报两个数据:
image.png
上报的消息转码后结果如下:

image.png

将收到的other_info的内容作为命令下发字段的参数值下发给设备:

image.png

设备模拟器收到的数据如下:

image.png

Base64编解码介绍:我们以上面的03开头的消息为例进行说明
找一个base64在线编解码器,将other_info的值进行解码(注意勾选解码结果以16进制显示)

image.png

image.png

那么反过来编码的结果会是什么样的呢?

image.png

为什么得到的结果不是AQ==呢?原因很简单,因为这里是按照字符编码的,而不是按数值进行编码的。我们可以按照base64编码原理手动计算一下。

base64编码说明:Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。

这是什么意思呢?我们一起计算一下就明白了。
base64每3个8比特位进行编码,每个8比特位是一个字符,这里有两种转化方式,导致编码会有2种结果。


1)把01当作字符,不足3个字符,补1个0,得到010,再转成8比特位2进制表示。字符怎么用2进制表示的?在计算机里使用ascii码表示,查ascii码表,0的2进制ascii码为00110000,1的2进制ascii码为00110001,010就变成了001100000011000100110000(3*8=24),转化为4个6位的字节(4*6=24)就变成001100、000011、000100、110000(每6位数一组,我在中间用、隔开),之后在6位的前面补两个0,形成8位一个字节的形式,00001100、00000011、00000100、00110000,这几个数转成10进制的值分别为12、3、4、48,再查base64的表,12为M,3为D,4为E,最后一位因为我们补了一个0才得到的010(如果剩下的字符不足3个字节,则用0填充,输出字符使用'='),所以使用=表示,就得到了MDE=


2)把01当作一个字节十六进制数值,不足3个字节,补2个字节的0,得到01 00 00 (这是3个字节),转成8比特位2进制表示,即0转成00000000,1转成00000001,于是100就是000000010000000000000000,转化为4个6位的字节(4*6=24)就变成000000、010000、000000、000000,前面补两个0得到00000000、00010000、00000000、00000000,这几个数转成10进制的值分别为0、16、0、0,再查base64的表,0为A,16为Q,后面2个字符因为我们补了2个0所以都是=,就得到了AQ==

总结:

1)数组类型的数据是按Base64码进行编解码的,比如在数据上报时01转为“AQ==”,命令下发时将“AQ==”(命令下发的参数值为AQ==转为01。大家可以试试看。
2)可变长度数组要关联长度字段,长度字段必须为int型
3)命令下发直接使用定长的数组即可,下发的字段长度是其实是以实际下发的数据为准。

4)平台使用的Base64编码是将码流当作数值型而非字符型(见上面的第二种转化方法)


补充:


image.png


应大家强烈要求,提供一个有16进制数值型的base64编码方法,见附件,主要参考base64encode_number这个function。

我验证了一些,大家可以多验证验证,如果有问题可以反馈给我:)

image.png


image.png



  • 2.96KB 下载次数:0

    附件下载

  • a.rar 2.96KB 下载次数:0
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。