修改了网络库名称

This commit is contained in:
董宏宇
2021-01-28 16:48:40 +08:00
parent 2376689b3c
commit 352220d78b
47 changed files with 92 additions and 105 deletions

1
foudations/mogo-network/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

View File

@@ -0,0 +1,60 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
// 对kotlin生成doc
apply plugin: 'org.jetbrains.dokka'
apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode 1
versionName "1.0"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dokka {
outputFormat = 'javadoc'
outputDirectory = "$rootDir/ApiDoc/foudations/commons"
configuration {
// Do not output deprecated members
skipDeprecated = true
// Emit warnings about not documented members.
reportUndocumented = true
// Do not create index pages for empty packages
skipEmptyPackages = true
noJdkLink = true
noStdlibLink = true
noAndroidSdkLink = true
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
if (Boolean.valueOf(RELEASE)) {
api "com.mogo.cloud:passport:${MOGO_PASSPORT_VERSION}"
} else {
api project(path: ':foudations:mogo-passport')
}
}

View File

@@ -0,0 +1,4 @@
GROUP=com.mogo.cloud
POM_ARTIFACT_ID=network
VERSION_CODE=1
VERSION_NAME=1.0.2-SNAPSHOT

View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mogo.cloud.commons">
/
</manifest>

View File

@@ -0,0 +1,119 @@
package com.mogo.cloud.commons.utils;
/**
* @author donghongyu
*/
public class CoordinateUtils {
private static double a = 6378245.0;
private static double ee = 0.00669342162296594323;
/**
* 手机GPS坐标转火星坐标
*
* @return
*/
public static double[] transformFromWGSToGCJ( double lat, double lon ) {
//如果在国外,则默认不进行转换
if ( outOfChina( lat, lon ) ) {
return new double[]{lat, lon};
}
double dLat = transformLat( lon - 105.0, lat - 35.0 );
double dLon = transformLon( lon - 105.0, lat - 35.0 );
double radLat = lat / 180.0 * Math.PI;
double magic = Math.sin( radLat );
magic = 1 - ee * magic * magic;
double sqrtMagic = Math.sqrt( magic );
dLat = ( dLat * 180.0 ) / ( ( a * ( 1 - ee ) ) / ( magic * sqrtMagic ) * Math.PI );
dLon = ( dLon * 180.0 ) / ( a / sqrtMagic * Math.cos( radLat ) * Math.PI );
return new double[]{lat + dLat, lon + dLon};
}
public static double transformLat( double x, double y ) {
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt( x > 0 ? x : -x );
ret += ( 20.0 * Math.sin( 6.0 * x * Math.PI ) + 20.0 * Math.sin( 2.0 * x * Math.PI ) ) * 2.0 / 3.0;
ret += ( 20.0 * Math.sin( y * Math.PI ) + 40.0 * Math.sin( y / 3.0 * Math.PI ) ) * 2.0 / 3.0;
ret += ( 160.0 * Math.sin( y / 12.0 * Math.PI ) + 320 * Math.sin( y * Math.PI / 30.0 ) ) * 2.0 / 3.0;
return ret;
}
public static double transformLon( double x, double y ) {
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt( x > 0 ? x : -x );
ret += ( 20.0 * Math.sin( 6.0 * x * Math.PI ) + 20.0 * Math.sin( 2.0 * x * Math.PI ) ) * 2.0 / 3.0;
ret += ( 20.0 * Math.sin( x * Math.PI ) + 40.0 * Math.sin( x / 3.0 * Math.PI ) ) * 2.0 / 3.0;
ret += ( 150.0 * Math.sin( x / 12.0 * Math.PI ) + 300.0 * Math.sin( x / 30.0 * Math.PI ) ) * 2.0 / 3.0;
return ret;
}
public static boolean outOfChina( double lat, double lon ) {
if ( lon < 72.004 || lon > 137.8347 )
return true;
if ( lat < 0.8293 || lat > 55.8271 )
return true;
return false;
}
public static final double[] transformGcj02toWgs84( double lat, double lng ) {
double[] var10000;
if ( outOfChina( lat, lng ) ) {
var10000 = new double[]{lng, lat};
} else {
double dlat = transformLat( lng - 105.0D, lat - 35.0D );
double dlng = transformLon( lng - 105.0D, lat - 35.0D );
double radlat = lat / 180.0D * Math.PI;
double magic = Math.sin( radlat );
magic = ( double ) 1 - 0.006693421622965943D * magic * magic;
double sqrtmagic = Math.sqrt( magic );
dlat = dlat * 180.0D / ( 6335552.717000426D / ( magic * sqrtmagic ) * Math.PI );
dlng = dlng * 180.0D / ( 6378245.0D / sqrtmagic * Math.cos( radlat ) * Math.PI );
double mglat = lat + dlat;
double mglng = lng + dlng;
var10000 = new double[]{lng * ( double ) 2 - mglng, lat * ( double ) 2 - mglat};
}
return var10000;
}
/**
* @param lon1
* @param lat1
* @param lon2
* @param lat2
* @return 两坐标的距离 单位M
*/
public static float calculateLineDistance( double lon1, double lat1, double lon2, double lat2 ) {
try {
double var2 = lon1;
double var4 = lat1;
double var6 = lon2;
double var8 = lat2;
var2 *= 0.01745329251994329D;
var4 *= 0.01745329251994329D;
var6 *= 0.01745329251994329D;
var8 *= 0.01745329251994329D;
double var10 = Math.sin( var2 );
double var12 = Math.sin( var4 );
double var14 = Math.cos( var2 );
double var16 = Math.cos( var4 );
double var18 = Math.sin( var6 );
double var20 = Math.sin( var8 );
double var22 = Math.cos( var6 );
double var24 = Math.cos( var8 );
double[] var28 = new double[3];
double[] var29 = new double[3];
var28[0] = var16 * var14;
var28[1] = var16 * var10;
var28[2] = var12;
var29[0] = var24 * var22;
var29[1] = var24 * var18;
var29[2] = var20;
return ( float ) ( Math.asin( Math.sqrt( ( var28[0] - var29[0] ) * ( var28[0] - var29[0] ) + ( var28[1] - var29[1] ) * ( var28[1] - var29[1] ) + ( var28[2] - var29[2] ) * ( var28[2] - var29[2] ) ) / 2.0D ) * 1.27420015798544E7D );
} catch ( Throwable var26 ) {
var26.printStackTrace();
return 0.0F;
}
}
}

View File

@@ -0,0 +1,12 @@
package com.mogo.cloud.network
import java.io.Serializable
/**
* created by wujifei on 2021/1/22 11:11
* describe:基本数据结构
*/
data class BaseData<T>(var code: Int,
var msg: String?,
val detailMsg: String?,
var result: T?) : Serializable, Cloneable

View File

@@ -0,0 +1,31 @@
package com.mogo.cloud.network
/**
* created by wujifei on 2021/1/20 10:46
* describe:
*/
class NetConstants {
companion object {
const val TAG = "LogInterceptor"
const val READ_TIMEOUT = 20000L
const val WRITE_TIMEOUT = 20000L
const val CONNECT_TIMEOUT = 15000L
const val DEVA_HOST = "http://dzt-deva.zhidaozhixing.com"
const val IM_HOST = "http://dzt-im.zhidaozhixing.com"
const val LAUNCHER_SNAPSHOT_HOST = "http://dzt-launcherSnapshot.zhidaozhixing.com"
const val CHANNEL_MANAGER_HOST = "http://dzt-channelManager.zhidaozhixing.com"
const val DATA_SERVICE_HOST = "http://dzt-dataService.zhidaozhixing.com"
const val REALTIME_LOCATION_HOST = "http://dzt-realtimeLocation.zhidaozhixing.com"
const val INSTANT_HOST = "http://dzt-Instant.zhidaozhixing.com"
const val GEOFENCE_HOST = "http://dzt-geoFenceCarService.zhidaozhixing.com"
const val CARLIFE_HOST = "http://dzt-carlife.zhidaozhixing.com"
const val STRATEGY_PUSH_HOST = "http://dzt-strategyPush.zhidaozhixing.com"
const val TRAVEL_CONDITION_HOST = "http://dzt-travelCondition.zhidaozhixing.com"
const val TMC_HOST = "http://dzt-tmcServer.zhidaozhixing.com"
const val IM_SOCKET_DOMAIN = "dzt-im.zhidaozhixing.com"
const val WEBSOCKET_DOMAIN = "dzt-Instant.zhidaozhixing.com"
}
}

View File

@@ -0,0 +1,38 @@
package com.mogo.cloud.network
import com.mogo.cloud.network.NetConstants.Companion.CONNECT_TIMEOUT
import com.mogo.cloud.network.NetConstants.Companion.READ_TIMEOUT
import com.mogo.cloud.network.NetConstants.Companion.WRITE_TIMEOUT
import com.mogo.cloud.network.SSLSocketFactoryUtils.createSSLSocketFactory
import com.mogo.cloud.network.SSLSocketFactoryUtils.createTrustAllManager
import com.mogo.cloud.network.interceptor.HttpHeaderInterceptor
import com.mogo.cloud.network.interceptor.HttpDnsInterceptor
import com.mogo.cloud.network.interceptor.HttpLoggingInterceptor
import okhttp3.OkHttpClient
import java.util.concurrent.TimeUnit
/**
*
* @Author: wujifei
* @CreateDate: 1/20/21 12:16 AM
* @Description: 获取OkHttpClient
*/
class OkHttpFactory private constructor() {
companion object {
val okHttpClient: OkHttpClient by lazy {
OkHttpClient.Builder()
.addNetworkInterceptor(HttpHeaderInterceptor())
.addNetworkInterceptor(HttpLoggingInterceptor())
.addInterceptor(HttpDnsInterceptor())
.sslSocketFactory(createSSLSocketFactory(), createTrustAllManager())
.hostnameVerifier(SSLSocketFactoryUtils.TrustAllHostnameVerifier())
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
.writeTimeout(WRITE_TIMEOUT, TimeUnit.MILLISECONDS)
.build()
}
}
}

View File

@@ -0,0 +1,48 @@
package com.mogo.cloud.network
import androidx.collection.ArrayMap
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
/**
*
* @Author: wujifei
* @CreateDate: 1/19/21 11:21 PM
* @Description: 获取Retrofit实例
*/
object RetrofitFactory {
private val sRpcServiceMap: MutableMap<String, Retrofit?> = ArrayMap()
private val sRpcNoAdapterServiceMap: MutableMap<String, Retrofit?> = ArrayMap()
@Synchronized
fun getInstance(baseUrl: String): Retrofit? {
var target = sRpcServiceMap[baseUrl]
if (target == null) {
target = Retrofit.Builder()
.client(OkHttpFactory.okHttpClient)
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
sRpcServiceMap[baseUrl] = target
}
return target
}
@Synchronized
fun getInstanceNoCallAdapter(baseUrl: String): Retrofit? {
var target = sRpcNoAdapterServiceMap[baseUrl]
if (target == null) {
target = Retrofit.Builder()
.client(OkHttpFactory.okHttpClient)
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
sRpcNoAdapterServiceMap[baseUrl] = target
}
return target
}
}

View File

@@ -0,0 +1,57 @@
package com.mogo.cloud.network
import java.security.SecureRandom
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import javax.net.ssl.*
/**
* created by wujifei on 2021/1/26 12:51
* describe:
*/
object SSLSocketFactoryUtils {
/*
* 默认信任所有的证书
* 最好加上证书认证主流App都有自己的证书
* */
private const val str = "TLS"
fun createSSLSocketFactory(): SSLSocketFactory? {
var sslSocketFactory: SSLSocketFactory? = null
try {
val sslContext = SSLContext.getInstance(str)
sslContext.init(null, arrayOf<TrustManager?>(createTrustAllManager()), SecureRandom())
sslSocketFactory = sslContext.socketFactory
} catch (e: Exception) {
}
return sslSocketFactory
}
fun createTrustAllManager(): X509TrustManager? {
var tm: X509TrustManager? = null
try {
tm = object : X509TrustManager {
@Throws(CertificateException::class)
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
//do nothing接受任意客户端证书
}
@Throws(CertificateException::class)
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
//do nothing接受任意服务端证书
}
override fun getAcceptedIssuers(): Array<X509Certificate?> {
return arrayOfNulls(0)
}
}
} catch (e: Exception) {
}
return tm
}
class TrustAllHostnameVerifier : HostnameVerifier {
override fun verify(hostname: String, session: SSLSession): Boolean {
return true
}
}
}

View File

@@ -0,0 +1,29 @@
package com.mogo.cloud.network.interceptor
import com.mogo.cloud.httpdns.MogoHttpDnsClient
import com.mogo.utils.logger.Logger
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import java.lang.Exception
/**
* created by wujifei on 2021/1/27 15:57
* describe:
*/
class HttpDnsInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request: Request = chain.request()
var url = request.url().toString()
val host = request.url().host()
try {
MogoHttpDnsClient.getHttpDnsAddressUseCacheIfNecessary(0, request.url().host())?.let {
url = url.replace(host, it)
Logger.d("DomainExchange", """oriHost: ${host} newHost: $it newUrl: $url""")
}
} catch (e: Exception) {
Logger.d("DomainExchange", e.toString())
}
return chain.proceed(request.newBuilder().url(url).build())
}
}

View File

@@ -0,0 +1,20 @@
package com.mogo.cloud.network.interceptor
import com.mogo.cloud.passport.MoGoAiCloudClient
import okhttp3.Interceptor
import okhttp3.Response
/**
* created by wujifei on 2021/1/20 15:18
* describe:header携带信息
*/
class HttpHeaderInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val original = chain.request()
val request = original.newBuilder()
.header("token", MoGoAiCloudClient.getInstance().aiCloudClientConfig.token)
.method(original.method(), original.body())
.build()
return chain.proceed(request)
}
}

View File

@@ -0,0 +1,87 @@
package com.mogo.cloud.network.interceptor
import com.mogo.cloud.network.NetConstants.Companion.TAG
import com.mogo.utils.logger.Logger
import okhttp3.*
import okio.Buffer
import java.io.IOException
import java.nio.charset.Charset
import java.util.concurrent.TimeUnit
/**
* created by wujifei on 2021/1/27 14:33
* describe:网络日志拦截
*/
class HttpLoggingInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val requestBody = request.body()
val hasRequestBody = requestBody != null
var protocol = Protocol.HTTP_1_1.toString()
var body = "null"
if (chain.connection() != null && chain.connection()!!.protocol() != null) {
protocol = chain.connection()!!.protocol().toString()
}
if (hasRequestBody) {
try {
val UTF8 = Charset.forName("UTF-8")
val buffer = Buffer()
requestBody?.writeTo(buffer)
var charset = UTF8
val contentType = requestBody?.contentType()
if (contentType != null) {
charset = contentType.charset(UTF8)
}
if (charset != null) {
body = buffer.readString(charset)
}
} catch (e: IOException) {
e.printStackTrace()
}
}
val logMsg = StringBuilder()
.append("------> http request start").append("\r\n")
.append(protocol).append(", ")
.append(request.method()).append("\r\n")
.append("Request Headers: {").append(request.headers().toString().replace("\n",", ")).append("}\r\n")
.append("Url: ").append(request.url()).append("\r\n")
.append("Content-Type: ").append(requestBody?.contentType()).append("\r\n")
.append("Content-Length: ").append(requestBody?.contentLength()).append("\r\n")
.append("Content-body: ").append(body).append("\r\n")
.append("------> http request end").append("\r\n").append("\r\n")
val startTime = System.nanoTime()
val response = chain.proceed(chain.request())
val endTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)
val responseBody = response.body()
var responseContent: String? = null
var bodySize: String? = null
var contentType: MediaType? = null
var consumedResponse = false
if (responseBody != null) {
val contentLength = responseBody.contentLength()
bodySize = if (contentLength != -1L) "$contentLength-byte" else "unknown-length"
contentType = responseBody.contentType()
responseContent = responseBody.string()
consumedResponse = true
}
logMsg.append("------> http response start").append("\r\n")
.append(response.code()).append(" ")
.append(response.message()).append(" ")
.append(response.protocol()).append(" ").append("\r\n")
.append("Response Content: ").append(responseContent).append("\r\n")
.append("Content-Type: ").append(contentType).append("\r\n")
.append("Content-Length: ").append(bodySize).append("\r\n")
.append("Time: (").append(endTime).append("ms)").append("\r\n")
.append("------> http response end")
Logger.d(TAG, logMsg.toString())
return if (consumedResponse) response.newBuilder().body(ResponseBody.create(contentType, responseContent)).build() else response
}
}