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


    基础篇

    基础场景见上面两个帖子,这里单独说明数组和可变长度数组的用法
    话不多说,开始今天的演(表)示(演)

    Profile和插件开发

    添加一个string类型的属性:

    在插件里添加一条数据上报消息:(已添加一个messageId,值为0x02

    再添加一个固定长度的数组型字段,长度为5个字节

    与profile里的属性关联起来:

    再添加一条数据上报消息:(已添加一个messageId,值为0x03

    再添加一个长度字段:

    添加一个可变长度数组,并关联长字段:

    与profile里的属性关联起来:

    最后部署插件即可。

    调测:

    注册一个新设备:

    使用NB设备模拟器,绑定后上报数据:先上报3条02开头的码流

    查看设备历史数据:

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

    再上报03开头的码流:

    查看设备历史数据:

    命令下发:

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

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

    info字段内容如下:

    部署插件后开始在线测试。先上报两个数据:

    上报的消息转码后结果如下:

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

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

    ‘’

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

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

    为什么得到的结果不是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当作数值(也就是1),不足3个字符,补2个0,得到100,转成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编码是将码流当作数值型而非字符型(见上面的第二种转化方法)

    补充:

    P.S. 再追加Base64编码解码参考帖子(帖子后面有代码)

    JS实现——Base64编码解码,带16进制显示

    作者:Lily_w

  • 相关阅读:
    yocto/bitbake 学习资源
    QEMU/KVM学习资源
    ubuntu 中创建和删除用户
    git 重命名本地和远程分支
    Ubuntu 上搭建 FTP 服务器
    gdb 常见用法
    git log 显示与特定文件相关的 commit 信息
    基于 qemu system mode 运行 arm 程序
    基于 qemu user mode 运行 aarch64 程序
    checking in(airport)
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165384.html
Copyright © 2020-2023  润新知