ex
Fork of mbed-os-example-mbed5-blinky by
Diff: dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/framework/heartbeat/HeartBeat.java
- Revision:
- 45:2aa9f933c8d2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/framework/heartbeat/HeartBeat.java Tue Jul 18 16:34:48 2017 +0800
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baidu.duer.dcs.framework.heartbeat;
+
+import com.baidu.duer.dcs.http.HttpConfig;
+import com.baidu.duer.dcs.http.HttpRequestInterface;
+import com.baidu.duer.dcs.http.callback.ResponseCallback;
+import com.baidu.duer.dcs.util.LogUtil;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import okhttp3.Call;
+import okhttp3.Response;
+
+/**
+ * 用于检测Directives 是否正常
+ * <p>
+ * Created by guxiuzhong@baidu.com on 2017/6/17.
+ */
+public class HeartBeat {
+ private static final String TAG = HeartBeat.class.getSimpleName();
+ // 设置ping成功后的(ping成功即代表directive请求成功了)请求的时间间隔
+ // 修改成270s原因:国内网关保持一个连接时间一般都是300s
+ private static final long PING_TIME_SUCCEED = 30 * 1000;
+ // 设置ping失败后的(ping失败即代表directive请求失败了)请求的时间间隔
+ private static final long PING_TIME_FAILED = 5 * 1000;
+ private final HttpRequestInterface httpRequest;
+ private Timer timer;
+ private PingTask pingTask;
+ private IHeartbeatListener listener;
+ // 连接状态
+ private ConnectState connectState;
+
+ private enum ConnectState {
+ CONNECTED,
+ UNCONNECTED
+ }
+
+ public HeartBeat(HttpRequestInterface httpRequest) {
+ this.httpRequest = httpRequest;
+ timer = new Timer();
+ }
+
+ /**
+ * 如果Directives连接成功了,调用此方法进行探测
+ */
+ public void startNormalPing() {
+ connectState = ConnectState.CONNECTED;
+ startPing(PING_TIME_SUCCEED, PING_TIME_SUCCEED);
+ }
+
+ /**
+ * 如果Directives连接异常了,调用此方法进行探测
+ */
+ public void startExceptionalPing() {
+ connectState = ConnectState.UNCONNECTED;
+ startPing(PING_TIME_FAILED, PING_TIME_FAILED);
+ }
+
+ /**
+ * 如果Events连接异常了,调用此方法进行探测
+ */
+ public void startImmediatePing() {
+ connectState = ConnectState.UNCONNECTED;
+ startPing(0, PING_TIME_FAILED);
+ }
+
+ private void fireOnConnect() {
+ if (listener != null) {
+ listener.onStartConnect();
+ }
+ }
+
+ private void startPing(long delay, long timeInterval) {
+ if (pingTask != null) {
+ pingTask.cancel();
+ }
+ pingTask = new PingTask();
+ if (timer != null) {
+ timer.schedule(pingTask, delay, timeInterval);
+ }
+ }
+
+ /**
+ * 停止ping探测,释放资源
+ */
+ public void release() {
+ if (pingTask != null) {
+ pingTask.cancel();
+ pingTask = null;
+ }
+
+ timer.cancel();
+ timer = null;
+ httpRequest.cancelRequest(HttpConfig.HTTP_PING_TAG);
+ }
+
+ private void ping() {
+ httpRequest.cancelRequest(HttpConfig.HTTP_PING_TAG);
+ httpRequest.doGetPingAsync(null, new ResponseCallback() {
+ @Override
+ public void onError(Call call, Exception e, int id) {
+ super.onError(call, e, id);
+ LogUtil.d(TAG, "ping onError");
+ connectState = ConnectState.UNCONNECTED;
+ fireOnConnect();
+ }
+
+ @Override
+ public void onResponse(Response response, int id) {
+ super.onResponse(response, id);
+ LogUtil.d(TAG, "ping onResponse, code :" + response.code());
+ if (response.code() == 200 || response.code() == 204) {
+ if (connectState == ConnectState.UNCONNECTED) {
+ fireOnConnect();
+ }
+ } else {
+ connectState = ConnectState.UNCONNECTED;
+ fireOnConnect();
+ }
+ }
+ });
+ }
+
+ public void setHeartbeatListener(IHeartbeatListener listener) {
+ this.listener = listener;
+ }
+
+ /**
+ * ping 回调接口
+ */
+ public interface IHeartbeatListener {
+ /**
+ * 需要建立长连接时回调
+ */
+ void onStartConnect();
+ }
+
+ private final class PingTask extends TimerTask {
+ @Override
+ public void run() {
+ ping();
+ }
+ }
+}
\ No newline at end of file
