parseData method
void
parseData(
- List<
int> mac, - List<
int> data, { - OnSwitchUnit? onSwitchUnit,
- OnGetRealTimeData? onGetRealTimeData,
- OnGetProbeBoxInfo? onGetProbeChargingBoxInfo,
- OnGetProbeInfo? onGetProbeInfo,
- OnAlarmResult? onAlarmResult,
- OnCancelAmbientAlarm? onCancelAmbientAlarm,
- OnGetProbeInfoFailure? onGetProbeInfoFailure,
- OnEndWorkByBox? onEndWorkByBox,
Implementation
void parseData(
List<int> mac,
List<int> data, {
OnSwitchUnit? onSwitchUnit,
OnGetRealTimeData? onGetRealTimeData,
OnGetProbeBoxInfo? onGetProbeChargingBoxInfo,
OnGetProbeInfo? onGetProbeInfo,
OnAlarmResult? onAlarmResult,
OnCancelAmbientAlarm? onCancelAmbientAlarm,
OnGetProbeInfoFailure? onGetProbeInfoFailure,
OnEndWorkByBox? onEndWorkByBox,
}) async {
final cid = data.sublist(1, 3);
// print('cid: $cid');
if (ElinkProbeConfig.isProbeAndBox(cid)) {
// print('isProbeAndBox');
final decrypted = await Ailink().mcuDecrypt(Uint8List.fromList(mac), Uint8List.fromList(data));
switch (decrypted[0]) {
case 0x02: ///mcu上报设备状态数据
final isBox = ElinkProbeConfig.isCidProbeBox(cid);
final version = decrypted[1] & 0xFF;
final supportNum = decrypted[2] & 0xFF;
final connectNum = decrypted[3] & 0xFF;
final boxChargingState = (decrypted[4] >> 7) & 0x01;
final boxBattery = decrypted[4] & 0x7F;
final boxUnit = decrypted[5] & 0xFF;
final probeList = <ElinkProbeBoxInfo>[];
if (connectNum > 0) {
for (int i = 0; i < connectNum; i++) {
//探针编号
final num = decrypted[9 + i * 15] & 0xFF;
//盒子连接的探针Mac地址
final mac = List.filled(6, 0x00);
mac[0] = decrypted[10 + i * 15];
mac[1] = decrypted[11 + i * 15];
mac[2] = decrypted[12 + i * 15];
mac[3] = decrypted[13 + i * 15];
mac[4] = decrypted[14 + i * 15];
mac[5] = decrypted[15 + i * 15];
// 食物温度单位
int foodUnit = isBox ? (decrypted[16 + i * 15] & 0xFF) >> 7 : (decrypted[17 + i * 15] & 0x80) >> 7;
// 食物温度正负
int foodPositive = isBox ? decrypted[16 + i * 15] & 0x40 : ((decrypted[17 + i * 15] & 0x40) >> 6) & 0x01;
// 食物温度绝对值
int foodTemperature = isBox ? (decrypted[17 + i * 15] & 0xFF) + ((decrypted[16 + i * 15] & 0x3F) << 8) : (decrypted[16 + i * 15] & 0xFF) + ((decrypted[17 + i * 15] & 0x3F) << 8);
// 环境温度单位
int ambientUnit = isBox ? (decrypted[18 + i * 15] & 0xFF) >> 7 : (decrypted[19 + i * 15] & 0x80) >> 7;
// 环境温度正负
int ambientPositive = isBox ? decrypted[18 + i * 15] & 0x40 : ((decrypted[19 + i * 15] & 0x40) >> 6) & 0x01;
// 环境温度绝对值
int ambientTemperature = isBox ? (decrypted[19 + i * 15] & 0xFF) + ((decrypted[18 + i * 15] & 0x3F) << 8) : (decrypted[18 + i * 15] & 0xFF) + ((decrypted[19 + i] & 0x3F) << 8);
// 探针充电状态
int probeChargingState = (decrypted[20 + i * 15] & 0xFF) >> 7;
// 探针电量
int probeBattery = decrypted[20 + i * 15] & 0x7F;
// 探针插入食物状态 插入1 未插入0 不支持255
int probeState = decrypted[21 + i * 15] & 0xFF;
//数据类赋值
final model = ElinkProbeBoxInfo(num, mac, foodUnit, foodPositive, foodTemperature, ambientUnit, ambientPositive, ambientTemperature, ElinkChargingState.values[probeChargingState], probeBattery, probeState);
probeList.add(model);
}
onGetProbeChargingBoxInfo?.call(supportNum, connectNum, ElinkChargingState.values[boxChargingState], boxBattery, ElinkTemperatureUnit.values[boxUnit], probeList);
} else {
onGetProbeChargingBoxInfo?.call(supportNum, connectNum, ElinkChargingState.values[boxChargingState], boxBattery, ElinkTemperatureUnit.values[boxUnit], probeList);
}
break;
case 0x03: ///探针数据
if (ElinkProbeConfig.isCidProbe(cid)) {
_parseElinkProbeRealTimeData(
decrypted,
onGetRealTimeData: onGetRealTimeData,
);
} else if (ElinkProbeConfig.isCidProbeBox(cid)) {
_parseElinkBoxProbeData(decrypted, onGetProbeInfo: onGetProbeInfo);
} else {
if (decrypted.length < 2) return;
final unit = decrypted[1] & 0x01;
onSwitchUnit?.call(ElinkSetResult.values[unit]);
}
break;
case 0x04: ///mcu上报单位切换结果
onSwitchUnit?.call(ElinkProbeConfig.isCidProbe(cid) ? ElinkSetResult.values[decrypted[1]]: ElinkSetResult.success);
break;
case 0x05: ///mcu上报报警状态数据
if (ElinkProbeConfig.isCidProbeBox(cid)) {
if (decrypted.length < 8) return;
final mac = List.filled(6, 0x00);
mac[0] = decrypted[1];
mac[1] = decrypted[2];
mac[2] = decrypted[3];
mac[3] = decrypted[4];
mac[4] = decrypted[5];
mac[5] = decrypted[6];
final timeout = (decrypted[7] & 0x04) >> 2;
final ambientTempHigh = (decrypted[7] & 0x02) >> 1;
final targetReached = decrypted[7] & 0x01;
onAlarmResult?.call(mac, timeout == 1, ambientTempHigh == 1, targetReached == 1);
}
break;
case 0x06: ///mcu回复报警状态成功或失败 0->成功 1->失败 2->不支持
if (ElinkProbeConfig.isCidProbeBoxWithScreen(cid)) {
if (decrypted.length < 8) return;
final mac = List.filled(6, 0x00);
mac[0] = decrypted[1];
mac[1] = decrypted[2];
mac[2] = decrypted[3];
mac[3] = decrypted[4];
mac[4] = decrypted[5];
mac[5] = decrypted[6];
final targetReached = decrypted[7] & 0x01;
onAlarmResult?.call(mac, false, false, targetReached == 1);
}
break;
case 0x07: ///mcu发送取消报警
break;
case 0x08: ///mcu回复取消报警 0->成功 1->失败 2->不支持
if (ElinkProbeConfig.isCidProbeBoxWithScreen(cid)) {
if (decrypted.length < 8) return;
final mac = List.filled(6, 0x00);
mac[0] = decrypted[1];
mac[1] = decrypted[2];
mac[2] = decrypted[3];
mac[3] = decrypted[4];
mac[4] = decrypted[5];
mac[5] = decrypted[6];
final cancelAlarmState = decrypted[7] & 0xFF;
onCancelAmbientAlarm?.call(mac, cancelAlarmState == 0xFF);
}
break;
case 0x0A:
if (ElinkProbeConfig.isCidProbeBoxWithScreen(cid)) {
_parseElinkBoxWithScreenProbeData(decrypted, onGetProbeInfo: onGetProbeInfo, onGetProbeInfoFailure: onGetProbeInfoFailure, onEndWorkByBox: onEndWorkByBox);
}
break;
}
}
}