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();
    });
  }
}