parseData method

void parseData(
  1. List<int> mac,
  2. List<int> data, {
  3. OnSwitchUnit? onSwitchUnit,
  4. OnGetRealTimeData? onGetRealTimeData,
  5. OnGetProbeBoxInfo? onGetProbeChargingBoxInfo,
  6. OnGetProbeInfo? onGetProbeInfo,
  7. OnAlarmResult? onAlarmResult,
  8. OnCancelAmbientAlarm? onCancelAmbientAlarm,
  9. OnGetProbeInfoFailure? onGetProbeInfoFailure,
  10. 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;
    }
  }
}