【软件】ENTOAM映拓 QY-A126 电子秤通信协议分析与转换
ENTOAM映拓 QY-A126 电子秤通信协议分析与转换
零、背景
买了一把电子秤,但是收银软件展示不支持,就想着自己写个协议转换软件,读取重量信息后通过虚拟串口com0com发送到收银软件,故对此电子秤协议进行分析

壹、分析
1、抓包
通过串口工具连接到电子秤所对应的串口,我们可以拿到电子秤实时上传的重量数据

这是我把一个物体(0.076KG)放上去又拿下来的过程

这是我把秤盘(1.364KG)拿起又放下的过程
由此,我们可以得到如下原始帧:
AB 00 00 00 00 83 00 03 5F 00 00 08 98 21 00 01 03 00 00 00 00 97 C9
0.000KG,稳定
AB 00 00 00 00 83 00 03 5F 00 00 08 98 20 00 01 03 00 00 00 4C 59 52
0.076KG,不稳定
AB 00 00 00 00 83 00 03 5F 00 00 08 98 21 00 01 03 00 00 00 4C 59 52
0.076KG,稳定
AB 00 00 00 00 83 00 03 5F 00 00 08 98 20 00 01 03 80 00 05 54 AF 75
-1.364KG,不稳定
AB 00 00 00 00 83 00 03 5F 00 00 08 98 21 00 01 03 80 00 05 54 AF 75
-1.364KG,稳定
2、 分析
简单观察一下数据,我们发现第14个字节若为20则是不稳定,为21则是稳定, 而第18个字节、第19个字节、第20个字节和第21个字节应该是重量信息,其中,若第18个字节的最高位为1,则重量是负的,剩下的组成一个31位无符号整型,单位应该是克
贰、代码
根据上面抓包的分析结果,我们可以写出如下代码来解析此秤上传的称重数据:
/// <summary>解析 QY-A126 协议帧(23 字节)</summary>
/// <remarks>
/// 字段:
/// [0] = 0xAB 帧头
/// [13] bit0 = 稳定标志(1=稳定,0=不稳定)
/// [17] bit7 = 符号位(1=负,0=正)
/// [17] bit0-6 + [18] + [19] + [20] = 重量值(大端无符号,清除符号位后)
/// [22] = CRC-8/MAXIM 校验(校验 [0]-[21])
/// </remarks>
private void ParseFrame(byte[] frame)
{
if (frame.Length < FRAME_SIZE) return;
if (frame[0] != 0xAB) return;
// TODO: 不知道怎么校验,跳过检验
// CRC-8/MAXIM 校验
// byte calcCrc = Crc8Maxim(frame, 0, FRAME_SIZE - 1);
// if (calcCrc != frame[22]) return;
// 稳定标志:byte[13] 的 bit0
bool stable = (frame[13] & 0x01) == 0x01;
// 符号位:byte[17] 的 bit7
bool negative = (frame[17] & 0x80) == 0x80;
// 重量值:清除 byte[17] 的 bit7 后,拼接字节 [17]-[20] 为大端无符号整数
int signCleared = frame[17] & 0x7F;
int weightGrams = (signCleared << 24) | (frame[18] << 16) | (frame[19] << 8) | frame[20];
if (negative)
weightGrams = -weightGrams;
// 得到解析结果,当前克重和是否稳定状态,同步一下
lock (_weightLock)
{
_currentWeightGrams = weightGrams;
_isWeightStable = stable;
}
}
然后用AI辅助生成了一个小工具

成功读取到了电子秤的重量数据~
叁、总结
此次通过抓包和分析,成功读取到了电子秤的重量数据。神奇的是这些电子秤为啥不把协议公开出来放到网上好让我们适配?还要我们自己抓包,不是很懂,但是觉得真麻烦!
协议解析函数处理流程如下:
-
输入验证:接收23字节数据帧,若帧头部为AB标识则继续处理,否则直接返回空值。
-
状态判定:解析第14字节的二进制最低位,若为1则输出状态“稳定”,若为0则输出状态“不稳定”。
-
重量计算:
- 首先根据第18字节的最高位判断重量符号:若为1则重量为负值,否则为正值。
- 将第18字节的最高位强制置为0(清零符号位),随后与第19、20、21字节合并为4字节无符号整型数据。
- 将该整型值转换为重量数值,并以克为单位返回。

浙公网安备 33010602011771号