ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:34:48 2017 +0800
Revision:
45:2aa9f933c8d2
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TMBOY 45:2aa9f933c8d2 1 /*
TMBOY 45:2aa9f933c8d2 2 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
TMBOY 45:2aa9f933c8d2 3 *
TMBOY 45:2aa9f933c8d2 4 * Licensed under the Apache License, Version 2.0 (the "License");
TMBOY 45:2aa9f933c8d2 5 * you may not use this file except in compliance with the License.
TMBOY 45:2aa9f933c8d2 6 * You may obtain a copy of the License at
TMBOY 45:2aa9f933c8d2 7 *
TMBOY 45:2aa9f933c8d2 8 * http://www.apache.org/licenses/LICENSE-2.0
TMBOY 45:2aa9f933c8d2 9 *
TMBOY 45:2aa9f933c8d2 10 * Unless required by applicable law or agreed to in writing, software
TMBOY 45:2aa9f933c8d2 11 * distributed under the License is distributed on an "AS IS" BASIS,
TMBOY 45:2aa9f933c8d2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TMBOY 45:2aa9f933c8d2 13 * See the License for the specific language governing permissions and
TMBOY 45:2aa9f933c8d2 14 * limitations under the License.
TMBOY 45:2aa9f933c8d2 15 */
TMBOY 45:2aa9f933c8d2 16 package com.baidu.duer.dcs.framework;
TMBOY 45:2aa9f933c8d2 17
TMBOY 45:2aa9f933c8d2 18 import com.baidu.duer.dcs.framework.dispatcher.AudioData;
TMBOY 45:2aa9f933c8d2 19 import com.baidu.duer.dcs.framework.dispatcher.MultipartParser;
TMBOY 45:2aa9f933c8d2 20 import com.baidu.duer.dcs.framework.heartbeat.HeartBeat;
TMBOY 45:2aa9f933c8d2 21 import com.baidu.duer.dcs.framework.message.DcsRequestBody;
TMBOY 45:2aa9f933c8d2 22 import com.baidu.duer.dcs.framework.message.DcsResponseBody;
TMBOY 45:2aa9f933c8d2 23 import com.baidu.duer.dcs.framework.message.DcsStreamRequestBody;
TMBOY 45:2aa9f933c8d2 24 import com.baidu.duer.dcs.http.HttpConfig;
TMBOY 45:2aa9f933c8d2 25 import com.baidu.duer.dcs.http.HttpRequestInterface;
TMBOY 45:2aa9f933c8d2 26 import com.baidu.duer.dcs.http.OkHttpRequestImpl;
TMBOY 45:2aa9f933c8d2 27 import com.baidu.duer.dcs.http.callback.ResponseCallback;
TMBOY 45:2aa9f933c8d2 28 import com.baidu.duer.dcs.util.LogUtil;
TMBOY 45:2aa9f933c8d2 29
TMBOY 45:2aa9f933c8d2 30 import java.io.IOException;
TMBOY 45:2aa9f933c8d2 31
TMBOY 45:2aa9f933c8d2 32 import okhttp3.Call;
TMBOY 45:2aa9f933c8d2 33 import okhttp3.Response;
TMBOY 45:2aa9f933c8d2 34
TMBOY 45:2aa9f933c8d2 35 /**
TMBOY 45:2aa9f933c8d2 36 * 和服务器端保持长连接、发送events和接收directives和维持心跳
TMBOY 45:2aa9f933c8d2 37 * <p>
TMBOY 45:2aa9f933c8d2 38 * Created by wuruisheng on 2017/6/1.
TMBOY 45:2aa9f933c8d2 39 */
TMBOY 45:2aa9f933c8d2 40 public class DcsClient {
TMBOY 45:2aa9f933c8d2 41 public static final String TAG = DcsClient.class.getSimpleName();
TMBOY 45:2aa9f933c8d2 42 private final DcsResponseDispatcher dcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 43 private final HttpRequestInterface httpRequestImp;
TMBOY 45:2aa9f933c8d2 44 private final HeartBeat heartBeat;
TMBOY 45:2aa9f933c8d2 45 private IDcsClientListener dcsClientListener;
TMBOY 45:2aa9f933c8d2 46
TMBOY 45:2aa9f933c8d2 47 public DcsClient(DcsResponseDispatcher dcsResponseDispatcher, IDcsClientListener dcsClientListener) {
TMBOY 45:2aa9f933c8d2 48 this.dcsResponseDispatcher = dcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 49 this.dcsClientListener = dcsClientListener;
TMBOY 45:2aa9f933c8d2 50 httpRequestImp = new OkHttpRequestImpl();
TMBOY 45:2aa9f933c8d2 51 heartBeat = new HeartBeat(httpRequestImp);
TMBOY 45:2aa9f933c8d2 52 heartBeat.setHeartbeatListener(new HeartBeat.IHeartbeatListener() {
TMBOY 45:2aa9f933c8d2 53 @Override
TMBOY 45:2aa9f933c8d2 54 public void onStartConnect() {
TMBOY 45:2aa9f933c8d2 55 startConnect();
TMBOY 45:2aa9f933c8d2 56 }
TMBOY 45:2aa9f933c8d2 57 });
TMBOY 45:2aa9f933c8d2 58 }
TMBOY 45:2aa9f933c8d2 59
TMBOY 45:2aa9f933c8d2 60 public void release() {
TMBOY 45:2aa9f933c8d2 61 heartBeat.release();
TMBOY 45:2aa9f933c8d2 62 httpRequestImp.cancelRequest(HttpConfig.HTTP_DIRECTIVES_TAG);
TMBOY 45:2aa9f933c8d2 63 httpRequestImp.cancelRequest(HttpConfig.HTTP_EVENT_TAG);
TMBOY 45:2aa9f933c8d2 64 }
TMBOY 45:2aa9f933c8d2 65
TMBOY 45:2aa9f933c8d2 66 /**
TMBOY 45:2aa9f933c8d2 67 * 建立连接
TMBOY 45:2aa9f933c8d2 68 */
TMBOY 45:2aa9f933c8d2 69 public void startConnect() {
TMBOY 45:2aa9f933c8d2 70 httpRequestImp.cancelRequest(HttpConfig.HTTP_DIRECTIVES_TAG);
TMBOY 45:2aa9f933c8d2 71 getDirectives(new IResponseListener() {
TMBOY 45:2aa9f933c8d2 72 @Override
TMBOY 45:2aa9f933c8d2 73 public void onSucceed(int statusCode) {
TMBOY 45:2aa9f933c8d2 74 LogUtil.d(TAG, "getDirectives onSucceed");
TMBOY 45:2aa9f933c8d2 75 fireOnConnected();
TMBOY 45:2aa9f933c8d2 76 heartBeat.startNormalPing();
TMBOY 45:2aa9f933c8d2 77 }
TMBOY 45:2aa9f933c8d2 78
TMBOY 45:2aa9f933c8d2 79 @Override
TMBOY 45:2aa9f933c8d2 80 public void onFailed(String errorMessage) {
TMBOY 45:2aa9f933c8d2 81 LogUtil.d(TAG, "getDirectives onFailed");
TMBOY 45:2aa9f933c8d2 82 fireOnUnconnected();
TMBOY 45:2aa9f933c8d2 83 heartBeat.startExceptionalPing();
TMBOY 45:2aa9f933c8d2 84 }
TMBOY 45:2aa9f933c8d2 85 });
TMBOY 45:2aa9f933c8d2 86 }
TMBOY 45:2aa9f933c8d2 87
TMBOY 45:2aa9f933c8d2 88 /**
TMBOY 45:2aa9f933c8d2 89 * 发送带流式请求
TMBOY 45:2aa9f933c8d2 90 *
TMBOY 45:2aa9f933c8d2 91 * @param requestBody 消息体
TMBOY 45:2aa9f933c8d2 92 * @param streamRequestBody stream式消息体
TMBOY 45:2aa9f933c8d2 93 * @param listener 回调
TMBOY 45:2aa9f933c8d2 94 */
TMBOY 45:2aa9f933c8d2 95 public void sendRequest(DcsRequestBody requestBody,
TMBOY 45:2aa9f933c8d2 96 DcsStreamRequestBody streamRequestBody, final IResponseListener listener) {
TMBOY 45:2aa9f933c8d2 97 httpRequestImp.doPostEventMultipartAsync(requestBody,
TMBOY 45:2aa9f933c8d2 98 streamRequestBody, getResponseCallback(dcsResponseDispatcher, new IResponseListener() {
TMBOY 45:2aa9f933c8d2 99 @Override
TMBOY 45:2aa9f933c8d2 100 public void onSucceed(int statusCode) {
TMBOY 45:2aa9f933c8d2 101 if (listener != null) {
TMBOY 45:2aa9f933c8d2 102 listener.onSucceed(statusCode);
TMBOY 45:2aa9f933c8d2 103 }
TMBOY 45:2aa9f933c8d2 104 }
TMBOY 45:2aa9f933c8d2 105
TMBOY 45:2aa9f933c8d2 106 @Override
TMBOY 45:2aa9f933c8d2 107 public void onFailed(String errorMessage) {
TMBOY 45:2aa9f933c8d2 108 if (listener != null) {
TMBOY 45:2aa9f933c8d2 109 listener.onFailed(errorMessage);
TMBOY 45:2aa9f933c8d2 110 }
TMBOY 45:2aa9f933c8d2 111
TMBOY 45:2aa9f933c8d2 112 heartBeat.startImmediatePing();
TMBOY 45:2aa9f933c8d2 113 }
TMBOY 45:2aa9f933c8d2 114 }));
TMBOY 45:2aa9f933c8d2 115 }
TMBOY 45:2aa9f933c8d2 116
TMBOY 45:2aa9f933c8d2 117 /**
TMBOY 45:2aa9f933c8d2 118 * 发送普通请求
TMBOY 45:2aa9f933c8d2 119 *
TMBOY 45:2aa9f933c8d2 120 * @param requestBody 消息体
TMBOY 45:2aa9f933c8d2 121 * @param listener 回调
TMBOY 45:2aa9f933c8d2 122 */
TMBOY 45:2aa9f933c8d2 123 public void sendRequest(DcsRequestBody requestBody, IResponseListener listener) {
TMBOY 45:2aa9f933c8d2 124 httpRequestImp.doPostEventStringAsync(requestBody,
TMBOY 45:2aa9f933c8d2 125 getResponseCallback(dcsResponseDispatcher, listener));
TMBOY 45:2aa9f933c8d2 126 }
TMBOY 45:2aa9f933c8d2 127
TMBOY 45:2aa9f933c8d2 128 private void getDirectives(IResponseListener listener) {
TMBOY 45:2aa9f933c8d2 129 httpRequestImp.cancelRequest(HttpConfig.HTTP_DIRECTIVES_TAG);
TMBOY 45:2aa9f933c8d2 130 httpRequestImp.doGetDirectivesAsync(null,
TMBOY 45:2aa9f933c8d2 131 getResponseCallback(dcsResponseDispatcher, listener));
TMBOY 45:2aa9f933c8d2 132 }
TMBOY 45:2aa9f933c8d2 133
TMBOY 45:2aa9f933c8d2 134 private void fireOnConnected() {
TMBOY 45:2aa9f933c8d2 135 if (dcsClientListener != null) {
TMBOY 45:2aa9f933c8d2 136 dcsClientListener.onConnected();
TMBOY 45:2aa9f933c8d2 137 }
TMBOY 45:2aa9f933c8d2 138 }
TMBOY 45:2aa9f933c8d2 139
TMBOY 45:2aa9f933c8d2 140 private void fireOnUnconnected() {
TMBOY 45:2aa9f933c8d2 141 if (dcsClientListener != null) {
TMBOY 45:2aa9f933c8d2 142 dcsClientListener.onUnconnected();
TMBOY 45:2aa9f933c8d2 143 }
TMBOY 45:2aa9f933c8d2 144 }
TMBOY 45:2aa9f933c8d2 145
TMBOY 45:2aa9f933c8d2 146 private ResponseCallback getResponseCallback(final DcsResponseDispatcher dcsResponseDispatcher,
TMBOY 45:2aa9f933c8d2 147 final IResponseListener responseListener) {
TMBOY 45:2aa9f933c8d2 148 ResponseCallback responseCallback = new ResponseCallback() {
TMBOY 45:2aa9f933c8d2 149 @Override
TMBOY 45:2aa9f933c8d2 150 public void onError(Call call, Exception e, int id) {
TMBOY 45:2aa9f933c8d2 151 LogUtil.d(TAG, "onError,", e);
TMBOY 45:2aa9f933c8d2 152 if (responseListener != null) {
TMBOY 45:2aa9f933c8d2 153 responseListener.onFailed(e.getMessage());
TMBOY 45:2aa9f933c8d2 154 }
TMBOY 45:2aa9f933c8d2 155 }
TMBOY 45:2aa9f933c8d2 156
TMBOY 45:2aa9f933c8d2 157 @Override
TMBOY 45:2aa9f933c8d2 158 public void onResponse(Response response, int id) {
TMBOY 45:2aa9f933c8d2 159 super.onResponse(response, id);
TMBOY 45:2aa9f933c8d2 160 LogUtil.d(TAG, "onResponse OK ," + response.request().url());
TMBOY 45:2aa9f933c8d2 161 LogUtil.d(TAG, "onResponse code ," + response.code());
TMBOY 45:2aa9f933c8d2 162 if (responseListener != null) {
TMBOY 45:2aa9f933c8d2 163 responseListener.onSucceed(response.code());
TMBOY 45:2aa9f933c8d2 164 }
TMBOY 45:2aa9f933c8d2 165 }
TMBOY 45:2aa9f933c8d2 166
TMBOY 45:2aa9f933c8d2 167 @Override
TMBOY 45:2aa9f933c8d2 168 public Response parseNetworkResponse(Response response, int id) throws Exception {
TMBOY 45:2aa9f933c8d2 169 int statusCode = response.code();
TMBOY 45:2aa9f933c8d2 170 if (statusCode == 200) {
TMBOY 45:2aa9f933c8d2 171 MultipartParser multipartParser = new MultipartParser(
TMBOY 45:2aa9f933c8d2 172 new MultipartParser.IMultipartParserListener() {
TMBOY 45:2aa9f933c8d2 173 @Override
TMBOY 45:2aa9f933c8d2 174 public void onResponseBody(DcsResponseBody responseBody) {
TMBOY 45:2aa9f933c8d2 175 dcsResponseDispatcher.onResponseBody(responseBody);
TMBOY 45:2aa9f933c8d2 176 }
TMBOY 45:2aa9f933c8d2 177
TMBOY 45:2aa9f933c8d2 178 @Override
TMBOY 45:2aa9f933c8d2 179 public void onAudioData(AudioData audioData) {
TMBOY 45:2aa9f933c8d2 180 dcsResponseDispatcher.onAudioData(audioData);
TMBOY 45:2aa9f933c8d2 181 }
TMBOY 45:2aa9f933c8d2 182
TMBOY 45:2aa9f933c8d2 183 @Override
TMBOY 45:2aa9f933c8d2 184 public void onParseFailed(String unParseMessage) {
TMBOY 45:2aa9f933c8d2 185 dcsResponseDispatcher.onParseFailed(unParseMessage);
TMBOY 45:2aa9f933c8d2 186 }
TMBOY 45:2aa9f933c8d2 187 });
TMBOY 45:2aa9f933c8d2 188
TMBOY 45:2aa9f933c8d2 189 try {
TMBOY 45:2aa9f933c8d2 190 multipartParser.parseResponse(response);
TMBOY 45:2aa9f933c8d2 191 } catch (IOException e) {
TMBOY 45:2aa9f933c8d2 192 e.printStackTrace();
TMBOY 45:2aa9f933c8d2 193 }
TMBOY 45:2aa9f933c8d2 194 }
TMBOY 45:2aa9f933c8d2 195 return response;
TMBOY 45:2aa9f933c8d2 196 }
TMBOY 45:2aa9f933c8d2 197 };
TMBOY 45:2aa9f933c8d2 198
TMBOY 45:2aa9f933c8d2 199 return responseCallback;
TMBOY 45:2aa9f933c8d2 200 }
TMBOY 45:2aa9f933c8d2 201
TMBOY 45:2aa9f933c8d2 202 public interface IDcsClientListener {
TMBOY 45:2aa9f933c8d2 203 void onConnected();
TMBOY 45:2aa9f933c8d2 204
TMBOY 45:2aa9f933c8d2 205 void onUnconnected();
TMBOY 45:2aa9f933c8d2 206 }
TMBOY 45:2aa9f933c8d2 207 }