startHeartBeat method

Future<void> startHeartBeat()

Implementation

Future<void> startHeartBeat() async {
  if (_stateDataObs.isJoinClassSuccess) {
    if (_config.classId.toString().isEmpty) {
      TCICLog.error(
        'classId is empty, please check the classId',
        actionModule: ActionModule.tcicController.name,
        actionName: ActionName.startHeartBeat.name,
      );
      return;
    }
    final stateReport = json.encode({
      "RtcInfos": {"userId": _config.userId},
      "Role": getRole().name,
      "Time": DateTime.now().toIso8601String(),
      "Seq": heartBeatSeq,
    });
    TCICLog.info(
      "$stateReport, heartBeatInterval: $heartBeatInterval ms",
      actionModule: ActionModule.tcicController.name,
      actionName: ActionName.startHeartBeat.name,
    );
    // 如果 networkService.sendHeartBeat 3 秒内没有返回,则直接 return
    try {
      final data = await networkService
          .sendHeartBeat(
            HeartbeatBody(classId: _config.classId, stateReport: stateReport),
          )
          .timeout(
            const Duration(seconds: 3),
            onTimeout: () {
              TCICLog.error(
                'sendHeartBeat 超时(3秒未返回)',
                actionModule: ActionModule.tcicController.name,
                actionName: ActionName.startHeartBeat.name,
              );
              return null;
            },
          );
      if (data == null) {
        return;
      } else {
        if (data.errorCode == 0) {
          heartBeatSeq++;
          if (data.interval != 0) {
            final currentInterval = (data.interval);
            if (currentInterval != heartBeatInterval) {
              heartBeatInterval = currentInterval;
              TCICLog.info(
                'heartBeatInterval changed: $heartBeatInterval',
                actionModule: ActionModule.tcicController.name,
                actionName: ActionName.startHeartBeat.name,
              );
            }
          }
        } else {
          if (_handleHeartBeatResult(data)) {
            return;
          }
        }
      }
    } catch (e) {
      TCICLog.error(
        'sendHeartBeat 异常: $e',
        actionModule: ActionModule.tcicController.name,
        actionName: ActionName.startHeartBeat.name,
      );
      return;
    }

    cancelHeartBeatTimer();
    _heartBeatTimer = Timer.periodic(
      Duration(milliseconds: heartBeatInterval),
      (timer) {
        startHeartBeat();
      },
    );
  }
}