如何为Helium Console编写自定义JS函数实现MsgPack格式Payload自动解码
Helium Console 自定义MsgPack解码解决方案
实现思路
- Helium Console自定义函数仅支持无依赖原生JS运行,无需引入完整MsgPack库,仅实现适配当前设备输出数据类型的轻量解码逻辑即可满足需求
- 执行流程分为三步:将base64编码的原始payload转为二进制字节流、MsgPack解包为JS对象、返回符合Helium集成要求的格式化结果
完整可直接使用的解码函数
// Helium Console 自定义解码函数入口 function Decoder(payload) { // 1. base64转Uint8Array二进制字节流 function base64ToBytes(base64) { const binStr = atob(base64); const len = binStr.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { bytes[i] = binStr.charCodeAt(i); } return bytes; } // 2. 极简MsgPack解包,仅适配当前设备使用的MsgPack数据类型 function msgpackUnpack(bytes) { let offset = 0; function read() { const byte = bytes[offset++]; // 正fixint if (byte < 0x80) return byte; // fixmap if (byte >= 0x80 && byte <= 0x8f) { const len = byte - 0x80; const obj = {}; for (let i = 0; i < len; i++) { const key = read(); obj[key] = read(); } return obj; } // fixstr if (byte >= 0xa0 && byte <= 0xbf) { const len = byte - 0xa0; let str = ''; for (let i = 0; i < len; i++) { str += String.fromCharCode(bytes[offset++]); } return str; } // float32 if (byte === 0xca) { const view = new DataView(bytes.buffer, offset, 4); const val = view.getFloat32(0, false); // 大端序 offset += 4; return val; } // 后续设备新增数据类型可在此处扩展解码逻辑 throw new Error(`不支持的MsgPack类型: 0x${byte.toString(16)}`); } return read(); } // 3. 执行解码并返回结果 const bytes = base64ToBytes(payload); return msgpackUnpack(bytes); } // 测试验证:使用示例payload输出和Python脚本完全一致 // console.log(Decoder("haJiVspAozMzo3RfQxilZWNfbVMWonBoB6NvcnAC")) // 输出:{ bV: 5.099999904632568, t_C: 24, ph: 7, orp: 2, ec_mS: 22 }
部署说明
直接将上述函数复制到Helium Console的自定义函数编辑区即可使用,若后续设备上报字段新增了未支持的MsgPack类型,仅需在msgpackUnpack函数中补充对应解码逻辑即可。
内容的提问来源于stack exchange,提问作者gregarican
相关产品推荐
相关产品推荐

