【开发者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编码解码参考帖子(帖子后面有代码)
作者:Lily_w
【开发者portal在线开发插件系列四】数组 及 可变长度数组的更多相关文章
- 【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)【华为云技术分享】
前言和基本操作请参考[开发者portal在线开发插件系列一]profile和基本上下行消息,此处不再复述,没操作过的小伙伴一定要先去看看哦~ 话不多说,开始今天的演(表)示(演) 场景说明: 假设一: ...
- 【开发者portal在线开发插件系列五】命令的响应,即命令结果的上报(mid的使用)
基础篇 [开发者portal在线开发插件系列一]profile和基本上下行消息 [开发者portal在线开发插件系列二]多条上下行消息(messageId的使用) 基础场景见上面两个帖子,这里单独介绍 ...
- 【开发者portal在线开发插件系列一】profile和基本上下行消息
前言: 开发者portal支持在线开发profile(即设备建模).在线开发插件.模拟应用管理设备.模拟设备上报数据接收命令.支持离线开发的profile和插件的上传部署,是合作伙伴快速集成设备.对接 ...
- 【开发者portal在线开发插件系列三】字符串 及 可变长度字符串
基础篇 基础场景见上面两个帖子,这里单独说明字符串和可变长度字符串的用法. 话不多说,开始今天的演(表)示(演) Profile和插件开发 添加一个string类型的属性: 在插件里添加一条数据上报消 ...
- WCF开发实战系列四:使用Windows服务发布WCF服务
WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...
- [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
文章来自:http://www.hoohack.me/2016/02/15/understanding-phps-internal-array-implementation-ch 原文:https:/ ...
- Web程序员开发App系列 - 申请苹果开发者账号
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- 四、K3 WISE 开发插件《工业单据老单插件开发新手指导》
开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 =============================================== 目录 一 ...
- 十款开发者常用的Chrome插件,让chrome成为开发利器!
Chrome浏览器无论是作为浏览器市场的NO1还是其强大的跨平台能力以及丰富的扩展插件,一直是许多开发者的首要选择的浏览器.chrome浏览器也因为其丰富的Chrome插件,帮助开发者们在开发流程中极 ...
随机推荐
- 「刷题」Triple
正解是普通型母函数+FFT. 才学了多项式,做了一道比较好的题了. 首先有三个斧子被偷了. 我们考虑构造一种普通型母函数. 就是说一种多项式吧,我的理解. 系数是方案,下标,也就是所谓的元指数代表的是 ...
- CSPS模拟 67
炸分炸的厉害.(当然这跟b哥定律无关 话说好久没人嘲笑我菜了,快飘的不知道到哪了. 谁能讽我两句我不要面子的. 另外在博客上写些没用的东西好浪费精力啊我又不想当网红 主要是考试的时候心态不稳. 以为T ...
- 常用的webpack优化方法
1. 前言 关于webpack,相信现在的前端开发人员一定不会陌生,因为它已经成为前端开发人员必不可少的一项技能,它的官方介绍如下: webpack 是一个模块打包器.webpack的主要目标是将 J ...
- svg路径蒙版动画
svg路径蒙版动画,是比较实用的一种动画效果,能够绘制如下图所示的动画. 接下来细说这样的动画是如何做成的: 1.准备工作 2.SVG路径动画 3.SVG路径蒙版动画 4.复杂图形的编辑技巧 1.准备 ...
- SSM学习成果总结,图书管理系统进行三层整合
一:先看一下效果图 二:目录结构 三:pojo package com.zh.pojo; import lombok.AllArgsConstructor; import lombok.Data; ...
- C/C++企业链表的实现
首先 先介绍企业链表 和Linux内核链表 和 之前我发的一篇单项链表的区别 结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!! 答案:有些编译器 支持用结构体变量名做地址的方式但一 ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)---Harbor的安装
前期安装文档:https://www.cnblogs.com/lq-93/p/11828626.html Harbor的作用: 开发提交代码至gitlab容器中,Jenkins拉取代码构建镜像 ...
- css3的过渡和动画的属性介绍
一.过渡 什么是过渡? 过渡是指:某元素的css属性值在一段时间内,平滑过渡到另外一个值,过渡主要观察的是过程和结果. 设置能够过渡的属性: 支持过渡的样式属性,颜色的属性,取值为数值,transfo ...
- 《计算机网络 自顶向下方法》 第2章 应用层 Part1
常见的应用层协议有哪些? HTTP(HyperText Transfer Protocol):超文本传输协议 FTP(File Transfer Protocol):文件传输协议 SMTP(Sim ...
- Unity - Cinemachine实现相机抖动
普通相机抖动脚本较易实现,但在使用cinemachine相机下,其Transform组件不可被代码改变,那么Cinemachine的相机抖动如何实现呢?本文结合实际项目,对实现相机抖动的三大步骤进行系 ...