From: snicker Date: Sun, 29 Dec 2019 23:38:37 +0000 (+0800) Subject: 部分协议完成 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=45147c660ef96598b7b07e00b196e0f0e7e66548;p=icsupport.git 部分协议完成 --- diff --git a/.gradle/2.14.1/taskArtifacts/cache.properties.lock b/.gradle/2.14.1/taskArtifacts/cache.properties.lock index 7e66efc5..b37d8199 100644 Binary files a/.gradle/2.14.1/taskArtifacts/cache.properties.lock and b/.gradle/2.14.1/taskArtifacts/cache.properties.lock differ diff --git a/.gradle/2.14.1/taskArtifacts/fileHashes.bin b/.gradle/2.14.1/taskArtifacts/fileHashes.bin index 0629446f..e37426fc 100644 Binary files a/.gradle/2.14.1/taskArtifacts/fileHashes.bin and b/.gradle/2.14.1/taskArtifacts/fileHashes.bin differ diff --git a/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin b/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin index aeb0dbc1..554eedc1 100644 Binary files a/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin and b/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin differ diff --git a/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin b/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin index 04327054..7a8dc8f6 100644 Binary files a/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin and b/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin differ diff --git a/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin b/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin index 4d215b8f..8c51fad7 100644 Binary files a/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin and b/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin differ diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 48e85ca1..6b5012b2 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 874991b5..fde10d2d 100644 Binary files a/.idea/caches/gradle_models.ser and b/.idea/caches/gradle_models.ser differ diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..c619a207 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 2a80f600..00562491 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -3,11 +3,14 @@ \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_appcompat_v7_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_appcompat_v7_25_1_0_aar.xml index 51096cc0..8c7f9eed 100644 --- a/.idea/libraries/Gradle__com_android_support_appcompat_v7_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_appcompat_v7_25_1_0_aar.xml @@ -1,17 +1,14 @@ - - - - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_multidex_1_0_1_aar.xml b/.idea/libraries/Gradle__com_android_support_multidex_1_0_1_aar.xml new file mode 100644 index 00000000..3ec6c82d --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_multidex_1_0_1_aar.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_multidex_instrumentation_1_0_1_aar.xml b/.idea/libraries/Gradle__com_android_support_multidex_instrumentation_1_0_1_aar.xml new file mode 100644 index 00000000..8efd17ff --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_multidex_instrumentation_1_0_1_aar.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_annotations_25_1_0_jar.xml b/.idea/libraries/Gradle__com_android_support_support_annotations_25_1_0_jar.xml index 6d92bf16..0b4a8e67 100644 --- a/.idea/libraries/Gradle__com_android_support_support_annotations_25_1_0_jar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_annotations_25_1_0_jar.xml @@ -1,16 +1,16 @@ - + - + - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_compat_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_compat_25_1_0_aar.xml index 7b18251e..98fe6683 100644 --- a/.idea/libraries/Gradle__com_android_support_support_compat_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_compat_25_1_0_aar.xml @@ -1,17 +1,14 @@ - - - - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_core_ui_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_core_ui_25_1_0_aar.xml index 79c34b06..ca56f345 100644 --- a/.idea/libraries/Gradle__com_android_support_support_core_ui_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_core_ui_25_1_0_aar.xml @@ -1,17 +1,14 @@ - - - - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_core_utils_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_core_utils_25_1_0_aar.xml index 7af2af92..7dd3a2c4 100644 --- a/.idea/libraries/Gradle__com_android_support_support_core_utils_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_core_utils_25_1_0_aar.xml @@ -1,17 +1,14 @@ - - - - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_fragment_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_fragment_25_1_0_aar.xml index d7eb9db7..e5f9b3e9 100644 --- a/.idea/libraries/Gradle__com_android_support_support_fragment_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_fragment_25_1_0_aar.xml @@ -1,17 +1,14 @@ - - - - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_media_compat_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_media_compat_25_1_0_aar.xml index 31c3cdc6..06cee449 100644 --- a/.idea/libraries/Gradle__com_android_support_support_media_compat_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_media_compat_25_1_0_aar.xml @@ -1,17 +1,14 @@ - - - - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_25_1_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_vector_drawable_25_1_0_aar.xml index 5471c4f5..2eeb36f5 100644 --- a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_25_1_0_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_support_vector_drawable_25_1_0_aar.xml @@ -5,10 +5,10 @@ - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml b/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml index dfad6cfe..c2b1ef4c 100644 --- a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml @@ -5,10 +5,10 @@ - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml b/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml index 1ed2abb1..d15151da 100644 --- a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml @@ -5,10 +5,10 @@ - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml b/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml index b36e7fa5..4d86e76e 100644 --- a/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml @@ -5,10 +5,10 @@ - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml b/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml index 45cdf14f..18ad764c 100644 --- a/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml @@ -5,10 +5,10 @@ - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml b/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml index 9736d901..a8924958 100644 --- a/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml +++ b/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml @@ -5,10 +5,10 @@ - + - + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_reactivex_rxjava_1_1_0_jar.xml b/.idea/libraries/Gradle__io_reactivex_rxjava_1_1_0_jar.xml index 1346c816..aeceeca0 100644 --- a/.idea/libraries/Gradle__io_reactivex_rxjava_1_1_0_jar.xml +++ b/.idea/libraries/Gradle__io_reactivex_rxjava_1_1_0_jar.xml @@ -4,6 +4,8 @@ - + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 111c1166..5324a423 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,11 +2,64 @@ - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - - + + + + + + + + + - + - - + + + + + + @@ -229,82 +461,346 @@ - - 1577534766048 + + 1577541371535 - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/app/src/main/java/com/ic/protocol/MainActivity.java + 71 + + + + + + + + + + + + + + + + + "33".split("#") + JAVA + EXPRESSION + + + msg1.split("#") + JAVA + EXPRESSION + + + msg2.split("#"); + JAVA + EXPRESSION + + + msg.split("#") + JAVA + EXPRESSION + + + msg.split("#"); + JAVA + EXPRESSION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + - + + + + + + + + + + + + + + + + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - 1.8 - - - - - - \ No newline at end of file diff --git a/app/EQC_G5.jks b/app/EQC_G5.jks new file mode 100644 index 00000000..2229d46b Binary files /dev/null and b/app/EQC_G5.jks differ diff --git a/app/app.iml b/app/app.iml index 2c8e50d3..5c2f597b 100644 --- a/app/app.iml +++ b/app/app.iml @@ -85,6 +85,8 @@ + + @@ -106,6 +108,7 @@ + @@ -113,6 +116,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index ab03feb7..bf2e328b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,27 @@ apply plugin: 'com.android.application' apply plugin: 'me.tatarka.retrolambda' +// APK 名称 +static def getApkBaseName() { + return "ICSer" +} android { compileSdkVersion 25 buildToolsVersion "25.0.1" + def currentVersionCode = getVersionCode() + def currentVersionName = releaseTime() defaultConfig { - applicationId "com.hy.RxSocketDemo" + applicationId "com.ic.protocol" minSdkVersion 19 targetSdkVersion 25 - versionCode 1 - versionName "1.0" + versionCode currentVersionCode + versionName "${currentVersionName}" + multiDexEnabled true + +// buildConfigField "boolean", "DEBUG_MODE", "true" // 调试版本 + buildConfigField "boolean", "DEBUG_MODE", "false" + // 正式版本 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -18,12 +30,39 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + signingConfigs { + key { + storeFile file("EQC_G5.jks") + storePassword "123456" + keyAlias "watch_g5" + keyPassword "123456" + } + } + buildTypes { + release { + zipAlignEnabled true // zip 对齐优化 + shrinkResources true // 移除未使用的资源文件 + signingConfig signingConfigs.key + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + renderscriptDebuggable = false + debuggable = false + jniDebuggable = false + manifestPlaceholders = [:] + } + + debug { + signingConfig signingConfigs.key + // 启用 Android 插件压缩器 +// minifyEnabled true +// useProguard false + } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } - +} dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { @@ -33,3 +72,27 @@ dependencies { compile 'com.github.ChestnutPlus:TestModules:v1.0.16' testCompile 'junit:junit:4.12' } +def getVersionCode() { + def versionCodeFile = file('version_code.properties') + if (versionCodeFile.canRead()) { + Properties properties = new Properties() + properties.load(new FileInputStream(versionCodeFile)) + def versionCode = properties['VERSION_CODE'].toInteger()//读取version_code.properties文件存放的版本号。 + def runTasks = gradle.startParameter.taskNames + def task = ':app:assembleRelease' + if (task in runTasks) { + properties['VERSION_CODE'] = (++versionCode).toString() + properties.store(versionCodeFile.newWriter(), null) + } + + return versionCode + } else { + throw new GradleException("无法读取version_code.properties文件!") + } +} + +def releaseTime() { + + return new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("GMT+08:00")) + +} \ No newline at end of file diff --git a/app/see_sha1.bat b/app/see_sha1.bat new file mode 100644 index 00000000..2a598670 --- /dev/null +++ b/app/see_sha1.bat @@ -0,0 +1,9 @@ +@echo off +TITLE ²é¿´Ç©ÃûµÄ sha1 +echo ******************************************************** +echo Ìáʾ£ºÃÜÔ¿¿â¿ÚÁîÊÇ 123456 +echo ******************************************************** +echo. +keytool -v -list -keystore EQC_G5.jks +echo ²é¿´Ö¤ÊéÖ¸ÎÆµÄ SHA1 ×Ö¶Î +pause \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e2b07066..c93f8aca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -76,6 +76,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/ic/protocol/MainActivity.java b/app/src/main/java/com/ic/protocol/MainActivity.java index 2c86effb..ea9f7da9 100644 --- a/app/src/main/java/com/ic/protocol/MainActivity.java +++ b/app/src/main/java/com/ic/protocol/MainActivity.java @@ -1,11 +1,15 @@ package com.ic.protocol; +import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; +import com.ic.protocol.service.protocolMainServer; +import com.ic.protocol.utils.RxSocket; + import java.net.InetAddress; import java.nio.ByteBuffer; @@ -15,8 +19,7 @@ import rx.schedulers.Schedulers; public class MainActivity extends AppCompatActivity { - private Toastc toast = null; - + private protocolMainServer mProtocolMainServer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -25,120 +28,50 @@ public class MainActivity extends AppCompatActivity { Button btnConnect = (Button) findViewById(R.id.btnConnect); Button btnDisConnect = (Button) findViewById(R.id.btnDisConnect); Button btnWrite = (Button) findViewById(R.id.btnWrite); - - toast = new Toastc(this, Toast.LENGTH_SHORT); + Button btnWrite2 = (Button) findViewById(R.id.btnWrite2); btnConnect.setOnClickListener(clickListener); btnDisConnect.setOnClickListener(clickListener); btnWrite.setOnClickListener(clickListener); + btnWrite2.setOnClickListener(clickListener); - //监听Socket的收包 - RxSocket.getInstance().read() - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - bytes -> { - //这里,应该去处理这个消息 - LogToast("get Msg :"+new String(bytes)+" (size)" + bytes.length); - - }, - throwable -> { + startService(new Intent(this,protocolMainServer.class));// protocol service + if (mProtocolMainServer == null ) mProtocolMainServer = protocolMainServer.getInstance(); - }, - ()->{ - - } - ); - - //监听Socket的连接状态 - RxSocket.getInstance().socketStatusListener() - .subscribeOn(Schedulers.newThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(socketStatus -> { - LogToast("socketStatus:" + socketStatus.name()); - }); } - /** - * 解析域名获取IP数组 - * @param host - * @return - */ - public String parseHostGetIPAddress(String host) { - StringBuilder serverip=new StringBuilder(""); - try { - InetAddress[] inetAddressArr = InetAddress.getAllByName(host); - if (inetAddressArr != null && inetAddressArr.length > 0) { - String[] ipAddressArr = new String[inetAddressArr.length]; - for (int i = 0; i < inetAddressArr.length; i++) { - serverip.append( inetAddressArr[i].getHostAddress());; - } - } - } catch (Exception e) { - e.printStackTrace(); - return null; - } - return serverip.toString(); - } private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnConnect: //进行连接Socket:这里使用的是,在本地上开启了一个服务器。 - String serverip= parseHostGetIPAddress("watch.jiai.pro"); - RxSocket.getInstance().connectRx(serverip==null?"118.178.155.223":serverip,8090) - .subscribe( - aBoolean -> { - LogToast("RxSocket Connect "+aBoolean); - }, - throwable -> { - LogToast("RxSocket Connect Error : "+throwable.getMessage()); - }, - () -> { - - } - ); + if (mProtocolMainServer == null ) mProtocolMainServer = protocolMainServer.getInstance(); + if(mProtocolMainServer !=null) mProtocolMainServer.connectServer(); break; case R.id.btnDisConnect: //断开连接 - RxSocket.getInstance().disConnect() - .subscribe( - aBoolean -> { - LogToast("RxSocket DisConnect "+aBoolean); - }, - throwable -> { - LogToast("RxSocket DisConnect Error : "+throwable.getMessage()); - }, - () -> { - - } - ); + if (mProtocolMainServer == null ) mProtocolMainServer = protocolMainServer.getInstance(); + if(mProtocolMainServer !=null) mProtocolMainServer.disconnectServer(); break; case R.id.btnWrite: //向RxSocket写数据 - //示例数据:IWAP00867155030001063# - byte[] test = new String("IWAP00867155030001063#").getBytes(); - ByteBuffer byteBuffer = ByteBuffer.wrap(test); - RxSocket.getInstance().write(byteBuffer) - .subscribe( - aBoolean -> { - LogToast("RxSocket write "+aBoolean); - }, - throwable -> { - LogToast("RxSocket write Error : "+throwable.getMessage()); - }, - () -> { - } - ); + if (mProtocolMainServer == null ) mProtocolMainServer = protocolMainServer.getInstance(); + if(mProtocolMainServer !=null) mProtocolMainServer.sendMsg(new String("IWAP00867155030001063#")); + break; + case R.id.btnWrite2: + String msg="IWAP00938495856921245#"; + String msg1="IWAP0093849566856921245#IWAP0"; + String msg2="IWAP00938495856921245#IWAP0093849585692fff5#"; + msg.split("#"); + msg1.split("#"); + msg2.split("#"); + + break; } } }; - private void LogToast(String msg) { - if (msg!=null && msg.length()>0 && toast!=null) - toast.setText(msg).show(); - } } diff --git a/app/src/main/java/com/ic/protocol/adapter/protocolAPIHelper.java b/app/src/main/java/com/ic/protocol/adapter/protocolAPIHelper.java new file mode 100644 index 00000000..f8f08543 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/adapter/protocolAPIHelper.java @@ -0,0 +1,282 @@ +package com.ic.protocol.adapter; + +import android.support.annotation.NonNull; + +import com.ic.protocol.bean.Config; +import com.ic.protocol.bean.deviceStatus; +import com.ic.protocol.bean.heartRateStatus; +import com.ic.protocol.utils.ICLog; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class protocolAPIHelper { + private static final String TAG = "ICSrv." + protocolAPIHelper.class.getSimpleName(); + + private final String CMDHEADER="IW"; + private final String CMDEND="#"; + private final String CMDSPLIT=","; + public enum CMD_TYPE{ + AP00, + BP00, + AP01, + BP01, + AP02, + BP02, + AP92, + BP92, + AP03, + BP03, + AP05, + BP05, + AP07, + BP07, + AP10, + BP10, + AP49, + BP49, + APTM, + BPTM, + AP12, + BP12, + AP14, + BP14, + AP15, + BP15, + AP16, + BP16, + AP17, + BP17, + AP18, + BP18, + AP21, + BP21, + AP28, + BP28, + AP31, + BP31, + AP33, + BP33, + APXL, + BPXL, + AP84, + BP84, + AP85, + BP85, + AP86, + BP86, + AP89, + BP89, + UNKNOWN_CMD, + } + + private HashMap cmdMap=null; + + public protocolAPIHelper(){ + + cmdMap= new HashMap() ; + cmdMap.put(CMD_TYPE.AP00,"AP00"); + cmdMap.put(CMD_TYPE.BP00,"BP00"); + cmdMap.put(CMD_TYPE.AP01,"AP01"); + cmdMap.put(CMD_TYPE.BP01,"BP01"); + cmdMap.put(CMD_TYPE.AP02,"AP02"); + cmdMap.put(CMD_TYPE.BP02,"BP02"); + cmdMap.put(CMD_TYPE.AP92,"AP92"); + cmdMap.put(CMD_TYPE.BP92,"BP92"); + cmdMap.put(CMD_TYPE.AP03,"AP03"); + cmdMap.put(CMD_TYPE.BP03,"BP03"); + cmdMap.put(CMD_TYPE.AP05,"AP05"); + cmdMap.put(CMD_TYPE.BP05,"BP05"); + cmdMap.put(CMD_TYPE.AP07,"AP07"); + cmdMap.put(CMD_TYPE.BP07,"BP07"); + cmdMap.put(CMD_TYPE.AP10,"AP10"); + cmdMap.put(CMD_TYPE.BP10,"BP10"); + cmdMap.put(CMD_TYPE.AP49,"AP49"); + cmdMap.put(CMD_TYPE.BP49,"BP49"); + cmdMap.put(CMD_TYPE.APTM,"APTM"); + cmdMap.put(CMD_TYPE.BPTM,"BPTM"); + cmdMap.put(CMD_TYPE.AP12,"AP12"); + cmdMap.put(CMD_TYPE.BP12,"BP12"); + cmdMap.put(CMD_TYPE.AP14,"AP14"); + cmdMap.put(CMD_TYPE.BP14,"BP14"); + cmdMap.put(CMD_TYPE.AP15,"AP15"); + cmdMap.put(CMD_TYPE.BP15,"BP15"); + cmdMap.put(CMD_TYPE.AP16,"AP16"); + cmdMap.put(CMD_TYPE.BP16,"BP16"); + cmdMap.put(CMD_TYPE.AP17,"AP17"); + cmdMap.put(CMD_TYPE.BP17,"BP17"); + cmdMap.put(CMD_TYPE.AP18,"AP00"); + cmdMap.put(CMD_TYPE.BP18,"BP18"); + cmdMap.put(CMD_TYPE.AP21,"AP21"); + cmdMap.put(CMD_TYPE.BP21,"BP21"); + cmdMap.put(CMD_TYPE.AP28,"AP28"); + cmdMap.put(CMD_TYPE.BP28,"BP28"); + cmdMap.put(CMD_TYPE.AP31,"AP31"); + cmdMap.put(CMD_TYPE.BP31,"BP31"); + cmdMap.put(CMD_TYPE.AP33,"AP33"); + cmdMap.put(CMD_TYPE.BP33,"BP33"); + cmdMap.put(CMD_TYPE.APXL,"APXL"); + cmdMap.put(CMD_TYPE.BPXL,"BPXL"); + cmdMap.put(CMD_TYPE.AP84,"AP84"); + cmdMap.put(CMD_TYPE.BP84,"BP84"); + cmdMap.put(CMD_TYPE.AP85,"AP85"); + cmdMap.put(CMD_TYPE.BP85,"BP85"); + cmdMap.put(CMD_TYPE.AP86,"AP86"); + cmdMap.put(CMD_TYPE.BP86,"BP86"); + cmdMap.put(CMD_TYPE.AP89,"AP89"); + cmdMap.put(CMD_TYPE.BP89,"BP89"); + + } + + private StringBuffer cmdbuf=new StringBuffer(); + /* + 输入的字符串,如果有完整命令,返回 true + 否则返回 false + */ + public boolean isCmdStr(String msg){ + int head_index=msg.indexOf(CMDHEADER); + if (head_index>=0){ + int end_index=msg.indexOf("#",head_index); + if (end_index>=0) + { + return true; + } + } + return false; + } + private void log(String msg) { + ICLog.log(TAG,msg); + } + + private void log(String function,String msg) { + ICLog.log(TAG,function,msg); + } + /* + 返回true 表示 cmd 全部解析成功 + 返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用 + 字符串通过#号进行识别。 + 每个字符串如果发现 #,却又没有Header,“IW”则会被丢弃 + */ + public boolean parserCmd(String cmd_msgbuf){ + boolean iscmdComplete=false; + boolean ret=true; + String last_inCompletecmd=""; + cmdbuf.append(cmd_msgbuf); + /* + 如果不是 #结尾,就认为 接收数据不全,置位。 + */ + if (cmdbuf.toString().endsWith(CMDEND)){ + iscmdComplete=true; + } + String [] cmdlist = cmd_msgbuf.split(CMDEND); + int listlen=cmdlist.length; + /* + 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd + */ + if (cmdlist.length>0 && iscmdComplete==false){ + listlen -=1; + last_inCompletecmd = cmdlist[listlen]; + log("cmd not complete , "+last_inCompletecmd); + } + for (int i = 0; i< listlen ; i++){ + for(CMD_TYPE key: cmdMap.keySet()){ + if ( cmdlist[i].startsWith(CMDHEADER+cmdMap.get(key))){ + log("found cmd keyid=" + key+" ,keyname="+cmdMap.get(key)+" , "+cmdlist[i]); + if(key == CMD_TYPE.BP28){ + //如果是BP28则 后面的数据是音频,需要保留 + if ((i+1)=3) { + log("handleBP00", "Set Datetime " + msg[1]); + log("handleBP00", "Set TimeZone " + msg[2]); + }else{ + log("handleBP00","format Error"); + } + } + + //处理 心跳 BP03 + private void handleBP03(String cmd){ + + } + //处理 BP28 语音消息 + private void handleBP28(String cmd) { + //log("handleBP28 msg"+cmd); + String[] msg=cmd.split(CMDSPLIT); + if (msg.length>=7){ + log(msg[1]); + log(msg[2]); + log(msg[3]); + log(msg[4]); + log(msg[5]); + log(msg[6]); + + } + + } +} diff --git a/app/src/main/java/com/ic/protocol/bean/Config.java b/app/src/main/java/com/ic/protocol/bean/Config.java new file mode 100644 index 00000000..ee394142 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/Config.java @@ -0,0 +1,19 @@ +package com.ic.protocol.bean; + +public class Config { + private String ServerIP="118.178.155.223"; + private int ServerPort=8090; + private String ServerHostname="watch.jiai.pro"; + + + public String getServerIP(){ + return ServerIP; + } + public int getServerPort(){ + return ServerPort; + } + public String getServerHostname(){ + return ServerHostname; + } + +} diff --git a/app/src/main/java/com/ic/protocol/bean/deviceStatus.java b/app/src/main/java/com/ic/protocol/bean/deviceStatus.java new file mode 100644 index 00000000..379feaae --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/deviceStatus.java @@ -0,0 +1,59 @@ +package com.ic.protocol.bean; + +public class deviceStatus { + private String imei="867155030001063"; + private final String UserDebug ="userdebug"; + private final String User ="user"; + + + public String getIMEI(){ + return imei; + } + + + public boolean isNetworkAvailable(){ + return true; + } + + /* + return UserDebug , User + */ + public String BuildType() + { + return UserDebug; + } + + + public String HardwareInfo(){ + return "SC9820E C41 V1.0"; + } + + public String BuildVersion(){ + return "C41-GW-V0.0.1"; + } + + public String getBatteryLevel(){ + return "100"; + } + + public String getGSMSignal(){ + return "060"; + } + + public String getGPSLocationStarNums(){ + return "009"; + } + public String getProtection(){ + return "00"; + } + public String getWorkMode(){ + return "00"; + } + public String getStepCount(){ + return "23425"; + } + + public String getRolltimes(){ + return "00"; + } +} diff --git a/app/src/main/java/com/ic/protocol/bean/heartRateStatus.java b/app/src/main/java/com/ic/protocol/bean/heartRateStatus.java new file mode 100644 index 00000000..12c7ec00 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/heartRateStatus.java @@ -0,0 +1,34 @@ +package com.ic.protocol.bean; + +public class heartRateStatus { + + private int lastHeartrate; + private HEARTRATE_WORKINGSTAT currentStat; + public enum HEARTRATE_WORKINGSTAT { + HEARTRATE_CLOSED, + HEARTRATE_OPEN, + HEARTRATE_NOTWARED, + HEARTRATE_WARED_AND_TESTING, + HEARTRATE_TEST_SUCCESS, + HEARTRATE_TEST_FAILED, + } ; + + public boolean isHeartr8ateExists(){ + return true; + } + + public HEARTRATE_WORKINGSTAT getHeartrateWorkingStat(){ + return currentStat; + } + + public void setHeartrateStat(HEARTRATE_WORKINGSTAT stat){ + currentStat = stat; + } + public int getHeartrateData(){ + return lastHeartrate; + } + + public void setLastHeartrate(int value){ + lastHeartrate=value; + } +} diff --git a/app/src/main/java/com/ic/protocol/bean/location.java b/app/src/main/java/com/ic/protocol/bean/location.java new file mode 100644 index 00000000..c905b32f --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/location.java @@ -0,0 +1,28 @@ +package com.ic.protocol.bean; + +public class location { + + private LOCATION_STAT currentStat; + private LocationPoint currentLP=new LocationPoint(); + public class LocationPoint{ + public double lat; + public double lon; + } + public enum LOCATION_STAT{ + LOCATION_SUCCESS, + LOCATION_GPS_FAILED, + LOCATION_WIFI_FAILED, + } + public LOCATION_STAT getLocationStat(){ + return currentStat; + } + + public LocationPoint getLocation(){ + return currentLP; + } + + public void setLocation(double lat,double lon){ + currentLP.lat=lat; + currentLP.lon=lon; + } +} diff --git a/app/src/main/java/com/ic/protocol/bean/serverStatus.java b/app/src/main/java/com/ic/protocol/bean/serverStatus.java new file mode 100644 index 00000000..9feb0763 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/serverStatus.java @@ -0,0 +1,4 @@ +package com.ic.protocol.bean; + +public class serverStatus { +} diff --git a/app/src/main/java/com/ic/protocol/bean/simStatus.java b/app/src/main/java/com/ic/protocol/bean/simStatus.java new file mode 100644 index 00000000..8d5f9711 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/simStatus.java @@ -0,0 +1,4 @@ +package com.ic.protocol.bean; + +public class simStatus { +} diff --git a/app/src/main/java/com/ic/protocol/bean/stepCounter.java b/app/src/main/java/com/ic/protocol/bean/stepCounter.java new file mode 100644 index 00000000..990a9211 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/bean/stepCounter.java @@ -0,0 +1,4 @@ +package com.ic.protocol.bean; + +public class stepCounter { +} diff --git a/app/src/main/java/com/ic/protocol/service/connectionServer.java b/app/src/main/java/com/ic/protocol/service/connectionServer.java new file mode 100644 index 00000000..e8d3345d --- /dev/null +++ b/app/src/main/java/com/ic/protocol/service/connectionServer.java @@ -0,0 +1,4 @@ +package com.ic.protocol.service; + +public class connectionServer { +} diff --git a/app/src/main/java/com/ic/protocol/service/protocolMainServer.java b/app/src/main/java/com/ic/protocol/service/protocolMainServer.java new file mode 100644 index 00000000..024b8c8e --- /dev/null +++ b/app/src/main/java/com/ic/protocol/service/protocolMainServer.java @@ -0,0 +1,360 @@ +package com.ic.protocol.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.support.annotation.Nullable; +import android.widget.Toast; + +import com.ic.protocol.adapter.protocolAPIHelper; +import com.ic.protocol.bean.Config; +import com.ic.protocol.bean.deviceStatus; +import com.ic.protocol.utils.ICLog; +import com.ic.protocol.utils.RxSocket; + +import java.net.InetAddress; +import java.nio.ByteBuffer; + +import chestnut.ui.Toastc; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.BatteryManager; +import android.os.Handler; +import android.os.IBinder; + +import android.telephony.TelephonyManager; +import android.util.Log; + +import java.util.Timer; +import java.util.TimerTask; + +public class protocolMainServer extends Service { + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + private Toastc toast = null; + + private static protocolMainServer mProtocolServer=null; + + public boolean isServerConnected(){ + return (RxSocket.getInstance().getSocketStatus()==RxSocket.SocketStatus.CONNECTED)?true:false; + } + public boolean sendMsg(String cmd) { + + + if(!isServerConnected()) + { + return false; + } + //向RxSocket写数据 + //示例数据:IWAP00867155030001063# + byte[] test = cmd.getBytes(); + ByteBuffer byteBuffer = ByteBuffer.wrap(test); + RxSocket.getInstance().write(byteBuffer) + .subscribe( + aBoolean -> { + log("RxSocket write " + aBoolean); + }, + throwable -> { + log("RxSocket write Error : " + throwable.getMessage()); + }, + () -> { + + } + ); + return true; + } + public boolean connectServer(){ + + //进行连接Socket:这里使用的是,在本地上开启了一个服务器。 + String serverip= parseHostGetIPAddress("watch.jiai.pro"); + RxSocket.getInstance().connectRx(serverip==null?"118.178.155.223":serverip,8090) + .subscribe( + aBoolean -> { + log("RxSocket Connect "+aBoolean); + }, + throwable -> { + log("RxSocket Connect Error : "+throwable.getMessage()); + }, + () -> { + + } + ); + + + return true; + } + + public boolean disconnectServer(){ + + //断开连接 + RxSocket.getInstance().disConnect() + .subscribe( + aBoolean -> { + log("RxSocket DisConnect "+aBoolean); + }, + throwable -> { + log("RxSocket DisConnect Error : "+throwable.getMessage()); + }, + () -> { + + } + ); + + return true; + } + + /** + * 解析域名获取IP数组 + * @param host + * @return + */ + public String parseHostGetIPAddress(String host) { + StringBuilder serverip=new StringBuilder(""); + try { + InetAddress[] inetAddressArr = InetAddress.getAllByName(host); + if (inetAddressArr != null && inetAddressArr.length > 0) { + String[] ipAddressArr = new String[inetAddressArr.length]; + + for (int i = 0; i < inetAddressArr.length; i++) { + serverip.append( inetAddressArr[i].getHostAddress());; + } + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return serverip.toString(); + } + + private void LogToast(String msg) { +// if (msg!=null && msg.length()>0 && toast!=null) +// toast.setText(msg).show(); + } + + + private static final String TAG = "ICSrv." + protocolMainServer.class.getSimpleName(); + + private static boolean mLowPowerMode = false; + private static boolean mCallStateIsIdle = true; // 非通话活动 + private TelephonyManager telManager; + private Timer mTimer_keepalive=null; + + private Config mConfig=null; + private deviceStatus mDevStat=null; + private protocolAPIHelper mProtocolAPI=null; + + private void log(String msg) { + ICLog.log(TAG,msg); + } + + private void log(String funcName, String msg) { + ICLog.log(TAG,funcName,msg); + } + + + @Override + public void onCreate() { + + log("开始监听网络协议状态"); + + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Intent.ACTION_BATTERY_LOW); // 低电量提示 + intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); // 低电量变化 + intentFilter.addAction(Intent.ACTION_MANAGE_NETWORK_USAGE); + try { + registerReceiver(mIntentReceiver, intentFilter); + } catch (Exception ignored) { + } + + + telManager = (TelephonyManager) getApplicationContext().getSystemService(Service.TELEPHONY_SERVICE); + assert telManager != null; +// telManager.listen(mCallStateListener, PhoneStateListener.LISTEN_CALL_STATE); + + + init_protocols(); + + startTimer(); + mProtocolServer=this; + super.onCreate(); + } + + public static protocolMainServer getInstance(){ + return mProtocolServer; + } + private void init_protocols(){ + + if (mConfig == null) mConfig = new Config(); + if (mDevStat == null) mDevStat =new deviceStatus(); + if (mProtocolAPI == null) mProtocolAPI = new protocolAPIHelper(); + toast = new Toastc(this, Toast.LENGTH_SHORT); + //监听Socket的收包 + RxSocket.getInstance().read() + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + bytes -> { + //这里,应该去处理这个消息 + String msg=new String(bytes); + log("get Msg :"+msg+" (size)" + bytes.length); + mProtocolAPI.parserCmd(msg); + }, + throwable -> { + + }, + ()->{ + + } + ); + + //监听Socket的连接状态 + RxSocket.getInstance().socketStatusListener() + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(socketStatus -> { + log("socketStatus:" + socketStatus.name()); + }); + } + + private void startTimer(){ + if (mTimer_keepalive == null) { + mTimer_keepalive = new Timer(); + } + + if (mTimer_keepalive !=null){ + mTimer_keepalive.schedule(new TimerTask() { + @Override + public void run() { + do_timer_task(); + } + },0,20000); + } + } + + public void do_timer_task(){ + + if(!isServerConnected()) { + connectServer(); + } + if( needLogin()){ + log("do_timer_task send cmd "+ mProtocolAPI.AP00(mDevStat)); +// Handler callbackHandler=new Handler(); + String serverip = parseHostGetIPAddress(mConfig.getServerHostname()); + log("getip "+mConfig.getServerHostname()+" "+serverip); +// mConfig.setServerIP(serverip); +// mConfig.setServerPort(8090); + sendMsg(mProtocolAPI.AP00(mDevStat)); + + + } + log("do_timer_task send cmd "+ mProtocolAPI.AP03(mDevStat)); + sendMsg(mProtocolAPI.AP03(mDevStat)); + + } + private void stopTimer(){ + if (mTimer_keepalive !=null){ + mTimer_keepalive.cancel(); + mTimer_keepalive = null; + } + } + + private boolean needLogin(){ + return true; + } + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + return super.onStartCommand(intent, flags, startId); + } + + + @Override + public void onDestroy() { + super.onDestroy(); + try { + unregisterReceiver(mIntentReceiver); + } catch (Exception ignored) { + } + } + + private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + boolean lastIsLowPowerMode = isLowPowerMode(); + log("mIntentReceiver,onReceive", "START"); + log("mIntentReceiver,onReceive", "action: " + action + + ", mCallStateIsIdle: " + mCallStateIsIdle); + + setLowPowerMode(false); + if (!inCall() && action != null) { // 非通话活动 + boolean currLowPowerMode = false; + if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { + int rawLevel = intent.getIntExtra("level", -1); + int scale = intent.getIntExtra("scale", -1); + int status = intent.getIntExtra("status", -1); + int level = -1; // percentage, or -1 for unknown + + if (status != BatteryManager.BATTERY_STATUS_CHARGING) { // 非充电状态 + if (rawLevel >= 0 && scale > 0) { + level = (rawLevel * 100) / scale; + currLowPowerMode = isLowPower(level); + log("mIntentReceiver,onReceive", "level: " + level); + } + } + } else if (action.equals(Intent.ACTION_BATTERY_LOW)) { + log("mIntentReceiver,onReceive", "ACTION_BATTERY_LOW"); + currLowPowerMode = true; + } + + // 只在状态改变时激活桌面 + boolean needActivateLauncher = (currLowPowerMode != lastIsLowPowerMode); + log("mIntentReceiver,onReceive", + "lastIsLowPowerMode:" + lastIsLowPowerMode + + "currLowPowerMode:" + currLowPowerMode + + ", needActivateLauncher:" + needActivateLauncher); + + setLowPowerMode(currLowPowerMode); + + + if (needActivateLauncher) { + log("低电量,进入协议省电模式!"); + } + + } + log("mIntentReceiver,onReceive", "END"); + } + }; + + public boolean isLowPowerMode() { + log("isLowPowerMode", "" + mLowPowerMode); + return mLowPowerMode; + } + + /** + * 根据电量,判断是否是低电量 + * + * @param level + * @return + */ + public static boolean isLowPower(int level) { + return (level <= 15); + } + + public void setLowPowerMode(boolean v) { + log("setLowPowerMode", "" + v); + mLowPowerMode = v; + } + + private boolean inCall() { +// return telManager.getCallState() != TelephonyManager.CALL_STATE_IDLE; + return false; + } +} diff --git a/app/src/main/java/com/ic/protocol/utils/ICLog.java b/app/src/main/java/com/ic/protocol/utils/ICLog.java new file mode 100644 index 00000000..86d71531 --- /dev/null +++ b/app/src/main/java/com/ic/protocol/utils/ICLog.java @@ -0,0 +1,22 @@ +package com.ic.protocol.utils; + +import android.util.Log; + +public class ICLog { + private static final boolean DEBUG = true; //BuildConfig.DEBUG; + + public static void log(String TAG, String msg) { + if (DEBUG) { + Log.i(TAG, msg); + + } + + + } + + public static void log(String TAG,String funcName, String msg) { + if (DEBUG) { + Log.i(TAG, "[" + funcName + "]" + msg); + } + } +} diff --git a/app/src/main/java/com/ic/protocol/RxSocket.java b/app/src/main/java/com/ic/protocol/utils/RxSocket.java similarity index 99% rename from app/src/main/java/com/ic/protocol/RxSocket.java rename to app/src/main/java/com/ic/protocol/utils/RxSocket.java index f1623e9d..82c797cb 100644 --- a/app/src/main/java/com/ic/protocol/RxSocket.java +++ b/app/src/main/java/com/ic/protocol/utils/RxSocket.java @@ -1,4 +1,4 @@ -package com.ic.protocol; +package com.ic.protocol.utils; import java.net.InetSocketAddress; import java.nio.ByteBuffer; diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b6352a83..b2ccdf09 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,7 +8,7 @@ android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" - tools:context="com.hy.RxSocketDemo.MainActivity"> + tools:context="com.ic.protocol.MainActivity">