上文提到传感器值信息和描述信息的分离。值信息和描述的分离,有利于代码结构化,也可以节约传输带宽。
这里记录一种传感器值信息的压缩表达方法,但不建议在项目中使用。主要是现在无论是处理器(单片机)还是传输线路,性能都提升很多,并不对节省的这几个字节敏感。
一般来讲,传感器采集的数据,得到的信息都是展现給人来看的。让我们来看几组温度数据。
1、2、3、4
温度数据分辨率为1,采集间隔内,数据变化间值为1.
100、200、300、400,501
温度数据分辨率为1,采集间隔内,数据变化间值为100,501会被我们约等
为500。
2、4、8、17
温度数据分辨率为1,采集间隔内,数据指数变化,8后面的预期数据为16,即便测量值为17,我们在口头描述中也多会约等
为16。
因为数据只是用来人为观察,这种约等完全是合理的,也并没有破坏其中的统计规律。
由上,我们可以看到我们对数据总是有一个识别分辨率的。而这个分辨率一个字节表述就足够了。
1、2、3、4
1×100、2×100、3×100、4×100
100为基础数据,有效数据只传输1,2,3,4即可。
pow(2,1)、pow(2,2)、pow(2,3)、pow(2,4)
2的指数为基础数据,有效数据只传输1,2,3,4即可
比如下面公式:
result = (double) (((m * val) + (b * pow(10, k1))) * pow(10, k2))
其中val为有效数据,m,b,k1,k2都为基础数据,这个函数曲线通过调节参数总能找到一个适应当前数据的渐进线。~,如果找不到这条渐进线,还可以将结果:
case SDR_SENSOR_L_LN:
result = log(result);
break;
case SDR_SENSOR_L_LOG10:
result = log10(result);
break;
case SDR_SENSOR_L_LOG2:
result = (double) (log(result) / log(2.0));
break;
case SDR_SENSOR_L_E:
result = exp(result);
break;
case SDR_SENSOR_L_EXP10:
result = pow(10.0, result);
break;
case SDR_SENSOR_L_EXP2:
result = pow(2.0, result);
break;
case SDR_SENSOR_L_1_X:
result = pow(result, -1.0); /*1/x w/o exception */
break;
case SDR_SENSOR_L_SQR:
result = pow(result, 2.0);
break;
case SDR_SENSOR_L_CUBE:
result = pow(result, 3.0);
break;
case SDR_SENSOR_L_SQRT:
result = sqrt(result);
break;
case SDR_SENSOR_L_CUBERT:
result = cbrt(result);
break;
这样我们便做好了传感器值信息的压缩。
这套数据压缩方案来自于IPMI协议