package com.ezviz.demo.common;
import com.google.gson.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class HdlHttp
{
///
/// 请求地址
///
public static String RequestHttpsHost = "https://test-gz.hdlcontrol.com";
public String HeaderPrefix = "Bearer ";
public static String HdlToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI2YTdlNzExOTAyNTQ0Y2FhOWQyMGVkMDMyNzRmNTE3OCIsInJvbGUiOiIiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidXNlckFjY291bnQiOiIxODgyNDg2NDE0MyIsInRlbmFudElkIjoiMjAiLCJ1c2VyVHlwZSI6IlVTRVJfQyIsInRva2VuVHlwZSI6ImFjY2Vzc190b2tlbiIsInVzZXJOYW1lIjoiTEUwMDAiLCJhcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzMjg4ODYyNzMwMDM4NTU4NzQiLCJleHAiOjE2MTQ5MTM0MzksIm5iZiI6MTYxNDkwNjIzOX0.bx_z4weGI3HfehqKppM3nuegDgVOXvvKAOJFhArdhlO8pKjrnCMv-3t4xtzp8fORwGTjV_Mz4JESAicwsK0tgtkrnUonNqmSizkq2ZyaETiriZFt6333-hi-pyqNoKHTow6-rVIrJHVePOiecS1VGLND0TZ3gMR82KZHrqKmwQ4";
public String RequestResponseFromZigbeeHttps(String i_RequestName, HashMap i_pra) {
byte[] result = RequestResultFromZigbeeHttps(i_RequestName, i_pra);
if (result == null) {
return null;
}
String resultData = new String(result);
String code = "";
String data = "";
try {
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(resultData);
JsonObject jsonObj = element.getAsJsonObject();
code = jsonObj.get("code").toString();
data = jsonObj.get("data").toString();
} catch (Exception e) {
}
if (code.equals("0") == false) {
return null;
}
return data;
}
private byte[] CheckTokenIsTimeOut(byte[] i_result, String i_RequestName, HashMap i_pra)
{
if (i_result == null || i_result.length == 0 || i_result[0] != '{' || i_result[i_result.length - 1] != '}')
{
//以上都不是正规的json
return i_result;
}
String resultData = new String(i_result);
String code = "";
String data = "";
try {
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(resultData);
JsonObject jsonObj = element.getAsJsonObject();
code = jsonObj.get("code").toString();
data = jsonObj.get("data").toString();
} catch (Exception e) {
}
if (code.equals("-1") || code.equals("-2"))
{
//系统繁忙,请稍后再试
return null;
}
if (code.equals("40001") || code.equals("10006") )
{
return null;
}
return i_result;
}
public byte[] RequestResultFromZigbeeHttps(String i_RequestName, HashMap i_pra)
{
// Token=MainActivity.token;
//请求Url的完成路径
String fullUrl = RequestHttpsHost + "/" + i_RequestName;
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).build();
MediaType mediaType = MediaType.parse("application/json");
String strBody = this.GetSignRequestJson(new Gson().toJson(i_pra));
RequestBody body = RequestBody.create(mediaType, strBody);
Request request = new Request.Builder().url(fullUrl).post(body)
.addHeader("Content-Type", "application/json")
.addHeader("authorization", HeaderPrefix + HdlToken)
.addHeader("clientType", "2")
.build();
try
{
Response response = client.newCall(request).execute();
ResponseBody responseBody = response.body();
InputStream inputStream = responseBody.byteStream();
byte[] bytes = readInputStream(inputStream);
return CheckTokenIsTimeOut(bytes, i_RequestName, i_pra);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
private byte[] readInputStream(InputStream inputStream)
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
try
{
while ((len = inputStream.read(buffer)) != -1)
{
outputStream.write(buffer, 0, len);
}
byte[] data = outputStream.toByteArray();
outputStream.close();
inputStream.close();
return data;
}
catch (IOException e)
{
return null;
}
}
///
/// appKey(访问云端固定的东西)
///
private String APP_KEY = "HDL-HOME-APP-TEST";
///
/// 我也不知道这是什么鬼东西
///
private String SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss";
///
/// 获取当前时间戳值(访问云端使用)
///
///
private String GetTimestamp()
{
// 相差秒数
return String.valueOf(System.currentTimeMillis());
}
///
/// MD5加密
///
///
///
private String SignMD5Encrypt(String s)
{
try
{
byte[] btInput = s.getBytes("utf-8");
MessageDigest mdInst = MessageDigest.getInstance("MD5");
mdInst.update(btInput);
byte[] sign = mdInst.digest();
String signstr = "";
for (int i = 0; i < sign.length; i++)
{
String stmp = Integer.toHexString(sign[i] & 0xff);
if (stmp.length() == 1)
{
signstr += "0" + stmp;
}
else
{
signstr += stmp;
}
}
return signstr.toLowerCase();
}
catch (IOException | NoSuchAlgorithmException e)
{
return null;
}
}
///
/// 基础服务的接口都要校验sign,计算sign签名
///
/// body的数据
///
private String GetSignRequestJson(String i_BodyData)
{
//1. 将model实体转为Dictionary
HashMap paramDictionary = new Gson().fromJson(i_BodyData, HashMap.class);
//2. 计算sign
if (paramDictionary != null)
{
paramDictionary.put("appKey", APP_KEY);
paramDictionary.put("timestamp", GetTimestamp());
//2.1 字典升序
List listkey = new ArrayList(paramDictionary.keySet());
Collections.sort(listkey);
//2.2 拼接按URL键值对
String str = "";
for (int i = 0; i < listkey.size(); i++)
{
String strkey = listkey.get(i);
Object obj = paramDictionary.get(strkey);
if (obj == null)
{
//不校验
continue;
}
String myValue = obj.toString();
if (myValue == "")
{
//空字符也不校验
continue;
}
if (obj.getClass() == boolean.class)
{
//云端那帮沙雕说bool类型必须用小写
myValue = myValue.toLowerCase();
}
str += strkey + "=" + myValue + "&";
}
//2.3 拼接SECRET_KEY
str = str.substring(0, str.length() - 1) + SECRET_KEY;
//2.4 MD5转换+转小写
String signstr = SignMD5Encrypt(str);
paramDictionary.put("sign", signstr);
return new Gson().toJson(paramDictionary).toString();
}
else
{
return "";
}
}
}