@@ -22,7 +22,11 @@ android { | |||
sourceCompatibility 1.8 | |||
targetCompatibility 1.8 | |||
} | |||
sourceSets { | |||
main { | |||
jniLibs.srcDirs = ['libs'] | |||
} | |||
} | |||
} | |||
@@ -31,9 +35,9 @@ dependencies { | |||
implementation 'androidx.appcompat:appcompat:1.1.0' | |||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | |||
testImplementation 'junit:junit:4.12' | |||
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.7.4' | |||
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.0' | |||
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.5.4' | |||
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.7.4'//蓝牙核心库 | |||
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.0'//OTA库,需要依赖核心库 | |||
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.5.4'//解析库,需要依赖核心库 | |||
implementation 'androidx.recyclerview:recyclerview:1.1.0' | |||
implementation 'com.jakewharton:butterknife:10.2.0' | |||
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' |
@@ -29,11 +29,11 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleBleConfig; | |||
@@ -43,11 +43,10 @@ import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleDeviceData; | |||
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData; | |||
/** | |||
* xing<br> | |||
* 2019/7/12<br> | |||
* 显示数据 | |||
* 艾地体脂秤 | |||
*/ | |||
public class ADWeightScaleCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, OnBleSettingListener, | |||
ADWeightScaleDeviceData.onNotifyData, View.OnClickListener, RadioGroup.OnCheckedChangeListener { |
@@ -26,7 +26,7 @@ import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData; | |||
/** | |||
* xing<br> | |||
* 2019/11/14<br> | |||
* java类作用描述 | |||
* 艾地体脂秤用户管理界面 | |||
*/ | |||
public class ADWeightScaleUserActivity extends AppCompatActivity implements View.OnClickListener { | |||
@@ -10,6 +10,7 @@ import android.widget.ArrayAdapter; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import android.widget.RadioGroup; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
@@ -24,11 +25,11 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatBleConfig; | |||
@@ -57,6 +58,7 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
private int heightUnit = 0; | |||
private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin; | |||
private RadioButton mRadioButtonCm, mRadioButtonInch, mRadioButtonFoot; | |||
private TextView tv_baby_body_fat_weight,tv_baby_body_fat_height,tv_baby_body_fat_adc; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
@@ -112,6 +114,11 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
mRadioButtonFoot = findViewById(R.id.radio_height_foot); | |||
tv_baby_body_fat_weight = findViewById(R.id.tv_baby_body_fat_weight); | |||
tv_baby_body_fat_height = findViewById(R.id.tv_baby_body_fat_height); | |||
tv_baby_body_fat_adc = findViewById(R.id.tv_baby_body_fat_adc); | |||
} | |||
@@ -386,6 +393,8 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
weightUnit = unit; | |||
showWeightUnit(weightUnit); | |||
} | |||
tv_baby_body_fat_weight.setText(weightStr+unitStr); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -415,6 +424,7 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
heightUnit = unit; | |||
showHeightUnit(heightUnit); | |||
} | |||
tv_baby_body_fat_height.setText(heightStr+unitStr); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -429,6 +439,7 @@ public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbac | |||
public void onImpedanceSuccess(boolean appAlgorithm,int adc, int algorithmId) { | |||
BleLog.i(TAG, "测阻抗成功"); | |||
mList.add(TimeUtils.getTime() + "测阻抗成功,阻抗值:" + adc + " ,算法ID:" + algorithmId+" ;"+(appAlgorithm?"使用app算法":"使用秤算法")); | |||
tv_baby_body_fat_adc.setText(String.valueOf(adc)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -24,22 +24,21 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; | |||
import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 显示数据 | |||
* 婴儿秤 | |||
*/ | |||
public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener | |||
, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener, | |||
@@ -431,6 +430,9 @@ public class BabyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
@Override | |||
protected void onDestroy() { | |||
if (babyDevice!=null){ | |||
babyDevice.disconnect(); | |||
} | |||
super.onDestroy(); | |||
BleLog.i(TAG, "onDestroy"); | |||
} |
@@ -5,6 +5,7 @@ import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.text.TextUtils; | |||
import android.view.View; | |||
import android.view.WindowManager; | |||
import android.widget.ArrayAdapter; | |||
@@ -26,6 +27,7 @@ import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleInfoListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleParameterListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleRssiListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleSettingListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
@@ -33,12 +35,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDataUtils; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
@@ -48,14 +50,13 @@ import androidx.annotation.Nullable; | |||
* 2019/4/25<br> | |||
* 基础指令信息数据显示 | |||
*/ | |||
public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, | |||
OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener { | |||
public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener, OnBleRssiListener { | |||
private static String TAG = BleCmdActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
private EditText etName, etMacType, etDid, etBroadcastTime, etMcuType, etSleepTime; | |||
private EditText etName, etMacType, etCid, etVid, etPid, etBroadcastTime, etMcuType, etSleepTime; | |||
private Context mContext; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
@@ -65,7 +66,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
/** | |||
* 是否暂停显示数据 | |||
*/ | |||
private boolean mPauseShowCmd=false; | |||
private boolean mPauseShowCmd = false; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
@@ -120,9 +121,12 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
findViewById(R.id.btnSleepTimeWrite).setOnClickListener(this); | |||
findViewById(R.id.btnSleepTimeRead).setOnClickListener(this); | |||
findViewById(R.id.btn_start_ble).setOnClickListener(this); | |||
findViewById(R.id.btnNameRssi).setOnClickListener(this); | |||
etName = findViewById(R.id.etName); | |||
etMacType = findViewById(R.id.etMacType); | |||
etDid = findViewById(R.id.etDid); | |||
etCid = findViewById(R.id.etCid); | |||
etVid = findViewById(R.id.etVid); | |||
etPid = findViewById(R.id.etPid); | |||
etBroadcastTime = findViewById(R.id.etBroadcastTime); | |||
etMcuType = findViewById(R.id.etMcuType); | |||
etSleepTime = findViewById(R.id.etSleepTime); | |||
@@ -138,16 +142,25 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
case R.id.btnPause: | |||
mPauseShowCmd=!mPauseShowCmd; | |||
mPauseShowCmd = !mPauseShowCmd; | |||
break; | |||
case R.id.btnHandshake: | |||
if (mBleDevice != null) | |||
mBleDevice.sendHandshake(); | |||
if (mBleDevice != null) { | |||
mBleDevice.setHandshakeStatus(true); | |||
// mBleDevice.sendHandshake(); | |||
mList.add(TimeUtils.getTime() + "发送握手"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
break; | |||
case R.id.btnVersion: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
sendData(sendBleBean); | |||
// sendBleBean = new SendBleBean(); | |||
// sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
// sendData(sendBleBean); | |||
if (mBleDevice != null) { | |||
String version = mBleDevice.getVersion(); | |||
mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
break; | |||
case R.id.btnBattery: | |||
sendBleBean = new SendBleBean(); | |||
@@ -204,21 +217,29 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnDidWrite: | |||
String didStr = etDid.getText().toString().trim().toLowerCase(Locale.US); | |||
if (didStr.contains(",")) { | |||
String[] didStrS = didStr.split(","); | |||
if (didStrS.length > 5) { | |||
int cidS = Integer.parseInt(didStrS[0]); | |||
int vidS = Integer.parseInt(didStrS[1]); | |||
int pidS = Integer.parseInt(didStrS[2]); | |||
int cid = Integer.parseInt(didStrS[3]); | |||
int vid = Integer.parseInt(didStrS[4]); | |||
int pid = Integer.parseInt(didStrS[5]); | |||
byte[] did = bleDataUtils.getDid(cidS, vidS, pidS, cid, vid, pid); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setDid(did)); | |||
sendData(sendBleBean); | |||
try { | |||
String cidS = etCid.getText().toString().trim().toLowerCase(Locale.US); | |||
String vidS = etVid.getText().toString().trim().toLowerCase(Locale.US); | |||
String pidS = etPid.getText().toString().trim().toLowerCase(Locale.US); | |||
int cid = 0; | |||
int vid = 0; | |||
int pid = 0; | |||
if (!TextUtils.isEmpty(cidS)) { | |||
cid = Integer.parseInt(cidS); | |||
} | |||
if (!TextUtils.isEmpty(vidS)) { | |||
vid = Integer.parseInt(vidS); | |||
} | |||
if (!TextUtils.isEmpty(pidS)) { | |||
pid = Integer.parseInt(pidS); | |||
} | |||
byte[] did = bleDataUtils.getDid(1, 1, 1, cid, vid, pid); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setDid(did)); | |||
sendData(sendBleBean); | |||
} catch (NumberFormatException e) { | |||
e.printStackTrace(); | |||
} | |||
break; | |||
case R.id.btnDidRead: | |||
@@ -275,6 +296,11 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
sendBleBean.setHex(mBleSendCmdUtil.setToWake()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnNameRssi: | |||
if (mBleDevice != null) { | |||
mBleDevice.readRssi(); | |||
} | |||
break; | |||
} | |||
@@ -300,9 +326,10 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
if (mBleDevice == null) { | |||
finish(); | |||
BleLog.i(TAG, "mBleDevice==null"); | |||
return; | |||
} | |||
mBleDevice.setOnBleVersionListener(this); | |||
// mBleDevice.setOnBleDeviceDataListener(this); | |||
mBleDevice.setOnBleDeviceDataListener(this); | |||
mBleDevice.setOnBleErrListener(this); | |||
mBleDevice.setOnBleInfoListener(this); | |||
mBleDevice.setOnMcuParameterListener(this); | |||
@@ -311,6 +338,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
mBleDevice.setOnBleParameterListener(this); | |||
mBleDevice.setOnBleHandshakeListener(this); | |||
mBleDevice.setOnBleOtherDataListener(this); | |||
mBleDevice.setOnBleRssiListener(this); | |||
} | |||
} | |||
@@ -383,16 +411,21 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
@Override | |||
public void onNotifyOtherData(byte[] data) { | |||
if (mPauseShowCmd){ | |||
if (mPauseShowCmd) { | |||
return; | |||
} | |||
mList.add(TimeUtils.getTime() + "透传数据:" + BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onNotifyDataA6(byte[] hex) { | |||
} | |||
@Override | |||
public void onNotifyData(byte[] hex, int type) { | |||
if (mPauseShowCmd){ | |||
if (mPauseShowCmd) { | |||
return; | |||
} | |||
String data = ""; | |||
@@ -538,6 +571,16 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, On | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void OnRssi(int rssi) { | |||
String name = ""; | |||
if (mBleDevice != null) { | |||
name = mBleDevice.getName(); | |||
} | |||
mList.add(TimeUtils.getTime() + "名称:" + name + " ,||信号:" + rssi); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); |
@@ -1,500 +0,0 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.content.Context; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.view.WindowManager; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.Toast; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleErrListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleInfoListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleParameterListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleSettingListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDataUtils; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 基础指令信息数据显示 | |||
*/ | |||
public class BleCmdActivityDataData extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener,View.OnClickListener , OnBleOtherDataListener { | |||
private static String TAG = BleCmdActivityDataData.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
private EditText etName, etMacType, etDid, etBroadcastTime, etMcuType; | |||
private Context mContext; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
private BleDataUtils bleDataUtils; | |||
private BleDevice mBleDevice; | |||
private int type; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
switch (msg.what) { | |||
case REFRESH_DATA: | |||
if (listAdapter != null) | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_ble); | |||
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); | |||
mContext = this; | |||
mAddress = getIntent().getStringExtra("mac"); | |||
type = getIntent().getIntExtra("type", -1); | |||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
init(); | |||
} | |||
private void init() { | |||
mList = new ArrayList<>(); | |||
ListView listView = findViewById(R.id.listview); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
listView.setAdapter(listAdapter); | |||
bleDataUtils = BleDataUtils.getInstance(); | |||
findViewById(R.id.btnClear).setOnClickListener(this); | |||
findViewById(R.id.btnHandshake).setOnClickListener(this); | |||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btnTimeRead).setOnClickListener(this); | |||
findViewById(R.id.btnTimeWrite).setOnClickListener(this); | |||
findViewById(R.id.btnNameRead).setOnClickListener(this); | |||
findViewById(R.id.btnMacRead).setOnClickListener(this); | |||
findViewById(R.id.btnMacTypeRead).setOnClickListener(this); | |||
findViewById(R.id.btnNameWrite).setOnClickListener(this); | |||
findViewById(R.id.btnMacTypeWrite).setOnClickListener(this); | |||
findViewById(R.id.btnDidWrite).setOnClickListener(this); | |||
findViewById(R.id.btnDidRead).setOnClickListener(this); | |||
findViewById(R.id.btnBroadcastTimeWrite).setOnClickListener(this); | |||
findViewById(R.id.btnBroadcastTimeRead).setOnClickListener(this); | |||
findViewById(R.id.btnBmRestart).setOnClickListener(this); | |||
findViewById(R.id.btnBmReset).setOnClickListener(this); | |||
findViewById(R.id.btnMcuType).setOnClickListener(this); | |||
findViewById(R.id.btnUnits).setOnClickListener(this); | |||
etName = findViewById(R.id.etName); | |||
etMacType = findViewById(R.id.etMacType); | |||
etDid = findViewById(R.id.etDid); | |||
etBroadcastTime = findViewById(R.id.etBroadcastTime); | |||
etMcuType = findViewById(R.id.etMcuType); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
SendBleBean sendBleBean; | |||
switch (v.getId()) { | |||
case R.id.btnClear: | |||
if (mList != null) | |||
mList.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
case R.id.btnHandshake: | |||
if (mBleDevice != null) | |||
mBleDevice.sendHandshake(); | |||
break; | |||
case R.id.btnVersion: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnBattery: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnTimeRead: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getSysTime()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnTimeWrite: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(),true)); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnNameRead: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getBleName()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnMacRead: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getBleMac()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnMacTypeRead: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnMacTypeWrite: | |||
byte macType = Byte.valueOf(etMacType.getText().toString().trim()); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType)); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnNameWrite: | |||
byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim()); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setBleName(names)); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnBroadcastTimeRead: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnBroadcastTimeWrite: | |||
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnDidWrite: | |||
String didStr = etDid.getText().toString().trim().toLowerCase(Locale.US); | |||
if (didStr.contains(",")) { | |||
String[] didStrS = didStr.split(","); | |||
if (didStrS.length > 5) { | |||
int cidS = Integer.parseInt(didStrS[0]); | |||
int vidS = Integer.parseInt(didStrS[1]); | |||
int pidS = Integer.parseInt(didStrS[2]); | |||
int cid = Integer.parseInt(didStrS[3]); | |||
int vid = Integer.parseInt(didStrS[4]); | |||
int pid = Integer.parseInt(didStrS[5]); | |||
byte[] did = bleDataUtils.getDid(cidS, vidS, pidS, cid, vid, pid); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setDid(did)); | |||
sendData(sendBleBean); | |||
} | |||
} | |||
break; | |||
case R.id.btnDidRead: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnBmRestart: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setBleRestart()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnBmReset: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setBleReset()); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnMcuType: | |||
byte mode=(byte)Integer.parseInt(etMcuType.getText().toString().trim()); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode)); | |||
sendData(sendBleBean); | |||
break; | |||
case R.id.btnUnits: | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit()); | |||
sendData(sendBleBean); | |||
break; | |||
} | |||
} | |||
private void sendData(SendBleBean sendBleBean) { | |||
if (mBleDevice != null) { | |||
mBleDevice.sendData(sendBleBean); | |||
} | |||
} | |||
//---------------------------------服务--------------------------------------------------- | |||
@Override | |||
public void onServiceSuccess() { | |||
mList.add(TimeUtils.getTime() + "服务与界面建立连接成功"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
CallbackDisIm.getInstance().addListListener(this); | |||
if (mBluetoothService != null) { | |||
mBleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (mBleDevice == null) { | |||
finish(); | |||
BleLog.i(TAG, "mBleDevice==null"); | |||
} | |||
mBleDevice.setOnBleVersionListener(this); | |||
// mBleDevice.setOnBleDeviceDataListener(this); | |||
mBleDevice.setOnBleErrListener(this); | |||
mBleDevice.setOnBleInfoListener(this); | |||
mBleDevice.setOnMcuParameterListener(this); | |||
mBleDevice.setOnBleSettingListener(this); | |||
mBleDevice.setOnBleCompanyListener(this); | |||
mBleDevice.setOnBleParameterListener(this); | |||
mBleDevice.setOnBleHandshakeListener(this); | |||
mBleDevice.setOnBleOtherDataListener(this); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
mList.add(TimeUtils.getTime() + "服务与界面连接断开"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
mHandler.postDelayed(new Runnable() { | |||
@Override | |||
public void run() { | |||
finish(); | |||
} | |||
}, 3000); | |||
//与服务断开连接 | |||
mBluetoothService = null; | |||
} | |||
@Override | |||
public void unbindServices() { | |||
CallbackDisIm.getInstance().removeListener(this); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
BleLog.i(TAG, "unbindService,断开连接"); | |||
bleDevice.disconnect(); | |||
} | |||
} | |||
//-----------------状态------------------- | |||
@Override | |||
public void onConnecting(@NonNull String mac) { | |||
//TODO 连接中 | |||
BleLog.i(TAG, "连接中"); | |||
} | |||
@Override | |||
public void onDisConnected(@NonNull String mac, int code) { | |||
//TODO 连接断开 | |||
BleLog.i(TAG, "连接断开"); | |||
if (mAddress.equals(mac)) { | |||
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||
finish(); | |||
} | |||
} | |||
@Override | |||
public void onServicesDiscovered(@NonNull String mac) { | |||
//TODO 连接成功(获取服务成功) | |||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
} | |||
@Override | |||
public void bleOpen() { | |||
} | |||
@Override | |||
public void bleClose() { | |||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
} | |||
//--------------------------------- | |||
@Override | |||
public void onNotifyOtherData(byte[] data) { | |||
mList.add(TimeUtils.getTime() + "透传数据:" + BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onNotifyData(byte[] hex, int type) { | |||
String data = ""; | |||
if (hex != null) | |||
data = BleStrUtils.byte2HexStr(hex); | |||
if (type == 100) { | |||
mList.add(TimeUtils.getTime() + "send->" + data); | |||
} else { | |||
mList.add(TimeUtils.getTime() + "notify->" + data); | |||
} | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onHandshake(boolean status) { | |||
mList.add(TimeUtils.getTime() + "握手:" + status); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onSupportUnit(List<SupportUnitBean> list) { | |||
StringBuilder unitStr=new StringBuilder(); | |||
unitStr.append(TimeUtils.getTime()); | |||
for (SupportUnitBean supportUnitBean : list) { | |||
unitStr.append("单位类型:").append(supportUnitBean.getType()); | |||
StringBuilder units= new StringBuilder(); | |||
units.append("["); | |||
for (Integer integer1 : supportUnitBean.getSupportUnit()) { | |||
units.append(integer1).append(","); | |||
} | |||
units.append("]"); | |||
unitStr.append("单位列表:").append(units); | |||
unitStr.append("\n"); | |||
} | |||
mList.add(unitStr.toString()); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onMcuBatteryStatus(int status, int battery) { | |||
mList.add(TimeUtils.getTime() + "电量:" + battery + "%" + "||状态:" + status); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onSysTime(int status, int[] times) { | |||
String timeStr = | |||
times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + | |||
":" + times[5]; | |||
mList.add(TimeUtils.getTime() + "时间:" + timeStr + "||是否有效:" + status); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onErr(int cmdType) { | |||
mList.add(TimeUtils.getTime() + "错误:" + cmdType); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void OnSettingReturn(byte cmdType, byte cmdData) { | |||
mList.add(TimeUtils.getTime() + "设置指令:" + cmdType + "||结果:" + cmdData); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBleName(String name) { | |||
mList.add(TimeUtils.getTime() + "名称:" + name); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBleMac(String mac) { | |||
mList.add(TimeUtils.getTime() + "Mac:" + mac); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onNoConnectSleep(int sleepSwitch, int sleepTime, int sleepBroadcastSwitch, | |||
int sleepBroadcastTime) { | |||
mList.add(TimeUtils.getTime() + "sleepSwitch:" + sleepSwitch + "||sleepTime:" + sleepTime + "||sleepBroadcastSwitch:" + sleepBroadcastSwitch + "||sleepBroadcastTime:" + sleepBroadcastTime); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void OnDID(int cid, int vid, int pid) { | |||
mList.add(TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBleBroadcastTime(int time) { | |||
mList.add(TimeUtils.getTime() + "广播间隔:" + time); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onConnectTime(int time, int status, int timeOut) { | |||
mList.add(TimeUtils.getTime() + "连接:time:" + time + "||status:" + status + "||timeOut:" + timeOut); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBlePower(int power) { | |||
mList.add(TimeUtils.getTime() + "功率:" + power); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onPortRate(int rate) { | |||
mList.add(TimeUtils.getTime() + "串口波特率:" + rate); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBroadcastDataType(int type) { | |||
mList.add(TimeUtils.getTime() + "广播大小端:" + type); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onModuleUUID(int length, String serverUUID, String featureUUID1, | |||
String featureUUID2) { | |||
mList.add(TimeUtils.getTime() + "UUID:length:" + length + "||serverUUID:" + serverUUID + | |||
"||featureUUID1:" + featureUUID1 + "||featureUUID2" + featureUUID2); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBleMode(int mode) { | |||
mList.add(TimeUtils.getTime() + "模式:" + mode); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
BleLog.i(TAG, "onDestroy"); | |||
} | |||
} |
@@ -0,0 +1,347 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.ListView; | |||
import android.widget.SeekBar; | |||
import android.widget.TextView; | |||
import android.widget.Toast; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.widget.AppCompatSeekBar; | |||
import cn.net.aicare.modulelibrary.module.BloodOxygen.BleBloodOxygenBleConfig; | |||
import cn.net.aicare.modulelibrary.module.BloodOxygen.BleBloodOxygenDeviceData; | |||
/** | |||
* 血氧仪 | |||
*/ | |||
public class BloodOxygenActivity extends BleBaseActivity implements OnCallbackBle, BleBloodOxygenDeviceData.DataCallback { | |||
private TextView tv_sp_max, tv_sp_min, tv_pr_max, tv_pr_min, tv_pl_max, tv_pl_min, tv_version; | |||
private AppCompatSeekBar sb_sp_max, sb_sp_min, sb_pr_max, sb_pr_min, sb_pl_max, sb_pl_min; | |||
private ListView mListView; | |||
private List<String> loglist; | |||
private ArrayAdapter listAdapter; | |||
private String mAddress; | |||
private boolean mPauseRefresh = false; | |||
private BleBloodOxygenDeviceData mBleBloodOxygenDeviceData; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_bloodoxygen); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
tv_sp_max = findViewById(R.id.tv_sp_max); | |||
tv_sp_min = findViewById(R.id.tv_sp_min); | |||
tv_pr_max = findViewById(R.id.tv_pr_max); | |||
tv_pr_min = findViewById(R.id.tv_pr_min); | |||
tv_pl_max = findViewById(R.id.tv_pl_max); | |||
tv_pl_min = findViewById(R.id.tv_pl_min); | |||
tv_version = findViewById(R.id.tv_version); | |||
sb_sp_max = findViewById(R.id.sb_sp_max); | |||
sb_sp_min = findViewById(R.id.sb_sp_min); | |||
sb_pr_max = findViewById(R.id.sb_pr_max); | |||
sb_pr_min = findViewById(R.id.sb_pr_min); | |||
sb_pl_max = findViewById(R.id.sb_pl_max); | |||
sb_pl_min = findViewById(R.id.sb_pl_min); | |||
sb_pl_min = findViewById(R.id.sb_pl_min); | |||
mListView = findViewById(R.id.lv_log); | |||
loglist = new ArrayList<>(); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
mListView.setAdapter(listAdapter); | |||
findViewById(R.id.bt_status).setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
if (mBleBloodOxygenDeviceData != null) | |||
mBleBloodOxygenDeviceData.getDeviceStatus(); | |||
} | |||
}); | |||
findViewById(R.id.bt_alarm).setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
int sp_max = sb_sp_max.getProgress(); | |||
int sp_min = sb_sp_min.getProgress(); | |||
int pl_max = sb_pl_max.getProgress(); | |||
int pl_min = sb_pl_min.getProgress(); | |||
int pr_max = sb_pr_max.getProgress(); | |||
int pr_min = sb_pr_min.getProgress(); | |||
if (mBleBloodOxygenDeviceData != null) | |||
mBleBloodOxygenDeviceData.setAlarm(sp_max, sp_min, pr_max, pr_min, pl_max, pl_min); | |||
} | |||
}); | |||
findViewById(R.id.bt_version).setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
if (mBleBloodOxygenDeviceData != null) | |||
mBleBloodOxygenDeviceData.getVersion(); | |||
} | |||
}); | |||
findViewById(R.id.bt_pause).setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
mPauseRefresh=!mPauseRefresh; | |||
} | |||
}); | |||
findViewById(R.id.bt_clear).setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
mPauseRefresh=false; | |||
loglist.clear(); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
}); | |||
sb_sp_max.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_sp_max.setText(progress + ""); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
sb_sp_min.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_sp_min.setText(progress + ""); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
sb_pr_max.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_pr_max.setText(progress + ""); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
sb_pr_min.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_pr_min.setText(progress + ""); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
sb_pl_max.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_pl_max.setText(progress + ""); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
sb_pl_min.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_pl_min.setText(progress + ""); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
loglist.add(0, "连接设备成功"); | |||
mBluetoothService.setOnCallback(this); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
BleBloodOxygenDeviceData.init(bleDevice, this); | |||
mBleBloodOxygenDeviceData = BleBloodOxygenDeviceData.getInstance(); | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
protected void startScanBle(long timeOut) { | |||
super.startScanBle(timeOut); | |||
} | |||
@Override | |||
protected void stopScanBle() { | |||
super.stopScanBle(); | |||
} | |||
@Override | |||
protected void connectBle(BleValueBean bleValueBean) { | |||
super.connectBle(bleValueBean); | |||
} | |||
@Override | |||
protected void connectBle(String mac) { | |||
super.connectBle(mac); | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mAddress.equalsIgnoreCase(mac)) { | |||
Toast.makeText(this, "设备断开连接", Toast.LENGTH_SHORT).show(); | |||
finish(); | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mBleBloodOxygenDeviceData != null) { | |||
mBleBloodOxygenDeviceData.disconnect(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onData(byte[] data, int type) { | |||
String dataStr = "收到的数据"; | |||
if (type == 1) { | |||
dataStr = "收到透传数据:"; | |||
} | |||
dataStr += BleStrUtils.byte2HexStr(data); | |||
loglist.add(0, dataStr); | |||
refreshData(); | |||
} | |||
@Override | |||
public void onResult(int status, int spo2, int pr, float pi, int battery, float rr, int py, int pyTrough, int wearStatus) { | |||
String statusStr = ""; | |||
switch (status) { | |||
case BleBloodOxygenBleConfig.Test_status_START: | |||
statusStr = "开始测试"; | |||
break; | |||
case BleBloodOxygenBleConfig.Test_status_Finish: | |||
statusStr = "正在测试"; | |||
break; | |||
case BleBloodOxygenBleConfig.Test_status_ERROR: | |||
statusStr = "测试结束"; | |||
break; | |||
} | |||
String wearStatusStr = wearStatus == 1 ? "已佩戴" : "未佩戴"; | |||
String showData = | |||
"测试状态:" + statusStr + "\n血氧饱和度:" + spo2 + "\n脉率:" + pr + "\n血流灌注指数:" + pi + "\n电池电量:" + battery + "\n呼吸频率(RR):" + rr + "\n脉率曲线值:" + py + "\n脉率曲线波谷:" + pyTrough + "\n佩戴状态:" + wearStatusStr; | |||
loglist.add(0, showData); | |||
refreshData(); | |||
} | |||
@Override | |||
public void onSetResult(int result) { | |||
String resultStr = ""; | |||
switch (result) { | |||
case BleBloodOxygenBleConfig.SET_RESULT_FAIL: | |||
resultStr = "设置失败"; | |||
break; | |||
case BleBloodOxygenBleConfig.SET_RESULT_SUCCESS: | |||
resultStr = "设置成功"; | |||
break; | |||
} | |||
loglist.add(0, "设置结果" + resultStr); | |||
refreshData(); | |||
} | |||
@Override | |||
public void onErrorCode(int code) { | |||
String errorStr = ""; | |||
switch (code) { | |||
case BleBloodOxygenBleConfig.ErrorCode_Saturation_Rate_Not_Stable: | |||
errorStr = "血氧饱和率不稳定"; | |||
break; | |||
case BleBloodOxygenBleConfig.ErrorCode_Pulse_Rate_Unstable: | |||
errorStr = "脉率不稳定"; | |||
break; | |||
case BleBloodOxygenBleConfig.ErrorCode_Test_Error: | |||
errorStr = "测量出错"; | |||
break; | |||
case BleBloodOxygenBleConfig.ErrorCode_Low_Power: | |||
errorStr = "设备低电"; | |||
break; | |||
} | |||
loglist.add(0, "设置结果" + errorStr); | |||
refreshData(); | |||
} | |||
private void refreshData() { | |||
if (listAdapter != null && !mPauseRefresh) { | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
tv_version.setText(version); | |||
} | |||
} |
@@ -0,0 +1,394 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.os.Bundle; | |||
import android.text.Editable; | |||
import android.text.TextWatcher; | |||
import android.util.Log; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import org.json.JSONArray; | |||
import org.json.JSONException; | |||
import org.json.JSONObject; | |||
import java.io.ByteArrayOutputStream; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.net.HttpURLConnection; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
/** | |||
* 4G血糖仪 | |||
*/ | |||
public class BloodSugar4GActivity extends AppCompatActivity implements View.OnClickListener { | |||
private String TAG = BloodSugar4GActivity.class.getName(); | |||
private String token; | |||
private long appid; | |||
private String imei; | |||
private List<String> loglist; | |||
private String myDeviceId; | |||
private ArrayAdapter logAdapter; | |||
private ListView listviw; | |||
private EditText mEditText; | |||
private Button btn_deviceId; | |||
private Button btn_data; | |||
private Button btn_clear; | |||
private Button btn_login; | |||
private List<Long> bodyIds; | |||
private long maxId = 0l; | |||
private Button btn_test; | |||
private Button btn_produce; | |||
private String url = "https://ailink.aicare.net.cn"; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_bloodsugar_4g); | |||
listviw = findViewById(R.id.listviw); | |||
mEditText = findViewById(R.id.ed_imei); | |||
btn_deviceId = findViewById(R.id.btn_deviceId); | |||
btn_data = findViewById(R.id.btn_data); | |||
btn_clear = findViewById(R.id.btn_clear); | |||
btn_login = findViewById(R.id.btn_login); | |||
btn_test = findViewById(R.id.btn_test); | |||
btn_produce = findViewById(R.id.btn_produce); | |||
btn_deviceId.setOnClickListener(this); | |||
btn_data.setOnClickListener(this); | |||
btn_clear.setOnClickListener(this); | |||
btn_login.setOnClickListener(this); | |||
btn_test.setOnClickListener(this); | |||
btn_produce.setOnClickListener(this); | |||
loglist = new ArrayList<>(); | |||
bodyIds = new ArrayList<>(); | |||
logAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
listviw.setAdapter(logAdapter); | |||
new Thread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
login(); | |||
} catch (Throwable throwable) { | |||
throwable.printStackTrace(); | |||
} | |||
} | |||
}).start(); | |||
mEditText.addTextChangedListener(new TextWatcher() { | |||
@Override | |||
public void beforeTextChanged(CharSequence s, int start, int count, int after) { | |||
} | |||
@Override | |||
public void onTextChanged(CharSequence s, int start, int before, int count) { | |||
} | |||
@Override | |||
public void afterTextChanged(Editable s) { | |||
myDeviceId = ""; | |||
maxId = 0; | |||
} | |||
}); | |||
} | |||
public void login() throws Throwable { | |||
String mUrl=url + "/api/user/login?key=inet_elink&username=dhls@qq.com&password=dc483e80a7a0bd9ef71d8cf973673924"; | |||
URL uri = new URL(mUrl); | |||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
// Post请求必须设置允许输出 | |||
httpURLConnection.setDoOutput(true); | |||
// Post请求不能使用缓存 | |||
httpURLConnection.setUseCaches(false); | |||
// 设置为Post请求 | |||
httpURLConnection.setRequestMethod("POST"); | |||
httpURLConnection.setInstanceFollowRedirects(true); | |||
// 配置请求Content-Type | |||
httpURLConnection.setRequestProperty("Content-Type", | |||
"application/x-www-form-urlencode"); | |||
// 设置连接超时时间 | |||
httpURLConnection.setConnectTimeout(6 * 1000); | |||
// 开始连接 | |||
httpURLConnection.connect(); | |||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
// dos.write(map.toString().getBytes()); | |||
// dos.flush(); | |||
// dos.close(); | |||
// 判断请求是否成功 | |||
if (httpURLConnection.getResponseCode() == 200) { | |||
// 获取返回的数据 | |||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
String result = new String(data, "UTF-8"); | |||
Log.i(TAG, result); | |||
JSONObject jsonObject = new JSONObject(result); | |||
JSONObject datajson = jsonObject.getJSONObject("data"); | |||
runOnUiThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
token = jsonObject.getString("token"); | |||
appid = datajson.getLong("appUserId"); | |||
loglist.add(0, "登录成功"); | |||
logAdapter.notifyDataSetChanged(); | |||
} catch (JSONException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
}); | |||
} else { | |||
Log.i(TAG, "Post方式请求失败"); | |||
runOnUiThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
loglist.add(0, "登录失败"); | |||
} | |||
}); | |||
} | |||
} | |||
public void getDeviceid() throws Throwable { | |||
StringBuilder stringBuilder = new StringBuilder(); | |||
stringBuilder.append(url); | |||
stringBuilder.append("/api/device/getDeviceBySN?key=inet_elink&appUserId="); | |||
stringBuilder.append(appid); | |||
stringBuilder.append("&token="); | |||
stringBuilder.append(token); | |||
stringBuilder.append("&deviceSN="); | |||
stringBuilder.append(imei); | |||
Log.e(TAG, stringBuilder.toString()); | |||
URL uri = new URL(stringBuilder.toString()); | |||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
// Post请求必须设置允许输出 | |||
httpURLConnection.setDoOutput(true); | |||
// Post请求不能使用缓存 | |||
httpURLConnection.setUseCaches(false); | |||
// 设置为Post请求 | |||
httpURLConnection.setRequestMethod("POST"); | |||
httpURLConnection.setInstanceFollowRedirects(true); | |||
// 配置请求Content-Type | |||
httpURLConnection.setRequestProperty("Content-Type", | |||
"application/x-www-form-urlencode"); | |||
// 设置连接超时时间 | |||
httpURLConnection.setConnectTimeout(6 * 1000); | |||
// 开始连接 | |||
httpURLConnection.connect(); | |||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
// dos.write(map.toString().getBytes()); | |||
// dos.flush(); | |||
// dos.close(); | |||
// 判断请求是否成功 | |||
if (httpURLConnection.getResponseCode() == 200) { | |||
// 获取返回的数据 | |||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
String result = new String(data, "UTF-8"); | |||
Log.i(TAG, result); | |||
JSONObject jsonObject = new JSONObject(result); | |||
JSONArray datajson = jsonObject.getJSONArray("data"); | |||
runOnUiThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
if (datajson.length() > 0) | |||
myDeviceId = datajson.getJSONObject(0).getString("deviceId"); | |||
loglist.add(0, "设备信息" + result); | |||
logAdapter.notifyDataSetChanged(); | |||
} catch (JSONException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
}); | |||
} else { | |||
Log.i(TAG, "Post方式请求失败"); | |||
} | |||
} | |||
public void getData() throws Throwable { | |||
if (myDeviceId.isEmpty()) { | |||
runOnUiThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
loglist.add(0, "请获取设备Id"); | |||
logAdapter.notifyDataSetChanged(); | |||
} | |||
}); | |||
return; | |||
} | |||
StringBuilder stringBuilder = new StringBuilder(); | |||
stringBuilder.append(url); | |||
stringBuilder.append("/api/deDataGlu/listByDeviceId?key=inet_elink&appUserId="); | |||
stringBuilder.append(appid); | |||
stringBuilder.append("&token="); | |||
stringBuilder.append(token); | |||
stringBuilder.append("&deviceId="); | |||
stringBuilder.append(myDeviceId); | |||
stringBuilder.append("&maxId="); | |||
stringBuilder.append(maxId); | |||
URL uri = new URL(stringBuilder.toString()); | |||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
// // Post请求必须设置允许输出 | |||
// httpURLConnection.setDoOutput(true); | |||
// // Post请求不能使用缓存 | |||
// httpURLConnection.setUseCaches(false); | |||
// 设置为Post请求 | |||
// httpURLConnection.setRequestMethod("GET"); | |||
// httpURLConnection.setInstanceFollowRedirects(true); | |||
// // 配置请求Content-Type | |||
// httpURLConnection.setRequestProperty("Content-Type", | |||
// "application/x-www-form-urlencode"); | |||
// 设置连接超时时间 | |||
httpURLConnection.setConnectTimeout(6 * 1000); | |||
// 开始连接 | |||
httpURLConnection.connect(); | |||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||
// dos.write(map.toString().getBytes()); | |||
// dos.flush(); | |||
// dos.close(); | |||
// 判断请求是否成功 | |||
if (httpURLConnection.getResponseCode() == 200) { | |||
// 获取返回的数据 | |||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||
String result = new String(data, "UTF-8"); | |||
JSONObject jsonObject = new JSONObject(result); | |||
JSONObject dataObject = jsonObject.getJSONObject("data"); | |||
JSONArray datajson = dataObject.getJSONArray("list"); | |||
bodyIds.clear(); | |||
for (int i = 0; i < datajson.length(); i++) { | |||
long id = datajson.getJSONObject(i).getLong("id"); | |||
bodyIds.add(id); | |||
StringBuffer stringBuffer = new StringBuffer(); | |||
stringBuffer.append("id:"); | |||
stringBuffer.append(id); | |||
stringBuffer.append(" 创建时间:"); | |||
stringBuffer.append(TimeUtils.getTime(datajson.getJSONObject(i).getLong("createTime"))); | |||
stringBuffer.append("血糖值(原始值):"); | |||
int value = datajson.getJSONObject(i).getInt("gluFasting"); | |||
stringBuffer.append(value); | |||
stringBuffer.append(" 小数位:"); | |||
int point = datajson.getJSONObject(i).getInt("gluPoint"); | |||
stringBuffer.append(point); | |||
stringBuffer.append(" 单位:"); | |||
int unit = datajson.getJSONObject(i).getInt("gluUnit"); | |||
stringBuffer.append(unit); | |||
stringBuffer.append("\n血糖(计算后)"); | |||
stringBuffer.append(String.format(Locale.US, "%." + point + "f", (value * 1f) * Math.pow(10, 0 - point))); | |||
stringBuffer.append(unit == 1 ? "mmol/L" : "mg/dL"); | |||
loglist.add(0, stringBuffer.toString()); | |||
} | |||
if (maxId == 0) { | |||
loglist.add(0, "总共有:" + bodyIds.size() + " 条"); | |||
} else { | |||
loglist.add(0, "新增了:" + bodyIds.size() + " 条"); | |||
} | |||
if (bodyIds.size() > 0) { | |||
maxId = bodyIds.get(bodyIds.size() - 1); | |||
} | |||
Log.i(TAG, result); | |||
runOnUiThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
logAdapter.notifyDataSetChanged(); | |||
} | |||
}); | |||
} else { | |||
runOnUiThread(new Runnable() { | |||
@Override | |||
public void run() { | |||
loglist.add(0, "请求失败"); | |||
logAdapter.notifyDataSetChanged(); | |||
} | |||
}); | |||
} | |||
} | |||
public byte[] readInputStream(InputStream inputStream) throws IOException { | |||
byte[] buffer = new byte[1024]; | |||
int len = 0; | |||
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||
while ((len = inputStream.read(buffer)) != -1) { | |||
bos.write(buffer, 0, len); | |||
} | |||
bos.close(); | |||
return bos.toByteArray(); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
if (v.getId() == R.id.btn_deviceId) { | |||
imei = mEditText.getText().toString().trim(); | |||
if (imei == null || imei.isEmpty()) { | |||
loglist.add("请输入IMEI号"); | |||
} else { | |||
new Thread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
getDeviceid(); | |||
} catch (Throwable throwable) { | |||
throwable.printStackTrace(); | |||
} | |||
} | |||
}).start(); | |||
} | |||
} else if (v.getId() == R.id.btn_data) { | |||
new Thread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
getData(); | |||
} catch (Throwable throwable) { | |||
throwable.printStackTrace(); | |||
} | |||
} | |||
}).start(); | |||
} else if (v.getId() == R.id.btn_clear) { | |||
loglist.clear(); | |||
logAdapter.notifyDataSetChanged(); | |||
} else if (v.getId() == R.id.btn_login) { | |||
new Thread(new Runnable() { | |||
@Override | |||
public void run() { | |||
try { | |||
login(); | |||
} catch (Throwable throwable) { | |||
throwable.printStackTrace(); | |||
} | |||
} | |||
}).start(); | |||
} else if (v.getId() == R.id.btn_produce) { | |||
url = "https://ailink.aicare.net.cn"; | |||
} else if (v.getId() == R.id.btn_test) { | |||
url = "http://test.ailink.app.aicare.net.cn"; | |||
} | |||
} | |||
} |
@@ -27,6 +27,7 @@ import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.UUID; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig; | |||
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleDeviceData; | |||
@@ -45,7 +46,7 @@ public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbac | |||
private final int REFRESH_DATA = 3; | |||
private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin; | |||
private TextView tv_broadcast_temp, tv_broadcast_mac; | |||
private TextView tv_broadcast_temp, tv_broadcast_mac,tv_broadcast_did; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
@@ -104,6 +105,7 @@ public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbac | |||
mRadioButtonLbLb = findViewById(R.id.radio_weight_lb_lb); | |||
tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac); | |||
tv_broadcast_did = findViewById(R.id.tv_broadcast_did); | |||
} | |||
@@ -353,9 +355,9 @@ public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbac | |||
@Override | |||
public void OnDID(int cid, int vid, int pid) { | |||
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid; | |||
// if (tv_broadcast_did!=null){ | |||
// tv_broadcast_did.setText(didStr); | |||
// } | |||
if (tv_broadcast_did!=null){ | |||
tv_broadcast_did.setText(didStr); | |||
} | |||
} | |||
@@ -0,0 +1,258 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.content.Context; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||
import com.pingwang.bluetoothlib.device.SendMcuBean; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 验证不握手不加密模块 | |||
*/ | |||
public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, | |||
View.OnClickListener, OnBleOtherDataListener, OnBleDeviceDataListener { | |||
private static String TAG = ClearShakeHandsActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
private Context mContext; | |||
private EditText et_type; | |||
private BleDevice mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
private int type=0x01; | |||
private byte unit = 0; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
switch (msg.what) { | |||
case REFRESH_DATA: | |||
if (listAdapter != null) | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_clear_shake_hands); | |||
mContext = this; | |||
mAddress = getIntent().getStringExtra("mac"); | |||
type = getIntent().getIntExtra("type", -1); | |||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
init(); | |||
} | |||
private void init() { | |||
mList = new ArrayList<>(); | |||
ListView listView = findViewById(R.id.listview); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
listView.setAdapter(listAdapter); | |||
findViewById(R.id.btn_set_unit).setOnClickListener(this); | |||
findViewById(R.id.btn1).setOnClickListener(this); | |||
findViewById(R.id.clear).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn_set_unit: | |||
if (unit == SphyBleConfig.SPHY_UNIT_MMHG) { | |||
unit = SphyBleConfig.SPHY_UNIT_KPA; | |||
setUnit(unit); | |||
} else { | |||
unit = SphyBleConfig.SPHY_UNIT_MMHG; | |||
setUnit(unit); | |||
} | |||
break; | |||
case R.id.btn1: | |||
String cmd = et_type.getText().toString().trim(); | |||
byte[] bytes=new byte[cmd.length()/2]; | |||
for (int i=0;i<=cmd.length()-2;i+=2){ | |||
int i1 = Integer.parseInt(cmd.substring(i, i + 2), 16); | |||
bytes[i>>1]=(byte)i1; | |||
} | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,bytes); | |||
mBleDevice.sendData(sendDataBean); | |||
mList.add(TimeUtils.getTime() + "发送->" + BleStrUtils.byte2HexStr(bytes)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
case R.id.clear: | |||
if (mList != null) | |||
mList.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
} | |||
} | |||
/** | |||
* 设置单位(Set unit) | |||
* | |||
* @param unit | |||
*/ | |||
public void setUnit(byte unit) { | |||
SendMcuBean sendMcuBean = new SendMcuBean(); | |||
byte[] data = new byte[2]; | |||
data[0] = SphyBleConfig.SET_UNIT; | |||
data[1] = unit; | |||
sendMcuBean.setHex(0x01, data); | |||
mBleDevice.sendData(sendMcuBean); | |||
mList.add(TimeUtils.getTime() + "发送->" + BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
//---------------------------------服务--------------------------------------------------- | |||
@Override | |||
public void onServiceSuccess() { | |||
CallbackDisIm.getInstance().addListListener(this); | |||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||
//与服务建立连接 | |||
if (mBluetoothService != null) { | |||
mBleDevice = mBluetoothService.getBleDevice(mAddress); | |||
mBleDevice.setA7Encryption(false); | |||
mBleDevice.setOnBleDeviceDataListener(ClearShakeHandsActivity.this); | |||
mBleDevice.setOnBleVersionListener(ClearShakeHandsActivity.this); | |||
mBleDevice.setOnBleOtherDataListener(ClearShakeHandsActivity.this); | |||
byte[] bytes = mBleSendCmdUtil.setClearShakeHands(); | |||
SendBleBean sendBleBean=new SendBleBean(); | |||
sendBleBean.setHex(bytes); | |||
mBleDevice.sendData(sendBleBean); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
BleLog.i(TAG, "服务与界面连接断开"); | |||
//与服务断开连接 | |||
mBluetoothService = null; | |||
} | |||
@Override | |||
public void unbindServices() { | |||
CallbackDisIm.getInstance().removeListener(this); | |||
if (mBleDevice != null) { | |||
mBleDevice.disconnect(); | |||
mBleDevice = null; | |||
} | |||
} | |||
//-----------------状态------------------- | |||
@Override | |||
public void onConnecting(@NonNull String mac) { | |||
//TODO 连接中 | |||
if (mAddress.equals(mac)) | |||
BleLog.i(TAG, "连接中"); | |||
} | |||
@Override | |||
public void onDisConnected(@NonNull String mac, int code) { | |||
//TODO 连接断开 | |||
if (mAddress.equals(mac)) { | |||
BleLog.i(TAG, "连接断开"); | |||
finish(); | |||
} | |||
} | |||
@Override | |||
public void onServicesDiscovered(@NonNull String mac) { | |||
//TODO 连接成功(获取服务成功) | |||
if (mAddress.equals(mac)) | |||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
} | |||
@Override | |||
public void bleOpen() { | |||
} | |||
@Override | |||
public void bleClose() { | |||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
finish(); | |||
} | |||
//-----------------通知------------------- | |||
@Override | |||
public void onNotifyData(byte[] hex, int type) { | |||
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(hex)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onNotifyDataA6(byte[] hex) { | |||
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(hex)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onNotifyOtherData(byte[] data) { | |||
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
BleLog.i(TAG, "onDestroy"); | |||
} | |||
} |
@@ -22,12 +22,12 @@ import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.server.ELinkBleServer; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
@@ -36,7 +36,7 @@ import androidx.appcompat.app.AppCompatActivity; | |||
/** | |||
* xing<br> | |||
* 2019/3/6<br> | |||
* java类作用描述 | |||
* 连接测试工具 | |||
*/ | |||
public class ConnectBleTestActivity extends AppCompatActivity implements OnCallbackBle { | |||
@@ -7,6 +7,8 @@ import android.widget.CompoundButton; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import com.holtek.libHTBodyfat.HTBodyBasicInfo; | |||
import com.holtek.libHTBodyfat.HTBodyResultAllBody; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
@@ -19,6 +21,9 @@ import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; | |||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
/** | |||
* 八电极秤 | |||
*/ | |||
public class EightBodyfatActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, EightBodyFatBleDeviceData.EightBodyFatCallback { | |||
private List<String> loglist; | |||
@@ -235,6 +240,8 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
case EightBodyFatUtil.MEASUREMENT_END: | |||
loglist.add(0, "测量完成"); | |||
//测量完成 | |||
if (mEightBodyfatAdc!=null)kaimengJieMi(mEightBodyfatAdc); | |||
break; | |||
case EightBodyFatUtil.MUC_CALL_BACK_RESULT: | |||
switch (typeState) { | |||
@@ -299,6 +306,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
public void onImpedance(int adc, int part, int arithmetic) { | |||
loglist.add(0, "阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic); | |||
kaimeng(part,adc); | |||
} | |||
@Override | |||
@@ -330,4 +338,108 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
public void showData(String data) { | |||
// loglist.add(0, data); | |||
} | |||
private EightBodyfatAdc mEightBodyfatAdc; | |||
private void kaimeng(int part, int adc) { | |||
if (mEightBodyfatAdc == null) mEightBodyfatAdc = new EightBodyfatAdc(); | |||
switch (part) { | |||
case EightBodyFatUtil.IMPEDANCE_FOOT: | |||
//双脚阻抗 | |||
mEightBodyfatAdc.setAdcFoot(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_HAND: | |||
//双手阻抗 | |||
mEightBodyfatAdc.setAdcHand(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_BODY: | |||
//躯干阻抗 | |||
mEightBodyfatAdc.setAdcBody(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_L_HAND: | |||
//"左手阻抗"; | |||
mEightBodyfatAdc.setAdcLeftHand(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_R_HAND: | |||
// adc = adc + "右手阻抗"; | |||
mEightBodyfatAdc.setAdcRightHand(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_L_FOOT: | |||
// adc = adc + "左脚阻抗"; | |||
mEightBodyfatAdc.setAdcLeftFoot(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_R_FOOT: | |||
// adc = adc + "右脚阻抗"; | |||
mEightBodyfatAdc.setAdcRightFoot(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_L_BODY: | |||
// adc = adc + "左驱干"; | |||
mEightBodyfatAdc.setAdcLeftBody(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_R_BODY: | |||
// adc = adc + "右躯干"; | |||
mEightBodyfatAdc.setAdcRightBody(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_R_HAND_L_FOOT: | |||
// adc = adc + "右手左脚"; | |||
mEightBodyfatAdc.setAdcRightHandLeftFoot(adc); | |||
break; | |||
case EightBodyFatUtil.IMPEDANCE_L_HAND_R_FOOT: | |||
// adc = adc + "左手右脚"; | |||
mEightBodyfatAdc.setAdcLeftHandRightFoot(adc); | |||
break; | |||
default: | |||
} | |||
} | |||
private void kaimengJieMi(EightBodyfatAdc mEightBodyfatAdc) { | |||
loglist.add(0,mEightBodyfatAdc.toString()); | |||
HTBodyBasicInfo basicInfo = new HTBodyBasicInfo(1, 170, 65, 25); | |||
loglist.add(0, "默认传入用户: 性别:男,身高:170,体重 65kg 年龄25"); | |||
basicInfo.htZAllBodyImpedance = mEightBodyfatAdc.getAdcRightBody(); | |||
basicInfo.htZLeftLegImpedance = mEightBodyfatAdc.getAdcLeftFoot(); | |||
basicInfo.htZRightLegImpedance = mEightBodyfatAdc.getAdcRightFoot(); | |||
basicInfo.htZLeftArmImpedance = mEightBodyfatAdc.getAdcLeftHand(); | |||
basicInfo.htZRightArmImpedance = mEightBodyfatAdc.getAdcRightHand(); | |||
basicInfo.htTwoLegsImpedance = mEightBodyfatAdc.getAdcFoot(); | |||
basicInfo.htTwoArmsImpedance = mEightBodyfatAdc.getAdcHand(); | |||
HTBodyResultAllBody resultTwoLegs = new HTBodyResultAllBody(); | |||
int errorType = resultTwoLegs.getBodyfatWithBasicInfo(basicInfo); | |||
if (errorType == HTBodyBasicInfo.ErrorNone) { | |||
String jiemi="加密阻抗:" + | |||
" \n双脚=" + (resultTwoLegs.htZLeftLeg + resultTwoLegs.htZRightLeg) + | |||
" \n双手=" + (resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightArm) + | |||
" \n左手=" + resultTwoLegs.htZLeftArm + | |||
" \n右手=" + resultTwoLegs.htZRightArm + | |||
" \n左脚=" + resultTwoLegs.htZLeftLeg + | |||
" \n右脚=" + resultTwoLegs.htZRightLeg + | |||
" \n左躯干=" + (resultTwoLegs.htZAllBody)+ | |||
" \n右躯干=" + (resultTwoLegs.htZAllBody)+ | |||
" \n右手左脚=" + (resultTwoLegs.htZRightArm + resultTwoLegs.htZLeftLeg) + | |||
" \n左手右脚=" + (resultTwoLegs.htZLeftArm + resultTwoLegs.htZRightLeg) + | |||
" \n全身=" + resultTwoLegs.htZAllBody; | |||
loglist.add(0, jiemi); | |||
} else { | |||
loglist.add(0, "解析阻抗:错误码:" + errorType + "\n" | |||
+ " ErrorAge = 1 ,ErrorWeight = 2, ErrorHeight = 4, ErrorSex = 8, ErrorImpedance = 16, ErrorImpedanceLeftLeg = 32, ErrorImpedanceRightLeg = 64,ErrorImpedanceLeftArm = 128, ErrorImpedanceRightArm = 256" | |||
); | |||
} | |||
} | |||
} |
@@ -0,0 +1,123 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
public class EightBodyfatAdc { | |||
private int adcFoot; //双脚阻抗, | |||
private int adcHand;//双手阻抗 | |||
private int adcLeftHand; //左手阻抗 | |||
private int adcRightHand; //右手阻抗 | |||
private int adcLeftFoot; //左脚阻抗 | |||
private int adcRightFoot; //右脚阻抗 | |||
private int adcLeftBody; | |||
private int adcRightBody; | |||
private int adcRightHandLeftFoot; | |||
private int adcLeftHandRightFoot; | |||
private int adcBody; | |||
public int getAdcFoot() { | |||
return adcFoot; | |||
} | |||
public void setAdcFoot(int adcFoot) { | |||
this.adcFoot = adcFoot; | |||
} | |||
public int getAdcHand() { | |||
return adcHand; | |||
} | |||
public void setAdcHand(int adcHand) { | |||
this.adcHand = adcHand; | |||
} | |||
public int getAdcLeftHand() { | |||
return adcLeftHand; | |||
} | |||
public void setAdcLeftHand(int adcLeftHand) { | |||
this.adcLeftHand = adcLeftHand; | |||
} | |||
public int getAdcRightHand() { | |||
return adcRightHand; | |||
} | |||
public void setAdcRightHand(int adcRightHand) { | |||
this.adcRightHand = adcRightHand; | |||
} | |||
public int getAdcLeftFoot() { | |||
return adcLeftFoot; | |||
} | |||
public void setAdcLeftFoot(int adcLeftFoot) { | |||
this.adcLeftFoot = adcLeftFoot; | |||
} | |||
public int getAdcRightFoot() { | |||
return adcRightFoot; | |||
} | |||
public void setAdcRightFoot(int adcRightFoot) { | |||
this.adcRightFoot = adcRightFoot; | |||
} | |||
public int getAdcLeftBody() { | |||
return adcLeftBody; | |||
} | |||
public void setAdcLeftBody(int adcLeftBody) { | |||
this.adcLeftBody = adcLeftBody; | |||
} | |||
public int getAdcRightBody() { | |||
return adcRightBody; | |||
} | |||
public void setAdcRightBody(int adcRightBody) { | |||
this.adcRightBody = adcRightBody; | |||
} | |||
public int getAdcRightHandLeftFoot() { | |||
return adcRightHandLeftFoot; | |||
} | |||
public void setAdcRightHandLeftFoot(int adcRightHandLeftFoot) { | |||
this.adcRightHandLeftFoot = adcRightHandLeftFoot; | |||
} | |||
public int getAdcLeftHandRightFoot() { | |||
return adcLeftHandRightFoot; | |||
} | |||
public void setAdcLeftHandRightFoot(int adcLeftHandRightFoot) { | |||
this.adcLeftHandRightFoot = adcLeftHandRightFoot; | |||
} | |||
public int getAdcBody() { | |||
return adcBody; | |||
} | |||
public void setAdcBody(int adcBody) { | |||
this.adcBody = adcBody; | |||
} | |||
@Override | |||
public String toString() { | |||
return "加密阻抗:" + | |||
" \n双脚=" + adcFoot + | |||
" \n双手=" + adcHand + | |||
" \n左手=" + adcLeftHand + | |||
" \n右手=" + adcRightHand + | |||
" \n左脚=" + adcLeftFoot + | |||
" \n右脚=" + adcRightFoot + | |||
" \n左躯干=" + adcLeftBody + | |||
" \n右躯干=" + adcRightBody + | |||
" \n右手左脚=" + adcRightHandLeftFoot + | |||
" \n左手右脚=" + adcLeftHandRightFoot + | |||
" \n全身=" + adcBody ; | |||
} | |||
} |
@@ -24,24 +24,23 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 显示数据 | |||
* 身高仪 | |||
*/ | |||
public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
HeightDeviceData.onNotifyData, OnBleVersionListener , OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||
HeightDeviceData.onNotifyData, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||
private static String TAG = HeightCmdActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
@@ -52,6 +51,7 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
* 服务Intent | |||
*/ | |||
private Context mContext; | |||
private EditText et_type; | |||
private HeightDeviceData mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
@@ -94,6 +94,7 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btn_get_did).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
cmdBtn(); | |||
} | |||
@@ -133,7 +134,12 @@ public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
mBleDevice.sendData(sendBleBean); | |||
break; | |||
case R.id.btn1: | |||
String cmd = et_type.getText().toString().trim(); | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,cmd.getBytes()); | |||
mBleDevice.sendData(sendDataBean); | |||
break; | |||
case R.id.clear: | |||
if (mList != null) | |||
mList.clear(); |
@@ -0,0 +1,562 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.ListView; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import java.lang.ref.WeakReference; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData; | |||
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleUntils; | |||
/** | |||
* 身高体重秤 | |||
*/ | |||
public class HeightWeightScaleActivity extends BleBaseActivity implements OnCallbackBle, HeightBodyFatBleData.OnHeightBodyFatDataCallback, View.OnClickListener { | |||
private String mAddress = ""; | |||
private List<String> logList; | |||
private ListView listView; | |||
private ArrayAdapter listAdapter; | |||
private int selectWUnit; | |||
private int selectHUnit; | |||
private int currentWUnit = 0; | |||
private int currentHUnit = 0; | |||
private int currentMode = 1; | |||
private int selectMode = 1; | |||
private final int SETUNIT = 0; | |||
private final int SETUSER = 1; | |||
private final int SETMODE = 2; | |||
private final int ADC = 3; | |||
private final int FINISH = 4; | |||
private final int DEVICESTATUS = 5; | |||
private final int VOICE = 6; | |||
private final int VOICESTATUS = 7; | |||
private MHandler mMHandler; | |||
private TextView text; | |||
private int currentVoice = 1; | |||
private int selectVoice = 1; | |||
@Override | |||
public void onServiceSuccess() { | |||
mBluetoothService.setOnCallback(this); | |||
logList.add(0, "绑定服务成功"); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.setOnCallback(this); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
HeightBodyFatBleData.init(bleDevice); | |||
HeightBodyFatBleData.getInstance().setOnHeightBodyFatDataCallback(this); | |||
HeightBodyFatBleData.getInstance().setOnHeightBodyFatDataCallback(this); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_height_bodyfat); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
logList = new ArrayList<>(); | |||
listView = findViewById(R.id.listView); | |||
mMHandler = new WeakReference<>(new MHandler()).get(); | |||
findViewById(R.id.kg).setOnClickListener(this); | |||
findViewById(R.id.jin).setOnClickListener(this); | |||
findViewById(R.id.st_lb).setOnClickListener(this); | |||
findViewById(R.id.lb).setOnClickListener(this); | |||
findViewById(R.id.girl).setOnClickListener(this); | |||
findViewById(R.id.man).setOnClickListener(this); | |||
findViewById(R.id.cm).setOnClickListener(this); | |||
findViewById(R.id.inch).setOnClickListener(this); | |||
findViewById(R.id.ft_in).setOnClickListener(this); | |||
findViewById(R.id.bodyfat).setOnClickListener(this); | |||
findViewById(R.id.weight).setOnClickListener(this); | |||
findViewById(R.id.baby).setOnClickListener(this); | |||
findViewById(R.id.deviceStatus).setOnClickListener(this); | |||
findViewById(R.id.voice_open).setOnClickListener(this); | |||
findViewById(R.id.voice_close).setOnClickListener(this); | |||
findViewById(R.id.voice_status).setOnClickListener(this); | |||
findViewById(R.id.finish).setOnClickListener(this); | |||
findViewById(R.id.height_weight).setOnClickListener(this); | |||
text = findViewById(R.id.text); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, logList); | |||
listView.setAdapter(listAdapter); | |||
} | |||
@Override | |||
public void onStartScan() { | |||
} | |||
@Override | |||
public void onScanning(BleValueBean data) { | |||
} | |||
@Override | |||
public void onScanTimeOut() { | |||
} | |||
@Override | |||
public void onConnecting(String mac) { | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mac.equals(mAddress)) { | |||
logList.add(0, "连接已经断开"); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
public void onConnectionSuccess(String mac) { | |||
} | |||
@Override | |||
public void onServicesDiscovered(String mac) { | |||
} | |||
@Override | |||
public void bleOpen() { | |||
} | |||
@Override | |||
public void bleClose() { | |||
} | |||
@Override | |||
public void onVersion(String version) { | |||
logList.add(0, "版本号:" + version); | |||
} | |||
@Override | |||
public void onSupportUnitList(List<SupportUnitBean> list) { | |||
} | |||
@Override | |||
public void onMcuResult(int type, int result) { | |||
String resultStr = ""; | |||
if (result == HeightBodyFatBleUntils.SET_SUCCESS) { | |||
resultStr = "成功"; | |||
} else if (result == HeightBodyFatBleUntils.SET_FAIL) { | |||
resultStr = "失败"; | |||
} else { | |||
resultStr = "不支持"; | |||
} | |||
switch (type) { | |||
case HeightBodyFatBleUntils.MCU_SET_USER_RESULT: | |||
mMHandler.removeMessages(SETUSER); | |||
logList.add(0, "下发用户结果:" + resultStr); | |||
break; | |||
case HeightBodyFatBleUntils.MCU_SET_UNIT_RESULT: | |||
if (result == 0) { | |||
currentHUnit = selectHUnit; | |||
currentWUnit = selectWUnit; | |||
if (currentHUnit == 0) { | |||
} | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
} | |||
mMHandler.removeMessages(SETUNIT); | |||
logList.add(0, "设置单位结果:" + resultStr); | |||
break; | |||
case HeightBodyFatBleUntils.MCU_SET_WORK_MODE_RESULT: | |||
if (result == 0) { | |||
currentMode = selectMode; | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
} | |||
mMHandler.removeMessages(SETMODE); | |||
logList.add(0, "设置工作模式:" + resultStr); | |||
break; | |||
case HeightBodyFatBleUntils.MUC_REQUEST_VOICE_SET_RESULT: | |||
if (result == 0) { | |||
currentVoice = selectVoice; | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
} | |||
mMHandler.removeMessages(VOICE); | |||
logList.add(0, "设置声音结果:" + resultStr); | |||
break; | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onMcuRequestUser() { | |||
logList.add(0, "请求下发用户,点击下发用户"); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onDeviceStatus(int workMode, int battery, int batteryStatus, int weightUnit, int heightUnit, int voice) { | |||
mMHandler.removeMessages(DEVICESTATUS); | |||
currentMode = workMode; | |||
currentWUnit = weightUnit; | |||
currentHUnit = heightUnit; | |||
currentVoice = voice; | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
logList.add(0, "体重状态 模式:" + workMode + " 电池电量: " + battery + " 电池状态: " + batteryStatus | |||
+ "\n 体重单位: " + weightUnit + " 身高单位: " + heightUnit + " 声音状态: " + voice); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onWeightBodyFat(int workMode, int weightMode, int weight, int decimals, int unit) { | |||
logList.add(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||
+ " 小数位: " + decimals + " 单位: " + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
if (weightMode == 2) { | |||
mMHandler.removeMessages(ADC); | |||
mMHandler.removeMessages(FINISH); | |||
mMHandler.sendEmptyMessageDelayed(ADC, 30000); | |||
mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | |||
} | |||
} | |||
@Override | |||
public void onWeightBaby(int workMode, int weightMode, int adultWeight, int adultBabyWeight, int babyWeight, int decimals, int unit) { | |||
logList.add(0, "抱婴体重 模式:" + workMode + " 测量状态:" + weightMode + " 成人体重:" + adultWeight + | |||
"\n 抱婴体重:" + adultBabyWeight + " 婴儿体重:" + babyWeight + " 小数位:" + decimals + " 单位" + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
if (weightMode == 2) { | |||
mMHandler.removeMessages(FINISH); | |||
mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | |||
} | |||
} | |||
@Override | |||
public void onWeight(int workMode, int weightMode, int weight, int decimals, int unit) { | |||
logList.add(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||
+ " 小数位: " + decimals + " 单位: " + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
if (weightMode == 2) { | |||
mMHandler.removeMessages(FINISH); | |||
mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | |||
} | |||
} | |||
@Override | |||
public void onAdc(int workMode, int status, int adcType, int adc, int arithmetic) { | |||
mMHandler.removeMessages(ADC); | |||
logList.add(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType | |||
+ " 阻抗: " + adc + " 算法位: " + arithmetic); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onHeart(int workMode, int status, int heart) { | |||
logList.add(0, "心率数据 模式:" + workMode + " 测量状态: " + status + " 心率: " + heart); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) { | |||
logList.add(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onHeight(int workMode, int height, int decimals, int unit) { | |||
logList.add(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onBodyfat1(int workMode, int bfr, int sfr, int vfr, int rom, int bmr, int age) { | |||
logList.add(0, "体脂数据 模式:" + workMode + "\n 体脂率: " + bfr + " 皮下脂肪: " + sfr | |||
+ "\n 内脏脂肪: " + vfr + " 肌肉路: " + rom + "\n 基础代谢率: " + bmr + " 年龄" + age); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onBodyfat2(int workMode, int bm, int water, int pp, int bmi, int heart, int obesityLevels) { | |||
logList.add(0, "体脂数据 模式:" + workMode + " 骨量: " + bm + " 水分: " + water | |||
+ "\n 蛋白率: " + pp + " bmi: " + bmi + " 心率: " + heart + " \n肥胖等级" + obesityLevels); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onVoice(int status) { | |||
mMHandler.removeMessages(VOICESTATUS); | |||
logList.add(0, "声音状态 模式:" + status); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onFinish(int workMode) { | |||
logList.add(0, "测量完成 模式:" + workMode); | |||
listAdapter.notifyDataSetChanged(); | |||
mMHandler.removeMessages(FINISH); | |||
} | |||
@Override | |||
public void onError(int error) { | |||
logList.add(0, "错误码: " + error); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
if (HeightBodyFatBleData.getInstance() != null) { | |||
switch (v.getId()) { | |||
case R.id.kg: | |||
selectWUnit = 0; | |||
logList.add(0, "下发体重单位 :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.jin: | |||
selectWUnit = 1; | |||
logList.add(0, "下发体重单位 :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.st_lb: | |||
selectWUnit = 4; | |||
logList.add(0, "下发体重单位 :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.lb: | |||
selectWUnit = 6; | |||
logList.add(0, "下发体重单位 :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, selectWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.girl: | |||
logList.add(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(0, 18, 165)); | |||
mMHandler.removeMessages(SETUSER); | |||
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
break; | |||
case R.id.man: | |||
logList.add(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(1, 28, 170)); | |||
mMHandler.removeMessages(SETUSER); | |||
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
break; | |||
case R.id.cm: | |||
selectHUnit = 0; | |||
logList.add(0, "下发身高单位 :" + selectHUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.inch: | |||
selectHUnit = 1; | |||
logList.add(0, "下发身高单位 :" + selectHUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.ft_in: | |||
selectHUnit = 2; | |||
logList.add(0, "下发身高单位 :" + selectHUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(selectHUnit, currentWUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.baby: | |||
selectMode = 2; | |||
logList.add(0, "下发工作模式 :" + selectMode); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
mMHandler.removeMessages(SETMODE); | |||
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
break; | |||
case R.id.bodyfat: | |||
selectMode = 1; | |||
logList.add(0, "下发工作模式 :" + selectMode); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
mMHandler.removeMessages(SETMODE); | |||
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
break; | |||
case R.id.weight: | |||
selectMode = 3; | |||
logList.add(0, "下发工作模式 :" + selectMode); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
mMHandler.removeMessages(SETMODE); | |||
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
break; | |||
case R.id.height_weight: | |||
selectMode = 4; | |||
logList.add(0, "下发工作模式 :" + selectMode); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
mMHandler.removeMessages(SETMODE); | |||
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
break; | |||
case R.id.deviceStatus: | |||
logList.add(0, "请求设备状态 :" ); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getDeviceStatus()); | |||
mMHandler.removeMessages(DEVICESTATUS); | |||
mMHandler.sendEmptyMessageDelayed(DEVICESTATUS, 3000); | |||
break; | |||
case R.id.voice_open: | |||
selectVoice = 1; | |||
logList.add(0, "设置声音 :" + selectMode); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
mMHandler.removeMessages(VOICE); | |||
mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
break; | |||
case R.id.voice_close: | |||
selectVoice = 2; | |||
logList.add(0, "设置声音 :" + selectMode); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
mMHandler.removeMessages(VOICE); | |||
mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
break; | |||
case R.id.voice_status: | |||
logList.add(0, "获取声音状态"); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus()); | |||
mMHandler.removeMessages(VOICESTATUS); | |||
mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000); | |||
break; | |||
case R.id.finish: | |||
logList.add(0, "回复测量完成"); | |||
listAdapter.notifyDataSetChanged(); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish()); | |||
break; | |||
} | |||
} | |||
} | |||
public class MHandler extends Handler { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
super.handleMessage(msg); | |||
switch (msg.what) { | |||
case SETMODE: | |||
logList.add(0, "下发模式没有回复"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case SETUNIT: | |||
logList.add(0, "下发单位没有回复"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case SETUSER: | |||
logList.add(0, "下发用户没有回复"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case FINISH: | |||
logList.add(0, "没有回复测量完成指令(\n为了检测是否有回复。" + | |||
"app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量完成。" + | |||
"\n如果回复。此消息可以忽略)"+"\n 每次测量(母婴模式。的测量完成也只能发一次),测量完成的命令只能发一次!!!!。"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case ADC: | |||
logList.add(0, "没有测量阻抗的指令(\n为了检测是否有回复。app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量阻抗的状态。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case DEVICESTATUS: | |||
logList.add(0, "没有接收到设备状态(\n为了检测是否有回复。app会在点击获取设备状态指令的时候。开启定时器。去确认设备是否有回复设备状态。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case VOICE: | |||
logList.add(0, "没有声音设置的回复(\n为了检测是否有回复。app会在点击设置声音的时候。开启定时器。去确认设备是否有回复设置声音。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case VOICESTATUS: | |||
logList.add(0, "没有声音状态的回复(\n为了检测是否有回复。app会在点击声音状态的时候。开启定时器。去确认设备是否有回复声音状态。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
} | |||
} | |||
} | |||
} |
@@ -1,144 +0,0 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.app.Dialog; | |||
import android.content.DialogInterface; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.view.KeyEvent; | |||
import android.view.LayoutInflater; | |||
import android.view.View; | |||
import android.view.ViewGroup; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.fragment.app.DialogFragment; | |||
import androidx.fragment.app.FragmentManager; | |||
import androidx.fragment.app.FragmentTransaction; | |||
/** | |||
* elink-android<br> | |||
* LoadingIosDialogFragment<br> | |||
* xing<br> | |||
* 2019/2/26 16:07<br> | |||
* 加载提示框 | |||
*/ | |||
public class LoadingIosDialogFragment extends DialogFragment { | |||
private static String TAG = LoadingIosDialogFragment.class.getName(); | |||
private final static int DISMISS_OUT = 1; | |||
/** | |||
* 默认超时时间 | |||
*/ | |||
private int timeOut = 30; | |||
private boolean show = false; | |||
public boolean isShow() { | |||
return show; | |||
} | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
switch (msg.what) { | |||
case DISMISS_OUT: | |||
LoadingIosDialogFragment.this.dismiss(); | |||
break; | |||
} | |||
} | |||
}; | |||
@Override | |||
public void dismiss() { | |||
try { | |||
mHandler.removeMessages(DISMISS_OUT); | |||
if (getFragmentManager() != null) | |||
super.dismiss(); | |||
show = false; | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
public int getTimeOut() { | |||
return timeOut; | |||
} | |||
public void setTimeOut(int timeOut) { | |||
this.timeOut = timeOut; | |||
} | |||
public void show(@NonNull FragmentManager manager) { | |||
this.show(manager, "LoadingIosDialogFragment"); | |||
} | |||
@Override | |||
public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||
try { | |||
super.show(manager, tag); | |||
show = true; | |||
} catch (Exception e) { | |||
show = false; | |||
e.printStackTrace(); | |||
} | |||
mHandler.sendEmptyMessageDelayed(DISMISS_OUT, timeOut * 1000); | |||
} | |||
@Override | |||
public int show(@NonNull FragmentTransaction transaction, @Nullable String tag) { | |||
return super.show(transaction, tag); | |||
} | |||
@Override | |||
public void onActivityCreated(@Nullable Bundle savedInstanceState) { | |||
super.onActivityCreated(savedInstanceState); | |||
if (getDialog() != null) { | |||
getDialog().setOnShowListener(null); | |||
getDialog().setOnCancelListener(null); | |||
getDialog().setOnDismissListener(null); | |||
} | |||
} | |||
@Nullable | |||
@Override | |||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | |||
return super.onCreateView(inflater, container, savedInstanceState); | |||
} | |||
@NonNull | |||
@Override | |||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||
LayoutInflater inflater = LayoutInflater.from(requireContext()); | |||
View v = inflater.inflate(R.layout.dialog_loading_ios, null);// 得到加载view | |||
Dialog loadingDialog = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||
loadingDialog.setCancelable(false);//设置点击空白处是否可以取消 | |||
//按返回键是否可以取消 | |||
loadingDialog.setCanceledOnTouchOutside(false); | |||
loadingDialog.setContentView(v);// 设置布局 | |||
loadingDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { | |||
@Override | |||
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { | |||
//返回不关闭 | |||
return keyCode == KeyEvent.KEYCODE_BACK; | |||
} | |||
}); | |||
return loadingDialog; | |||
} | |||
@Override | |||
public void onDestroyView() { | |||
super.onDestroyView(); | |||
if (mHandler != null) { | |||
mHandler.removeCallbacksAndMessages(null); | |||
} | |||
} | |||
} |
@@ -1,74 +1,153 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.Manifest; | |||
import android.app.AlertDialog; | |||
import android.content.DialogInterface; | |||
import android.content.Intent; | |||
import android.content.pm.PackageManager; | |||
import android.net.Uri; | |||
import android.os.Build; | |||
import android.os.Bundle; | |||
import android.provider.Settings; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.widget.Button; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.AILinkSDK; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.AppConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
import androidx.annotation.NonNull; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import androidx.core.app.ActivityCompat; | |||
public class MainActivity extends AppCompatActivity { | |||
public class MainActivity extends BleAppBaseActivity { | |||
private static String TAG = MainActivity.class.getName(); | |||
private List<View> mList = new ArrayList<>(); | |||
@Override | |||
protected void uiHandlerMessage(Message msg) { | |||
} | |||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
AILinkSDK.getInstance().init(this); | |||
setContentView(R.layout.activity_main); | |||
protected int getLayoutId() { | |||
return R.layout.activity_main; | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
protected void initListener() { | |||
MyListener listener = new MyListener(); | |||
// Button btn_shpy = findViewById(R.id.btn_sphy); | |||
// Button btn_tempgun = findViewById(R.id.btn_tempgun); | |||
// Button btn_temp = findViewById(R.id.btn_temp); | |||
// Button btn_baby = findViewById(R.id.btn_baby); | |||
// Button btn_height = findViewById(R.id.btn_height); | |||
// Button btn_ble = findViewById(R.id.btn_ble); | |||
// Button btn_weightScale = findViewById(R.id.btn_lock); | |||
// Button btn_ble_test = findViewById(R.id.btn_ble_test); | |||
// Button btnConnectTest = findViewById(R.id.btnConnectTest); | |||
// Button btn_ad_weight = findViewById(R.id.btn_ad_weight); | |||
// Button btn_ble_weight = findViewById(R.id.btn_ble_weight); | |||
// Button btn_wifi_ble_tooth = findViewById(R.id.btn_wifi_ble_tooth); | |||
// Button wifi_config = findViewById(R.id.wifi_config); | |||
// Button eight_scale = findViewById(R.id.eight_scale); | |||
// Button btn_ota = findViewById(R.id.btn_ota); | |||
// Button btn_wristband = findViewById(R.id.btn_wristband); | |||
// Button glucometer = findViewById(R.id.glucometer); | |||
// Button btn_broadcast_scale = findViewById(R.id.btn_broadcast_scale); | |||
// Button btn_broadcast_blood_oxygen = findViewById(R.id.btn_broadcast_blood_oxygen); | |||
// Button btn_smart_mask = findViewById(R.id.btn_smart_mask); | |||
// Button btn_bld = findViewById(R.id.btn_bld); | |||
// Button btn_bleBo = findViewById(R.id.btn_bleBo); | |||
// Button btn_coffeeScale = findViewById(R.id.btn_coffeeScale); | |||
// Button btn_scooter = findViewById(R.id.btn_scooter); | |||
// Button btn_shareCharger = findViewById(R.id.btn_shareCharger); | |||
// Button btn_transmission = findViewById(R.id.btn_transmission); | |||
// Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight); | |||
// Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat); | |||
mList.add(findViewById(R.id.btn_sphy)); | |||
mList.add(findViewById(R.id.btn_tempgun)); | |||
mList.add(findViewById(R.id.btn_temp)); | |||
mList.add(findViewById(R.id.btn_baby)); | |||
mList.add(findViewById(R.id.btn_height)); | |||
mList.add(findViewById(R.id.btn_ble)); | |||
mList.add(findViewById(R.id.btn_lock)); | |||
mList.add(findViewById(R.id.btn_ble_test)); | |||
mList.add(findViewById(R.id.btnConnectTest)); | |||
mList.add(findViewById(R.id.btn_ad_weight)); | |||
mList.add(findViewById(R.id.btn_ble_weight)); | |||
mList.add(findViewById(R.id.btn_wifi_ble_tooth)); | |||
mList.add(findViewById(R.id.wifi_config)); | |||
mList.add(findViewById(R.id.eight_scale)); | |||
mList.add(findViewById(R.id.btn_ota)); | |||
mList.add(findViewById(R.id.glucometer)); | |||
mList.add(findViewById(R.id.btn_broadcast_scale)); | |||
mList.add(findViewById(R.id.btn_broadcast_blood_oxygen)); | |||
mList.add(findViewById(R.id.btn_smart_mask)); | |||
mList.add(findViewById(R.id.btn_bld)); | |||
mList.add(findViewById(R.id.btn_bleBo)); | |||
mList.add(findViewById(R.id.btn_coffeeScale)); | |||
mList.add(findViewById(R.id.btn_scooter)); | |||
mList.add(findViewById(R.id.btn_shareCharger)); | |||
mList.add(findViewById(R.id.btn_share_socket)); | |||
mList.add(findViewById(R.id.btn_transmission)); | |||
mList.add(findViewById(R.id.btn_wifi_ble_weight)); | |||
mList.add(findViewById(R.id.btn_baby_body_fat)); | |||
mList.add(findViewById(R.id.btn_broadcast_height)); | |||
mList.add(findViewById(R.id.btn_hbfs)); | |||
mList.add(findViewById(R.id.btn_find)); | |||
mList.add(findViewById(R.id.btn_4g_bs)); | |||
mList.add(findViewById(R.id.btn_clear_shake_hands)); | |||
mList.add(findViewById(R.id.btn_food_temp)); | |||
mList.add(findViewById(R.id.btn_temp_humidity)); | |||
mList.add(findViewById(R.id.btn_share_condom)); | |||
for (View view : mList) { | |||
view.setOnClickListener(listener); | |||
} | |||
List<Integer> showViewId = AppConfig.SHOW_VIEW_ID; | |||
if (showViewId != null) { | |||
for (View view : mList) { | |||
view.setVisibility(View.GONE); | |||
} | |||
for (Integer integer : showViewId) { | |||
findViewById(integer).setVisibility(View.VISIBLE); | |||
} | |||
} | |||
} | |||
@Override | |||
protected void initData() { | |||
initPermissions(); | |||
} | |||
@Override | |||
protected void initView() { | |||
BleLog.init("", "", BuildConfig.DEBUG); | |||
String version = getString(R.string.version) + ":" + BuildConfig.VERSION_NAME; | |||
((TextView) findViewById(R.id.tv_app_version)).setText(version); | |||
init(); | |||
initPermissions(); | |||
AILinkSDK.getInstance().init(this);//sdk | |||
SP.init(this); | |||
} | |||
private void init() { | |||
MyListener listener = new MyListener(); | |||
Button btn_shpy = findViewById(R.id.btn_sphy); | |||
Button btn_tempgun = findViewById(R.id.btn_tempgun); | |||
Button btn_temp = findViewById(R.id.btn_temp); | |||
Button btn_baby = findViewById(R.id.btn_baby); | |||
Button btn_height = findViewById(R.id.btn_height); | |||
Button btn_ble = findViewById(R.id.btn_ble); | |||
findViewById(R.id.btn_ble_weight).setOnClickListener(listener); | |||
findViewById(R.id.btn_wifi_ble_tooth).setOnClickListener(listener); | |||
findViewById(R.id.wifi_config).setOnClickListener(listener); | |||
findViewById(R.id.eight_scale).setOnClickListener(listener); | |||
findViewById(R.id.btn_ota).setOnClickListener(listener); | |||
findViewById(R.id.glucometer).setOnClickListener(listener); | |||
findViewById(R.id.btn_broadcast_scale).setOnClickListener(listener); | |||
findViewById(R.id.btn_broadcast_blood_oxygen).setOnClickListener(listener); | |||
findViewById(R.id.btn_smart_mask).setOnClickListener(listener); | |||
findViewById(R.id.btn_transmission).setOnClickListener(listener); | |||
btn_shpy.setOnClickListener(listener); | |||
btn_tempgun.setOnClickListener(listener); | |||
btn_temp.setOnClickListener(listener); | |||
btn_baby.setOnClickListener(listener); | |||
btn_height.setOnClickListener(listener); | |||
btn_ble.setOnClickListener(listener); | |||
findViewById(R.id.btn_wifi_ble_weight).setOnClickListener(listener); | |||
findViewById(R.id.btn_baby_body_fat).setOnClickListener(listener); | |||
} | |||
private class MyListener implements View.OnClickListener { | |||
@Override | |||
public void onClick(View v) { | |||
@@ -78,6 +157,11 @@ public class MainActivity extends AppCompatActivity { | |||
// } | |||
int type = 0; | |||
switch (v.getId()) { | |||
case R.id.btn_clear_shake_hands: | |||
type= BleDeviceConfig.CLEAR_SHAKE_HANDS; | |||
break; | |||
case R.id.btn_sphy: | |||
type = BleDeviceConfig.BLOOD_PRESSURE; | |||
break; | |||
@@ -93,7 +177,12 @@ public class MainActivity extends AppCompatActivity { | |||
case R.id.btn_height: | |||
type = BleDeviceConfig.HEIGHT_METER; | |||
break; | |||
case R.id.btn_lock: | |||
type = BleDeviceConfig.SMART_LOCK; | |||
break; | |||
case R.id.btn_ad_weight: | |||
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; | |||
break; | |||
case R.id.btn_wifi_ble_weight: | |||
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE; | |||
break; | |||
@@ -110,110 +199,102 @@ public class MainActivity extends AppCompatActivity { | |||
type = BleDeviceConfig.BABY_BODY_FAT; | |||
break; | |||
case R.id.btn_broadcast_scale: | |||
Intent intentBroadcast = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity.class); | |||
Intent intentBroadcast = new Intent(MainActivity.this, BroadcastScaleActivity.class); | |||
startActivity(intentBroadcast); | |||
return; | |||
case R.id.btn_broadcast_blood_oxygen: | |||
Intent intentBloodOxygen = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity.class); | |||
Intent intentBloodOxygen = new Intent(MainActivity.this, BroadcastBloodOxygenActivity.class); | |||
startActivity(intentBloodOxygen); | |||
return; | |||
case R.id.btn_smart_mask: | |||
type = BleDeviceConfig.SMART_MASK; | |||
break; | |||
case R.id.btn_bleBo: | |||
type = BleDeviceConfig.BLE_BOOLD_OXYGEN; | |||
break; | |||
// case R.id.btn_bld: | |||
// type = BleDeviceConfig.BLD_WEIGHT; | |||
// break; | |||
case R.id.btn_ble: | |||
type = -1; | |||
break; | |||
case R.id.btn_ble_test: | |||
type = -2; | |||
break; | |||
case R.id.btn_ota: | |||
type = -3; | |||
break; | |||
case R.id.btn_transmission: | |||
type = -4; | |||
break; | |||
case R.id.eight_scale: | |||
type = BleDeviceConfig.EIGHT_BODY_FAT_SCALE; | |||
break; | |||
case R.id.btnConnectTest: | |||
Intent intent = new Intent(MainActivity.this, ConnectBleTestActivity.class); | |||
startActivity(intent); | |||
return; | |||
case R.id.wifi_config: | |||
Intent intent1 = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity.class); | |||
Intent intent1 = new Intent(MainActivity.this, WifiConfigActivity.class); | |||
startActivity(intent1); | |||
return; | |||
case R.id.btn_coffeeScale: | |||
// 咖啡秤 | |||
type = BleDeviceConfig.COFFEE_SCALE; | |||
break; | |||
case R.id.btn_scooter: | |||
type = BleDeviceConfig.SMART_SCOOTER; | |||
break; | |||
case R.id.btn_shareCharger: | |||
// 共享充电器 | |||
type = BleDeviceConfig.SHARE_CHARGER; | |||
break; | |||
case R.id.btn_share_socket: | |||
// 共享插座 | |||
type = BleDeviceConfig.SHARE_SOCKET; | |||
break; | |||
case R.id.btn_share_condom: | |||
// 共享套套机 | |||
type = BleDeviceConfig.SHARE_CONDOM; | |||
break; | |||
case R.id.btn_find: | |||
// 寻物器 | |||
Intent findDeviceActivity = new Intent(MainActivity.this, FindDeviceNewActivity.class); | |||
startActivity(findDeviceActivity); | |||
return; | |||
case R.id.btn_broadcast_height: | |||
// 广播身高仪 | |||
Intent intentBroadcastHeight = new Intent(MainActivity.this, BroadcastHeightActivity.class); | |||
startActivity(intentBroadcastHeight); | |||
return; | |||
case R.id.btn_4g_bs: | |||
} | |||
startActivity(type); | |||
} | |||
} | |||
/** | |||
* 初始化请求权限 | |||
*/ | |||
private void initPermissions() { | |||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
ActivityCompat | |||
.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, Manifest.permission.ACCESS_WIFI_STATE, | |||
Manifest.permission.CHANGE_WIFI_STATE}, 1); | |||
} | |||
} | |||
// 广播身高仪 | |||
Intent bloodSugar4GIntent = new Intent(MainActivity.this, BloodSugar4GActivity.class); | |||
startActivity(bloodSugar4GIntent); | |||
return; | |||
case R.id.btn_food_temp: | |||
// 食品温度计 | |||
type = BleDeviceConfig.FOOD_TEMP; | |||
break; | |||
case R.id.btn_hbfs: | |||
type=BleDeviceConfig.HEIGHT_BODY_FAT; | |||
break; | |||
case R.id.btn_temp_humidity: | |||
type= BleDeviceConfig.TEMP_Humidity; | |||
break; | |||
@Override | |||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
if (requestCode != 1) { | |||
return; | |||
} | |||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
} else { | |||
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | |||
//权限请求失败,但未选中“不再提示”选项 | |||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
//引导用户至设置页手动授权 | |||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||
intent.setData(uri); | |||
startActivity(intent); | |||
} | |||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
if (dialog != null) { | |||
dialog.cancel(); | |||
} | |||
} | |||
}).show(); | |||
} else { | |||
//权限请求失败,选中“不再提示”选项 | |||
// T.showShort(MainActivity.this, "获取权限失败"); | |||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
//引导用户至设置页手动授权 | |||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||
intent.setData(uri); | |||
startActivity(intent); | |||
} | |||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
if (dialog != null) { | |||
dialog.cancel(); | |||
} | |||
} | |||
}).show(); | |||
} | |||
startActivity(type); | |||
} | |||
} | |||
private void startActivity(int tyep) { | |||
Intent intent = new Intent(this, aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity.class); | |||
Intent intent = new Intent(this, ShowBleActivity.class); | |||
intent.putExtra("type", tyep); | |||
startActivity(intent); | |||
} |
@@ -1,23 +1,32 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.Manifest; | |||
import android.app.Activity; | |||
import android.bluetooth.BluetoothAdapter; | |||
import android.content.ComponentName; | |||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.content.ServiceConnection; | |||
import android.content.pm.PackageManager; | |||
import android.location.LocationManager; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.IBinder; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.provider.Settings; | |||
import android.text.TextUtils; | |||
import android.view.View; | |||
import android.widget.AdapterView; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.Toast; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
@@ -26,13 +35,24 @@ import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.UUID; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import androidx.core.app.ActivityCompat; | |||
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig; | |||
/** | |||
@@ -42,6 +62,8 @@ import androidx.appcompat.app.AppCompatActivity; | |||
*/ | |||
public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, OnScanFilterListener { | |||
public static final int REQUEST_PERMISSION_CODE = 1500; | |||
private static String TAG = ShowBleActivity.class.getName(); | |||
private final int BIND_SERVER_OK = 1; | |||
@@ -56,8 +78,12 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
private Intent bindIntent; | |||
private Context mContext; | |||
private int mType; | |||
private boolean mFilter = true; | |||
private String mNoEncryptionMac = ""; | |||
private String mFilterName = ""; | |||
private String mFilterMac = ""; | |||
private int mCid; | |||
private int mVid; | |||
private int mPid; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
@@ -89,8 +115,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
} | |||
init(); | |||
initData(); | |||
} | |||
private void initData() { | |||
@@ -105,22 +129,23 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
Button btn = findViewById(R.id.btn); | |||
Button btn1 = findViewById(R.id.btn1); | |||
Button clear = findViewById(R.id.clear); | |||
final Button filter = findViewById(R.id.filter); | |||
filter.setTag(true); | |||
filter.setText(getString(R.string.filter)+"true"); | |||
EditText et_filter_name = findViewById(R.id.et_filter_name); | |||
EditText et_filter_mac = findViewById(R.id.et_filter_mac); | |||
btn.setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
if (mBluetoothService != null) { | |||
BleLog.i(TAG, "搜索设备"); | |||
if (mType == -3) { | |||
mBluetoothService.scanLeDevice(0); | |||
mFilterName = et_filter_name.getText().toString().trim(); | |||
mFilterMac = et_filter_mac.getText().toString().trim(); | |||
if (mType == BleDeviceConfig.SMART_SCOOTER) { | |||
Map<String, String> map = new HashMap<>(); | |||
map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid | |||
mBluetoothService.scanLeDevice(0, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | |||
} else { | |||
if (mFilter) | |||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK); | |||
else | |||
mBluetoothService.scanLeDevice(0); | |||
//0000FEE7=手表 | |||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK, UUID | |||
.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | |||
} | |||
mList.clear(); | |||
listAdapter.notifyDataSetChanged(); | |||
@@ -146,16 +171,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
} | |||
}); | |||
filter.setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
boolean m = (Boolean) filter.getTag(); | |||
filter.setTag(!m); | |||
mFilter = !m; | |||
filter.setText("过滤:" + mFilter); | |||
} | |||
}); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
listView.setAdapter(listAdapter); | |||
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |||
@@ -163,15 +178,41 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |||
String itemStr = mList.get(position); | |||
String mac = itemStr.split("=")[0]; | |||
if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE==mType){ | |||
Intent intent=new Intent(); | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ToothBrushWifiBleActivity.class); | |||
String cidVidPid = itemStr.split("=")[2]; | |||
mCid = Integer.parseInt(cidVidPid.split(";")[0]); | |||
mVid = Integer.parseInt(cidVidPid.split(";")[1]); | |||
mPid = Integer.parseInt(cidVidPid.split(";")[2]); | |||
if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) { | |||
//验证不握手,不加密的界面使用 | |||
BleConfig.setHandshakeStatus(mac, false); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.stopScan(); | |||
mBluetoothService.connectDevice(mac); | |||
showLoading(); | |||
} | |||
} else if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE == mType) { | |||
Intent intent = new Intent(); | |||
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class); | |||
intent.putExtra("type", mType); | |||
intent.putExtra("mac", mac); | |||
startActivity(intent); | |||
finish(); | |||
}else { | |||
} else { | |||
if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) { | |||
//vid=12的不用握手校验,不加密 | |||
mNoEncryptionMac = mac; | |||
BleConfig.setHandshakeStatus(mac, false); | |||
} else if (mCid == BleDeviceConfig.SMART_SCOOTER) { | |||
if (mPid == 0x0001) { | |||
//电滑板pid=01的不用握手校验,不加密 | |||
BleConfig.setHandshakeStatus(mac, false); | |||
} | |||
mNoEncryptionMac = mac; | |||
} else if (mCid == 0) { | |||
//CID=0不需要握手 | |||
BleConfig.setHandshakeStatus(mac, false); | |||
} | |||
if (mBluetoothService != null) { | |||
mBluetoothService.stopScan(); | |||
mBluetoothService.connectDevice(mac); | |||
@@ -182,6 +223,14 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
}); | |||
// 延迟后请求权限 | |||
btn.postDelayed(() -> { | |||
if (isDestroyed()) { | |||
return; | |||
} | |||
checkPermission(); | |||
}, 500); | |||
} | |||
@@ -246,11 +295,12 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
public void onScanning(@NonNull BleValueBean data) { | |||
String mAddress = data.getMac(); | |||
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); | |||
if (!mList.contains(mAddress + "=" + data.getName())) { | |||
String dataStr = mAddress + "=" + data.getName() + "=" + data.getCid() + ";" + data.getVid() + ";" + data.getPid(); | |||
if (!mList.contains(dataStr)) { | |||
String data1 = BleStrUtils.byte2HexStr(data.getScanRecord()); | |||
String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData()); | |||
BleLog.i(TAG, "MAC=" + mAddress + " ||" + data1 + "||" + data2); | |||
mList.add(mAddress + "=" + data.getName()); | |||
BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2); | |||
mList.add(dataStr); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@@ -266,73 +316,128 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
@Override | |||
public void onDisConnected(@NonNull String mac, int code) { | |||
dismissLoading(); | |||
Toast.makeText(mContext, getString(R.string.disconnect) + code, Toast.LENGTH_SHORT).show(); | |||
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||
} | |||
@Override | |||
public void onServicesDiscovered(@NonNull String mac) { | |||
if (mac.equalsIgnoreCase(mNoEncryptionMac)) { | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mac); | |||
bleDevice.setA7Encryption(false); | |||
mNoEncryptionMac = ""; | |||
} | |||
dismissLoading(); | |||
Intent intent = new Intent(); | |||
int type = mType;//默认婴儿秤 | |||
switch (type) { | |||
case BleDeviceConfig.BABY_SCALE: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BabyCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, BabyCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.INFRARED_THERMOMETER: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.BLOOD_PRESSURE: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, SphyCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.THERMOMETER: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, TempCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.HEIGHT_METER: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, HeightCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE: | |||
intent.setClass(ShowBleActivity.this, WeightScaleBleActivity.class); | |||
break; | |||
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE: | |||
intent.setClass(ShowBleActivity.this, WeightScaleWifiBleActivity.class); | |||
break; | |||
case BleDeviceConfig.TOOTHBRUSH_WIFI_BLE: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ToothBrushWifiBleActivity.class); | |||
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class); | |||
break; | |||
case BleDeviceConfig.EIGHT_BODY_FAT_SCALE: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity.class); | |||
intent.setClass(ShowBleActivity.this, EightBodyfatActivity.class); | |||
break; | |||
case BleDeviceConfig.BLOOD_GLUCOSE: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BloodGlucoseActivity.class); | |||
intent.setClass(ShowBleActivity.this, BloodGlucoseActivity.class); | |||
break; | |||
case BleDeviceConfig.BABY_BODY_FAT: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BabyBodyFatCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, BabyBodyFatCmdActivity.class); | |||
break; | |||
case BleDeviceConfig.SMART_MASK: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity.class); | |||
intent.setClass(ShowBleActivity.this, SmartMaskActivity.class); | |||
break; | |||
case BleDeviceConfig.SMART_SCOOTER: | |||
intent.setClass(ShowBleActivity.this, SkateboardDataActivity.class); | |||
break; | |||
case BleDeviceConfig.BLE_BOOLD_OXYGEN: | |||
intent.setClass(ShowBleActivity.this, BloodOxygenActivity.class); | |||
break; | |||
case BleDeviceConfig.COFFEE_SCALE: | |||
// 咖啡秤 | |||
intent.setClass(ShowBleActivity.this, CoffeeScaleActivity.class); | |||
break; | |||
case BleDeviceConfig.SHARE_CHARGER: | |||
// 共享充电器 | |||
intent.setClass(ShowBleActivity.this, ShareChargerActivity.class); | |||
break; | |||
case BleDeviceConfig.SHARE_SOCKET: | |||
// 共享插座 | |||
intent.setClass(ShowBleActivity.this, ShareSocketActivity.class); | |||
break; | |||
case BleDeviceConfig.SHARE_CONDOM: | |||
// 共享套套机 | |||
intent.setClass(ShowBleActivity.this, ShareCondomActivity.class); | |||
break; | |||
case BleDeviceConfig.FIND_DEVICE: | |||
// 寻物器 | |||
// intent.setClass(ShowBleActivity.this, FindDeviceActivity.class); | |||
intent.setClass(ShowBleActivity.this, FindDeviceNewActivity.class); | |||
BleConfig.setHandshakeStatus(mac, false); | |||
break; | |||
case BleDeviceConfig.FOOD_TEMP: | |||
// 食品温度计 | |||
intent.setClass(ShowBleActivity.this, FoodTempActivity.class); | |||
break; | |||
case BleDeviceConfig.HEIGHT_BODY_FAT: | |||
intent.setClass(ShowBleActivity.this, HeightWeightScaleActivity.class); | |||
break; | |||
case BleDeviceConfig.TEMP_Humidity: | |||
intent.setClass(ShowBleActivity.this, TempHumidityActivity.class); | |||
break; | |||
// case BleDeviceConfig.BLD_WEIGHT: | |||
// intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class); | |||
// break; | |||
case -1: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BleCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, BleCmdActivity.class); | |||
break; | |||
case -2: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity.class); | |||
intent.setClass(ShowBleActivity.this, TestCmdActivity.class); | |||
break; | |||
case -3: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TestOtaActivity.class); | |||
intent.setClass(ShowBleActivity.this, TestOtaActivity.class); | |||
break; | |||
case -4: | |||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity.class); | |||
intent.setClass(ShowBleActivity.this, TransmissionActivity.class); | |||
break; | |||
case 65536: | |||
//验证不握手不加密的界面 | |||
intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class); | |||
break; | |||
} | |||
} | |||
intent.putExtra("type", type); | |||
intent.putExtra("mac", mac); | |||
intent.putExtra("cid", mCid); | |||
intent.putExtra("vid", mVid); | |||
intent.putExtra("pid", mPid); | |||
startActivity(intent); | |||
} | |||
@@ -345,17 +450,32 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
@Override | |||
public void bleClose() { | |||
checkPermission(); | |||
} | |||
@Override | |||
public boolean onFilter(BleValueBean bleValueBean) { | |||
int cid = bleValueBean.getCid(); | |||
BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType); | |||
if (mType < 0 || mType > 0xFF) | |||
return true; | |||
else | |||
if (mType < 0) { | |||
if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) { | |||
return true; | |||
} | |||
if (!TextUtils.isEmpty(mFilterName)) { | |||
String name = bleValueBean.getName(); | |||
if (name != null && name.toUpperCase().contains(mFilterName.toUpperCase())) { | |||
return true; | |||
} | |||
} | |||
if (!TextUtils.isEmpty(mFilterMac)) { | |||
String mac = bleValueBean.getMac().replace(":", "").toUpperCase().trim(); | |||
return mac.contains(mFilterMac.toUpperCase()); | |||
} | |||
return false; | |||
} else { | |||
return mType == cid; | |||
} | |||
} | |||
@Override | |||
@@ -363,6 +483,13 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
//TODO 过滤后的设备 | |||
} | |||
@Override | |||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |||
super.onActivityResult(requestCode, resultCode, data); | |||
if (requestCode == REQUEST_PERMISSION_CODE) { | |||
checkPermission(); | |||
} | |||
} | |||
//--------------------------start Loading-------------------------- | |||
private LoadingIosDialogFragment mDialogFragment; | |||
@@ -399,6 +526,89 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.stopScan(); | |||
} | |||
unbindService(); | |||
} | |||
// ------------------- 权限 ------------------ | |||
/** | |||
* 检查权限 | |||
*/ | |||
private void checkPermission() { | |||
// 没有蓝牙权限就请求蓝牙权限 | |||
if (!hasBluetooth()) { | |||
requestBluetooth(); | |||
return; | |||
} | |||
// 没有定位权限就请求定位权限 | |||
if (!hasLocationPermission()) { | |||
requestLocationPermission(this); | |||
return; | |||
} | |||
// 没有定位服务就请求定位服务 | |||
if (!hasLocationService()) { | |||
requestLocationService(); | |||
return; | |||
} | |||
// 都有了,OK | |||
Toast.makeText(mContext, "权限都有,可以开始搜索", Toast.LENGTH_SHORT).show(); | |||
} | |||
/** | |||
* 是否有定位权限 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasLocationPermission() { | |||
return ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; | |||
} | |||
/** | |||
* 蓝牙是否打开 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasBluetooth() { | |||
return BluetoothAdapter.getDefaultAdapter().isEnabled(); | |||
} | |||
/** | |||
* 定位服务是否打开 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasLocationService() { | |||
LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); | |||
if (locationManager == null) { | |||
return false; | |||
} | |||
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); | |||
} | |||
/** | |||
* 申请定位权限 | |||
*/ | |||
private void requestLocationPermission(Activity activity) { | |||
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_CODE); | |||
} | |||
/** | |||
* 申请打开蓝牙 | |||
*/ | |||
private void requestBluetooth() { | |||
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); | |||
startActivityForResult(intent, REQUEST_PERMISSION_CODE); | |||
} | |||
/** | |||
* 申请打开定位服务 | |||
*/ | |||
private void requestLocationService() { | |||
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||
startActivityForResult(intent, REQUEST_PERMISSION_CODE); | |||
} | |||
} |
@@ -20,11 +20,11 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import butterknife.BindView; | |||
@@ -54,7 +54,14 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, | |||
ListView mListview; | |||
@BindView(R.id.get_version) | |||
Button mGetVersion; | |||
@BindView(R.id.get_AIQ) | |||
Button mGetAIQ; | |||
@BindView(R.id.close_power) | |||
Button closePower; | |||
@BindView(R.id.set_mode) | |||
Button setMode; | |||
@BindView(R.id.set_payload) | |||
Button setPayload; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
private Context mContext; | |||
@@ -63,6 +70,8 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
private int type = SmartMaskBleConfig.SMART_MASK; | |||
private int mFanStatus = 0; | |||
private boolean showPayload; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
@@ -102,6 +111,11 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, | |||
mSetFan.setOnClickListener(this); | |||
mGetVersion.setOnClickListener(this); | |||
setPayload.setOnClickListener(this); | |||
setMode.setOnClickListener(this); | |||
closePower.setOnClickListener(this); | |||
mGetAIQ.setOnClickListener(this); | |||
} | |||
@@ -141,7 +155,18 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, | |||
mDevice.setFanStatus(mFanStatus); | |||
} | |||
break; | |||
case R.id.get_AIQ: | |||
if (mDevice != null) mDevice.getIAQData(); | |||
break; | |||
case R.id.set_mode: | |||
if (mDevice != null) mDevice.setTestMode(); | |||
break; | |||
case R.id.close_power: | |||
if (mDevice != null) mDevice.closePower(); | |||
break; | |||
case R.id.set_payload: | |||
showPayload = true; | |||
break; | |||
} | |||
} | |||
@@ -232,6 +257,38 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, | |||
//-----------------通知------------------- | |||
@Override | |||
public void onPayloadData(byte[] data) { | |||
if (showPayload) { | |||
mList.add(BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
} | |||
@Override | |||
public void onSetStatus(int type,int status) { | |||
String data = ""; | |||
if (type== SmartMaskBleConfig.GET_TEST_MODE){ | |||
data="进入测试模式:"; | |||
}else if (type== SmartMaskBleConfig.GET_POWER){ | |||
data="关机:"; | |||
} | |||
switch (status) { | |||
case 0: | |||
data += "成功"; | |||
break; | |||
case 1: | |||
data += "失败"; | |||
break; | |||
} | |||
mList.add(TimeUtils.getTime() + data); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onStatus(int airIndex, int fanStatus, int power, int powerStatus, int batteryRemaining, int breathRate, int breathState, int filterDuration) { | |||
@@ -314,6 +371,24 @@ public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, | |||
} | |||
@Override | |||
public void onIAQData(int status, int eCo2, int TvOc, int hcho) { | |||
String data = ""; | |||
switch (status) { | |||
case 0: | |||
data = "OK"; | |||
break; | |||
case 1: | |||
data = "Heating"; | |||
break; | |||
case 2: | |||
data = "Error"; | |||
break; | |||
} | |||
mList.add(TimeUtils.getTime() + data + "\n ECO2:" + eCo2 + "\n TVOC:" + TvOc + "\n HCHO:" + hcho); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
mList.add(TimeUtils.getTime() + "版本号:" + version); |
@@ -8,6 +8,7 @@ import android.os.Message; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
@@ -15,6 +16,7 @@ import com.pingwang.bluetoothlib.config.CmdConfig; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||
import com.pingwang.bluetoothlib.device.SendMcuBean; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
@@ -48,6 +50,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
private ArrayAdapter listAdapter; | |||
private Context mContext; | |||
private EditText et_type; | |||
private SphyDeviceData mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
@@ -95,10 +98,12 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
}); | |||
findViewById(R.id.btn1).setOnClickListener(this); | |||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btn_get_did).setOnClickListener(this); | |||
findViewById(R.id.clear).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
cmdBtn(); | |||
} | |||
@@ -153,7 +158,12 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
mBleDevice.sendData(sendBleBean); | |||
break; | |||
case R.id.btn1: | |||
String cmd = et_type.getText().toString().trim(); | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,cmd.getBytes()); | |||
mBleDevice.sendData(sendDataBean); | |||
break; | |||
case R.id.clear: | |||
if (mList != null) | |||
mList.clear(); | |||
@@ -258,7 +268,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
@Override | |||
public void getSphyCmd(byte cmd) { | |||
mList.add(TimeUtils.getTime() + "cmd:" + cmd); | |||
mList.add(TimeUtils.getTime() + "指令:" + cmd); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -266,7 +276,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
public void sphyDataNow(int dia, int sys, int decimal, int pul, int unit) { | |||
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal); | |||
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal); | |||
mList.add(TimeUtils.getTime() + "current:dia=" + diaStr + " sys=" + sysStr + " pul=" + pul + " unit=" + unit); | |||
mList.add(TimeUtils.getTime() + "实时:dia=" + diaStr + "sys=" + sysStr + "pul=" + pul + "unit" + "=" + unit); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -274,7 +284,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
public void sphyData(int dia, int sys, int decimal, int pul, int unit) { | |||
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal); | |||
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal); | |||
mList.add(TimeUtils.getTime() + "result:dia=" + diaStr + " sys=" + sysStr + " pul=" + pul + " unit=" + unit); | |||
mList.add(TimeUtils.getTime() + "稳定:dia=" + diaStr + "sys=" + sysStr + "pul=" + pul + "unit" + "=" + unit); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -283,31 +293,31 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
String showData = ""; | |||
switch (unit) { | |||
case CmdConfig.SETTING_SUCCESS: | |||
showData = getString(R.string.set_success); | |||
showData = "设置单位成功"; | |||
break; | |||
case CmdConfig.SETTING_FAILURE: | |||
showData = getString(R.string.set_failure); | |||
showData = "设置单位失败"; | |||
break; | |||
case CmdConfig.SETTING_ERR: | |||
showData = getString(R.string.set_err); | |||
showData = "设置单位错误"; | |||
break; | |||
} | |||
mList.add(TimeUtils.getTime() + showData+" unit="+SphyCmdActivity.this.unit); | |||
mList.add(TimeUtils.getTime() + showData); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void getErr(byte status) { | |||
mList.add(TimeUtils.getTime() + "Err:" + status); | |||
mList.add(TimeUtils.getTime() + "错误:" + status); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
mList.add(TimeUtils.getTime() + "Version:" + version); | |||
mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -320,7 +330,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
@Override | |||
public void onMcuBatteryStatus(int status, int battery) { | |||
mList.add(TimeUtils.getTime() + getString(R.string.power) + battery + "%"); | |||
mList.add(TimeUtils.getTime() + "电量:" + battery + "%"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -329,7 +339,7 @@ public class SphyCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
String time = | |||
times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + | |||
":" + times[5]; | |||
mList.add(TimeUtils.getTime() + "system Time:" + time); | |||
mList.add(TimeUtils.getTime() + "系统时间:" + time); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -24,11 +24,11 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.thermometer.TempDeviceData; | |||
@@ -37,7 +37,7 @@ import cn.net.aicare.modulelibrary.module.thermometer.TempDeviceData; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 显示数据 | |||
* 体温计 | |||
*/ | |||
public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||
@@ -50,6 +50,7 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
* 服务Intent | |||
*/ | |||
private Context mContext; | |||
private EditText et_type; | |||
private TempDeviceData mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
@@ -91,6 +92,7 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btn_get_did).setOnClickListener(this); | |||
findViewById(R.id.clear).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
cmdBtn(); | |||
} | |||
@@ -129,7 +131,12 @@ public class TempCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
mBleDevice.sendData(sendBleBean); | |||
break; | |||
case R.id.btn1: | |||
String cmd = et_type.getText().toString().trim(); | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,cmd.getBytes()); | |||
mBleDevice.sendData(sendDataBean); | |||
break; | |||
case R.id.clear: | |||
if (mList != null) | |||
mList.clear(); |
@@ -25,24 +25,22 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 显示数据 | |||
* 额温枪 | |||
*/ | |||
public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
OnBleVersionListener, TempGunDeviceData.onNotifyData , OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener { | |||
public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, TempGunDeviceData.onNotifyData , OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener { | |||
private static String TAG = TempGunCmdActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
@@ -53,6 +51,7 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis | |||
* 服务Intent | |||
*/ | |||
private Context mContext; | |||
private EditText et_type; | |||
private TempGunDeviceData mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
@@ -94,6 +93,7 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btn_get_did).setOnClickListener(this); | |||
findViewById(R.id.clear).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
cmdBtn(); | |||
} | |||
@@ -135,7 +135,12 @@ public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis | |||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
mBleDevice.sendData(sendBleBean); | |||
break; | |||
case R.id.btn1: | |||
String cmd = et_type.getText().toString().trim(); | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,cmd.getBytes()); | |||
mBleDevice.sendData(sendDataBean); | |||
break; | |||
case R.id.clear: | |||
if (mList != null) | |||
mList.clear(); |
@@ -0,0 +1,299 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import java.lang.ref.WeakReference; | |||
import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.List; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.TempHumidity.TempHumidityBleUtils; | |||
/** | |||
* 温湿度计 | |||
*/ | |||
public class TempHumidityActivity extends BleBaseActivity implements OnCallbackBle, TempHumidityBleUtils.BleDataCallBack, View.OnClickListener { | |||
private String mAddress = ""; | |||
private List<String> logList; | |||
private List<String> historyLogList; | |||
private List<Long> historyLogListId; | |||
private ListView listView; | |||
private ListView list_view_history; | |||
private ArrayAdapter listAdapter; | |||
private ArrayAdapter historyListAdapter; | |||
private MHandler mMHandler; | |||
private EditText et_history; | |||
private boolean isHeart; | |||
private final int HEART = 1; | |||
private TextView tv_result; | |||
@Override | |||
public void onServiceSuccess() { | |||
mBluetoothService.setOnCallback(this); | |||
logList.add(0, "绑定服务成功"); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.setOnCallback(this); | |||
mBluetoothService.deviceConnectListener(mAddress, true); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
TempHumidityBleUtils.init(bleDevice); | |||
TempHumidityBleUtils.getInstance().setBleDataCallBack(this); | |||
} else { | |||
mBluetoothService.disconnectAll(); | |||
startScanBle(0); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_temp_humidity); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
logList = new ArrayList<>(); | |||
historyLogList = new ArrayList<>(); | |||
historyLogListId = new ArrayList<>(); | |||
listView = findViewById(R.id.listView); | |||
list_view_history = findViewById(R.id.list_view_history); | |||
tv_result = findViewById(R.id.tv_result); | |||
et_history = findViewById(R.id.et_history); | |||
mMHandler = new WeakReference<>(new MHandler()).get(); | |||
findViewById(R.id.btn_slow).setOnClickListener(this); | |||
findViewById(R.id.btn_fat).setOnClickListener(this); | |||
findViewById(R.id.btn_history).setOnClickListener(this); | |||
findViewById(R.id.btn_hear).setOnClickListener(this); | |||
findViewById(R.id.btn_show_history).setOnClickListener(this); | |||
findViewById(R.id.btn_clear).setOnClickListener(this); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, logList); | |||
historyListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, historyLogList); | |||
listView.setAdapter(listAdapter); | |||
list_view_history.setAdapter(historyListAdapter); | |||
} | |||
@Override | |||
public void onStartScan() { | |||
} | |||
@Override | |||
public void onScanning(BleValueBean data) { | |||
if (data.getMac().equalsIgnoreCase(mAddress)) { | |||
stopScanBle(); | |||
mBluetoothService.connectDevice(mAddress); | |||
} | |||
} | |||
@Override | |||
public void onScanTimeOut() { | |||
} | |||
@Override | |||
public void onConnecting(String mac) { | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mac.equals(mAddress)) { | |||
logList.add(0, "连接已经断开"); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
public void onConnectionSuccess(String mac) { | |||
stopScanBle(); | |||
logList.add(0, "连接成功" + mac); | |||
} | |||
@Override | |||
public void onServicesDiscovered(String mac) { | |||
if (mac.equalsIgnoreCase(mAddress)) { | |||
stopScanBle(); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
TempHumidityBleUtils.init(bleDevice); | |||
TempHumidityBleUtils.getInstance().setBleDataCallBack(this); | |||
} | |||
} | |||
} | |||
@Override | |||
public void bleOpen() { | |||
} | |||
@Override | |||
public void bleClose() { | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
if (TempHumidityBleUtils.getInstance() != null) { | |||
switch (v.getId()) { | |||
case R.id.btn_slow: | |||
if (TempHumidityBleUtils.getInstance() != null) { | |||
TempHumidityBleUtils.getInstance().sendSlowData(); | |||
logList.add(0, "慢速保存数据"); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
case R.id.btn_fat: | |||
if (TempHumidityBleUtils.getInstance() != null) { | |||
TempHumidityBleUtils.getInstance().sendFatData(); | |||
logList.add(0, "快速速保存数据"); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
case R.id.btn_history: | |||
if (TempHumidityBleUtils.getInstance() != null) { | |||
String s = et_history.getText().toString().trim(); | |||
long maxId = 0; | |||
if (!s.isEmpty()) { | |||
maxId = Long.parseLong(s); | |||
} | |||
TempHumidityBleUtils.getInstance().getOffLineRecord(maxId); | |||
logList.add(0, "获取历史记录 时间Id" + maxId); | |||
tv_result.setText(""); | |||
historyLogListId.clear(); | |||
historyLogList.clear(); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
case R.id.btn_show_history: | |||
if (listView.getVisibility() == View.VISIBLE) { | |||
historyListAdapter.notifyDataSetChanged(); | |||
listView.setVisibility(View.GONE); | |||
list_view_history.setVisibility(View.VISIBLE); | |||
} else { | |||
listView.setVisibility(View.VISIBLE); | |||
list_view_history.setVisibility(View.GONE); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
case R.id.btn_hear: | |||
if (!isHeart) { | |||
isHeart = true; | |||
mMHandler.sendEmptyMessage(HEART); | |||
logList.add(0, "开启心跳"); | |||
} else { | |||
isHeart = false; | |||
mMHandler.removeMessages(HEART); | |||
logList.add(0, "关闭心跳"); | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
case R.id.btn_clear: | |||
logList.clear(); | |||
historyLogListId.clear(); | |||
historyLogList.clear(); | |||
listAdapter.notifyDataSetChanged(); | |||
historyListAdapter.notifyDataSetChanged(); | |||
break; | |||
} | |||
} | |||
} | |||
@Override | |||
public void onDeviceStatus(int battery, long time, float temp, float humidity) { | |||
logList.add(0, "设备状态 电池电量:" + battery + "\n时间:" + time + " 温度: " + temp + " 湿度:" + humidity); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onOffLineRecordNum(long total, long sendNum) { | |||
logList.add(0, "历史记录 总量:" + total + "发送量:" + sendNum); | |||
if (total == sendNum) { | |||
if (historyLogListId.size() > 0) { | |||
Collections.sort(historyLogListId); | |||
tv_result.setText("总:" + historyLogListId.size() + "开:" + historyLogListId.get(0) + "结:" + historyLogListId.get(historyLogList.size() - 1)); | |||
} else { | |||
tv_result.setText(""); | |||
} | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onOffLineRecord(long time, float temp, float humidity) { | |||
historyLogList.add(0, "时间:" + time + " 温度: " + temp + " 湿度:" + humidity); | |||
historyLogListId.add(time); | |||
} | |||
public class MHandler extends Handler { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
super.handleMessage(msg); | |||
switch (msg.what) { | |||
case HEART: | |||
if (TempHumidityBleUtils.getInstance() != null) { | |||
TempHumidityBleUtils.getInstance().getDeviceStatus(); | |||
mMHandler.sendEmptyMessageDelayed(HEART, 5000); | |||
} | |||
break; | |||
} | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
mMHandler.removeMessages(HEART); | |||
if (mBluetoothService != null) | |||
mBluetoothService.disconnectAll(); | |||
} | |||
} |
@@ -34,10 +34,9 @@ import androidx.annotation.Nullable; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 显示数据 | |||
* 测试指令界面 | |||
*/ | |||
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, | |||
View.OnClickListener { | |||
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, View.OnClickListener { | |||
private static String TAG = TestCmdActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
@@ -67,8 +66,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
case SEND_DATA: | |||
if (sendUuid != null && sendUuidServer != null) { | |||
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid | |||
, BleConfig.WRITE_DATA, sendUuidServer); | |||
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | |||
bleDevice.sendData(sendDataBean); | |||
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime); | |||
} | |||
@@ -135,8 +133,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
sendUuid = UUID.fromString(uuid); | |||
break; | |||
case R.id.btn_uuid_server: | |||
String uuidServer = | |||
et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
if (uuidServer.length() == 8) { | |||
uuidServer += uuidEnd; | |||
} | |||
@@ -172,7 +169,11 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
UUID UUID_NOTIFY = UUID.fromString(notify); | |||
if (bleDevice != null && sendUuidServer != null) { | |||
// bleDevice.setNotify(notifyOpen); | |||
bleDevice.setNotify(sendUuidServer,UUID_NOTIFY); | |||
if (notifyOpen) { | |||
bleDevice.setNotify(sendUuidServer, UUID_NOTIFY); | |||
} else { | |||
bleDevice.setCloseNotify(sendUuidServer, UUID_NOTIFY); | |||
} | |||
} | |||
} | |||
@@ -263,8 +264,6 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); |
@@ -16,6 +16,7 @@ import android.provider.Settings; | |||
import android.text.TextUtils; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.ListView; | |||
import android.widget.TextView; | |||
import android.widget.Toast; | |||
@@ -44,16 +45,16 @@ import androidx.core.app.ActivityCompat; | |||
/** | |||
* xing<br> | |||
* 2019/4/25<br> | |||
* 显示数据 | |||
* OTA测试界面 | |||
*/ | |||
public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, ShowListDialogFragment.onDialogListener { | |||
public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, OnBleDeviceDataListener, View.OnClickListener, OnBleOTAListener, ShowListDialogFragment.onDialogListener { | |||
private static String TAG = TestOtaActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
private final int SEND_DATA = 4; | |||
private TextView mTvVersion; | |||
private Button btn_shake_hands; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
@@ -63,6 +64,7 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mDialogList; | |||
private String mOTAFileName; | |||
private DialogOtaManager mDialogOtaManager; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
@@ -98,29 +100,31 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
ListView listView = findViewById(R.id.listview); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
listView.setAdapter(listAdapter); | |||
mTvVersion = findViewById(R.id.tv_version); | |||
btn_shake_hands = findViewById(R.id.btn_shake_hands); | |||
btn_shake_hands.setTag(false); | |||
findViewById(R.id.btn_ota_connect).setOnClickListener(this); | |||
findViewById(R.id.btn_ota_dis).setOnClickListener(this); | |||
findViewById(R.id.btn_ota_file).setOnClickListener(this); | |||
findViewById(R.id.btn_ota_start).setOnClickListener(this); | |||
mTvVersion=findViewById(R.id.tv_version); | |||
findViewById(R.id.btn_ota_start_585).setOnClickListener(this); | |||
findViewById(R.id.btn_ota_start_531).setOnClickListener(this); | |||
findViewById(R.id.btn_ota_start_580).setOnClickListener(this); | |||
btn_shake_hands.setOnClickListener(this); | |||
mOTAFileName = SP.getInstance().getOtaFileName(); | |||
if (mOTAFileName.isEmpty()) | |||
mTvVersion.setText("xxxxxxxx"); | |||
else | |||
mTvVersion.setText(mOTAFileName); | |||
mDialogList=new ArrayList<>(); | |||
mDialogList = new ArrayList<>(); | |||
} | |||
@Override | |||
public void onItemListener(int position) { | |||
if (mDialogList.size() > position) { | |||
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList | |||
.get(position); | |||
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList.get(position); | |||
String name = dialogStringImageBean.getName(); | |||
mOTAFileName = name; | |||
SP.getInstance().putOtaFileName(name); | |||
@@ -133,15 +137,15 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn_ota_connect: | |||
if (mBleDevice==null&&!TextUtils.isEmpty(mAddress)){ | |||
if (mBleDevice == null && !TextUtils.isEmpty(mAddress)) { | |||
connectBle(mAddress); | |||
} | |||
break; | |||
case R.id.btn_ota_dis: | |||
if (mBleDevice!=null){ | |||
if (mBleDevice != null) { | |||
mBleDevice.disconnect(); | |||
mBleDevice=null; | |||
mBleDevice = null; | |||
} | |||
break; | |||
case R.id.btn_ota_file: | |||
@@ -151,21 +155,23 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
mDialogList.add(new DialogStringImageAdapter.DialogStringImageBean(s, 0)); | |||
} | |||
ShowListDialogFragment.newInstance().setTitle("").setCancel("",0).setCancelBlank(true) | |||
.setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this) | |||
ShowListDialogFragment.newInstance().setTitle("").setCancel("", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this) | |||
.show(getSupportFragmentManager()); | |||
break; | |||
case R.id.btn_ota_start: | |||
if (mOTAFileName.isEmpty()) { | |||
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
return; | |||
} | |||
String byFileName = FileUtils.getByFileName()+mOTAFileName; | |||
mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
DialogOtaManager build = DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).build(mBleDevice); | |||
build.startOta(); | |||
case R.id.btn_ota_start_585: | |||
startOta(DialogOtaManager.IC_TYPE_585); | |||
break; | |||
case R.id.btn_ota_start_531: | |||
startOta(DialogOtaManager.IC_TYPE_531); | |||
break; | |||
case R.id.btn_ota_start_580: | |||
startOta(DialogOtaManager.IC_TYPE_580); | |||
break; | |||
case R.id.btn_shake_hands: | |||
boolean status = (boolean) btn_shake_hands.getTag(); | |||
btn_shake_hands.setTag(!status); | |||
btn_shake_hands.setText("握手:" + !status); | |||
break; | |||
@@ -173,21 +179,31 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
} | |||
private void startOta(int icType){ | |||
if (mOTAFileName.isEmpty()) { | |||
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||
return; | |||
} | |||
String byFileName = FileUtils.getByFileName() + mOTAFileName; | |||
mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
mDialogOtaManager= DialogOtaManager.newBuilder().setOnBleOTAListener(this).setFilePath(byFileName).setIcType(icType).build(mBleDevice); | |||
// mBleDevice.setOnDialogOTAListener(this); | |||
// mBleDevice.startDialogOta(byFileName, icType,((Boolean) btn_shake_hands.getTag())); | |||
} | |||
/** | |||
* 初始化请求权限 | |||
*/ | |||
private void initPermissions() { | |||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
ActivityCompat | |||
.requestPermissions(this, | |||
new String[]{Manifest.permission.ACCESS_FINE_LOCATION, | |||
Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); | |||
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); | |||
} | |||
} | |||
@Override | |||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | |||
@NonNull int[] grantResults) { | |||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
if (requestCode != 1) { | |||
return; | |||
@@ -196,19 +212,16 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
} else { | |||
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | |||
//权限请求失败,但未选中“不再提示”选项 | |||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备") | |||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
//引导用户至设置页手动授权 | |||
Intent intent = | |||
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
Uri uri = Uri.fromParts("package", getApplicationContext() | |||
.getPackageName(), null); | |||
intent.setData(uri); | |||
startActivity(intent); | |||
} | |||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
//引导用户至设置页手动授权 | |||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||
intent.setData(uri); | |||
startActivity(intent); | |||
} | |||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
if (dialog != null) { | |||
@@ -220,19 +233,16 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
} else { | |||
//权限请求失败,选中“不再提示”选项 | |||
// T.showShort(MainActivity.this, "获取权限失败"); | |||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备") | |||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
//引导用户至设置页手动授权 | |||
Intent intent = | |||
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
Uri uri = Uri.fromParts("package", getApplicationContext() | |||
.getPackageName(), null); | |||
intent.setData(uri); | |||
startActivity(intent); | |||
} | |||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
//引导用户至设置页手动授权 | |||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||
intent.setData(uri); | |||
startActivity(intent); | |||
} | |||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||
@Override | |||
public void onClick(DialogInterface dialog, int which) { | |||
if (dialog != null) { | |||
@@ -257,7 +267,9 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
if (mBluetoothService != null) { | |||
mBleDevice = mBluetoothService.getBleDevice(mAddress); | |||
mBluetoothService.setOnCallback(this); | |||
if (mDialogOtaManager != null) { | |||
mDialogOtaManager.setOnBleOTAListener(this); | |||
} | |||
} | |||
} | |||
@@ -319,7 +331,6 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
//-----------------通知------------------- | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
@@ -336,7 +347,7 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
} | |||
@Override | |||
public void onOtaFailure(int cmd ,String err) { | |||
public void onOtaFailure(int cmd, String err) { | |||
mList.add(TimeUtils.getTime() + "OTA失败:" + err); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
if (mBleDevice != null) { | |||
@@ -346,9 +357,8 @@ public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||
private int progressOld; | |||
@Override | |||
public void onOtaProgress(float progress, int currentCount, int maxCount) { | |||
public void onOtaProgress(float progress,int currentCount,int maxCount) { | |||
int progressInt = (int) progress; | |||
if (progressOld != progressInt) { | |||
progressOld = progressInt; |
@@ -1,18 +0,0 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import java.text.SimpleDateFormat; | |||
import java.util.Locale; | |||
/** | |||
* xing<br> | |||
* 2019/5/25<br> | |||
* java类作用描述 | |||
*/ | |||
public class TimeUtils { | |||
public static String getTime(){ | |||
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
return format.format(System.currentTimeMillis())+":\n"; | |||
} | |||
} |
@@ -24,10 +24,14 @@ import java.util.Arrays; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | |||
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | |||
/** | |||
* Wifi+ble 牙刷 | |||
*/ | |||
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback { | |||
private String TAG = ToothBrushWifiBleActivity.class.getName(); | |||
private String mAddress; | |||
@@ -54,7 +58,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
findViewById(R.id.default_try_out).setOnClickListener(this); | |||
findViewById(R.id.default_time_mode).setOnClickListener(this); | |||
findViewById(R.id.default_mode).setOnClickListener(this); | |||
// findViewById(R.id.ota).setOnClickListener(this); | |||
findViewById(R.id.ota).setOnClickListener(this); | |||
mEditText = findViewById(R.id.select_wifi_et); | |||
select_gears_et = findViewById(R.id.select_gears_et); | |||
@@ -351,11 +355,11 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
mToothBrushWiFiBleUtilsData.getdefaultGearAndDuration(); | |||
break; | |||
// case R.id.ota: | |||
// | |||
// mToothBrushWiFiBleUtilsData.setOta(); | |||
// | |||
// break; | |||
case R.id.ota: | |||
mToothBrushWiFiBleUtilsData.setOta(); | |||
break; | |||
} | |||
} |
@@ -1,6 +1,7 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.content.Context; | |||
import android.content.pm.ActivityInfo; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
@@ -15,6 +16,7 @@ import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||
import com.pingwang.bluetoothlib.device.SendMcuBean; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
@@ -32,15 +34,13 @@ import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData; | |||
/** | |||
* xing<br> | |||
* 2019/9/2<br> | |||
* 显示数据 | |||
* tpms连接版 | |||
*/ | |||
public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||
TpmsDeviceData.onNotifyData, TpmsDeviceData.onTpmsSetting, TpmsDeviceData.onTpmsInfo, OnBleVersionListener, | |||
OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||
TpmsDeviceData.onNotifyData, TpmsDeviceData.onTpmsSetting, TpmsDeviceData.onTpmsInfo, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||
private static String TAG = TpmsConnectCmdActivity.class.getName(); | |||
private final int REFRESH_DATA = 3; | |||
@@ -51,6 +51,7 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac | |||
* 服务Intent | |||
*/ | |||
private Context mContext; | |||
private EditText et_type; | |||
private TpmsDeviceData mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
@@ -72,6 +73,7 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
setContentView(R.layout.activity_height); | |||
mContext = this; | |||
mAddress = getIntent().getStringExtra("mac"); | |||
@@ -92,6 +94,7 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac | |||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btn_get_did).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
cmdBtn(); | |||
} | |||
@@ -131,7 +134,12 @@ public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbac | |||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||
mBleDevice.sendData(sendBleBean); | |||
break; | |||
case R.id.btn1: | |||
String cmd = et_type.getText().toString().trim(); | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,cmd.getBytes()); | |||
mBleDevice.sendData(sendDataBean); | |||
break; | |||
case R.id.clear: | |||
if (mList != null) | |||
mList.clear(); |
@@ -1,5 +1,6 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.content.pm.ActivityInfo; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Message; | |||
@@ -9,21 +10,23 @@ import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import androidx.annotation.Nullable; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.lang.ref.WeakReference; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | |||
/** | |||
* 透传界面 | |||
*/ | |||
public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback { | |||
private EditText et, et_cid; | |||
private Button send, bt_clear, bt_clear_log,bt_cid; | |||
@@ -68,6 +71,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
setContentView(R.layout.activity_transmission); | |||
WeakReference weakReference = new WeakReference(new MHandler()); | |||
mMHandler = (MHandler) weakReference.get(); | |||
@@ -97,10 +101,6 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
byte[] hexStr = BleStrUtils.stringToByte(hex); | |||
String cid = et_cid.getText().toString().toUpperCase().trim(); | |||
int hexStrCid = Integer.parseInt(cid, 16); | |||
if (mTransmissionDeviceData != null) { | |||
mTransmissionDeviceData.setSendData(hexStrCid, hexStr); | |||
} | |||
@@ -125,7 +125,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
public void showdata(String data) { | |||
mlogList.add(0, "收 payload数据"+TimeUtils.getTime()+data); | |||
mlogList.add(0, "收 payload数据"+ TimeUtils.getTime()+data); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
} | |||
@@ -1,101 +0,0 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.content.Context; | |||
import android.view.LayoutInflater; | |||
import android.view.View; | |||
import android.view.ViewGroup; | |||
import android.widget.AdapterView; | |||
import android.widget.SeekBar; | |||
import android.widget.TextView; | |||
import androidx.annotation.NonNull; | |||
import androidx.recyclerview.widget.RecyclerView; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { | |||
private List<User> mUser; | |||
private Context mContext; | |||
public UserAdapter(Context context, List<User> mUser) { | |||
this.mContext = context; | |||
this.mUser = mUser; | |||
} | |||
@NonNull | |||
@Override | |||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_user_info,parent)); | |||
} | |||
@Override | |||
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { | |||
} | |||
@Override | |||
public int getItemCount() { | |||
return mUser.size(); | |||
} | |||
class ViewHolder extends RecyclerView.ViewHolder implements SeekBar.OnSeekBarChangeListener { | |||
private TextView id; | |||
private SeekBar agesb, heightsb, weightsb, adcsb; | |||
public ViewHolder(@NonNull View itemView) { | |||
super(itemView); | |||
id = itemView.findViewById(R.id.id); | |||
agesb = itemView.findViewById(R.id.adcsb); | |||
agesb.setOnSeekBarChangeListener(this); | |||
heightsb = itemView.findViewById(R.id.heightsb); | |||
heightsb.setOnSeekBarChangeListener(this); | |||
weightsb = itemView.findViewById(R.id.weightsb); | |||
weightsb.setOnSeekBarChangeListener(this); | |||
adcsb = itemView.findViewById(R.id.adcsb); | |||
adcsb.setOnSeekBarChangeListener(this); | |||
} | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
int id = seekBar.getId(); | |||
User user = mUser.get(getLayoutPosition()); | |||
if (id == R.id.weightsb) { | |||
user.setWeight(progress); | |||
} else if (id == R.id.adcsb) { | |||
user.setAdc(progress); | |||
} else if (id == R.id.heightsb) { | |||
user.setHeight(progress); | |||
} else if (id == R.id.age) { | |||
user.setAge(progress); | |||
} | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
} | |||
} |
@@ -26,6 +26,7 @@ import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.AddUserDialog; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | |||
@@ -34,6 +35,9 @@ import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||
/** | |||
* Ble体脂秤 | |||
*/ | |||
public class WeightScaleBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, BodyFatBleUtilsData.BleBodyFatCallback { | |||
private String TAG = WeightScaleBleActivity.class.getName(); | |||
private String mAddress; |
@@ -31,6 +31,7 @@ import java.util.HashMap; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.WifiDialog; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | |||
@@ -38,6 +39,9 @@ import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | |||
/** | |||
* wifi+ble体脂秤 | |||
*/ | |||
public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, BodyFatBleUtilsData.BleBodyFatCallback, BodyFatBleUtilsData.BleBodyFatWiFiCallback { | |||
private String TAG = WeightScaleWifiBleActivity.class.getName(); | |||
private String mAddress; | |||
@@ -85,8 +89,8 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
findViewById(R.id.setedname).setOnClickListener(this); | |||
findViewById(R.id.setedpaw).setOnClickListener(this); | |||
findViewById(R.id.setedmac).setOnClickListener(this); | |||
// findViewById(R.id.ota).setOnClickListener(this); | |||
// findViewById(R.id.surroundings).setOnClickListener(this); | |||
findViewById(R.id.ota).setOnClickListener(this); | |||
findViewById(R.id.surroundings).setOnClickListener(this); | |||
mEditText = findViewById(R.id.select_wifi_et); | |||
kg = findViewById(R.id.kg); | |||
jing = findViewById(R.id.jin); | |||
@@ -590,25 +594,25 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
case R.id.disconnect: | |||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().disconnectWifi()); | |||
break; | |||
// case R.id.ota: | |||
//// bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().ota()); | |||
//// OtaUtil otaUtil=new OtaUtil(this,mBluetoothService.getBleDevice(mAddress)); | |||
// showFileChooser(); | |||
// break; | |||
// case R.id.surroundings: | |||
// if (isTest) { | |||
// setIp(productIp); | |||
// mList.add(0, "设置环境IP为生产环境"); | |||
// | |||
// } else { | |||
// setIp(testIp); | |||
// mList.add(0, "设置环境IP为测试环境"); | |||
// | |||
// | |||
// } | |||
// listAdapter.notifyDataSetChanged(); | |||
// | |||
// break; | |||
case R.id.ota: | |||
// bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().ota()); | |||
// OtaUtil otaUtil=new OtaUtil(this,mBluetoothService.getBleDevice(mAddress)); | |||
showFileChooser(); | |||
break; | |||
case R.id.surroundings: | |||
if (isTest) { | |||
setIp(productIp); | |||
mList.add(0, "设置环境IP为生产环境"); | |||
} else { | |||
setIp(testIp); | |||
mList.add(0, "设置环境IP为测试环境"); | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
break; | |||
} |
@@ -1,8 +1,10 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
import android.annotation.SuppressLint; | |||
import android.app.AlertDialog; | |||
import android.content.DialogInterface; | |||
import android.content.Intent; | |||
import android.content.pm.ActivityInfo; | |||
import android.content.pm.PackageManager; | |||
import android.location.LocationManager; | |||
import android.os.Build; | |||
@@ -38,6 +40,9 @@ import androidx.core.content.ContextCompat; | |||
import cn.net.aicare.modulelibrary.module.wifi.WifiConfig; | |||
import cn.net.aicare.modulelibrary.module.wifi.WifiUtils; | |||
/** | |||
* wifi配置界面 | |||
*/ | |||
public class WifiConfigActivity extends AppCompatActivity implements View.OnClickListener, WifiUtils.OnWifiEventListener { | |||
private String TAG = WifiConfigActivity.class.getName(); | |||
private EditText ssid, paw, key, sn, devicename; | |||
@@ -58,9 +63,11 @@ public class WifiConfigActivity extends AppCompatActivity implements View.OnClic | |||
private RadioButton kg, jing, stlb, lb; | |||
private String mDeviceName; | |||
@SuppressLint("SetTextI18n") | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
setContentView(R.layout.activity_wifi_config); | |||
ssid = findViewById(R.id.ssid); | |||
paw = findViewById(R.id.password); |
@@ -1,7 +1,6 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.base; | |||
import android.Manifest; | |||
import android.app.Activity; | |||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.content.pm.ActivityInfo; | |||
@@ -12,17 +11,15 @@ import android.os.Handler; | |||
import android.os.Message; | |||
import android.view.KeyEvent; | |||
import android.view.MenuItem; | |||
import android.view.MotionEvent; | |||
import android.view.View; | |||
import android.view.inputmethod.InputMethodManager; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | |||
import java.lang.ref.WeakReference; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.widget.Toolbar; | |||
@@ -53,7 +50,7 @@ public abstract class BleAppBaseActivity extends BleBaseActivity { | |||
/** | |||
* 需要申请的权限 | |||
*/ | |||
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}; | |||
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE}; | |||
/** | |||
* 权限请求返回 |
@@ -1,4 +1,4 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.base; | |||
import android.content.ComponentName; | |||
import android.content.Context; |
@@ -0,0 +1,21 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.config; | |||
import java.util.List; | |||
/** | |||
* xing<br> | |||
* 2021/3/5<br> | |||
* java类作用描述 | |||
*/ | |||
public class AppConfig { | |||
/** | |||
* 是否为客户专用OTA | |||
*/ | |||
public static boolean APP_TYPE_OTA=false; | |||
/** | |||
* 支持显示的ID,null表示所有的都显示,ID是按钮的ID不是CID | |||
*/ | |||
public static List<Integer> SHOW_VIEW_ID = null; | |||
} |
@@ -1,8 +1,7 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||
import android.app.Dialog; | |||
import android.content.DialogInterface; | |||
import android.content.IntentFilter; | |||
import android.os.Bundle; | |||
import android.view.KeyEvent; | |||
import android.view.LayoutInflater; | |||
@@ -12,13 +11,11 @@ import android.widget.RadioGroup; | |||
import android.widget.SeekBar; | |||
import android.widget.TextView; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.fragment.app.DialogFragment; | |||
import androidx.fragment.app.FragmentManager; | |||
import java.net.IDN; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||
@@ -6,10 +6,9 @@ import android.view.View; | |||
import android.view.ViewGroup; | |||
import android.widget.TextView; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.recyclerview.widget.RecyclerView; | |||
@@ -18,7 +18,6 @@ import android.widget.TextView; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
import androidx.annotation.ColorInt; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; |
@@ -12,7 +12,6 @@ import android.view.View; | |||
import android.view.ViewGroup; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.fragment.app.DialogFragment; |
@@ -1,4 +1,4 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||
import android.app.Dialog; | |||
import android.content.Context; | |||
@@ -12,6 +12,7 @@ import android.view.ViewGroup; | |||
import android.widget.EditText; | |||
import android.widget.TextView; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.fragment.app.DialogFragment; |
@@ -0,0 +1,223 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.find; | |||
import android.content.Context; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.Toast; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.findDevice.FindConnectDeviceInfoBean; | |||
import cn.net.aicare.modulelibrary.module.findDevice.FindDeviceData; | |||
public class FindDeviceActivity extends BleBaseActivity implements View.OnClickListener, FindDeviceData.onNotifyData { | |||
private Button btn_device_id_0, btn_device_id_1, btn_device_id_2, btn_device_id_3, btn_device_id_4, btn_device_id_5, btn_device_id_6; | |||
private Button btn_clear, btn_get_connect_number, btn_connect_info_list,btn_scan_ble; | |||
private EditText et_send_data; | |||
private ListView list_view; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private Context mContext; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private FindDeviceData mFindDeviceData; | |||
private Map<Integer, FindConnectDeviceInfoBean> mMap = new HashMap<>(); | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_find_device); | |||
mContext = this; | |||
btn_get_connect_number = findViewById(R.id.btn_get_connect_number); | |||
btn_connect_info_list = findViewById(R.id.btn_connect_info_list); | |||
btn_device_id_0 = findViewById(R.id.btn_device_id_0); | |||
btn_device_id_1 = findViewById(R.id.btn_device_id_1); | |||
btn_device_id_2 = findViewById(R.id.btn_device_id_2); | |||
btn_device_id_3 = findViewById(R.id.btn_device_id_3); | |||
btn_device_id_4 = findViewById(R.id.btn_device_id_4); | |||
btn_device_id_5 = findViewById(R.id.btn_device_id_5); | |||
btn_device_id_6 = findViewById(R.id.btn_device_id_6); | |||
et_send_data = findViewById(R.id.et_send_data); | |||
btn_clear = findViewById(R.id.btn_clear); | |||
list_view = findViewById(R.id.list_view); | |||
btn_scan_ble = findViewById(R.id.btn_scan_ble); | |||
btn_device_id_0.setOnClickListener(this); | |||
btn_device_id_1.setOnClickListener(this); | |||
btn_device_id_2.setOnClickListener(this); | |||
btn_device_id_3.setOnClickListener(this); | |||
btn_device_id_4.setOnClickListener(this); | |||
btn_device_id_5.setOnClickListener(this); | |||
btn_device_id_6.setOnClickListener(this); | |||
btn_clear.setOnClickListener(this); | |||
btn_scan_ble.setOnClickListener(this); | |||
btn_get_connect_number.setOnClickListener(this); | |||
btn_connect_info_list.setOnClickListener(this); | |||
// 获取Mac | |||
mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn_connect_info_list: | |||
if (mFindDeviceData!=null) { | |||
mFindDeviceData.getConnectInfoList(); | |||
} | |||
break; | |||
case R.id.btn_get_connect_number: | |||
if (mFindDeviceData!=null) { | |||
mFindDeviceData.getConnectDeviceNumber(); | |||
} | |||
break; | |||
case R.id.btn_device_id_0: | |||
sendCmd(0); | |||
break; | |||
case R.id.btn_device_id_1: | |||
sendCmd(1); | |||
break; | |||
case R.id.btn_device_id_2: | |||
sendCmd(2); | |||
break; | |||
case R.id.btn_device_id_3: | |||
sendCmd(3); | |||
break; | |||
case R.id.btn_device_id_4: | |||
sendCmd(4); | |||
break; | |||
case R.id.btn_device_id_5: | |||
sendCmd(5); | |||
break; | |||
case R.id.btn_device_id_6: | |||
sendCmd(6); | |||
break; | |||
case R.id.btn_clear: | |||
mList.clear(); | |||
if (mListAdapter != null) { | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
} | |||
} | |||
/** | |||
* 发送指令 | |||
*/ | |||
private void sendCmd(int id) { | |||
if (mMap != null) { | |||
FindConnectDeviceInfoBean findConnectDeviceInfoBean = mMap.get(id); | |||
if (findConnectDeviceInfoBean != null) { | |||
String trim = et_send_data.getText().toString().trim(); | |||
mFindDeviceData.setCmd(findConnectDeviceInfoBean.getDeviceId(), trim, findConnectDeviceInfoBean.getMac()); | |||
} else { | |||
Toast.makeText(mContext, "当前ID没有设备", Toast.LENGTH_SHORT).show(); | |||
} | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mFindDeviceData = FindDeviceData.getInstance(mBleDevice); | |||
mFindDeviceData.setOnNotifyData(this); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void onData(byte[] data, int type) { | |||
} | |||
@Override | |||
public void onConnectNumber(int number) { | |||
mList.add("当前连接的设备数量:" + number); | |||
if (mListAdapter != null) { | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
public void onConnectDeviceInfoList(List<FindConnectDeviceInfoBean> list) { | |||
StringBuilder deviceInfo = new StringBuilder(); | |||
for (FindConnectDeviceInfoBean findConnectDeviceInfoBean : list) { | |||
mMap.put(findConnectDeviceInfoBean.getDeviceId(), findConnectDeviceInfoBean); | |||
deviceInfo.append("设备ID").append(findConnectDeviceInfoBean.getDeviceId()).append(" || MAC地址:").append(findConnectDeviceInfoBean.getMac()).append("\n"); | |||
} | |||
mList.add(deviceInfo.toString()); | |||
if (mListAdapter != null) { | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
public void onConnectDeviceStatus(int id, int status) { | |||
String statusStr = status == 0 ? "断开" : "连接"; | |||
mList.add("设备ID:" + id + " || 状态:" + statusStr); | |||
if (mListAdapter != null) { | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
//---------------新-------------- | |||
@Override | |||
public void onNearbyDeviceInfo(String mac, int rssi, byte[] broadcastData) { | |||
} | |||
@Override | |||
public void onConnectDeviceStatus(String mac, int status) { | |||
} | |||
@Override | |||
public void onConnectDeviceInfo(int status, String mac) { | |||
} | |||
} |
@@ -0,0 +1,82 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.find; | |||
import android.content.Context; | |||
import android.view.LayoutInflater; | |||
import android.view.View; | |||
import android.view.ViewGroup; | |||
import android.widget.Button; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.recyclerview.widget.RecyclerView; | |||
/** | |||
* xing<br> | |||
*/ | |||
public class FindDeviceAdapter extends RecyclerView.Adapter<FindDeviceAdapter.KeyViewHolder> { | |||
private List<FindDeviceBean> mList; | |||
private OnItemClickListener listener; | |||
private Context mContext; | |||
public interface OnItemClickListener { | |||
void onItemClick(int position); | |||
} | |||
public FindDeviceAdapter(Context context, List<FindDeviceBean> list, OnItemClickListener listener) { | |||
mList = list; | |||
this.listener = listener; | |||
mContext = context; | |||
} | |||
@NonNull | |||
@Override | |||
public KeyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||
View view = LayoutInflater.from(mContext).inflate(R.layout.item_find_device, parent, false); | |||
return new KeyViewHolder(view, listener); | |||
} | |||
@Override | |||
public void onBindViewHolder(@NonNull KeyViewHolder holder, int position) { | |||
FindDeviceBean bean = mList.get(position); | |||
holder.btn_find_device.setText("MAC="+bean.getMac()); | |||
holder.btn_find_device.setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
if (listener != null) | |||
listener.onItemClick(position); | |||
} | |||
}); | |||
} | |||
@Override | |||
public int getItemCount() { | |||
return mList.size(); | |||
} | |||
static class KeyViewHolder extends RecyclerView.ViewHolder { | |||
private Button btn_find_device; | |||
KeyViewHolder(@NonNull View itemView, final OnItemClickListener listener) { | |||
super(itemView); | |||
btn_find_device = itemView.findViewById(R.id.btn_find_device); | |||
itemView.setOnClickListener(v -> { | |||
if (listener != null) | |||
listener.onItemClick(getLayoutPosition()); | |||
}); | |||
} | |||
} | |||
} |
@@ -0,0 +1,88 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.find; | |||
import androidx.annotation.Nullable; | |||
/** | |||
* xing<br> | |||
* 2021/4/12<br> | |||
* java类作用描述 | |||
*/ | |||
public class FindDeviceBean { | |||
private String mMac; | |||
private String mName; | |||
private int mRssi; | |||
private byte[] mBroadcastData; | |||
public FindDeviceBean(String mac, String name, int rssi, byte[] broadcastData) { | |||
mMac = mac; | |||
mName = name; | |||
mRssi = rssi; | |||
mBroadcastData = broadcastData; | |||
} | |||
public FindDeviceBean(String mac, String name, int rssi) { | |||
mMac = mac; | |||
mName = name; | |||
mRssi = rssi; | |||
} | |||
public FindDeviceBean(String mac, int rssi) { | |||
mMac = mac; | |||
mRssi = rssi; | |||
} | |||
public FindDeviceBean(String mac, int rssi, byte[] broadcastData) { | |||
mMac = mac; | |||
mRssi = rssi; | |||
mBroadcastData = broadcastData; | |||
} | |||
public String getMac() { | |||
return mMac; | |||
} | |||
public void setMac(String mac) { | |||
mMac = mac; | |||
} | |||
public String getName() { | |||
return mName; | |||
} | |||
public void setName(String name) { | |||
mName = name; | |||
} | |||
public int getRssi() { | |||
return mRssi; | |||
} | |||
public void setRssi(int rssi) { | |||
mRssi = rssi; | |||
} | |||
public byte[] getBroadcastData() { | |||
return mBroadcastData; | |||
} | |||
public void setBroadcastData(byte[] broadcastData) { | |||
mBroadcastData = broadcastData; | |||
} | |||
@Override | |||
public boolean equals(@Nullable Object obj) { | |||
if (obj instanceof String) { | |||
return this.mMac.equalsIgnoreCase((String) obj); | |||
} else if (obj instanceof FindDeviceBean) { | |||
return this.mMac.equalsIgnoreCase(((FindDeviceBean) obj).getMac()); | |||
} else { | |||
return super.equals(obj); | |||
} | |||
} | |||
} |
@@ -0,0 +1,381 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.find; | |||
import android.os.Message; | |||
import android.text.TextUtils; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.ListView; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.AILinkSDK; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | |||
import androidx.recyclerview.widget.GridLayoutManager; | |||
import androidx.recyclerview.widget.LinearLayoutManager; | |||
import androidx.recyclerview.widget.RecyclerView; | |||
import cn.net.aicare.modulelibrary.module.findDevice.FindDeviceData; | |||
public class FindDeviceNewActivity extends BleAppBaseActivity implements View.OnClickListener, OnCallbackBle, FindDeviceData.onNotifyData, OnScanFilterListener, FindDeviceAdapter.OnItemClickListener { | |||
private final int REFRESH_DATA = 2; | |||
private final int START_SCAN_BLE =3; | |||
private final static String BLE_NAME_START = "FiLink"; | |||
private final static String BLE_UUID_1 = "74278bdab64445208f0c720eaf00001a"; | |||
private final static String BLE_UUID_2 = "74278bdab64445208f0c720eaf00001b"; | |||
private Button btn_clear, btn_scan_ble; | |||
private TextView tv_status; | |||
private ListView list_view; | |||
private RecyclerView rv_device; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private FindDeviceData mFindDeviceData; | |||
private volatile ArrayList<FindDeviceBean> mFindDeviceBeanList; | |||
private FindDeviceAdapter mFindDeviceAdapter; | |||
@Override | |||
protected void uiHandlerMessage(Message msg) { | |||
switch (msg.what) { | |||
case REFRESH_DATA: | |||
if (mListAdapter != null) { | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
case START_SCAN_BLE: | |||
bleOpen(); | |||
break; | |||
} | |||
} | |||
@Override | |||
protected int getLayoutId() { | |||
return R.layout.activity_find_device_new; | |||
} | |||
@Override | |||
protected void initListener() { | |||
btn_clear.setOnClickListener(this); | |||
btn_scan_ble.setOnClickListener(this); | |||
} | |||
@Override | |||
protected void initData() { | |||
if (getSupportActionBar() != null) { | |||
getSupportActionBar().setTitle(getString(R.string.app_name) + ":" + BuildConfig.VERSION_NAME); | |||
} | |||
SP.init(this); | |||
// 获取Mac | |||
// mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
mFindDeviceBeanList = new ArrayList<>(); | |||
String findDeviceMacList = SP.getInstance().getFindDeviceMacList(); | |||
if (!TextUtils.isEmpty(findDeviceMacList) && findDeviceMacList.contains(";")) { | |||
String[] split = findDeviceMacList.split(";"); | |||
for (int i = 0; i < split.length; i++) { | |||
String mac = split[i]; | |||
if (!TextUtils.isEmpty(mac)) { | |||
mFindDeviceBeanList.add(new FindDeviceBean(mac, String.valueOf(i), -60)); | |||
} | |||
} | |||
} | |||
mFindDeviceAdapter = new FindDeviceAdapter(mContext, mFindDeviceBeanList, this); | |||
rv_device.setAdapter(mFindDeviceAdapter); | |||
} | |||
@Override | |||
protected void initView() { | |||
AILinkSDK.getInstance().init(this);//sdk | |||
btn_clear = findViewById(R.id.btn_clear); | |||
tv_status = findViewById(R.id.tv_status); | |||
list_view = findViewById(R.id.list_view); | |||
btn_scan_ble = findViewById(R.id.btn_scan_ble); | |||
rv_device = findViewById(R.id.rv_device); | |||
rv_device.setLayoutManager(new GridLayoutManager(mContext, 2, LinearLayoutManager.VERTICAL, false)); | |||
rv_device.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_white))); | |||
// rv_device.setVisibility(View.INVISIBLE); | |||
} | |||
@Override | |||
public void onItemClick(int position) { | |||
if (mFindDeviceBeanList.size() > position) { | |||
FindDeviceBean findDeviceBean = mFindDeviceBeanList.get(position); | |||
if (mFindDeviceData != null) { | |||
// mFindDeviceData.setDisconnectDevice(); | |||
mFindDeviceData.setConnectDevice(findDeviceBean.getMac()); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn_scan_ble: | |||
if (mFindDeviceData != null) { | |||
// mFindDeviceData.setNearbyDevice(1, 10, new byte[]{}); | |||
// if (rv_device.getVisibility() != View.VISIBLE) { | |||
// rv_device.setVisibility(View.VISIBLE); | |||
// } | |||
mFindDeviceBeanList.clear(); | |||
if (mFindDeviceAdapter != null) { | |||
mFindDeviceAdapter.notifyDataSetChanged(); | |||
} | |||
mFindDeviceData.getConnectInfoList(); | |||
mBluetoothService.scanLeDevice(30 * 1000); | |||
} | |||
break; | |||
case R.id.btn_clear: | |||
mList.clear(); | |||
if (mListAdapter != null) { | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
StringBuilder mac = new StringBuilder(); | |||
for (FindDeviceBean findDeviceBean : mFindDeviceBeanList) { | |||
mac.append(findDeviceBean.getMac()).append(";"); | |||
} | |||
if (mac.length() > 0) { | |||
mac.deleteCharAt(mac.length() - 1); | |||
} | |||
SP.getInstance().putFindDeviceMacList(mac.toString()); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
protected void onResume() { | |||
super.onResume(); | |||
} | |||
// ------------------- 权限 ------------------ | |||
@Override | |||
protected void onPermissionsOk() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.setOnCallback(this); | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
mBluetoothService.setOnScanFilterListener(this); | |||
if (mBleDevice != null) { | |||
mFindDeviceData = FindDeviceData.getInstance(mBleDevice); | |||
mFindDeviceData.setOnNotifyData(this); | |||
if (tv_status != null) | |||
tv_status.setText("已连接:" + mMac); | |||
mList.add("连接设备成功!"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} else { | |||
mHandler.removeMessages(START_SCAN_BLE); | |||
mHandler.sendEmptyMessage(START_SCAN_BLE); | |||
} | |||
} | |||
} | |||
//-------------------------- | |||
@Override | |||
public void onServiceSuccess() { | |||
if (mBluetoothService != null) { | |||
initPermissions(); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
if (mBluetoothService!=null){ | |||
mBluetoothService.disconnectAll(); | |||
} | |||
mFindDeviceData = null; | |||
mBluetoothService=null; | |||
} | |||
@Override | |||
public boolean onFilter(BleValueBean bleValueBean) { | |||
if (bleValueBean.getName() != null && bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) { | |||
return true; | |||
} else { | |||
byte[] data = bleValueBean.getManufacturerData(); | |||
if (data != null && data.length > 20) { | |||
byte[] uuidData = new byte[16]; | |||
System.arraycopy(data, 4, uuidData, 0, uuidData.length); | |||
String uuid = BleStrUtils.byte2HexStr_1(uuidData); | |||
if (uuid.equalsIgnoreCase(BLE_UUID_1) || uuid.equalsIgnoreCase(BLE_UUID_2)) { | |||
return true; | |||
} | |||
} | |||
} | |||
return false; | |||
} | |||
@Override | |||
public void onScanning(BleValueBean bleValueBean) { | |||
if (TextUtils.isEmpty(mMac) && bleValueBean.getName() != null && bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) { | |||
mMac = bleValueBean.getMac(); | |||
} else if (bleValueBean.getMac().equalsIgnoreCase(mMac) && mFindDeviceData == null) { | |||
BleConfig.setHandshakeStatus(mMac, false); | |||
mBluetoothService.stopScan(); | |||
mBluetoothService.connectDevice(mMac); | |||
mBluetoothService.setOnCallback(this); | |||
} else if (bleValueBean.getName() == null || !bleValueBean.getName().trim().toUpperCase().startsWith(BLE_NAME_START.toUpperCase())) { | |||
onNearbyDeviceInfo(bleValueBean.getMac(), bleValueBean.getRssi(), bleValueBean.getManufacturerData()); | |||
} | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mac.equalsIgnoreCase(mMac)) { | |||
mFindDeviceData = null; | |||
mList.add("连接断开:"+code); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
mHandler.removeMessages(START_SCAN_BLE); | |||
mHandler.sendEmptyMessageDelayed(START_SCAN_BLE,2000); | |||
} | |||
} | |||
@Override | |||
public void onServicesDiscovered(String mac) { | |||
if (mac.equalsIgnoreCase(mMac)) { | |||
mBluetoothService.stopScan(); | |||
onServiceSuccess(); | |||
} | |||
} | |||
@Override | |||
public void bleOpen() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.stopScan(); | |||
mList.add("正在扫描连接..."); | |||
if (tv_status != null) | |||
tv_status.setText("正在连接..."); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK); | |||
} | |||
} | |||
@Override | |||
public void bleClose() { | |||
mFindDeviceData = null; | |||
mList.add("蓝牙已关闭!"); | |||
if (tv_status != null) | |||
tv_status.setText("蓝牙已关闭!"); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onData(byte[] data, int type) { | |||
} | |||
//---------------新-------------- | |||
@Override | |||
public void onNearbyDeviceInfo(String mac, int rssi, byte[] broadcastData) { | |||
for (FindDeviceBean findDeviceBean : mFindDeviceBeanList) { | |||
if (findDeviceBean.getMac().equalsIgnoreCase(mac)) { | |||
return; | |||
} | |||
} | |||
mFindDeviceBeanList.add(new FindDeviceBean(mac, rssi, broadcastData)); | |||
if (mFindDeviceAdapter != null) { | |||
mFindDeviceAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
public void onConnectDeviceStatus(String mac, int status) { | |||
String statusStr = ""; | |||
switch (status) { | |||
case 0: | |||
statusStr = "连接成功"; | |||
break; | |||
case 1: | |||
statusStr = "断开连接"; | |||
break; | |||
case 2: | |||
statusStr = "响铃..."; | |||
break; | |||
case 3: | |||
statusStr = "连接超时"; | |||
break; | |||
} | |||
mList.add("设备:" + mac + " || 状态:" + statusStr); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@Override | |||
public void onConnectDeviceInfo(int status, String mac) { | |||
BleLog.i(TAG, "当前连接的设备:" + mac + " || status=" + status); | |||
if (status == 1) { | |||
mFindDeviceBeanList.add(new FindDeviceBean(mac, -60, new byte[]{})); | |||
if (mFindDeviceAdapter != null) { | |||
mFindDeviceAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,232 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose; | |||
import android.content.Intent; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.CompoundButton; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; | |||
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; | |||
/** | |||
* 血糖仪 | |||
*/ | |||
public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackBle, BloodGlucoseBleDeviceData.BloodGlucoseCallback { | |||
private Button support_unit, quest_status, showdata, test; | |||
private RadioButton mmol, mg; | |||
private ListView log_list; | |||
private List<String> mLogList; | |||
private ArrayAdapter listAdapter; | |||
private String mAddress; | |||
private boolean isShowData=false; | |||
private BloodGlucoseBleDeviceData mBloodGlucoseBleDeviceData; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_blood_glucose); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
support_unit = findViewById(R.id.support_unit); | |||
quest_status = findViewById(R.id.quest_status); | |||
showdata=findViewById(R.id.showdata); | |||
test = findViewById(R.id.test); | |||
mmol = findViewById(R.id.mmol); | |||
mg = findViewById(R.id.mg); | |||
log_list = findViewById(R.id.log_list); | |||
mLogList = new ArrayList<>(); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList); | |||
log_list.setAdapter(listAdapter); | |||
mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) | |||
if (mBloodGlucoseBleDeviceData != null) | |||
mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MMOL_L); | |||
} | |||
}); | |||
mg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) | |||
if (mBloodGlucoseBleDeviceData != null) | |||
mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MG_DL); | |||
} | |||
}); | |||
showdata.setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
if (!isShowData){ | |||
showdata.setText("隐藏Data数据"); | |||
isShowData=true; | |||
}else { | |||
showdata.setText("显示Data数据"); | |||
isShowData=false; | |||
} | |||
} | |||
}); | |||
quest_status.setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
if (mBloodGlucoseBleDeviceData != null) | |||
mBloodGlucoseBleDeviceData.queryStatus(); | |||
} | |||
}); | |||
// 流程测试 | |||
test.setOnClickListener(v -> { | |||
Intent intent = new Intent(this, BloodGlucoseTestActivity.class); | |||
intent.putExtra("mac", mAddress); | |||
startActivity(intent); | |||
}); | |||
// 查询设备支持单位 | |||
support_unit.setOnClickListener(v -> { | |||
if (mBloodGlucoseBleDeviceData != null) { | |||
mBloodGlucoseBleDeviceData.getSupportUnit(); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mLogList.add(0, "绑定服务成功"); | |||
listAdapter.notifyDataSetChanged(); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.setOnCallback(this); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice); | |||
mBloodGlucoseBleDeviceData.setBloodGlucoseCallback(this); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
// 断开连接直接退出 | |||
finish(); | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void onVersion(String version) { | |||
mLogList.add(0, "版本号:"+version); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onSupportUnit(List<SupportUnitBean> list) { | |||
mLogList.add(0, "支持单位:"); | |||
for (SupportUnitBean supportUnitBean:list) { | |||
mLogList.add(0, supportUnitBean.toString()); | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onDeviceStatus(int status) { | |||
switch (status){ | |||
case BloodGlucoseUtil.STATUS_STATELESS: | |||
mLogList.add(0,status+" 无状态"); | |||
break; | |||
case BloodGlucoseUtil.STATUS_WAIT_TEST_PAPER: | |||
mLogList.add(0,status+" 设备等待插入试纸"); | |||
break; | |||
case BloodGlucoseUtil.STATUS_WAIT_BLOOD_SAMPLES: | |||
mLogList.add(0,status+" 设备已插入试纸,等待获取血样"); | |||
break; | |||
case BloodGlucoseUtil.STATUS_ANALYSIS_BLOOD_SAMPLES: | |||
mLogList.add(0,status+" 血样已获取,分析血样中"); | |||
break; | |||
case BloodGlucoseUtil.STATUS_TEST_FINISH: | |||
mLogList.add(0,status+" 上发数据完成,测量完成"); | |||
break; | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onResult(int originalValue, float value, int unit, int decimal) { | |||
mLogList.add(0,"原始数据:"+originalValue+" 值:"+value+" 单位:"+unit+" 小数点位:"+decimal); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onErrorCode(int code) { | |||
switch (code){ | |||
case BloodGlucoseUtil.ERROR_CODE_NO_ELECTRICITY: | |||
mLogList.add(0,code+" 电池没电"); | |||
break; | |||
case BloodGlucoseUtil.ERROR_CODE_USED_TEST_PAPER: | |||
mLogList.add(0,code+" 已使用过的试纸"); | |||
break; | |||
case BloodGlucoseUtil.ERROR_CODE_TEMPERATURE_OUT_OF_RANGE: | |||
mLogList.add(0,code+" 环境温度超出使用范围"); | |||
break; | |||
case BloodGlucoseUtil.ERROR_CODE_WITHDRAWN_TEST_PAPER: | |||
mLogList.add(0,code+" 试纸施加血样后测试未完成,被退出试纸"); | |||
break; | |||
case BloodGlucoseUtil.ERROR_CODE_SELF_CHECK_FAIL: | |||
mLogList.add(0,code+" 机器自检未通过"); | |||
break; | |||
case BloodGlucoseUtil.ERROR_CODE_RESULT_LOWER: | |||
mLogList.add(0,code+" 测量结果过低,超出测量范围"); | |||
break; | |||
case BloodGlucoseUtil.ERROR_CODE_RESULT_OVERTOP: | |||
mLogList.add(0,code+" 测量结果过高,超出测量范围"); | |||
break; | |||
default: | |||
mLogList.add(0,"错误码:"+code); | |||
break; | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onSetUnitResult(int result) { | |||
switch (result){ | |||
case BloodGlucoseUtil.SUCCESS: | |||
mLogList.add(0,result+" 成功"); | |||
break; | |||
case BloodGlucoseUtil.FAILED: | |||
mLogList.add(0,result+" 失败"); | |||
break; | |||
case BloodGlucoseUtil.NONSUPPORT: | |||
mLogList.add(0,result+" 不支持"); | |||
break; | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onData(String data) { | |||
if (isShowData) | |||
mLogList.add(0,data); | |||
} | |||
} |
@@ -0,0 +1,523 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose; | |||
import android.os.Bundle; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.ListView; | |||
import android.widget.Toast; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; | |||
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; | |||
public class BloodGlucoseTestActivity extends BleBaseActivity implements OnCallbackBle, BloodGlucoseBleDeviceData.BloodGlucoseCallback, OnBleCompanyListener { | |||
private ListView list_view; | |||
private ArrayAdapter mAdapter; | |||
private List<String> mList; | |||
private String mAddress; | |||
private BloodGlucoseBleDeviceData mBleDevice; | |||
private List<Integer> mSupportUnit;// 设备支持的单位列表 | |||
private int mCurTestUnit = 0;// 当前在测试第几个单位 | |||
private int mCurStep = 1;// 当前流程进行到第几步 | |||
private static final int STEP_END_FAIL = -1;// 测试结束 失败 | |||
private static final int STEP_END_SUCCESS = -2;// 测试结束 成功 | |||
private static final int STEP_CID = 1;// 查询设备CID VID PID | |||
private static final int STEP_UNIT = 2;// 查询设备支持的单位 | |||
private static final int STEP_DEVICE_STATUS = 3;// 获取设备状态 | |||
private static final int STEP_TEST_STATUS_1 = 4;// 测量状态1 插入试纸 | |||
private static final int STEP_TEST_STATUS_2 = 5;// 测量状态2 获取血样 | |||
private static final int STEP_TEST_STATUS_3 = 6;// 测量状态3 分析血样 | |||
private static final int STEP_TEST_DATA = 7;// 测量数据 | |||
private static final int STEP_TEST_STATUS_4 = 8;// 测量状态4 测量完成 | |||
private static final int STEP_SET_UNIT = 9;// APP设置单位 需要设备支持该单位 | |||
private static final int STEP_SET_UNIT_SUCCESS = 10;// APP设置单位 需要返回成功 | |||
private static final int STEP_SET_UNIT_FAIL = 11;// APP设置单位 需要返回失败 | |||
private static final int STEP_SET_UNIT_UNSUPPORT = 12;// APP设置单位 需要返回不支持 | |||
private static final int STEP_ERROR_CODE_1 = 13;// 错误码 电池没电 | |||
private static final int STEP_ERROR_CODE_2 = 14;// 错误码 已使用过的试纸 | |||
private static final int STEP_ERROR_CODE_3 = 15;// 错误码 环境温度超出使用范围 | |||
private static final int STEP_ERROR_CODE_4 = 16;// 错误码 试纸施加血样后测试未完成, 被退出试纸 | |||
private static final int STEP_ERROR_CODE_5 = 17;// 错误码 机器自检未通过 | |||
private static final int STEP_ERROR_CODE_6 = 18;// 错误码 测量结果过低, 超出测量范围 | |||
private static final int STEP_ERROR_CODE_7 = 19;// 错误码 测量结果过高, 超出测量范围 | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_blood_glucose_test); | |||
list_view = findViewById(R.id.list_view); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mAdapter); | |||
setTitle("流程测试"); | |||
list_view.postDelayed(this::nextStep, 500); | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
showToast("设备断开连接"); | |||
finish(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.setOnCallback(this); | |||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
mBleDevice = new BloodGlucoseBleDeviceData(bleDevice); | |||
mBleDevice.setBloodGlucoseCallback(this); | |||
bleDevice.setOnBleCompanyListener(this); | |||
} else { | |||
// 无法获取到设备 | |||
showToast("无法获取到设备信息"); | |||
finish(); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void onVersion(String version) { | |||
} | |||
@Override | |||
public void onSupportUnit(List<SupportUnitBean> list) { | |||
// 获取到设备支持的单位 | |||
if (mCurStep == STEP_UNIT) { | |||
String supportUnitStr = "设备支持的单位:"; | |||
if (list != null && list.size() > 0) { | |||
boolean hasUnit = false; | |||
for (SupportUnitBean bean : list) { | |||
// 6 是血糖单位 | |||
if (bean.getType().equals("6")) { | |||
mSupportUnit = bean.getSupportUnit(); | |||
hasUnit = true; | |||
for (int unit : bean.getSupportUnit()) { | |||
// if (unit == BloodGlucoseUtil.UNIT_MMOL_L) { | |||
if (unit == 0) { | |||
supportUnitStr += "mmol/L,"; | |||
} | |||
// if (unit == BloodGlucoseUtil.UNIT_MG_DL) { | |||
if (unit == 1) { | |||
supportUnitStr += "mg/DL,"; | |||
} | |||
} | |||
} | |||
} | |||
if (!hasUnit) { | |||
supportUnitStr += "空"; | |||
} | |||
} else { | |||
supportUnitStr += "空"; | |||
} | |||
if (supportUnitStr.contains(",")) { | |||
supportUnitStr = supportUnitStr.substring(0, supportUnitStr.length() - 1); | |||
} | |||
addText(supportUnitStr); | |||
addText("测试通过"); | |||
mCurStep = STEP_DEVICE_STATUS; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
} | |||
@Override | |||
public void onDeviceStatus(int status) { | |||
if (mCurStep == STEP_DEVICE_STATUS) { | |||
addText("获取到设备状态:" + status); | |||
addText("测试通过"); | |||
addText("下面进入血氧值测量流程测试"); | |||
mCurStep = STEP_TEST_STATUS_1; | |||
nextStep(); | |||
} else { | |||
switch (mCurStep) { | |||
case STEP_TEST_STATUS_1: | |||
// 插入试纸 | |||
if (status == BloodGlucoseUtil.STATUS_WAIT_TEST_PAPER) { | |||
addText("收到插入试纸,下一步"); | |||
mCurStep = STEP_TEST_STATUS_2; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
case STEP_TEST_STATUS_2: | |||
// 获取血样 | |||
if (status == BloodGlucoseUtil.STATUS_WAIT_BLOOD_SAMPLES) { | |||
addText("收到获取血样,下一步"); | |||
mCurStep = STEP_TEST_STATUS_3; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
case STEP_TEST_STATUS_3: | |||
// 分析血样 | |||
if (status == BloodGlucoseUtil.STATUS_ANALYSIS_BLOOD_SAMPLES) { | |||
addText("收到分析血样,下一步"); | |||
mCurStep = STEP_TEST_DATA; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
case STEP_TEST_STATUS_4: | |||
// 测量完成 | |||
if (status == BloodGlucoseUtil.STATUS_TEST_FINISH) { | |||
addText("收到测量完成"); | |||
mCurStep = STEP_SET_UNIT; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
default: | |||
stepError(); | |||
break; | |||
} | |||
} | |||
} | |||
@Override | |||
public void onResult(int originalValue, float value, int unit, int decimal) { | |||
if (mCurStep == STEP_TEST_DATA) { | |||
addText("收到数据:originValue:" + originalValue + ",value:" + value + ",unit:" + unit + ",decimal:" + decimal); | |||
mCurStep = STEP_TEST_STATUS_4; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
} | |||
@Override | |||
public void onErrorCode(int code) { | |||
if (mCurStep == STEP_ERROR_CODE_1) { | |||
addText("收到错误码:" + code + ",下一步"); | |||
mCurStep = STEP_END_SUCCESS; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
// switch (mCurStep) { | |||
// case STEP_ERROR_CODE_1: | |||
// if (code == 1) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_ERROR_CODE_2; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// case STEP_ERROR_CODE_2: | |||
// if (code == 2) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_ERROR_CODE_3; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// case STEP_ERROR_CODE_3: | |||
// if (code == 3) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_ERROR_CODE_4; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// case STEP_ERROR_CODE_4: | |||
// if (code == 4) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_ERROR_CODE_5; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// case STEP_ERROR_CODE_5: | |||
// if (code == 5) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_ERROR_CODE_6; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// case STEP_ERROR_CODE_6: | |||
// if (code == 6) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_ERROR_CODE_7; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// case STEP_ERROR_CODE_7: | |||
// if (code == 7) { | |||
// addText("收到错误码:" + code + ",下一步"); | |||
// mCurStep = STEP_END_SUCCESS; | |||
// nextStep(); | |||
// } else { | |||
// stepError(); | |||
// } | |||
// break; | |||
// } | |||
} | |||
@Override | |||
public void onSetUnitResult(int result) { | |||
switch (mCurStep) { | |||
case STEP_SET_UNIT_SUCCESS: | |||
// 设置单位成功 | |||
// if (result == 0) { | |||
if (result == 0 || result == 1 || result == 2) { | |||
if (result == 0) { | |||
addText("收到设置单位成功,下一步"); | |||
} else if (result == 1) { | |||
addText("收到设置单位失败,下一步"); | |||
} else if (result == 2) { | |||
addText("收到设置单位不支持,下一步"); | |||
} | |||
// mCurStep = STEP_SET_UNIT_FAIL; | |||
mCurStep = STEP_SET_UNIT; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
case STEP_SET_UNIT_FAIL: | |||
// if (result == 1) { | |||
if (result == 0 || result == 1 || result == 2) { | |||
// mCurStep = STEP_SET_UNIT_UNSUPPORT; | |||
mCurStep = STEP_SET_UNIT; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
case STEP_SET_UNIT_UNSUPPORT: | |||
// if (result == 2) { | |||
if (result == 0 || result == 1 || result == 2) { | |||
mCurStep = STEP_SET_UNIT; | |||
nextStep(); | |||
} else { | |||
stepError(); | |||
} | |||
break; | |||
default: | |||
stepError(); | |||
break; | |||
} | |||
} | |||
@Override | |||
public void onData(String data) { | |||
} | |||
@Override | |||
public void OnDID(int cid, int vid, int pid) { | |||
// 获取到设备的CID VID PID | |||
if (cid < 0) { | |||
cid = 0; | |||
} | |||
if (vid < 0) { | |||
vid = 0; | |||
} | |||
if (pid < 0) { | |||
pid = 0; | |||
} | |||
if (mCurStep == STEP_CID) { | |||
addText("CID:" + cid + ",VID:" + vid + ",PID:" + pid); | |||
if (cid > 0 && vid > 0 && pid > 0) { | |||
addText("测试通过"); | |||
mCurStep = STEP_UNIT; | |||
nextStep(); | |||
} else { | |||
addText("测试不通过,CID VID PID不能小于等于0"); | |||
mCurStep = STEP_END_FAIL; | |||
nextStep(); | |||
} | |||
} else { | |||
stepError(); | |||
} | |||
} | |||
// 进行下一步 | |||
private void nextStep() { | |||
if (this.isDestroyed()) { | |||
return; | |||
} | |||
String stepStr = "第" + mCurStep + "步:"; | |||
switch (mCurStep) { | |||
case STEP_CID: | |||
// 查询CID VID PID | |||
addText(stepStr + "查询设备CID VID PID"); | |||
mBleDevice.getCidVidPid(); | |||
break; | |||
case STEP_UNIT: | |||
// 查询设备支持单位 | |||
addText(stepStr + "查询设备支持的单位"); | |||
mBleDevice.getSupportUnit(); | |||
break; | |||
case STEP_DEVICE_STATUS: | |||
// 获取设备状态 | |||
addText(stepStr + "APP下发查询状态指令,MCU接收到指令需要回复设备当前状态"); | |||
mBleDevice.queryStatus(); | |||
break; | |||
case STEP_TEST_STATUS_1: | |||
// 测量状态1 | |||
addText(stepStr + "请发送插入试纸"); | |||
break; | |||
case STEP_TEST_STATUS_2: | |||
// 测量状态2 | |||
addText(stepStr + "请发送获取血样"); | |||
break; | |||
case STEP_TEST_STATUS_3: | |||
// 测量状态3 | |||
addText(stepStr + "请发送分析血样中"); | |||
break; | |||
case STEP_TEST_DATA: | |||
// 测量数据 | |||
addText(stepStr + "请发送测量数据"); | |||
break; | |||
case STEP_TEST_STATUS_4: | |||
// 测量状态4 | |||
addText(stepStr + "请发送测量完成"); | |||
break; | |||
case STEP_SET_UNIT: | |||
// APP设置单位 | |||
if (mSupportUnit.size() > mCurTestUnit) { | |||
// 还有单位没测,进行测试 | |||
addText(stepStr + "APP下发单位:" + mSupportUnit.get(mCurTestUnit)); | |||
mCurTestUnit++; | |||
mCurStep = STEP_SET_UNIT_SUCCESS; | |||
nextStep(); | |||
} else { | |||
// 单位都测试完了 | |||
addText("单位设置测试完成"); | |||
mCurStep = STEP_ERROR_CODE_1; | |||
nextStep(); | |||
} | |||
break; | |||
case STEP_SET_UNIT_SUCCESS: | |||
// 单位设置成功 | |||
// addText(stepStr + "请回复单位设置成功"); | |||
addText(stepStr + "请回复单位设置结果"); | |||
break; | |||
case STEP_SET_UNIT_FAIL: | |||
// 单位设置失败 | |||
// addText(stepStr + "请回复单位设置失败"); | |||
addText(stepStr + "请回复单位设置结果"); | |||
break; | |||
case STEP_SET_UNIT_UNSUPPORT: | |||
// 单位设置不支持 | |||
// addText(stepStr + "请回复单位设置不支持"); | |||
addText(stepStr + "请回复单位设置结果"); | |||
break; | |||
case STEP_ERROR_CODE_1: | |||
// 错误码 电池没电 | |||
// addText(stepStr + "请发送错误码:电池没电"); | |||
addText(stepStr + "目前血糖仪支持的错误码有:\n" + | |||
"0x01:电池没电\n" + | |||
"0x02:已使用过的试纸\n" + | |||
"0x03:环境温度超出使用范围\n" + | |||
"0x04:试纸施加血样后测试未完成,被退出试纸\n" + | |||
"0x05:机器自检未通过\n" + | |||
"0x06:测量结果过低,超出测量范围\n" + | |||
"0x07:测量结果过高,超出测量范围\n\n" + | |||
"请设备发送支持的其中一种错误码"); | |||
break; | |||
case STEP_ERROR_CODE_2: | |||
// 错误码 已使用过的试纸 | |||
addText(stepStr + "请发送错误码:已使用过的试纸"); | |||
break; | |||
case STEP_ERROR_CODE_3: | |||
// 错误码 环境温度超出使用范围 | |||
addText(stepStr + "请发送错误码:环境温度超出使用范围"); | |||
break; | |||
case STEP_ERROR_CODE_4: | |||
// 错误码 试纸施加血样后测试未完成, 被退出试纸 | |||
addText(stepStr + "请发送错误码:试纸施加血样后测试未完成, 被退出试纸"); | |||
break; | |||
case STEP_ERROR_CODE_5: | |||
// 错误码 机器自检未通过 | |||
addText(stepStr + "请发送错误码:机器自检未通过"); | |||
break; | |||
case STEP_ERROR_CODE_6: | |||
// 错误码 测量结果过低, 超出测量范围 | |||
addText(stepStr + "测量结果过低, 超出测量范围"); | |||
break; | |||
case STEP_ERROR_CODE_7: | |||
// 错误码 测量结果过高, 超出测量范围 | |||
addText(stepStr + "测量结果过高, 超出测量范围"); | |||
break; | |||
case STEP_END_FAIL: | |||
// 测试结束 | |||
addText("❌ 测试结束:失败"); | |||
addText("❌ 请退出当前页面,重新进行流程测试"); | |||
setTitle("❌ 测试结束:失败"); | |||
break; | |||
case STEP_END_SUCCESS: | |||
// 测试结束 | |||
addText("✔ 测试结束:成功"); | |||
setTitle("✔ 测试结束:成功"); | |||
break; | |||
} | |||
} | |||
// 显示流程错误 | |||
private void stepError() { | |||
addText("❌ 第" + mCurStep + "步:" + "请严格按照流程进行测试!"); | |||
} | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
mList.add(text); | |||
mAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
// 弹出Toast | |||
private void showToast(String text) { | |||
Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); | |||
} | |||
} |
@@ -0,0 +1,447 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height; | |||
import android.Manifest; | |||
import android.app.Activity; | |||
import android.bluetooth.BluetoothAdapter; | |||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.content.pm.PackageManager; | |||
import android.location.LocationManager; | |||
import android.os.Bundle; | |||
import android.provider.Settings; | |||
import android.text.TextUtils; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.ListView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import com.pinwang.ailinkble.AiLinkPwdUtil; | |||
import java.math.BigDecimal; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import androidx.core.app.ActivityCompat; | |||
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig; | |||
/** | |||
* 广播身高仪 | |||
*/ | |||
public class BroadcastHeightActivity extends BleBaseActivity implements OnCallbackDis, OnScanFilterListener { | |||
private Context mContext; | |||
private ListView list_view; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_broadcast_height); | |||
mContext = this; | |||
list_view = findViewById(R.id.list_view); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
// 绑定服务成功,检查权限 | |||
checkPermission(); | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public boolean onFilter(BleValueBean bleValueBean) { | |||
return true; | |||
} | |||
/** | |||
* 请求权限的Code | |||
*/ | |||
public static final int REQUEST_PERMISSION_CODE = 1500; | |||
@Override | |||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |||
super.onActivityResult(requestCode, resultCode, data); | |||
if (requestCode == REQUEST_PERMISSION_CODE) { | |||
checkPermission(); | |||
} | |||
} | |||
@Override | |||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
if (requestCode == REQUEST_PERMISSION_CODE) { | |||
checkPermission(); | |||
} | |||
} | |||
@Override | |||
public void onScanRecord(BleValueBean bleValueBean) { | |||
if (TextUtils.isEmpty(mMac) && bleValueBean.isBroadcastModule()) { | |||
// 是广播模块 | |||
if (bleValueBean.getCid() == 0x03) { | |||
// 是身高仪,进行数据解析 | |||
notifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid(), bleValueBean.getMac()); | |||
} | |||
} | |||
} | |||
/** | |||
* @param manufacturerData 自定义厂商数据0xFF后面的数据 | |||
* @param cid cid 设备类型 | |||
* @param vid vid | |||
* @param pid pid | |||
*/ | |||
private void notifyData(byte[] manufacturerData, int cid, int vid, int pid, String mac) { | |||
if (manufacturerData == null) { | |||
addText("接收到的数据:null"); | |||
return; | |||
} | |||
if (manufacturerData.length >= 20) { | |||
byte sum = manufacturerData[9]; | |||
byte[] data = new byte[10]; | |||
System.arraycopy(manufacturerData, 10, data, 0, data.length); | |||
byte newSum = cmdSum(data); | |||
if (newSum == sum) { | |||
// addText("接收到的数据:原始数据:" + BleStrUtils.byte2HexStr(data)); | |||
byte[] bytes; | |||
byte[] dataOriginal = data.clone(); | |||
if (cid != 0 || vid != 0 || pid != 0) { | |||
//数据需要解密 | |||
if (cid == BroadcastScaleBleConfig.BROADCAST_SCALE_LING_YANG_CID) { | |||
bytes = AiLinkPwdUtil.decryptLingYang(data); | |||
} else { | |||
bytes = AiLinkPwdUtil.decryptBroadcast(cid, vid, pid, data); | |||
} | |||
} else { | |||
bytes = data; | |||
} | |||
// addText("接收到的数据:" + BleStrUtils.byte2HexStr(bytes)); | |||
checkData(bytes, cid, vid, pid, mac); | |||
} else { | |||
addText("校验和错误"); | |||
} | |||
} | |||
} | |||
// 上一次的流水号 | |||
private int mLastSerialNum = -1; | |||
/** | |||
* 解析数据 | |||
* | |||
* @param hex 解密后的数据 | |||
* @param cid cid | |||
* @param vid vid | |||
* @param pid pid | |||
*/ | |||
private void checkData(byte[] hex, int cid, int vid, int pid, String mac) { | |||
// 流水号 | |||
int serialNum = hex[0]; | |||
if (serialNum == mLastSerialNum) { | |||
return; | |||
} | |||
mLastSerialNum = serialNum; | |||
// 测量标识 | |||
int flag = hex[1] & 0xff; | |||
// 身高原始数据 | |||
int heightOrigin = (hex[2] & 0xff) << 8 | (hex[3] & 0xff); | |||
// 身高单位 0:cm;1:inch;2:ft-in | |||
int heightUnit = (hex[4] & 0xff) & 0x0f; | |||
// 身高小数点 | |||
int heightDecimal = ((hex[4] & 0xff) & 0xf0) >> 4; | |||
// 体重原始数据 | |||
int weightOrigin = (hex[5] & 0xff) << 8 | (hex[6] & 0xff); | |||
// 体重单位 0:kg;1:斤;2:lb:oz;3:oz;4:st:lb;5:g;6:lb | |||
int weightUnit = (hex[7] & 0xff) & 0x0f; | |||
// 体重正负号 | |||
int weightSymbol = ((hex[7] & 0xff) & 0x10) >> 4; | |||
// 体重小数点 | |||
int weightDecimal = ((hex[7] & 0xff) & 0xe0) >> 5; | |||
// 电量 | |||
int battery = hex[8] & 0xff; | |||
// 输出 | |||
String text = ""; | |||
text += "MAC地址:" + mac; | |||
text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex); | |||
text += "\n测量标识:" + flag + ":" + getFlagStr(flag); | |||
text += "\n身高原始数据:" + heightOrigin; | |||
text += "\n身高单位:" + heightUnit; | |||
text += "\n身高小数点:" + heightDecimal; | |||
text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal); | |||
if (weightOrigin != 0xffff) { | |||
text += "\n体重原始数据:" + weightOrigin; | |||
text += "\n体重单位:" + weightUnit; | |||
text += "\n体重正负号:" + weightSymbol; | |||
text += "\n体重小数点:" + weightDecimal; | |||
text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol); | |||
} else { | |||
text += "\n体重:" + "不支持"; | |||
} | |||
if (battery != 0xff) { | |||
text += "\n电量:" + battery; | |||
} else { | |||
text += "\n电量:" + "不支持"; | |||
} | |||
addText(text); | |||
} | |||
private String getFlagStr(int flag) { | |||
String str = ""; | |||
switch (flag) { | |||
case 0: | |||
str = "正在测量"; | |||
break; | |||
case 1: | |||
str = "稳定身高体重"; | |||
break; | |||
case 0xff: | |||
str = "测量失败"; | |||
break; | |||
} | |||
return str; | |||
} | |||
private String getHeightStr(int heightOrigin, int heightUnit, int heightDecimal) { | |||
String str = ""; | |||
str += getPreFloatStr((float) (heightOrigin * 1.0f / Math.pow(10, heightDecimal)), heightDecimal, 0); | |||
switch (heightUnit) { | |||
case 0: | |||
str += "cm"; | |||
break; | |||
case 1: | |||
str += "inch"; | |||
break; | |||
case 2: | |||
try { | |||
int ft = Integer.parseInt(str); | |||
int f = ft / 12; | |||
int i = ft - f * 12; | |||
str = f + "'" + i + "\""; | |||
} catch (Exception e) { | |||
str = "解析异常,原始值不是int型"; | |||
} | |||
break; | |||
} | |||
return str; | |||
} | |||
private String getWeightStr(int weightOrigin, int weightUnit, int weightDecimal, int weightSymbol) { | |||
String str = ""; | |||
str += getPreFloatStr((float) (weightOrigin * 1.0f / Math.pow(10, weightDecimal)) * (weightSymbol == 1 ? -1 : 1), weightDecimal, 0); | |||
switch (weightUnit) { | |||
case 0: | |||
str += "kg"; | |||
break; | |||
case 1: | |||
str += "斤"; | |||
break; | |||
case 2: | |||
str += "lb:oz"; | |||
break; | |||
case 3: | |||
str += "oz"; | |||
break; | |||
case 4: | |||
str += "st:lb"; | |||
break; | |||
case 5: | |||
str += "g"; | |||
break; | |||
case 6: | |||
str += "lb"; | |||
break; | |||
} | |||
return str; | |||
} | |||
/** | |||
* 四舍五入保留一位小数 | |||
* | |||
* @param f 原来小数 | |||
* @return 保留后的小数 | |||
*/ | |||
public static float getPreFloat(float f) { | |||
return getPreFloat(f, 1, 0); | |||
} | |||
/** | |||
* 保留小数 | |||
* | |||
* @param f 原始小数 | |||
* @param bit 保留多少位 | |||
* @param type 0 四舍五入,1 去尾,2 银行家, 3 进一 | |||
* @return 保留后的小数 | |||
*/ | |||
public static float getPreFloat(float f, int bit, int type) { | |||
return Float.parseFloat(getPreFloatStr(f, bit, type)); | |||
} | |||
/** | |||
* 保留小数,获取字符串 | |||
* | |||
* @param f 原始小数 | |||
* @param bit 保留多少位 | |||
* @param type 0 四舍五入,1 去尾,2 银行家, 3 进一 | |||
* @return 保留后的小数 | |||
*/ | |||
public static String getPreFloatStr(float f, int bit, int type) { | |||
BigDecimal dc = new BigDecimal(f); | |||
switch (type) { | |||
default: | |||
case 0: | |||
// 四舍五入 | |||
return dc.setScale(bit, BigDecimal.ROUND_HALF_UP).toString(); | |||
case 1: | |||
// 去尾 | |||
return dc.setScale(bit, BigDecimal.ROUND_DOWN).toString(); | |||
case 2: | |||
// 银行家 | |||
return dc.setScale(bit, BigDecimal.ROUND_HALF_EVEN).toString(); | |||
case 3: | |||
// 进一 | |||
return dc.setScale(bit, BigDecimal.ROUND_UP).toString(); | |||
} | |||
} | |||
/** | |||
* 校验累加,从1开始加 | |||
*/ | |||
private static byte cmdSum(byte[] data) { | |||
byte sum = 0; | |||
for (byte datum : data) { | |||
sum += datum; | |||
} | |||
return sum; | |||
} | |||
/** | |||
* 检查权限,并开始扫描 | |||
*/ | |||
private void checkPermission() { | |||
// 没有打开蓝牙就请求打开蓝牙 | |||
if (!hasBluetooth()) { | |||
requestBluetooth(); | |||
return; | |||
} | |||
// 没有定位权限就请求定位权限 | |||
if (!hasLocationPermission()) { | |||
requestLocationPermission(this); | |||
return; | |||
} | |||
// 没有定位服务就请求定位服务 | |||
if (!hasLocationService()) { | |||
requestLocationService(); | |||
return; | |||
} | |||
// 权限都有了,OK | |||
addText("权限都有,开始接收广播数据"); | |||
if (mBluetoothService != null) { | |||
mBluetoothService.setOnScanFilterListener(this); | |||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
} | |||
} | |||
/** | |||
* 是否有定位权限 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasLocationPermission() { | |||
return ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; | |||
} | |||
/** | |||
* 蓝牙是否打开 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasBluetooth() { | |||
return BluetoothAdapter.getDefaultAdapter().isEnabled(); | |||
} | |||
/** | |||
* 定位服务是否打开 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasLocationService() { | |||
LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); | |||
if (locationManager == null) { | |||
return false; | |||
} | |||
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); | |||
} | |||
/** | |||
* 申请定位权限 | |||
*/ | |||
private void requestLocationPermission(Activity activity) { | |||
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_CODE); | |||
} | |||
/** | |||
* 申请打开蓝牙 | |||
*/ | |||
private void requestBluetooth() { | |||
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); | |||
startActivityForResult(intent, REQUEST_PERMISSION_CODE); | |||
} | |||
/** | |||
* 申请打开定位服务 | |||
*/ | |||
private void requestLocationService() { | |||
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||
startActivityForResult(intent, REQUEST_PERMISSION_CODE); | |||
} | |||
private SimpleDateFormat sdf; | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
if (sdf == null) { | |||
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
} | |||
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
} |
@@ -0,0 +1,633 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale; | |||
import android.os.Bundle; | |||
import android.text.TextUtils; | |||
import android.util.Log; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.CoffeeScale.CoffeeScaleData; | |||
/** | |||
* 咖啡秤 | |||
*/ | |||
public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback { | |||
private static final String TAG = "Tag1"; | |||
private Button btn_clear; | |||
private Button btn_zero; | |||
private Button btn_set_weight_unit; | |||
private Button btn_set_temp_unit; | |||
private Button btn_set_auto_shutdown; | |||
private Button btn_set_timing; | |||
private Button btn_callback_timing; | |||
private Button btn_set_alert; | |||
private Button btn_stop_alert; | |||
private Button btn_callback_alert; | |||
private Button btn_callback_stop_alert; | |||
private Button btn_brew_mode; | |||
private RadioButton rb_kg; | |||
private RadioButton rb_jin; | |||
private RadioButton rb_lb_oz; | |||
private RadioButton rb_oz; | |||
private RadioButton rb_st_lb; | |||
private RadioButton rb_g; | |||
private RadioButton rb_lb; | |||
private RadioButton rb_c; | |||
private RadioButton rb_f; | |||
private RadioButton rb_positive_timing; | |||
private RadioButton rb_negative_timing; | |||
private RadioButton rb_timing_start; | |||
private RadioButton rb_timing_pause; | |||
private RadioButton rb_timing_reset; | |||
private RadioButton rb_callback_timing_success; | |||
private RadioButton rb_callback_timing_fail; | |||
private RadioButton rb_callback_timing_not_support; | |||
private RadioButton rb_alert_close; | |||
private RadioButton rb_alert_open; | |||
private RadioButton rb_callback_alert_success; | |||
private RadioButton rb_callback_alert_fail; | |||
private RadioButton rb_callback_alert_not_support; | |||
private RadioButton rb_callback_stop_alert_success; | |||
private RadioButton rb_callback_stop_alert_fail; | |||
private RadioButton rb_callback_stop_alert_not_support; | |||
private RadioButton rb_brew_mode_enter; | |||
private RadioButton rb_brew_mode_exit; | |||
private EditText et_auto_shutdown; | |||
private EditText et_timing; | |||
private EditText et_alert; | |||
private ListView list_view; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private CoffeeScaleData mCoffeeScaleData; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_coffee_scale); | |||
btn_clear = findViewById(R.id.btn_clear); | |||
btn_zero = findViewById(R.id.btn_zero); | |||
btn_set_weight_unit = findViewById(R.id.btn_set_weight_unit); | |||
btn_set_temp_unit = findViewById(R.id.btn_set_temp_unit); | |||
btn_set_auto_shutdown = findViewById(R.id.btn_set_auto_shutdown); | |||
btn_set_timing = findViewById(R.id.btn_set_timing); | |||
btn_callback_timing = findViewById(R.id.btn_callback_timing); | |||
btn_set_alert = findViewById(R.id.btn_set_alert); | |||
btn_stop_alert = findViewById(R.id.btn_stop_alert); | |||
btn_callback_alert = findViewById(R.id.btn_callback_alert); | |||
btn_callback_stop_alert = findViewById(R.id.btn_callback_stop_alert); | |||
btn_brew_mode = findViewById(R.id.btn_brew_mode); | |||
rb_kg = findViewById(R.id.rb_kg); | |||
rb_jin = findViewById(R.id.rb_jin); | |||
rb_lb_oz = findViewById(R.id.rb_lb_oz); | |||
rb_oz = findViewById(R.id.rb_oz); | |||
rb_st_lb = findViewById(R.id.rb_st_lb); | |||
rb_g = findViewById(R.id.rb_g); | |||
rb_lb = findViewById(R.id.rb_lb); | |||
rb_c = findViewById(R.id.rb_c); | |||
rb_f = findViewById(R.id.rb_f); | |||
rb_positive_timing = findViewById(R.id.rb_positive_timing); | |||
rb_negative_timing = findViewById(R.id.rb_negative_timing); | |||
rb_timing_start = findViewById(R.id.rb_timing_start); | |||
rb_timing_pause = findViewById(R.id.rb_timing_pause); | |||
rb_timing_reset = findViewById(R.id.rb_timing_reset); | |||
rb_callback_timing_success = findViewById(R.id.rb_callback_timing_success); | |||
rb_callback_timing_fail = findViewById(R.id.rb_callback_timing_fail); | |||
rb_callback_timing_not_support = findViewById(R.id.rb_callback_timing_not_support); | |||
rb_alert_close = findViewById(R.id.rb_alert_close); | |||
rb_alert_open = findViewById(R.id.rb_alert_open); | |||
rb_callback_alert_success = findViewById(R.id.rb_callback_alert_success); | |||
rb_callback_alert_fail = findViewById(R.id.rb_callback_alert_fail); | |||
rb_callback_alert_not_support = findViewById(R.id.rb_callback_alert_not_support); | |||
rb_callback_stop_alert_success = findViewById(R.id.rb_callback_stop_alert_success); | |||
rb_callback_stop_alert_fail = findViewById(R.id.rb_callback_stop_alert_fail); | |||
rb_callback_stop_alert_not_support = findViewById(R.id.rb_callback_stop_alert_not_support); | |||
rb_brew_mode_enter = findViewById(R.id.rb_brew_mode_enter); | |||
rb_brew_mode_exit = findViewById(R.id.rb_brew_mode_exit); | |||
et_auto_shutdown = findViewById(R.id.et_auto_shutdown); | |||
et_timing = findViewById(R.id.et_timing); | |||
et_alert = findViewById(R.id.et_alert); | |||
list_view = findViewById(R.id.list_view); | |||
btn_clear.setOnClickListener(this); | |||
btn_zero.setOnClickListener(this); | |||
btn_set_weight_unit.setOnClickListener(this); | |||
btn_set_temp_unit.setOnClickListener(this); | |||
btn_set_auto_shutdown.setOnClickListener(this); | |||
btn_set_timing.setOnClickListener(this); | |||
btn_callback_timing.setOnClickListener(this); | |||
btn_set_alert.setOnClickListener(this); | |||
btn_stop_alert.setOnClickListener(this); | |||
btn_callback_alert.setOnClickListener(this); | |||
btn_callback_stop_alert.setOnClickListener(this); | |||
btn_brew_mode.setOnClickListener(this); | |||
// 获取Mac | |||
mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn_clear: | |||
// 清空文本框 | |||
clearText(); | |||
break; | |||
case R.id.btn_zero: | |||
// APP下发去皮功能(归零功能) | |||
appSetZero(); | |||
break; | |||
case R.id.btn_set_weight_unit: | |||
// APP下发重量单位 | |||
appSetWeightUnit(); | |||
break; | |||
case R.id.btn_set_temp_unit: | |||
// APP下发温度单位 | |||
appSetTempUnit(); | |||
break; | |||
case R.id.btn_set_auto_shutdown: | |||
// APP下发自动关机 | |||
appSetAutoShutdown(); | |||
break; | |||
case R.id.btn_set_timing: | |||
// APP下发计时功能控制 | |||
appSetTiming(); | |||
break; | |||
case R.id.btn_callback_timing: | |||
// APP回复计时功能 | |||
appCallbackTiming(); | |||
break; | |||
case R.id.btn_set_alert: | |||
// APP下发报警设置 | |||
appSetAlert(); | |||
break; | |||
case R.id.btn_stop_alert: | |||
// APP停止报警指令 | |||
appStopAlert(); | |||
break; | |||
case R.id.btn_callback_alert: | |||
// APP回复报警设置 | |||
appCallbackAlert(); | |||
break; | |||
case R.id.btn_callback_stop_alert: | |||
// APP回复停止报警 | |||
appCallbackStopAlert(); | |||
break; | |||
case R.id.btn_brew_mode: | |||
// APP设置冲煮模式 | |||
appBrewMode(); | |||
break; | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mCoffeeScaleData = new CoffeeScaleData(mBleDevice); | |||
mCoffeeScaleData.setCoffeeScaleCallback(this); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void mcuResult(int weightType, int weightUnit, int weightDecimal, int weightSource, float weight, int tempUnit, int tempDecimal, int tempSource, float temp, int err) { | |||
Log.i(TAG, "onResult"); | |||
String text = "MCU上发重量:" + (weightType == 1 ? "稳定重量" : "实时重量"); | |||
text += ";重量小数点:" + weightDecimal; | |||
text += ";重量原始值:" + weightSource; | |||
text += ";重量:" + (weightDecimal > 0 ? weight : (int) weight) + getWeightUnitStr(weightUnit); | |||
if (tempUnit != 0xff) { | |||
text += ";温度小数点:" + tempDecimal; | |||
text += ";温度原始值:" + tempSource; | |||
text += ";温度:" + (tempDecimal > 0 ? temp : (int) temp) + getTempUnitStr(tempUnit); | |||
} else { | |||
text += ";温度:不支持"; | |||
} | |||
if (err != 0xff) { | |||
text += ";异常:" + getErrStr(err); | |||
} else { | |||
text += ";异常:不支持"; | |||
} | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuPower(int status, int power) { | |||
Log.i(TAG, "onPower:" + status + "," + power); | |||
String text = "MCU上发充电状态:" + getPowerStatusStr(status); | |||
text += ";电量:" + power + "%"; | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuTiming(int seconds, int type, int op) { | |||
Log.i(TAG, "onTiming:" + seconds + ",type:" + type + ",op:" + op); | |||
String text = "MCU上发计时:" + seconds + "秒"; | |||
text += ";" + getTimingStr(type) + ";" + getTimingOpStr(op); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuAlert(int seconds, int op) { | |||
Log.i(TAG, "onAlert:" + seconds + "," + op); | |||
String text = "MCU上发报警:" + seconds + "秒;" + getAlertOpStr(op); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuStopAlert() { | |||
Log.i(TAG, "onStopAlert"); | |||
String text = "MCU停止报警"; | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackSetZero(int status) { | |||
Log.i(TAG, "onSetZero:" + status); | |||
String text = "MCU回复去皮(归零):" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackSetWeightUnit(int status) { | |||
Log.i(TAG, "onSetWeightUnit:" + status); | |||
String text = "MCU回复设置重量单位:" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackSetTempUnit(int status) { | |||
Log.i(TAG, "onSetTempUnit:" + status); | |||
String text = "MCU回复设置温度单位:" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackSetAutoShutdown(int status) { | |||
Log.i(TAG, "onSetAutoShutdown:" + status); | |||
String text = "MCU回复设置自动关机:" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackSetTiming(int status) { | |||
Log.i(TAG, "onSetTiming:" + status); | |||
String text = "MCU回复设置计时功能:" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackSetAlert(int status) { | |||
Log.i(TAG, "onSetAlert:" + status); | |||
String text = "MCU回复设置警报功能:" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuCallbackStopAlert(int status) { | |||
Log.i(TAG, "onStopAlert:" + status); | |||
String text = "MCU回复停止警报功能:" + getStatusStr(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuBrewMode(int status) { | |||
Log.i(TAG, "onBrewMode:" + status); | |||
String text = "MCU冲煮模式:" + getBrewMode(status); | |||
addText(text); | |||
} | |||
@Override | |||
public void mcuSupportUnit(List<SupportUnitBean> list) { | |||
} | |||
// APP下发去皮功能(归零功能) | |||
private void appSetZero() { | |||
Log.i(TAG, "去皮功能(归零功能)"); | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发归零"); | |||
mCoffeeScaleData.setZero(); | |||
} | |||
} | |||
// APP设置重量单位 | |||
private void appSetWeightUnit() { | |||
Log.i(TAG, "设置重量单位"); | |||
int weightUnit = rb_kg.isChecked() ? 0 : rb_jin.isChecked() ? 1 : rb_lb_oz.isChecked() ? 2 : rb_oz.isChecked() ? 3 : rb_st_lb.isChecked() ? 4 : rb_g.isChecked() ? 5 : rb_lb.isChecked() ? 6 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发重量单位:" + weightUnit + ";" + getWeightUnitStr(weightUnit)); | |||
mCoffeeScaleData.setWeightUnit(weightUnit); | |||
} | |||
} | |||
// APP设置温度单位 | |||
private void appSetTempUnit() { | |||
Log.i(TAG, "设置温度单位"); | |||
int tempUnit = rb_c.isChecked() ? 0 : rb_f.isChecked() ? 1 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发温度单位:" + tempUnit + ";" + getTempUnitStr(tempUnit)); | |||
mCoffeeScaleData.setTempUnit(tempUnit); | |||
} | |||
} | |||
// APP设置自动关机 | |||
private void appSetAutoShutdown() { | |||
Log.i(TAG, "设置自动关机"); | |||
String str = et_auto_shutdown.getText().toString(); | |||
if (!TextUtils.isEmpty(str)) { | |||
int num = -1; | |||
try { | |||
num = Integer.parseInt(str); | |||
} catch (Exception e) { | |||
addText("APP下发自动关机:必须为整数"); | |||
} | |||
if (num >= 0xffff) { | |||
addText("APP下发自动关机:不能≥65535"); | |||
} else if (num < 0) { | |||
addText("APP下发自动关机:必须为正整数"); | |||
} else { | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发自动关机:" + num + "秒"); | |||
mCoffeeScaleData.setAutoShutdown(num); | |||
} | |||
} | |||
} else { | |||
addText("APP下发自动关机:不能为空"); | |||
} | |||
} | |||
// APP计时功能控制 | |||
private void appSetTiming() { | |||
Log.i(TAG, "计时功能控制"); | |||
String str = et_timing.getText().toString(); | |||
if (!TextUtils.isEmpty(str)) { | |||
int num = -1; | |||
try { | |||
num = Integer.parseInt(str); | |||
} catch (Exception e) { | |||
addText("APP下发计时功能:必须为整数"); | |||
} | |||
if (num >= 0xffff) { | |||
addText("APP下发计时功能:不能≥65535"); | |||
} else if (num < 0) { | |||
addText("APP下发计时功能:必须为正整数"); | |||
} else { | |||
int type = rb_positive_timing.isChecked() ? 0 : rb_negative_timing.isChecked() ? 1 : 0; | |||
int op = rb_timing_start.isChecked() ? 1 : rb_timing_pause.isChecked() ? 2 : rb_timing_reset.isChecked() ? 3 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发计时功能:" + num + "秒;" + getTimingStr(type) + ";" + getTimingOpStr(op)); | |||
mCoffeeScaleData.setTiming(num, type, op); | |||
} | |||
} | |||
} else { | |||
addText("APP下发计时功能:不能为空"); | |||
} | |||
} | |||
// APP回复计时功能 | |||
private void appCallbackTiming() { | |||
Log.i(TAG, "回复计时功能"); | |||
int status = rb_callback_timing_success.isChecked() ? 0 : rb_callback_timing_fail.isChecked() ? 1 : rb_callback_timing_not_support.isChecked() ? 2 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP回复计时功能:" + status + ";" + getStatusStr(status)); | |||
mCoffeeScaleData.callbackTiming(status); | |||
} | |||
} | |||
// APP报警设置指令 | |||
private void appSetAlert() { | |||
Log.i(TAG, "报警设置指令"); | |||
String str = et_alert.getText().toString(); | |||
if (!TextUtils.isEmpty(str)) { | |||
int num = -1; | |||
try { | |||
num = Integer.parseInt(str); | |||
} catch (Exception e) { | |||
addText("APP下发报警设置:必须为整数"); | |||
} | |||
if (num >= 0xffff) { | |||
addText("APP下发报警设置:不能≥65535"); | |||
} else if (num < 0) { | |||
addText("APP下发报警设置:必须为正整数"); | |||
} else { | |||
int op = rb_alert_close.isChecked() ? 0 : rb_alert_open.isChecked() ? 1 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发报警设置:" + num + "秒;" + getAlertOpStr(op)); | |||
mCoffeeScaleData.setAlert(num, op); | |||
} | |||
} | |||
} else { | |||
addText("APP下发报警设置:不能为空"); | |||
} | |||
} | |||
// APP停止报警指令 | |||
private void appStopAlert() { | |||
Log.i(TAG, "停止报警指令"); | |||
if (mCoffeeScaleData != null) { | |||
addText("APP下发停止报警"); | |||
mCoffeeScaleData.stopAlert(); | |||
} | |||
} | |||
// APP回复报警设置 | |||
private void appCallbackAlert() { | |||
Log.i(TAG, "回复报警设置"); | |||
int status = rb_callback_alert_success.isChecked() ? 0 : rb_callback_alert_fail.isChecked() ? 1 : rb_callback_alert_not_support.isChecked() ? 2 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP回复报警设置:" + status + ";" + getStatusStr(status)); | |||
mCoffeeScaleData.callbackAlert(status); | |||
} | |||
} | |||
// APP回复停止报警 | |||
private void appCallbackStopAlert() { | |||
Log.i(TAG, "回复停止报警"); | |||
int status = rb_callback_stop_alert_success.isChecked() ? 0 : rb_callback_stop_alert_fail.isChecked() ? 1 : rb_callback_stop_alert_not_support.isChecked() ? 2 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP回复停止报警:" + status + ";" + getStatusStr(status)); | |||
mCoffeeScaleData.callbackStopAlert(status); | |||
} | |||
} | |||
// APP设置冲煮模式 | |||
private void appBrewMode() { | |||
Log.i(TAG, "设置冲煮模式"); | |||
int status = rb_brew_mode_enter.isChecked() ? 1 : 0; | |||
if (mCoffeeScaleData != null) { | |||
addText("APP设置冲煮模式:" + status + ";" + getBrewMode(status)); | |||
mCoffeeScaleData.brewMode(status); | |||
} | |||
} | |||
SimpleDateFormat sdf; | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
if (sdf == null) { | |||
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
} | |||
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
// 清空文本 | |||
private void clearText() { | |||
mList.clear(); | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
private String getWeightUnitStr(int weightUnit) { | |||
switch (weightUnit) { | |||
case 0: | |||
return "kg"; | |||
case 1: | |||
return "斤"; | |||
case 2: | |||
return "lb:oz"; | |||
case 3: | |||
return "oz"; | |||
case 4: | |||
return "st:lb"; | |||
case 5: | |||
return "g"; | |||
case 6: | |||
return "lb"; | |||
} | |||
return ""; | |||
} | |||
private String getTempUnitStr(int tempUnit) { | |||
switch (tempUnit) { | |||
case 0: | |||
return "℃"; | |||
case 1: | |||
return "℉"; | |||
} | |||
return ""; | |||
} | |||
private String getErrStr(int err) { | |||
switch (err) { | |||
case 0: | |||
return "无异常"; | |||
case 1: | |||
return "超重"; | |||
} | |||
return ""; | |||
} | |||
private String getStatusStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "成功"; | |||
case 1: | |||
return "失败"; | |||
case 2: | |||
return "不支持"; | |||
} | |||
return ""; | |||
} | |||
private String getPowerStatusStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "没有充电"; | |||
case 1: | |||
return "充电中"; | |||
case 2: | |||
return "充满电"; | |||
case 3: | |||
return "充电异常"; | |||
} | |||
return ""; | |||
} | |||
private String getTimingStr(int type) { | |||
switch (type) { | |||
case 0: | |||
return "正计时"; | |||
case 1: | |||
return "倒计时"; | |||
} | |||
return ""; | |||
} | |||
private String getTimingOpStr(int op) { | |||
switch (op) { | |||
case 1: | |||
return "计时"; | |||
case 2: | |||
return "暂停"; | |||
case 3: | |||
return "重置"; | |||
} | |||
return ""; | |||
} | |||
private String getAlertOpStr(int op) { | |||
switch (op) { | |||
case 0: | |||
return "关闭"; | |||
case 1: | |||
return "打开"; | |||
} | |||
return ""; | |||
} | |||
private String getBrewMode(int status) { | |||
switch (status) { | |||
case 0: | |||
return "退出"; | |||
case 1: | |||
return "进入"; | |||
} | |||
return ""; | |||
} | |||
} |
@@ -0,0 +1,361 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import android.widget.Spinner; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.Calendar; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.FoodTemp.FoodTempData; | |||
/** | |||
* 食品温度计界面 | |||
*/ | |||
public class FoodTempActivity extends BleBaseActivity implements View.OnClickListener, FoodTempData.FoodTempCallback { | |||
private static final String TAG = "Tag1"; | |||
private Button btn_clear; | |||
private Button btn_get_device; | |||
private Button btn_set_temp_unit; | |||
private RadioButton rb_set_c; | |||
private RadioButton rb_set_f; | |||
private Button btn_stop_alert; | |||
private Spinner sp_stop_alert; | |||
private Button btn_set_target; | |||
private Spinner sp_set_target; | |||
private EditText et_set_target; | |||
private RadioButton rb_set_target_c; | |||
private RadioButton rb_set_target_f; | |||
private Button btn_set_timing; | |||
private Spinner sp_set_timing; | |||
private EditText et_set_timing; | |||
private Button btn_open_close; | |||
private RadioButton rb_open; | |||
private RadioButton rb_close; | |||
private Button btn_sync_time; | |||
private EditText et_year; | |||
private EditText et_month; | |||
private EditText et_day; | |||
private EditText et_hour; | |||
private EditText et_minute; | |||
private EditText et_second; | |||
private EditText et_week; | |||
private Button btn_open_close_probe; | |||
private Spinner sp_open_close_probe; | |||
private RadioButton rb_open_probe; | |||
private RadioButton rb_close_probe; | |||
private ListView list_view; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private FoodTempData mFoodTempData; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_food_temp); | |||
btn_clear = findViewById(R.id.btn_clear); | |||
btn_get_device = findViewById(R.id.btn_get_device); | |||
btn_set_temp_unit = findViewById(R.id.btn_set_temp_unit); | |||
rb_set_c = findViewById(R.id.rb_set_c); | |||
rb_set_f = findViewById(R.id.rb_set_f); | |||
btn_stop_alert = findViewById(R.id.btn_stop_alert); | |||
sp_stop_alert = findViewById(R.id.sp_stop_alert); | |||
btn_set_target = findViewById(R.id.btn_set_target); | |||
sp_set_target = findViewById(R.id.sp_set_target); | |||
et_set_target = findViewById(R.id.et_set_target); | |||
rb_set_target_c = findViewById(R.id.rb_set_target_c); | |||
rb_set_target_f = findViewById(R.id.rb_set_target_f); | |||
btn_set_timing = findViewById(R.id.btn_set_timing); | |||
sp_set_timing = findViewById(R.id.sp_set_timing); | |||
et_set_timing = findViewById(R.id.et_set_timing); | |||
btn_open_close = findViewById(R.id.btn_open_close); | |||
rb_open = findViewById(R.id.rb_open); | |||
rb_close = findViewById(R.id.rb_close); | |||
btn_sync_time = findViewById(R.id.btn_sync_time); | |||
et_year = findViewById(R.id.et_year); | |||
et_month = findViewById(R.id.et_month); | |||
et_day = findViewById(R.id.et_day); | |||
et_hour = findViewById(R.id.et_hour); | |||
et_minute = findViewById(R.id.et_minute); | |||
et_second = findViewById(R.id.et_second); | |||
et_week = findViewById(R.id.et_week); | |||
btn_open_close_probe = findViewById(R.id.btn_open_close_probe); | |||
sp_open_close_probe = findViewById(R.id.sp_open_close_probe); | |||
rb_open_probe = findViewById(R.id.rb_open_probe); | |||
rb_close_probe = findViewById(R.id.rb_close_probe); | |||
list_view = findViewById(R.id.list_view); | |||
btn_clear.setOnClickListener(this); | |||
btn_get_device.setOnClickListener(this); | |||
btn_set_temp_unit.setOnClickListener(this); | |||
btn_stop_alert.setOnClickListener(this); | |||
btn_set_target.setOnClickListener(this); | |||
btn_set_timing.setOnClickListener(this); | |||
btn_open_close.setOnClickListener(this); | |||
btn_sync_time.setOnClickListener(this); | |||
btn_open_close_probe.setOnClickListener(this); | |||
// 获取Mac | |||
mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
// 默认时间 | |||
Calendar calendar = Calendar.getInstance(); | |||
calendar.setTimeInMillis(System.currentTimeMillis()); | |||
et_year.setText("" + calendar.get(Calendar.YEAR)); | |||
et_month.setText("" + (calendar.get(Calendar.MONTH) + 1)); | |||
et_day.setText("" + calendar.get(Calendar.DAY_OF_MONTH)); | |||
et_hour.setText("" + calendar.get(Calendar.HOUR_OF_DAY)); | |||
et_minute.setText("" + calendar.get(Calendar.MINUTE)); | |||
et_second.setText("" + calendar.get(Calendar.SECOND)); | |||
int week = (calendar.get(Calendar.DAY_OF_WEEK) - 1); | |||
if (week <= 0) { | |||
week = 7; | |||
} | |||
et_week.setText("" + week); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
int id = v.getId(); | |||
if (id == R.id.btn_clear) { | |||
clearText(); | |||
} else if (id == R.id.btn_get_device) { | |||
appGetDevice(); | |||
} else if (id == R.id.btn_set_temp_unit) { | |||
appSetTempUnit(); | |||
} else if (id == R.id.btn_stop_alert) { | |||
appStopAlert(); | |||
} else if (id == R.id.btn_set_target) { | |||
appSetTargetTemp(); | |||
} else if (id == R.id.btn_set_timing) { | |||
appSetTiming(); | |||
} else if (id == R.id.btn_open_close) { | |||
appOpenClose(); | |||
} else if (id == R.id.btn_sync_time) { | |||
appSyncTime(); | |||
} else if (id == R.id.btn_open_close_probe) { | |||
appOpenCloseProbe(); | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mFoodTempData = new FoodTempData(mBleDevice); | |||
mFoodTempData.setFoodTempCallback(this); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void mcuDevice(int probeNum, int chargerState, int battery, int tempUnit, int alertType) { | |||
addText("MCU上发设备信息:探针数量:" + probeNum + ",充电状态:" + chargerState + ",电量:" + battery + ",温度单位:" + tempUnit + ",警报类型:" + alertType); | |||
} | |||
@Override | |||
public void mcuResult(int id, int inDevice, int curTemp, int curTempUnit, int ambienceTemp, int ambienceTempUnit, int targetTemp, int targetTempUnit, int inMeat, int enableAlert, int mode, int timing, int alertType) { | |||
addText("MCU上发数据:探针编号:" + id + ",探针插入设备状态:" + inDevice + ",当前温度:" + curTemp + ",当前温度单位:" + curTempUnit + ",环境温度:" + ambienceTemp + ",环境温度单位:" + ambienceTempUnit + ",目标温度:" + targetTemp + ",目标温度单位:" + targetTempUnit + ",探针插入肉状态:" + inMeat + ",警报启动状态:" + enableAlert + ",模式:" + mode + ",定时:" + timing + ",警报类型:" + alertType); | |||
} | |||
@Override | |||
public void mcuSetTempUnitResult(int result) { | |||
addText("MCU回复设置温度单位结果:" + result); | |||
} | |||
@Override | |||
public void mcuStopAlertResult(int result) { | |||
addText("MCU回复停止警报结果:" + result); | |||
} | |||
@Override | |||
public void mcuSetTargetTempResult(int result) { | |||
addText("MCU回复设置目标温度结果:" + result); | |||
} | |||
@Override | |||
public void mcuSetTimingResult(int result) { | |||
addText("MCU回复设置定时结果:" + result); | |||
} | |||
@Override | |||
public void mcuOpenCloseResult(int result) { | |||
addText("MCU回复开关机结果:" + result); | |||
} | |||
@Override | |||
public void mcuSyncTimeResult(int result) { | |||
addText("MCU回复同步时间结果:" + result); | |||
} | |||
@Override | |||
public void mcuOpenCloseProbeResult(int result) { | |||
addText("MCU回复开关探针结果:" + result); | |||
} | |||
/** | |||
* APP获取设备信息 | |||
*/ | |||
private void appGetDevice() { | |||
mFoodTempData.appGetDevice(); | |||
addText("APP请求获取设备信息"); | |||
} | |||
/** | |||
* APP设置温度单位 | |||
*/ | |||
private void appSetTempUnit() { | |||
int unit = rb_set_c.isChecked() ? 0 : 1; | |||
mFoodTempData.appSetTempUnit(unit); | |||
addText("APP设置温度单位:" + unit); | |||
} | |||
/** | |||
* APP停止设备报警 | |||
*/ | |||
private void appStopAlert() { | |||
int id = sp_stop_alert.getSelectedItemPosition(); | |||
mFoodTempData.appStopAlert(id); | |||
addText("APP停止设备报警:" + id); | |||
} | |||
/** | |||
* APP设置目标温度 | |||
*/ | |||
private void appSetTargetTemp() { | |||
int id = sp_set_target.getSelectedItemPosition(); | |||
int temp = 0; | |||
int tempUnit = rb_set_target_c.isChecked() ? 0 : 1; | |||
try { | |||
temp = Integer.parseInt(et_set_target.getText().toString()); | |||
} catch (Exception ignored) { | |||
addText("目标温度必须是整数"); | |||
return; | |||
} | |||
mFoodTempData.appSetTargetTemp(id, temp, tempUnit); | |||
addText("APP设置目标温度:编号:" + id + ",温度:" + temp + ",温度单位:" + tempUnit); | |||
} | |||
/** | |||
* APP设置定时 | |||
*/ | |||
private void appSetTiming() { | |||
int id = sp_set_timing.getSelectedItemPosition(); | |||
int minute = 0; | |||
try { | |||
minute = Integer.parseInt(et_set_timing.getText().toString()); | |||
} catch (Exception ignored) { | |||
addText("定时必须是整数"); | |||
return; | |||
} | |||
mFoodTempData.appSetTiming(id, minute); | |||
addText("APP设置定时:编号:" + id + ",分钟:" + minute); | |||
} | |||
/** | |||
* APP开关设备 | |||
*/ | |||
private void appOpenClose() { | |||
boolean isOpen = rb_open.isChecked(); | |||
mFoodTempData.appOpenClose(isOpen); | |||
addText("APP开关设备:" + isOpen); | |||
} | |||
/** | |||
* APP同步时间 | |||
*/ | |||
private void appSyncTime() { | |||
int year = 0; | |||
int month = 0; | |||
int day = 0; | |||
int hour = 0; | |||
int minute = 0; | |||
int second = 0; | |||
int week = 0; | |||
try { | |||
year = Integer.parseInt(et_year.getText().toString()); | |||
month = Integer.parseInt(et_month.getText().toString()); | |||
day = Integer.parseInt(et_day.getText().toString()); | |||
hour = Integer.parseInt(et_hour.getText().toString()); | |||
minute = Integer.parseInt(et_minute.getText().toString()); | |||
second = Integer.parseInt(et_second.getText().toString()); | |||
week = Integer.parseInt(et_week.getText().toString()); | |||
} catch (Exception ignored) { | |||
addText("年月日时分秒必须是整数"); | |||
return; | |||
} | |||
mFoodTempData.appSyncTime(year, month, day, hour, minute, second, week); | |||
addText("APP同步时间:年:" + year + ",月:" + month + ",日:" + day + ",时:" + hour + ",分:" + minute + ",秒:" + second + ",一周第几天:" + week); | |||
} | |||
/** | |||
* APP开关探针 | |||
*/ | |||
private void appOpenCloseProbe() { | |||
int id = sp_open_close_probe.getSelectedItemPosition(); | |||
boolean isOpen = rb_open_probe.isChecked(); | |||
mFoodTempData.appOpenCloseProbe(id, isOpen); | |||
addText("APP开关探针:编号:" + id + "," + isOpen); | |||
} | |||
SimpleDateFormat sdf; | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
if (sdf == null) { | |||
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
} | |||
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
// 清空文本 | |||
private void clearText() { | |||
mList.clear(); | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
} |
@@ -0,0 +1,241 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import android.widget.SeekBar; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.ShareCharger.ShareChargerData; | |||
/** | |||
* 共享充电器 | |||
*/ | |||
public class ShareChargerActivity extends BleBaseActivity implements View.OnClickListener, ShareChargerData.ShareChargerCallback { | |||
private Button btn_set; | |||
private SeekBar seek_hour; | |||
private SeekBar seek_minute; | |||
private SeekBar seek_second; | |||
private TextView tv_hour; | |||
private TextView tv_minute; | |||
private TextView tv_second; | |||
private Button btn_get; | |||
private Button btn_switch; | |||
private RadioButton rb_open; | |||
private RadioButton rb_close; | |||
private ListView list_view; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private ShareChargerData mShareChargerData; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_share_charger); | |||
btn_set = findViewById(R.id.btn_set); | |||
seek_hour = findViewById(R.id.seek_hour); | |||
seek_minute = findViewById(R.id.seek_minute); | |||
seek_second = findViewById(R.id.seek_second); | |||
tv_hour = findViewById(R.id.tv_hour); | |||
tv_minute = findViewById(R.id.tv_minute); | |||
tv_second = findViewById(R.id.tv_second); | |||
btn_get = findViewById(R.id.btn_get); | |||
btn_switch = findViewById(R.id.btn_switch); | |||
rb_open = findViewById(R.id.rb_open); | |||
rb_close = findViewById(R.id.rb_close); | |||
list_view = findViewById(R.id.list_view); | |||
btn_set.setOnClickListener(this); | |||
btn_get.setOnClickListener(this); | |||
btn_switch.setOnClickListener(this); | |||
// 滑动修改时间显示 | |||
seek_hour.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_hour.setText(progress + "时"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
seek_minute.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_minute.setText(progress + "分"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
seek_second.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_second.setText((progress + 1) + "秒"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
// 获取Mac | |||
mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn_set: | |||
int hour = seek_hour.getProgress(); | |||
int minute = seek_minute.getProgress(); | |||
int second = seek_second.getProgress() + 1; | |||
if (mShareChargerData != null) { | |||
addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||
mShareChargerData.appSetChargerTime(hour, minute, second); | |||
} | |||
break; | |||
case R.id.btn_get: | |||
if (mShareChargerData != null) { | |||
addText("APP获取剩余充电时间"); | |||
mShareChargerData.appGetChargerTime(); | |||
} | |||
break; | |||
case R.id.btn_switch: | |||
boolean isOpen = rb_open.isChecked(); | |||
if (mShareChargerData != null) { | |||
addText("APP切换开关:" + isOpen); | |||
mShareChargerData.appSwitch(isOpen); | |||
} | |||
break; | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mShareChargerData = new ShareChargerData(mBleDevice); | |||
mShareChargerData.setShareChargerCallback(this); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void mcuSetChargerTime(int status) { | |||
addText("MCU回复设置充电时间:" + getStatusStr(status)); | |||
} | |||
@Override | |||
public void mcuGetChargerTime(int status, int hour, int minute, int second) { | |||
addText("MCU回复查询剩余充电时间:" + getStatusStr(status) + ";" + getTimeStr(hour, minute, second)); | |||
} | |||
@Override | |||
public void mcuSwitch(int status) { | |||
addText("MCU回复开关:" + getStatusStr(status)); | |||
} | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
private String getStatusStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "成功"; | |||
case 1: | |||
return "失败"; | |||
case 2: | |||
return "不支持"; | |||
} | |||
return ""; | |||
} | |||
private String getTimeStr(int hour, int minute, int second) { | |||
String hourStr; | |||
if (hour >= 0) { | |||
hourStr = hour >= 10 ? "" + hour : "0" + hour; | |||
} else { | |||
hourStr = "NULL"; | |||
} | |||
String minuteStr; | |||
if (minute >= 0) { | |||
minuteStr = minute >= 10 ? "" + minute : "0" + minute; | |||
} else { | |||
minuteStr = "NULL"; | |||
} | |||
String secondStr; | |||
if (second >= 0) { | |||
secondStr = second >= 10 ? "" + second : "0" + second; | |||
} else { | |||
secondStr = "NULL"; | |||
} | |||
return hourStr + ":" + minuteStr + ":" + secondStr; | |||
} | |||
} |
@@ -0,0 +1,346 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import android.widget.SeekBar; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.ShareCondom.ShareCondomData; | |||
/** | |||
* 共享套套机 | |||
*/ | |||
public class ShareCondomActivity extends BleBaseActivity implements View.OnClickListener, ShareCondomData.ShareCondomCallback { | |||
private static final int MSG_TIMING = 100; | |||
private Button btn_set; | |||
private SeekBar seek_hour; | |||
private SeekBar seek_minute; | |||
private SeekBar seek_second; | |||
private TextView tv_hour; | |||
private TextView tv_minute; | |||
private TextView tv_second; | |||
private Button btn_get; | |||
private Button btn_switch; | |||
private RadioButton rb_open; | |||
private RadioButton rb_close; | |||
private ListView list_view; | |||
private Button btn_out; | |||
private Button btn_recycle; | |||
private Button btn_open; | |||
private TextView tv_time; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private ShareCondomData mShareCondomData; | |||
private long mEndStamp = 0;// 剩余时间目标的结束时间 | |||
/** | |||
* 计时 | |||
*/ | |||
private Handler mHandler = new Handler(Looper.myLooper()) { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
super.handleMessage(msg); | |||
if (msg.what == MSG_TIMING) { | |||
// 判断显示 | |||
long stamp = mEndStamp - System.currentTimeMillis(); | |||
int second = (int) stamp / 1000; | |||
if (second > 0) { | |||
tv_time.setText("剩余时间:" + second + "秒"); | |||
// 1秒后重新刷新 | |||
sendEmptyMessageDelayed(MSG_TIMING, 1000); | |||
} else { | |||
tv_time.setText(""); | |||
// 停止刷新 | |||
removeMessages(MSG_TIMING); | |||
} | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_share_condom); | |||
btn_set = findViewById(R.id.btn_set); | |||
seek_hour = findViewById(R.id.seek_hour); | |||
seek_minute = findViewById(R.id.seek_minute); | |||
seek_second = findViewById(R.id.seek_second); | |||
tv_hour = findViewById(R.id.tv_hour); | |||
tv_minute = findViewById(R.id.tv_minute); | |||
tv_second = findViewById(R.id.tv_second); | |||
btn_get = findViewById(R.id.btn_get); | |||
btn_switch = findViewById(R.id.btn_switch); | |||
rb_open = findViewById(R.id.rb_open); | |||
rb_close = findViewById(R.id.rb_close); | |||
list_view = findViewById(R.id.list_view); | |||
btn_out = findViewById(R.id.btn_out); | |||
btn_recycle = findViewById(R.id.btn_recycle); | |||
btn_open = findViewById(R.id.btn_open); | |||
tv_time = findViewById(R.id.tv_time); | |||
btn_set.setOnClickListener(this); | |||
btn_get.setOnClickListener(this); | |||
btn_switch.setOnClickListener(this); | |||
btn_out.setOnClickListener(this); | |||
btn_recycle.setOnClickListener(this); | |||
btn_open.setOnClickListener(this); | |||
// 滑动修改时间显示 | |||
seek_hour.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_hour.setText(progress + "时"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
seek_minute.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_minute.setText(progress + "分"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
seek_second.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_second.setText((progress + 1) + "秒"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
// 获取Mac | |||
mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
int id = v.getId(); | |||
if (id == R.id.btn_set) { | |||
int hour = seek_hour.getProgress(); | |||
int minute = seek_minute.getProgress(); | |||
int second = seek_second.getProgress() + 1; | |||
if (mShareCondomData != null) { | |||
addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||
mShareCondomData.appSetCondomTime(hour, minute, second); | |||
mEndStamp = System.currentTimeMillis() + (hour * 60 * 60 + minute * 60 + second) * 1000 + 1500;// 500是当前秒,1000是设备自己加的 | |||
mHandler.removeMessages(MSG_TIMING); | |||
mHandler.sendEmptyMessageDelayed(MSG_TIMING, 1000); | |||
} | |||
} else if (id == R.id.btn_get) { | |||
if (mShareCondomData != null) { | |||
addText("APP获取剩余充电时间"); | |||
mShareCondomData.appGetCondomTime(); | |||
} | |||
} else if (id == R.id.btn_switch) { | |||
boolean isOpen = rb_open.isChecked(); | |||
if (mShareCondomData != null) { | |||
addText("APP切换开关:" + isOpen); | |||
mShareCondomData.appSwitch(isOpen); | |||
} | |||
} else if (id == R.id.btn_out) { | |||
if (mShareCondomData != null) { | |||
addText("APP仓位出仓"); | |||
mShareCondomData.appOut(); | |||
} | |||
} else if (id == R.id.btn_recycle) { | |||
if (mShareCondomData != null) { | |||
addText("APP仓位回收"); | |||
mShareCondomData.appRecycle(); | |||
} | |||
} else if (id == R.id.btn_open) { | |||
if (mShareCondomData != null) { | |||
addText("APP打开补货门"); | |||
mShareCondomData.appOpen(); | |||
} | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
mHandler.removeCallbacksAndMessages(null); | |||
mHandler = null; | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mShareCondomData = new ShareCondomData(mBleDevice); | |||
mShareCondomData.setShareCondomCallback(this); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void mcuSetCondomTime(int status) { | |||
addText("MCU回复设置充电时间:" + getStatusStr(status)); | |||
} | |||
@Override | |||
public void mcuGetCondomTime(int status, int hour, int minute, int second) { | |||
addText("MCU回复查询剩余充电时间:" + getStatusStr(status) + ";" + getTimeStr(hour, minute, second)); | |||
} | |||
@Override | |||
public void mcuSwitch(int status) { | |||
addText("MCU回复开关:" + getStatusStr(status)); | |||
} | |||
@Override | |||
public void mcuOut(int status) { | |||
addText("MCU回复仓位出仓:" + getCondomOutStr(status)); | |||
} | |||
@Override | |||
public void mcuRecycle(int status) { | |||
addText("MCU回复仓位回收:" + getCondomRecycleStr(status)); | |||
} | |||
@Override | |||
public void mcuOpen(int status) { | |||
addText("MCU回复打开缺货仓:" + getCondomOutStr(status)); | |||
} | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
private String getStatusStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "成功"; | |||
case 1: | |||
return "失败"; | |||
case 2: | |||
return "不支持"; | |||
} | |||
return ""; | |||
} | |||
private String getCondomOutStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "成功"; | |||
case 1: | |||
return "不支持"; | |||
case 2: | |||
return "电机或限位开关故障"; | |||
case 3: | |||
return "仓位已出仓"; | |||
} | |||
return ""; | |||
} | |||
private String getCondomRecycleStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "成功"; | |||
case 1: | |||
return "不支持"; | |||
case 2: | |||
return "电机或限位开关故障"; | |||
case 3: | |||
return "仓位未出仓"; | |||
} | |||
return ""; | |||
} | |||
private String getTimeStr(int hour, int minute, int second) { | |||
String hourStr; | |||
if (hour >= 0) { | |||
hourStr = hour >= 10 ? "" + hour : "0" + hour; | |||
} else { | |||
hourStr = "NULL"; | |||
} | |||
String minuteStr; | |||
if (minute >= 0) { | |||
minuteStr = minute >= 10 ? "" + minute : "0" + minute; | |||
} else { | |||
minuteStr = "NULL"; | |||
} | |||
String secondStr; | |||
if (second >= 0) { | |||
secondStr = second >= 10 ? "" + second : "0" + second; | |||
} else { | |||
secondStr = "NULL"; | |||
} | |||
return hourStr + ":" + minuteStr + ":" + secondStr; | |||
} | |||
} |
@@ -0,0 +1,564 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import android.widget.SeekBar; | |||
import android.widget.Spinner; | |||
import android.widget.TextView; | |||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import java.util.Map; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
import cn.net.aicare.modulelibrary.module.ShareSocket.ShareSocketData; | |||
/** | |||
* 共享插座 | |||
*/ | |||
public class ShareSocketActivity extends BleBaseActivity implements View.OnClickListener, ShareSocketData.ShareSocketCallback, OnCallbackBle, OnScanFilterListener { | |||
private static final int MSG_TEST_START_SCAN = 100; | |||
private Button btn_set; | |||
private SeekBar seek_hour; | |||
private SeekBar seek_minute; | |||
private SeekBar seek_second; | |||
private TextView tv_hour; | |||
private TextView tv_minute; | |||
private TextView tv_second; | |||
private Button btn_get; | |||
private Button btn_switch; | |||
private RadioButton rb_open; | |||
private RadioButton rb_close; | |||
private ListView list_view; | |||
private Spinner sp; | |||
private TextView tv_timing_0; | |||
private TextView tv_timing_1; | |||
private TextView tv_test; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private ShareSocketData mShareSocketData; | |||
private Map<Integer, Long> mTimingMap;// 计时map;key:编号;value:结束的时间戳 | |||
private SimpleDateFormat mSDF; | |||
private boolean mIsTest = false;// 是否在进行测试 | |||
private long mTestAllStamp = 30 * 60 * 1000;// 完整测试时长 | |||
private long mTestSingleStamp = 2 * 60 * 1000;// 单轮测试时长 | |||
private long mTestStartStamp = 0;// 下发完整测试时长那一刻的时间戳 | |||
private int mTest1SuccessCount = 0;// 成功次数 | |||
private int mTest1AbnormalCount = 0;// 异常次数 | |||
private int mTest1Abnormal10Count = 0;// 异常超过10秒的次数 | |||
private int mTest1ResetCount = 0;// 复位次数 | |||
private int mTest2SuccessCount = 0;// 成功次数 | |||
private int mTest2AbnormalCount = 0;// 异常次数 | |||
private int mTest2Abnormal10Count = 0;// 异常超过20秒的次数 | |||
private int mTest2ResetCount = 0;// 复位次数 | |||
private int mTestConnectSuccessCount = 0;// 测试时连接成功的次数 | |||
private int mTestConnectFailCount = 0;// 测试时连接失败的次数 | |||
private Handler mHandler = new Handler(Looper.myLooper()) { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
super.handleMessage(msg); | |||
long endStamp = mTimingMap.get(msg.what); | |||
int timeStamp = (int) (endStamp - System.currentTimeMillis()) / 1000; | |||
String text = "编号" + msg.what + "计时:" + timeStamp + "秒"; | |||
switch (msg.what) { | |||
case 0: | |||
tv_timing_0.setText(text); | |||
break; | |||
case 1: | |||
tv_timing_1.setText(text); | |||
break; | |||
} | |||
// 判断倒计时结束了没有 | |||
if (timeStamp > 0) { | |||
// 没结束,1秒后继续 | |||
mHandler.sendEmptyMessageDelayed(msg.what, 1000); | |||
} else { | |||
// 结束了,gg | |||
mHandler.removeMessages(msg.what); | |||
} | |||
} | |||
}; | |||
// 测试Handler | |||
private Handler mTestHandler = new Handler(Looper.myLooper()) { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
super.handleMessage(msg); | |||
switch (msg.what) { | |||
case MSG_TEST_START_SCAN: | |||
// 开始扫描设备 | |||
addText("准备重连,开始扫描设备:" + mMac); | |||
mBluetoothService.scanLeDevice(0); | |||
break; | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_share_socket); | |||
btn_set = findViewById(R.id.btn_set); | |||
seek_hour = findViewById(R.id.seek_hour); | |||
seek_minute = findViewById(R.id.seek_minute); | |||
seek_second = findViewById(R.id.seek_second); | |||
tv_hour = findViewById(R.id.tv_hour); | |||
tv_minute = findViewById(R.id.tv_minute); | |||
tv_second = findViewById(R.id.tv_second); | |||
btn_get = findViewById(R.id.btn_get); | |||
btn_switch = findViewById(R.id.btn_switch); | |||
rb_open = findViewById(R.id.rb_open); | |||
rb_close = findViewById(R.id.rb_close); | |||
list_view = findViewById(R.id.list_view); | |||
sp = findViewById(R.id.sp); | |||
tv_timing_0 = findViewById(R.id.tv_timing_0); | |||
tv_timing_1 = findViewById(R.id.tv_timing_1); | |||
tv_test = findViewById(R.id.tv_test); | |||
btn_set.setOnClickListener(this); | |||
btn_get.setOnClickListener(this); | |||
btn_switch.setOnClickListener(this); | |||
// 滑动修改时间显示 | |||
seek_hour.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_hour.setText(progress + "时"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
seek_minute.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_minute.setText(progress + "分"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
seek_second.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { | |||
@Override | |||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||
tv_second.setText((progress + 1) + "秒"); | |||
} | |||
@Override | |||
public void onStartTrackingTouch(SeekBar seekBar) { | |||
} | |||
@Override | |||
public void onStopTrackingTouch(SeekBar seekBar) { | |||
} | |||
}); | |||
// 获取Mac | |||
mMac = getIntent().getStringExtra("mac"); | |||
// 初始化列表 | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
mTimingMap = new HashMap<>(); | |||
mSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
int id = v.getId(); | |||
if (id == R.id.btn_set) { | |||
int spId = sp.getSelectedItemPosition(); | |||
int hour = seek_hour.getProgress(); | |||
int minute = seek_minute.getProgress(); | |||
int second = seek_second.getProgress() + 1; | |||
if (mShareSocketData != null) { | |||
addText("APP设置充电时间:" + getTimeStr(hour, minute, second)); | |||
mShareSocketData.appSetSocketTime(spId, hour, minute, second); | |||
// 保存到map | |||
long endStamp = System.currentTimeMillis() + hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000 + 2000;// 最后包括这一秒,然后设备又多一秒 | |||
mTimingMap.put(spId, endStamp); | |||
// Handler开始计时 | |||
mHandler.removeMessages(spId); | |||
mHandler.sendEmptyMessageDelayed(spId, 1000); | |||
} | |||
} else if (id == R.id.btn_get) { | |||
int spId = sp.getSelectedItemPosition(); | |||
if (mShareSocketData != null) { | |||
addText("APP获取剩余充电时间"); | |||
mShareSocketData.appGetSocketTime(spId); | |||
} | |||
} else if (id == R.id.btn_switch) { | |||
int spId = sp.getSelectedItemPosition(); | |||
boolean isOpen = rb_open.isChecked(); | |||
if (mShareSocketData != null) { | |||
addText("APP切换开关:" + isOpen); | |||
mShareSocketData.appSwitch(spId, isOpen); | |||
} | |||
} else if (id == R.id.btn_version) { | |||
if (mShareSocketData != null) { | |||
addText("APP获取设备版本号"); | |||
mShareSocketData.appGetVersion(); | |||
} | |||
} else if (id == R.id.btn_test) { | |||
if (!mIsTest && mShareSocketData != null) { | |||
mIsTest = true; | |||
addText("开始性能测试"); | |||
startTest(); | |||
} | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mBluetoothService != null) { | |||
mBluetoothService.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBluetoothService.setOnCallback(this); | |||
mBluetoothService.setOnScanFilterListener(this); | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mShareSocketData = new ShareSocketData(mBleDevice); | |||
mShareSocketData.setShareSocketCallback(this); | |||
} | |||
} | |||
@Override | |||
public void onScanning(BleValueBean data) { | |||
// 扫描到了设备 | |||
if (mIsTest && !mBluetoothService.isConnectStatus()) { | |||
// 开始连接设备 | |||
addText("扫描到设备,开始连接"); | |||
mBluetoothService.connectDevice(mMac); | |||
// 停止扫描 | |||
mBluetoothService.stopScan(); | |||
} | |||
} | |||
@Override | |||
public boolean onFilter(BleValueBean bleValueBean) { | |||
// 只扫描相同的设备 | |||
return bleValueBean.getMac().equals(mMac); | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void mcuSetSocketTime(int id, int status) { | |||
addText("MCU回复设置充电时间:编号:" + id + ";" + getStatusStr(status)); | |||
} | |||
private int mCha1 = -1; | |||
private int mCha2 = -1; | |||
@Override | |||
public void mcuGetSocketTime(int id, int status, int hour, int minute, int second) { | |||
if (mCha1 >= 0 && mCha2 >= 0) { | |||
// 已经回了2次了,多出来的回复不处理 | |||
return; | |||
} | |||
addText("MCU回复查询剩余充电时间:编号:" + id + ";" + getStatusStr(status) + ";" + getTimeStr(hour, minute, second)); | |||
long mcuStamp = hour * 60 * 60 * 1000 + minute * 60 * 1000 + second * 1000; | |||
long appStamp = mTestAllStamp - (System.currentTimeMillis() - mTestStartStamp); | |||
if (appStamp < 0) { | |||
appStamp = 0; | |||
} | |||
if (mIsTest) { | |||
int cha = Math.abs((int) (mcuStamp - appStamp)); | |||
appStamp /= 1000; | |||
int h = (int) (appStamp / 60 / 60); | |||
int m = (int) (appStamp - hour * 60 * 60) / 60; | |||
int s = (int) appStamp % 60; | |||
addText("和APP的计时:" + getTimeStr(h, m, s) + "相差" + cha + "ms"); | |||
cha /= 1000; | |||
if (id == 0) { | |||
mCha1 = cha; | |||
} else if (id == 1) { | |||
mCha2 = cha; | |||
} | |||
boolean needReset = false; | |||
if (mCha1 >= 0 && mCha2 >= 0) { | |||
// 两条数据都回来了 | |||
if (mcuStamp == 0 && appStamp > 0) { | |||
mTest1ResetCount++; | |||
needReset = true; | |||
} else if (mCha1 < 5000) { | |||
mTest1SuccessCount++; | |||
} else if (mCha1 < 10000) { | |||
mTest1AbnormalCount++; | |||
needReset = true; | |||
} else { | |||
mTest1Abnormal10Count++; | |||
needReset = true; | |||
} | |||
if (mcuStamp == 0 && appStamp > 0) { | |||
mTest2ResetCount++; | |||
needReset = true; | |||
} else if (mCha2 < 5000) { | |||
mTest2SuccessCount++; | |||
} else if (mCha2 < 10000) { | |||
mTest2AbnormalCount++; | |||
needReset = true; | |||
} else { | |||
mTest2Abnormal10Count++; | |||
needReset = true; | |||
} | |||
// 刷新显示 | |||
refreshTest(); | |||
// 判断要不要重新发送充电时长 | |||
if (needReset) { | |||
// 有异常,需要重置 | |||
addText("出现异常,需要重置充电时间"); | |||
startTest(); | |||
} else if (appStamp <= 0) { | |||
// 几轮都走完了 | |||
addText("测试完成,重新设置充电时间"); | |||
startTest(); | |||
} else { | |||
// 没有问题 | |||
addText("本轮测试结束,总时长还没结束,直接断开,不重置充电时长"); | |||
if (mBleDevice != null) { | |||
mBleDevice.disconnect(); | |||
mBleDevice = null; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
@Override | |||
public void mcuSwitch(int id, int status) { | |||
addText("MCU回复开关:编号:" + id + ";" + getStatusStr(status)); | |||
} | |||
@Override | |||
public void mcuVersion(String version) { | |||
addText("MCU回复版本:" + version); | |||
} | |||
@Override | |||
public void onServicesDiscovered(String mac) { | |||
mBleDevice = mBluetoothService.getBleDevice(mMac); | |||
if (mIsTest && mBleDevice != null) { | |||
mTestConnectSuccessCount++; | |||
addText("连接成功:" + mMac + ",查询剩余充电时间"); | |||
mShareSocketData = new ShareSocketData(mBleDevice); | |||
mShareSocketData.setShareSocketCallback(this); | |||
mCha1 = mCha2 = -1; | |||
mShareSocketData.appGetSocketTime(0); | |||
mShareSocketData.appGetSocketTime(1); | |||
} | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mIsTest) { | |||
long stamp = mTestSingleStamp; | |||
if (stamp < 0) { | |||
stamp = 0; | |||
} | |||
mBleDevice = null; | |||
if (code != 0) { | |||
// 0是自己断开,不是0就说明是连接失败 | |||
mTestConnectFailCount++; | |||
addText("设备断开连接:" + code + "。正在测试,等待" + getTimeStrByStamp(10000) + "后重连"); | |||
mTestHandler.sendEmptyMessageDelayed(MSG_TEST_START_SCAN, 10000); | |||
} else { | |||
// 自己主动断开要等待 | |||
addText("主动断开连接:" + code + "。正在测试,等待" + getTimeStrByStamp(stamp) + "后重连"); | |||
mTestHandler.sendEmptyMessageDelayed(MSG_TEST_START_SCAN, stamp); | |||
} | |||
} else { | |||
addText("设备断开连接:" + code); | |||
} | |||
} | |||
// 开始插口1的测试 | |||
private void startTest() { | |||
addText("设置充电总时长:" + getTimeStrByStamp(mTestAllStamp)); | |||
mTestStartStamp = System.currentTimeMillis() + 2000L;// 1000毫秒是蓝牙的延迟,1000毫秒是MCU自己的延迟 | |||
long stamp = mTestAllStamp; | |||
stamp /= 1000; | |||
int hour = (int) (stamp / 60 / 60); | |||
int minute = (int) (stamp - hour * 60 * 60) / 60; | |||
int second = (int) stamp % 60; | |||
mShareSocketData.appSetSocketTime(0, hour, minute, second); | |||
mShareSocketData.appSetSocketTime(1, hour, minute, second); | |||
new Thread(() -> { | |||
try { | |||
Thread.sleep(2000); | |||
} catch (Exception ignored) { | |||
} | |||
if (mBleDevice != null && mBleDevice.isConnectSuccess()) { | |||
addText("设置充电总时长后断开连接"); | |||
mBleDevice.disconnect(); | |||
mBleDevice = null; | |||
} | |||
}).start(); | |||
} | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
runOnUiThread(() -> { | |||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
mList.add(sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
}); | |||
} | |||
private String getStatusStr(int status) { | |||
switch (status) { | |||
case 0: | |||
return "成功"; | |||
case 1: | |||
return "失败"; | |||
case 2: | |||
return "不支持"; | |||
} | |||
return ""; | |||
} | |||
private String getTimeStr(int hour, int minute, int second) { | |||
String hourStr; | |||
if (hour >= 0) { | |||
hourStr = hour >= 10 ? "" + hour : "0" + hour; | |||
} else { | |||
hourStr = "NULL"; | |||
} | |||
String minuteStr; | |||
if (minute >= 0) { | |||
minuteStr = minute >= 10 ? "" + minute : "0" + minute; | |||
} else { | |||
minuteStr = "NULL"; | |||
} | |||
String secondStr; | |||
if (second >= 0) { | |||
secondStr = second >= 10 ? "" + second : "0" + second; | |||
} else { | |||
secondStr = "NULL"; | |||
} | |||
return hourStr + ":" + minuteStr + ":" + secondStr; | |||
} | |||
/** | |||
* 根据毫秒数获取时间字符串 | |||
* | |||
* @param stamp 毫秒 | |||
* @return 时间 | |||
*/ | |||
private String getTimeStrByStamp(long stamp) { | |||
String str = ""; | |||
stamp /= 1000; | |||
int hour = (int) (stamp / 60 / 60); | |||
int minute = (int) (stamp - hour * 60 * 60) / 60; | |||
int second = (int) stamp % 60; | |||
if (hour > 0) { | |||
str += hour + "小时"; | |||
} | |||
if (minute > 0) { | |||
str += minute + "分钟"; | |||
} | |||
if (second > 0) { | |||
str += second + "秒"; | |||
} | |||
return str; | |||
} | |||
/** | |||
* 刷新测试统计 | |||
*/ | |||
private void refreshTest() { | |||
String str = ""; | |||
str += "\n连接次数:" + (mTestConnectSuccessCount + mTestConnectFailCount); | |||
str += "\n连接成功次数:" + mTestConnectSuccessCount; | |||
str += "\n连接失败次数:" + mTestConnectFailCount; | |||
str += "\n连接成功率:" + (mTestConnectSuccessCount * 1.0f / (mTestConnectSuccessCount + mTestConnectFailCount) * 100) + "%"; | |||
str += "\n\n插口1成功次数:" + mTest1SuccessCount; | |||
str += "\n插口1重置次数:" + mTest1ResetCount; | |||
str += "\n插口1异常不超过10秒次数:" + mTest1AbnormalCount; | |||
str += "\n插口1异常超过10秒次数:" + mTest1Abnormal10Count; | |||
str += "\n插口1成功率" + (mTest1SuccessCount * 1.0f / (mTest1SuccessCount + mTest1AbnormalCount + mTest1ResetCount + mTest1Abnormal10Count) * 100) + "%"; | |||
str += "\n\n插口2成功次数:" + mTest2SuccessCount; | |||
str += "\n插口2重置次数:" + mTest2ResetCount; | |||
str += "\n插口2异常不超过10秒次数:" + mTest2AbnormalCount; | |||
str += "\n插口2异常超过10秒次数:" + mTest2Abnormal10Count; | |||
str += "\n插口2成功率" + (mTest2SuccessCount * 1.0f / (mTest2SuccessCount + mTest2AbnormalCount + mTest2ResetCount + mTest2Abnormal10Count) * 100) + "%"; | |||
tv_test.setText(str); | |||
} | |||
} |
@@ -0,0 +1,207 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
import java.security.AlgorithmParameters; | |||
import java.security.Key; | |||
import javax.crypto.Cipher; | |||
import javax.crypto.SecretKey; | |||
import javax.crypto.spec.IvParameterSpec; | |||
import javax.crypto.spec.SecretKeySpec; | |||
public class AES128Util { | |||
//算法名 | |||
public static final String KEY_ALGORITHM = "AES"; | |||
//加解密算法/模式/填充方式 | |||
//可以任意选择,为了方便后面与iOS端的加密解密,采用与其相同的模式与填充方式 | |||
//ECB模式只用密钥即可对数据进行加密解密,CBC模式需要添加一个参数iv | |||
public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; | |||
//生成密钥 | |||
private static byte[] generateKey(String aesKey) throws Exception { | |||
// KeyGenerator kgen = KeyGenerator.getInstance(KEY_ALGORITHM); | |||
// | |||
// kgen.init(128, new SecureRandom(aesKey.getBytes())); | |||
// | |||
// SecretKey secretKey = kgen.generateKey(); | |||
// | |||
// byte[] encodeFormat = secretKey.getEncoded(); | |||
// | |||
// SecretKeySpec keySpec = new SecretKeySpec(encodeFormat, "AES"); | |||
// | |||
// return keySpec.getEncoded(); | |||
return aesKey.getBytes(); | |||
} | |||
//生成iv | |||
private static AlgorithmParameters generateIV(String ivVal) throws Exception { | |||
//iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 | |||
//byte[] iv = new byte[16]; | |||
//Arrays.fill(iv, (byte) 0x00); | |||
//Arrays.fill(iv,ivVal.getBytes()); | |||
byte[] iv; | |||
if (ivVal == null || ivVal.length() == 0) { | |||
iv = new byte[16]; | |||
} else { | |||
iv = ivVal.getBytes(); | |||
} | |||
AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM); | |||
params.init(new IvParameterSpec(iv)); | |||
return params; | |||
} | |||
//转化成JAVA的密钥格式 | |||
private static Key convertToKey(byte[] keyBytes) throws Exception { | |||
SecretKey secretKey = new SecretKeySpec(keyBytes, KEY_ALGORITHM); | |||
return secretKey; | |||
} | |||
//加密 | |||
public static String encrypt(String plainText, String aesKey, String ivVal) throws Exception { | |||
byte[] data = plainText.getBytes(); | |||
byte[] iv; | |||
if (ivVal == null || ivVal.length() == 0) { | |||
iv = new byte[16]; | |||
} else { | |||
iv = ivVal.getBytes(); | |||
} | |||
AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM); | |||
params.init(new IvParameterSpec(iv)); | |||
//转化为密钥 | |||
Key key = convertToKey(aesKey.getBytes()); | |||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | |||
//设置为加密模式 | |||
cipher.init(Cipher.ENCRYPT_MODE, key, params); | |||
byte[] encryptData = cipher.doFinal(data); | |||
return bytesToHexString(encryptData); | |||
} | |||
//解密 | |||
public static String decrypt(String encryptedStr, String aesKey, String ivVal) throws Exception { | |||
byte[] encryptedData = hexStringToByte(encryptedStr); | |||
byte[] keyBytes = generateKey(aesKey); | |||
Key key = convertToKey(keyBytes); | |||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); | |||
AlgorithmParameters iv = generateIV(ivVal); | |||
//设置为解密模式 | |||
cipher.init(Cipher.DECRYPT_MODE, key, iv); | |||
byte[] decryptData = cipher.doFinal(encryptedData); | |||
return new String(decryptData); | |||
} | |||
/** | |||
* 十六进制字符串转换成数组 | |||
* | |||
* @param hex | |||
* @return | |||
*/ | |||
private static byte[] hexStringToByte(String hex) { | |||
int len = (hex.length() / 2); | |||
byte[] result = new byte[len]; | |||
char[] achar = hex.toCharArray(); | |||
for (int i = 0; i < len; i++) { | |||
int pos = i * 2; | |||
result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); | |||
} | |||
return result; | |||
} | |||
private static byte toByte(char c) { | |||
byte b = (byte) "0123456789abcdef".indexOf(c); | |||
return b; | |||
} | |||
/** | |||
* 把字节数组转换成16进制字符串 | |||
* | |||
* @param bArray | |||
* @return | |||
*/ | |||
private static final String bytesToHexString(byte[] bArray) { | |||
StringBuffer sb = new StringBuffer(bArray.length); | |||
String sTemp; | |||
for (int i = 0; i < bArray.length; i++) { | |||
sTemp = Integer.toHexString(0xFF & bArray[i]); | |||
if (sTemp.length() < 2) | |||
sb.append(0); | |||
sb.append(sTemp.toLowerCase()); | |||
} | |||
return sb.toString(); | |||
} | |||
} |
@@ -54,11 +54,13 @@ public class FileUtils { | |||
}); | |||
L.d("Files", "Size: " + file.length); | |||
ArrayList<String> names = new ArrayList<String>(); | |||
for (int i = 0; i < file.length; i++) { | |||
L.d("Files", "FileName:" + file[i].getName()); | |||
names.add(file[i].getName()); | |||
for (File value : file) { | |||
L.d("Files", "FileName:" + value.getName()); | |||
names.add(value.getName()); | |||
} | |||
return names; | |||
} | |||
} |
@@ -0,0 +1,153 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
/** | |||
* xing<br> | |||
* 2019/3/7<br> | |||
* 广播解析工具类 | |||
*/ | |||
public class MyBleStrUtils { | |||
/** | |||
* (16进制) | |||
* BLE蓝牙返回的byte[] | |||
* byte[]转字符串 | |||
*/ | |||
public static String byte2HexStr(byte[] b) { | |||
if (b == null) | |||
return ""; | |||
StringBuilder hs = new StringBuilder(); | |||
String stmp; | |||
for (byte aB : b) { | |||
int a = aB & 0XFF; | |||
stmp = getHexString(a); | |||
if (stmp.length() == 1) | |||
hs.append("0").append(stmp); | |||
else | |||
hs.append(stmp); | |||
hs.append(" "); | |||
} | |||
return hs.toString(); | |||
} | |||
/** | |||
* int 10进制转16进制(返回大写字母) | |||
* | |||
* @return 16进制String | |||
*/ | |||
public static String getHexString(int number) { | |||
return Integer.toHexString(number); | |||
} | |||
/** | |||
* int到byte[] 由高位到低位 | |||
* @param i 需要转换为byte数组的整行值。 | |||
* @return byte数组 | |||
*/ | |||
public static byte[] intToByteArray(int i) { | |||
byte[] result = new byte[4]; | |||
result[0] = (byte)((i >> 24) & 0xFF); | |||
result[1] = (byte)((i >> 16) & 0xFF); | |||
result[2] = (byte)((i >> 8) & 0xFF); | |||
result[3] = (byte)(i & 0xFF); | |||
return result; | |||
} | |||
/** | |||
* 时间戳(秒)转byte数组 由高位到低位 | |||
* @param time 时间戳,精确到秒 | |||
* @return byte[5]数组 | |||
*/ | |||
public static byte[] getTimestampByte(long time) { | |||
byte[] result = new byte[5]; | |||
result[4] = (byte)((time >> 32) & 0xFF); | |||
result[3] = (byte)((time >> 24) & 0xFF); | |||
result[2] = (byte)((time >> 16) & 0xFF); | |||
result[1] = (byte)((time >> 8) & 0xFF); | |||
result[0] = (byte)(time & 0xFF); | |||
return result; | |||
} | |||
/** | |||
* byte[]转long | |||
* @param bytes 需要转换的数组 | |||
* @param isBig 是否为大端序 | |||
* @return 数值 | |||
*/ | |||
public static long byteArrayToLong(byte[] bytes,boolean isBig) { | |||
long value=0; | |||
int length = bytes.length; | |||
if (isBig){ | |||
for(int i = length; i >0; i--) { | |||
int shift= ((length-1)-(length-i)) * 8; | |||
value +=(bytes[(i-1)] & 0xFF) << shift; | |||
} | |||
}else { | |||
for(int i = 0; i <length; i++) { | |||
int shift= ((length-1)-i) * 8; | |||
value +=(bytes[i] & 0xFF) << shift; | |||
} | |||
} | |||
return value; | |||
} | |||
/** | |||
* (16进制) | |||
* BLE蓝牙返回的byte[] | |||
* byte[]转字符串 | |||
*/ | |||
public static String getMac(byte[] b,boolean isBig) { | |||
if (b == null) | |||
return ""; | |||
StringBuilder hs = new StringBuilder(); | |||
String stmp; | |||
if (isBig){ | |||
for (byte aB : b) { | |||
int a = aB & 0XFF; | |||
stmp = getHexString(a); | |||
if (stmp.length() == 1) | |||
hs.append("0").append(stmp); | |||
else | |||
hs.append(stmp); | |||
hs.append(":"); | |||
} | |||
}else { | |||
for (int i = b.length - 1; i >= 0; i--) { | |||
byte aB=b[i]; | |||
int a = aB & 0XFF; | |||
stmp = getHexString(a); | |||
if (stmp.length() == 1) | |||
hs.append("0").append(stmp); | |||
else | |||
hs.append(stmp); | |||
hs.append(":"); | |||
} | |||
} | |||
hs.deleteCharAt(hs.length()-1); | |||
return hs.toString(); | |||
} | |||
/** | |||
* mac地址转byte | |||
* @param mac | |||
* @return | |||
*/ | |||
public static byte[] getDeviceMacByte(String mac) { | |||
byte[] macByte = new byte[6]; | |||
if (mac.contains(":")) { | |||
String[] macArr = mac.split(":"); | |||
for (int i = 0; i < macArr.length; i++) { | |||
macByte[macArr.length - i - 1] = (byte) Integer.parseInt(macArr[i], 16); | |||
} | |||
} | |||
return macByte; | |||
} | |||
} |
@@ -19,6 +19,11 @@ public class SP { | |||
public static String OTA_FILE_NAME = "OTA_FILE_NAME"; | |||
/** | |||
* 寻物器mac地址列表 | |||
*/ | |||
private final static String FIND_DEVICE_MAC_LIST="FIND_DEVICE_MAC_LIST"; | |||
//------------------------------------- | |||
@@ -53,6 +58,15 @@ public class SP { | |||
editor.putString(OTA_FILE_NAME, name); | |||
apply(editor); | |||
} | |||
public String getFindDeviceMacList() { | |||
return sp.getString(FIND_DEVICE_MAC_LIST, STR_DEFAULT); | |||
} | |||
public void putFindDeviceMacList(String name) { | |||
SharedPreferences.Editor editor = sp.edit(); | |||
editor.putString(FIND_DEVICE_MAC_LIST, name); | |||
apply(editor); | |||
} | |||
/** |
@@ -1,6 +1,7 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
import java.text.SimpleDateFormat; | |||
import java.util.Calendar; | |||
import java.util.Locale; | |||
/** | |||
@@ -11,8 +12,79 @@ import java.util.Locale; | |||
public class TimeUtils { | |||
public static String getTime(){ | |||
java.text.SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
return format.format(System.currentTimeMillis())+":\n"; | |||
} | |||
public static String getTimeSSS(){ | |||
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US); | |||
return format.format(System.currentTimeMillis())+":\n"; | |||
} | |||
public static String getDateString() { | |||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US); | |||
return simpleDateFormat.format(System.currentTimeMillis()); | |||
} | |||
public static String getTime(long time){ | |||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||
return format.format(time)+":\n"; | |||
} | |||
/** | |||
* 返回当前年 | |||
*/ | |||
public static int getYear() { | |||
Calendar c = Calendar.getInstance(); | |||
return c.get(Calendar.YEAR); | |||
} | |||
/** | |||
* 返回当前月(1~12) | |||
*/ | |||
public static int getMonth() { | |||
Calendar c = Calendar.getInstance(); | |||
return c.get(Calendar.MONTH) + 1; | |||
} | |||
/** | |||
* 返回当前日 | |||
*/ | |||
public static int getDay() { | |||
Calendar c = Calendar.getInstance(); | |||
return c.get(Calendar.DAY_OF_MONTH); | |||
} | |||
/** | |||
* 返回当前日 | |||
*/ | |||
public static int getHour() { | |||
Calendar c = Calendar.getInstance(); | |||
return c.get(Calendar.HOUR_OF_DAY); | |||
} | |||
/** | |||
* 返回当前日 | |||
*/ | |||
public static int getMinute() { | |||
Calendar c = Calendar.getInstance(); | |||
return c.get(Calendar.MINUTE); | |||
} | |||
public static int[] getTimeArr(){ | |||
int[] time=new int[3]; | |||
Calendar c = Calendar.getInstance(); | |||
time[0] = c.get(Calendar.HOUR_OF_DAY); | |||
time[1] = c.get(Calendar.MINUTE); | |||
time[2]= c.get(Calendar.SECOND); | |||
return time; | |||
} | |||
public static String getTimeM(){ | |||
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
return format.format(System.currentTimeMillis())+":\n"; | |||
} | |||
} |
@@ -0,0 +1,6 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<shape xmlns:android = "http://schemas.android.com/apk/res/android"> | |||
<size | |||
android:width = "0dp" | |||
android:height = "10dp"/> | |||
</shape> |
@@ -43,6 +43,64 @@ | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:layout_margin="10dp" | |||
> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Weight:" | |||
android:textSize="18dp" | |||
/> | |||
<TextView | |||
android:id="@+id/tv_baby_body_fat_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0.0" | |||
android:textSize="18dp" | |||
android:layout_marginStart="5dp" | |||
/> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Height:" | |||
android:textSize="18dp" | |||
android:layout_marginStart="20dp" | |||
/> | |||
<TextView | |||
android:id="@+id/tv_baby_body_fat_height" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0.0" | |||
android:textSize="18dp" | |||
android:layout_marginStart="5dp" | |||
/> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="adc:" | |||
android:textSize="18dp" | |||
android:layout_marginStart="20dp" | |||
/> | |||
<TextView | |||
android:id="@+id/tv_baby_body_fat_adc" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0.0" | |||
android:textSize="18dp" | |||
android:layout_marginStart="5dp" | |||
/> | |||
</LinearLayout> | |||
<TextView | |||
android:layout_width="wrap_content" |
@@ -0,0 +1,52 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout | |||
xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<RadioGroup | |||
android:id="@+id/unit" | |||
android:layout_below="@+id/edit_Userid" | |||
android:layout_width="match_parent" | |||
android:orientation="horizontal" | |||
android:layout_height="wrap_content"> | |||
<RadioButton | |||
android:id="@+id/kg" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:text="kg"/> | |||
<RadioButton | |||
android:id="@+id/jin" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:text="斤"/> | |||
<RadioButton | |||
android:id="@+id/st_lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:text="st:lb"/> | |||
<RadioButton | |||
android:id="@+id/lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:text="lb"/> | |||
</RadioGroup> | |||
<ListView | |||
android:id="@+id/log_list" | |||
android:layout_marginTop="20dp" | |||
android:layout_below="@id/unit" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent"> | |||
</ListView> | |||
</LinearLayout> |
@@ -1,47 +1,41 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical" | |||
android:focusable="true" | |||
android:focusableInTouchMode="true" | |||
> | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:focusable="true" | |||
android:focusableInTouchMode="true" | |||
android:orientation="vertical"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" | |||
> | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical" | |||
> | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
> | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btnClear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/clear" | |||
/> | |||
android:text="@string/clear" /> | |||
<Button | |||
android:id="@+id/btnPause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停" | |||
/> | |||
android:text="暂停" /> | |||
</LinearLayout> | |||
@@ -49,32 +43,32 @@ | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
> | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btnHandshake" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/handshake" | |||
/> | |||
android:text="@string/handshake" /> | |||
<Button | |||
android:id="@+id/btnVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读版本" | |||
/> | |||
android:text="读版本" /> | |||
<Button | |||
android:id="@+id/btnBattery" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读电量" | |||
/> | |||
android:text="读电量" /> | |||
<Button | |||
android:id="@+id/btnNameRssi" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读名称信号" /> | |||
</LinearLayout> | |||
@@ -83,138 +77,144 @@ | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
android:padding="5dp"> | |||
<Button | |||
android:id="@+id/btnTimeRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读时间" | |||
/> | |||
android:text="读时间" /> | |||
<Button | |||
android:id="@+id/btnTimeWrite" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="写时间" | |||
/> | |||
android:text="写时间" /> | |||
<Button | |||
android:id="@+id/btnMacRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读mac" | |||
/> | |||
android:text="读mac" /> | |||
<Button | |||
android:id="@+id/btnBmRestart" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="重启模块" | |||
/> | |||
android:text="重启模块" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
android:padding="5dp"> | |||
<EditText | |||
android:id="@+id/etMcuType" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:hint="串口,i2c,spi" | |||
android:text="1" | |||
/> | |||
<Button | |||
android:id="@+id/btnMcuType" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设置模式" | |||
/> | |||
android:text="设置模式" /> | |||
<Button | |||
android:id="@+id/btnBmReset" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="出厂设置" | |||
/> | |||
android:text="出厂设置" /> | |||
<Button | |||
android:id="@+id/btnUnits" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读单位" | |||
/> | |||
android:text="读单位" /> | |||
<EditText | |||
android:id="@+id/etMcuType" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:hint="串口,i2c,spi" | |||
android:text="1" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
android:padding="5dp"> | |||
<EditText | |||
android:id="@+id/etCid" | |||
android:layout_width="60dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="cid" | |||
android:text="0" /> | |||
<EditText | |||
android:id="@+id/etDid" | |||
android:layout_width="200dp" | |||
android:id="@+id/etVid" | |||
android:layout_width="60dp" | |||
android:layout_height="wrap_content" | |||
android:hint="cidS,vidS,pidS,cid,vid,pid" | |||
android:text="1,1,1,1,2,3" | |||
/> | |||
android:digits="0123456789" | |||
android:hint="vid" | |||
android:text="0" /> | |||
<EditText | |||
android:id="@+id/etPid" | |||
android:layout_width="60dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="pid" | |||
android:text="0" /> | |||
<Button | |||
android:id="@+id/btnDidWrite" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="写DID" | |||
/> | |||
android:text="写DID" /> | |||
<Button | |||
android:id="@+id/btnDidRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读DID" | |||
/> | |||
android:text="读DID" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
<EditText | |||
android:id="@+id/etName" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:maxLength="13" | |||
/> | |||
android:padding="5dp"> | |||
<Button | |||
android:id="@+id/btnNameWrite" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="写名称" | |||
/> | |||
android:text="写名称" /> | |||
<Button | |||
android:id="@+id/btnNameRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读名称" | |||
/> | |||
android:text="读名称" /> | |||
<Button | |||
android:id="@+id/btn_start_ble" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="唤醒模块" | |||
/> | |||
android:text="唤醒模块" /> | |||
<EditText | |||
android:id="@+id/etName" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:maxLength="13" /> | |||
</LinearLayout> | |||
@@ -223,30 +223,26 @@ | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
<EditText | |||
android:id="@+id/etMacType" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:maxLength="1" | |||
android:digits="0987654321" | |||
/> | |||
android:padding="5dp"> | |||
<Button | |||
android:id="@+id/btnMacTypeWrite" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="写Mac大小端" | |||
/> | |||
android:text="写Mac大小端" /> | |||
<Button | |||
android:id="@+id/btnMacTypeRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读Mac大小端" | |||
/> | |||
android:text="读Mac大小端" /> | |||
<EditText | |||
android:id="@+id/etMacType" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0987654321" | |||
android:maxLength="1" /> | |||
</LinearLayout> | |||
@@ -254,60 +250,52 @@ | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
<EditText | |||
android:id="@+id/etBroadcastTime" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0987654321" | |||
/> | |||
android:padding="5dp"> | |||
<Button | |||
android:id="@+id/btnBroadcastTimeWrite" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="写广播间隔" | |||
/> | |||
android:text="写广播间隔" /> | |||
<Button | |||
android:id="@+id/btnBroadcastTimeRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读广播间隔" | |||
/> | |||
android:text="读广播间隔" /> | |||
<EditText | |||
android:id="@+id/etBroadcastTime" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0987654321" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:padding="5dp" | |||
> | |||
<EditText | |||
android:id="@+id/etSleepTime" | |||
android:layout_width="150dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0987654321," | |||
android:text="1,60,1,1000" | |||
android:hint="标记,时间,操作,广播时间" | |||
/> | |||
android:padding="5dp"> | |||
<Button | |||
android:id="@+id/btnSleepTimeWrite" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="写自动休眠" | |||
/> | |||
android:text="写自动休眠" /> | |||
<Button | |||
android:id="@+id/btnSleepTimeRead" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读自动休眠" | |||
/> | |||
android:text="读自动休眠" /> | |||
<EditText | |||
android:id="@+id/etSleepTime" | |||
android:layout_width="150dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0987654321," | |||
android:hint="标记,时间,操作,广播时间" | |||
android:text="1,60,1,1000" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
@@ -322,10 +310,11 @@ | |||
android:layout_weight="1" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll" | |||
> | |||
android:transcriptMode="alwaysScroll"> | |||
</ListView> | |||
</LinearLayout> |
@@ -48,6 +48,20 @@ | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/test" | |||
android:text="流程测试" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
/> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/log_list" | |||
android:layout_marginTop="20dp" |
@@ -0,0 +1,12 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" /> | |||
</LinearLayout> |
@@ -0,0 +1,251 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" | |||
android:text="SpO2上限" /> | |||
<TextView | |||
android:id="@+id/tv_sp_max" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" /> | |||
<androidx.appcompat.widget.AppCompatSeekBar | |||
android:id="@+id/sb_sp_max" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:max="255" | |||
android:min="0" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" | |||
android:text="SpO2下限" /> | |||
<TextView | |||
android:id="@+id/tv_sp_min" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" /> | |||
<androidx.appcompat.widget.AppCompatSeekBar | |||
android:id="@+id/sb_sp_min" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:max="255" | |||
android:min="0" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" | |||
android:text="脉率上限" /> | |||
<TextView | |||
android:id="@+id/tv_pr_max" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" /> | |||
<androidx.appcompat.widget.AppCompatSeekBar | |||
android:id="@+id/sb_pr_max" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:max="255" | |||
android:min="0" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" | |||
android:text="脉率下限" /> | |||
<TextView | |||
android:id="@+id/tv_pr_min" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" /> | |||
<androidx.appcompat.widget.AppCompatSeekBar | |||
android:id="@+id/sb_pr_min" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:max="255" | |||
android:min="0" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" | |||
android:text="血流灌注上限" /> | |||
<TextView | |||
android:id="@+id/tv_pl_max" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" /> | |||
<androidx.appcompat.widget.AppCompatSeekBar | |||
android:id="@+id/sb_pl_max" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:max="255" | |||
android:min="0" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" | |||
android:text="血流灌注下限" /> | |||
<TextView | |||
android:id="@+id/tv_pl_min" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="0.3" | |||
android:gravity="center" /> | |||
<androidx.appcompat.widget.AppCompatSeekBar | |||
android:id="@+id/sb_pl_min" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:max="255" | |||
android:min="0" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/bt_alarm" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设置警报" /> | |||
<Button | |||
android:id="@+id/bt_status" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="查询状态" /> | |||
<Button | |||
android:id="@+id/bt_pause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停接收" /> | |||
<Button | |||
android:id="@+id/bt_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/bt_version" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="查询版本号" /> | |||
<TextView | |||
android:id="@+id/tv_version" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="版本" | |||
/> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/lv_log" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:layout_marginTop="10dp" /> | |||
</LinearLayout> |
@@ -0,0 +1,108 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="IMEI号:" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
<EditText | |||
android:id="@+id/ed_imei" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:text="869324050002769" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_login" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="登录(仅一次)" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
<Button | |||
android:id="@+id/btn_deviceId" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="获取设备Id" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
<Button | |||
android:id="@+id/btn_data" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="获取数据" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
<Button | |||
android:id="@+id/btn_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="清屏" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_test" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="测试环境" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
<Button | |||
android:id="@+id/btn_produce" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:padding="5dp" | |||
android:text="生产环境" | |||
android:textColor="#000000" | |||
android:textSize="16dp" /> | |||
<TextView | |||
android:text="默认为生产环境,切换环境需要重新登录和获取设备id" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content"/> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/listviw" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" /> | |||
</LinearLayout> |
@@ -0,0 +1,13 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" /> | |||
</LinearLayout> |
@@ -127,10 +127,18 @@ | |||
android:id="@+id/tv_broadcast_temp" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="30℃" | |||
android:text="--℃" | |||
android:layout_marginStart="5dp" | |||
/> | |||
<TextView | |||
android:id="@+id/tv_broadcast_did" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="" | |||
android:layout_marginStart="20dp" | |||
/> | |||
</LinearLayout> | |||
@@ -0,0 +1,82 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical" | |||
android:focusable="true" | |||
android:focusableInTouchMode="true" | |||
> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" | |||
> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical" | |||
> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<EditText | |||
android:id="@+id/et_type" | |||
android:layout_width="200dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:text="01" | |||
android:digits="0123456789abcdefABCDEF" | |||
/> | |||
<Button | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="发送" | |||
/> | |||
<Button | |||
android:id="@+id/clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" | |||
/> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<Button | |||
android:id="@+id/btn_set_unit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="set_unit" | |||
/> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> | |||
<ListView | |||
android:id="@+id/listview" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="2" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll" | |||
> | |||
</ListView> | |||
</LinearLayout> |
@@ -0,0 +1,469 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_zero" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="去皮功能(归零功能)" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_weight_unit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发重量单位" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_kg" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="kg" /> | |||
<RadioButton | |||
android:id="@+id/rb_jin" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="斤" /> | |||
<RadioButton | |||
android:id="@+id/rb_lb_oz" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="lb:oz" /> | |||
<RadioButton | |||
android:id="@+id/rb_oz" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="oz" /> | |||
<RadioButton | |||
android:id="@+id/rb_st_lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="st:lb" /> | |||
<RadioButton | |||
android:id="@+id/rb_g" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="g" /> | |||
<RadioButton | |||
android:id="@+id/rb_lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="lb" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_temp_unit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发温度单位" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_c" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="℃" /> | |||
<RadioButton | |||
android:id="@+id/rb_f" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="℉" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_auto_shutdown" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发自动关机" /> | |||
<EditText | |||
android:id="@+id/et_auto_shutdown" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:inputType="number" | |||
android:text="60" /> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="3" | |||
android:text="(秒)" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_timing" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="计时功能控制" /> | |||
<EditText | |||
android:id="@+id/et_timing" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:inputType="number" | |||
android:text="30" /> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="3" | |||
android:text="(秒)" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_positive_timing" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="正计时" /> | |||
<RadioButton | |||
android:id="@+id/rb_negative_timing" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="倒计时" /> | |||
</RadioGroup> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_timing_start" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="计时" /> | |||
<RadioButton | |||
android:id="@+id/rb_timing_pause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停" /> | |||
<RadioButton | |||
android:id="@+id/rb_timing_reset" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="重置" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_callback_timing" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP回复计时功能" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_callback_timing_success" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="成功" /> | |||
<RadioButton | |||
android:id="@+id/rb_callback_timing_fail" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="失败" /> | |||
<RadioButton | |||
android:id="@+id/rb_callback_timing_not_support" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="不支持" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_alert" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="报警设置指令" /> | |||
<EditText | |||
android:id="@+id/et_alert" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:inputType="number" | |||
android:text="5" /> | |||
<TextView | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="3" | |||
android:text="(秒)" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_alert_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="关闭(默认)" /> | |||
<RadioButton | |||
android:id="@+id/rb_alert_open" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="打开" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_callback_alert" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP回复报警设置" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_callback_alert_success" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="成功" /> | |||
<RadioButton | |||
android:id="@+id/rb_callback_alert_fail" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="失败" /> | |||
<RadioButton | |||
android:id="@+id/rb_callback_alert_not_support" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="不支持" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="vertical"> | |||
<Button | |||
android:id="@+id/btn_stop_alert" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="停止报警指令" /> | |||
<Button | |||
android:id="@+id/btn_callback_stop_alert" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP回复停止报警" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_callback_stop_alert_success" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="成功" /> | |||
<RadioButton | |||
android:id="@+id/rb_callback_stop_alert_fail" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="失败" /> | |||
<RadioButton | |||
android:id="@+id/rb_callback_stop_alert_not_support" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="不支持" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="vertical"> | |||
<Button | |||
android:id="@+id/btn_brew_mode" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP设置冲煮模式" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_brew_mode_enter" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="进入冲煮模式" /> | |||
<RadioButton | |||
android:id="@+id/rb_brew_mode_exit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="退出冲煮模式" /> | |||
</RadioGroup> | |||
</LinearLayout> | |||
</ScrollView> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1dp" | |||
android:background="?android:attr/listDivider" /> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" /> | |||
</LinearLayout> |
@@ -0,0 +1,136 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_get_connect_number" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="连接个数" /> | |||
<Button | |||
android:id="@+id/btn_connect_info_list" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="连接的信息列表" /> | |||
<EditText | |||
android:id="@+id/et_send_data" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="10dp" | |||
android:text="123" | |||
android:textSize="18dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_device_id_0" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0" /> | |||
<Button | |||
android:id="@+id/btn_device_id_1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="1" /> | |||
<Button | |||
android:id="@+id/btn_device_id_2" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="2" /> | |||
<Button | |||
android:id="@+id/btn_device_id_3" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="3" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_device_id_4" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="4" /> | |||
<Button | |||
android:id="@+id/btn_device_id_5" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="5" /> | |||
<Button | |||
android:id="@+id/btn_device_id_6" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="6" /> | |||
<Button | |||
android:id="@+id/btn_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" | |||
/> | |||
</LinearLayout> | |||
<androidx.recyclerview.widget.RecyclerView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
/> | |||
<LinearLayout | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_scan_ble" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="扫描设备" | |||
/> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_marginTop="10dp" | |||
android:layout_weight="1" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll" | |||
> | |||
</ListView> | |||
</LinearLayout> |
@@ -0,0 +1,59 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:gravity="center_vertical" | |||
> | |||
<Button | |||
android:id="@+id/btn_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" | |||
/> | |||
<Button | |||
android:id="@+id/btn_scan_ble" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="扫描设备" | |||
/> | |||
<TextView | |||
android:id="@+id/tv_status" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="" | |||
/> | |||
</LinearLayout> | |||
<androidx.recyclerview.widget.RecyclerView | |||
android:id="@+id/rv_device" | |||
android:layout_width="match_parent" | |||
android:layout_height="300dp" | |||
/> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_marginTop="10dp" | |||
android:layout_weight="1" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll" | |||
> | |||
</ListView> | |||
</LinearLayout> |
@@ -0,0 +1,403 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical"> | |||
<Button | |||
android:id="@+id/btn_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空列表" /> | |||
<Button | |||
android:id="@+id/btn_get_device" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP获取设备信息" /> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<Button | |||
android:id="@+id/btn_set_temp_unit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发温度单位" /> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_set_c" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="℃" /> | |||
<RadioButton | |||
android:id="@+id/rb_set_f" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="℉" /> | |||
</RadioGroup> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_stop_alert" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP取消报警" /> | |||
<Spinner | |||
android:id="@+id/sp_stop_alert" | |||
android:layout_width="wrap_content" | |||
android:entries="@array/food_temp_probe" | |||
android:layout_height="wrap_content" /> | |||
</LinearLayout> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_target" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发目标温度" /> | |||
<Spinner | |||
android:id="@+id/sp_set_target" | |||
android:layout_width="wrap_content" | |||
android:entries="@array/food_temp_probe" | |||
android:layout_height="wrap_content" /> | |||
<EditText | |||
android:id="@+id/et_set_target" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:inputType="number" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<RadioGroup | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_set_target_c" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="℃" /> | |||
<RadioButton | |||
android:id="@+id/rb_set_target_f" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="℉" /> | |||
</RadioGroup> | |||
</LinearLayout> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_timing" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发定时" /> | |||
<Spinner | |||
android:id="@+id/sp_set_timing" | |||
android:layout_width="wrap_content" | |||
android:entries="@array/food_temp_probe" | |||
android:layout_height="wrap_content" /> | |||
<EditText | |||
android:id="@+id/et_set_timing" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:inputType="number" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginEnd="5dp" | |||
android:text="min" /> | |||
</LinearLayout> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<Button | |||
android:id="@+id/btn_open_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发设备开关机" /> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_open" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="开机" /> | |||
<RadioButton | |||
android:id="@+id/rb_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关机" /> | |||
</RadioGroup> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<Button | |||
android:id="@+id/btn_sync_time" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP同步时间" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="年" /> | |||
<EditText | |||
android:id="@+id/et_year" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="月" /> | |||
<EditText | |||
android:id="@+id/et_month" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="日" /> | |||
<EditText | |||
android:id="@+id/et_day" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="时" /> | |||
<EditText | |||
android:id="@+id/et_hour" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="分" /> | |||
<EditText | |||
android:id="@+id/et_minute" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="秒" /> | |||
<EditText | |||
android:id="@+id/et_second" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:text="星期" /> | |||
<EditText | |||
android:id="@+id/et_week" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="5dp" | |||
android:inputType="number" /> | |||
</LinearLayout> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1px" | |||
android:background="@android:color/darker_gray" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_open_close_probe" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP下发探针开关机" /> | |||
<Spinner | |||
android:id="@+id/sp_open_close_probe" | |||
android:layout_width="wrap_content" | |||
android:entries="@array/food_temp_probe" | |||
android:layout_height="wrap_content" /> | |||
</LinearLayout> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_open_probe" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="开机" /> | |||
<RadioButton | |||
android:id="@+id/rb_close_probe" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关机" /> | |||
</RadioGroup> | |||
</LinearLayout> | |||
</ScrollView> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1dp" | |||
android:background="?android:attr/listDivider" /> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" | |||
android:background="@android:color/white" /> | |||
</LinearLayout> |
@@ -225,7 +225,7 @@ | |||
android:text="靠近报警阀值:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar1" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" | |||
@@ -255,7 +255,7 @@ | |||
android:text="接收的阀值次数:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar2" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" | |||
@@ -285,7 +285,7 @@ | |||
android:text="脱离报警时间:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar3" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" | |||
@@ -315,7 +315,7 @@ | |||
android:text="脱离报警次数:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar4" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" | |||
@@ -344,7 +344,7 @@ | |||
android:text="Gsensor灵敏度:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar5" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" | |||
@@ -374,7 +374,7 @@ | |||
android:text="Gsensor不动的脱机时间:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar6" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" | |||
@@ -404,7 +404,7 @@ | |||
android:text="马达震动时间:" | |||
/> | |||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||
<com.pinwang.ailinkblesdk.view.SeekBarMin | |||
android:id="@+id/seekBar7" | |||
style="@style/Widget.AppCompat.SeekBar" | |||
android:layout_width="0dp" |
@@ -25,6 +25,20 @@ | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<EditText | |||
android:id="@+id/et_type" | |||
android:layout_width="200dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:text="4" | |||
/> | |||
<Button | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="发送" | |||
/> | |||
<Button | |||
android:id="@+id/clear" |
@@ -0,0 +1,180 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout | |||
xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/kg" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="kg" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/jin" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="斤" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/st_lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="ST:LB" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="lb" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/cm" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="cm" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/inch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="inch" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/ft_in" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="ft-in" | |||
android:textAllCaps="false" /> | |||
<TextView | |||
android:layout_gravity="top" | |||
android:gravity="top" | |||
android:id="@+id/text" | |||
android:text="体重单位:kg \n身高单位:cm, \n模式 身高体脂模式" | |||
android:layout_width="match_parent" | |||
android:layout_height="60dp"/> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/deviceStatus" | |||
android:text="获取设备状态" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content"/> | |||
<Button | |||
android:id="@+id/bodyfat" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="身高体脂模式" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="体重模式" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/baby" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="抱婴模式" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/voice_status" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="获取声音状态" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/voice_open" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="声音开" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/voice_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="声音关" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/height_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="体重身高模式" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/girl" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="女,18岁,165cm" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/man" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="男,28岁,170cm" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/finish" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="回复测量完成" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/listView" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent"/> | |||
</LinearLayout> |
@@ -12,191 +12,313 @@ | |||
android:padding="10dp" | |||
android:text="@string/version" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
<Button | |||
android:id="@+id/btn_sphy" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/sphygmometer" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_tempgun" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/forehead_gun" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_temp" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/thermometer" | |||
android:textSize="12dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
<Button | |||
android:id="@+id/btn_height" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/height_meter" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_smart_mask" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/smart_mask" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_baby" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/baby_scale" | |||
android:textSize="12dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
<Button | |||
android:id="@+id/btn_baby_body_fat" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/baby_body_fat_scale" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_broadcast_scale" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/broadcast_scale" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_broadcast_blood_oxygen" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/oximeter" | |||
android:textSize="12dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
<Button | |||
android:id="@+id/btn_wifi_ble_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/wifi_ble_weight_scale" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_ble_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/ble_body_fat_scale" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_wifi_ble_tooth" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/wifi_ble_toothbrush" | |||
android:textSize="12dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
android:layout_height="match_parent"> | |||
<Button | |||
android:id="@+id/btn_ble" | |||
android:layout_width="wrap_content" | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:text="@string/general_settings" | |||
android:textSize="12dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
android:orientation="vertical" | |||
android:padding="5dp"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_clear_shake_hands" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="不握手不加密" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_sphy" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="血压计" /> | |||
<Button | |||
android:id="@+id/btn_tempgun" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="额温枪" /> | |||
<Button | |||
android:id="@+id/btn_temp" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="体温计" /> | |||
<Button | |||
android:id="@+id/btn_baby" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="婴儿秤" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_height" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="身高仪" /> | |||
<Button | |||
android:id="@+id/btn_lock" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="电子锁" /> | |||
<Button | |||
android:id="@+id/wifi_config" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/device_wifi_config" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/eight_scale" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/eight_scale" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btn_ad_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="艾迪体脂秤" /> | |||
<Button | |||
android:id="@+id/btn_smart_mask" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="口罩" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_baby_body_fat" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="婴儿体脂两用秤" /> | |||
<Button | |||
android:id="@+id/btn_broadcast_scale" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="广播秤" /> | |||
<Button | |||
android:id="@+id/glucometer" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/blood_glucose_meter" | |||
android:textSize="12dp" /> | |||
</LinearLayout> | |||
<Button | |||
android:id="@+id/btn_broadcast_blood_oxygen" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="血氧仪" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_wifi_ble_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="WiFi+Ble体脂秤" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="10dp" | |||
android:gravity="center_vertical"> | |||
<Button | |||
android:id="@+id/btn_ble_weight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Ble体脂秤" /> | |||
<Button | |||
android:id="@+id/btn_wifi_ble_tooth" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="牙刷(wifi+ble)" /> | |||
</LinearLayout> | |||
<Button | |||
android:id="@+id/btn_ota" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/ota_general" | |||
android:textSize="12dp" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ble" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Ble通用设置" /> | |||
<Button | |||
android:id="@+id/btn_ble_test" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="BleTest" | |||
/> | |||
<Button | |||
android:id="@+id/btn_transmission" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/penetrate" | |||
android:textSize="12dp" /> | |||
<Button | |||
android:id="@+id/btnConnectTest" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="BleConnectTest" | |||
/> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/wifi_config" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="WIFI设备(配置wifi)" /> | |||
<Button | |||
android:id="@+id/eight_scale" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="八极秤" /> | |||
<Button | |||
android:id="@+id/glucometer" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="血糖仪" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ota" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="OTA通用" /> | |||
<Button | |||
android:id="@+id/btn_transmission" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="透传" /> | |||
<Button | |||
android:id="@+id/btn_bld" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="百利达" | |||
android:visibility="gone" /> | |||
<Button | |||
android:id="@+id/btn_bleBo" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="血氧(连接)" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_coffeeScale" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="咖啡秤" /> | |||
<Button | |||
android:id="@+id/btn_scooter" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="电滑板" /> | |||
<Button | |||
android:id="@+id/btn_shareCharger" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="共享充电器" /> | |||
<Button | |||
android:id="@+id/btn_share_socket" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="共享插座" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_broadcast_height" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="广播身高仪" /> | |||
<Button | |||
android:id="@+id/btn_hbfs" | |||
android:text="身高体脂秤" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content"/> | |||
<Button | |||
android:id="@+id/btn_find" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="寻物器" /> | |||
<Button | |||
android:id="@+id/btn_4g_bs" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="4G血糖仪" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_food_temp" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="食品温度计" /> | |||
<Button | |||
android:id="@+id/btn_temp_humidity" | |||
android:text="温湿度计" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content"/> | |||
<Button | |||
android:id="@+id/btn_share_condom" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="共享套套机" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> | |||
</LinearLayout> | |||
</LinearLayout> |
@@ -0,0 +1,136 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical"> | |||
<Button | |||
android:id="@+id/btn_set" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP设置充电时间" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_hour" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="23" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_hour" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0时" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_minute" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="59" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_minute" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0分" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_second" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="58" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_second" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="1秒" /> | |||
</LinearLayout> | |||
<Button | |||
android:id="@+id/btn_get" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP获取剩余充电时间" /> | |||
<Button | |||
android:id="@+id/btn_switch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP切换开关" /> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_open" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="开" /> | |||
<RadioButton | |||
android:id="@+id/rb_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关" /> | |||
</RadioGroup> | |||
</LinearLayout> | |||
</ScrollView> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1dp" | |||
android:background="?android:attr/listDivider" /> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" /> | |||
</LinearLayout> |
@@ -0,0 +1,167 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical"> | |||
<Button | |||
android:id="@+id/btn_set" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP设置充电时间" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_hour" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="23" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_hour" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0时" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_minute" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="59" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_minute" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0分" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_second" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="58" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_second" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="1秒" /> | |||
</LinearLayout> | |||
<Button | |||
android:id="@+id/btn_get" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP获取剩余充电时间" /> | |||
<TextView | |||
android:id="@+id/tv_time" | |||
android:text="" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" /> | |||
<Button | |||
android:id="@+id/btn_switch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP切换开关" /> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_open" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="开" /> | |||
<RadioButton | |||
android:id="@+id/rb_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关" /> | |||
</RadioGroup> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_out" | |||
android:text="出仓" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" /> | |||
<Button | |||
android:id="@+id/btn_recycle" | |||
android:text="回收" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" /> | |||
<Button | |||
android:id="@+id/btn_open" | |||
android:text="打开补仓门" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1dp" | |||
android:background="?android:attr/listDivider" /> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" /> | |||
</LinearLayout> |
@@ -0,0 +1,188 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="50dp" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="插座编号" /> | |||
<Spinner | |||
android:id="@+id/sp" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:entries="@array/share_socket_id" /> | |||
</LinearLayout> | |||
<Button | |||
android:id="@+id/btn_set" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP设置充电时间" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_hour" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="23" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_hour" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0时" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_minute" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="59" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_minute" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0分" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<SeekBar | |||
android:id="@+id/seek_second" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:max="58" | |||
android:progress="0" /> | |||
<TextView | |||
android:id="@+id/tv_second" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="1秒" /> | |||
</LinearLayout> | |||
<TextView | |||
android:id="@+id/tv_timing_0" | |||
android:layout_width="wrap_content" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:text="编号0计时:" /> | |||
<TextView | |||
android:id="@+id/tv_timing_1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="30dp" | |||
android:gravity="center" | |||
android:text="编号1计时:" /> | |||
<Button | |||
android:id="@+id/btn_get" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP获取剩余充电时间" /> | |||
<Button | |||
android:id="@+id/btn_switch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="APP切换开关" /> | |||
<RadioGroup | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_open" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="开" /> | |||
<RadioButton | |||
android:id="@+id/rb_close" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关" /> | |||
</RadioGroup> | |||
<Button | |||
android:id="@+id/btn_version" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="APP获取设备版本号" /> | |||
<Button | |||
android:id="@+id/btn_test" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="开始性能测试" /> | |||
<TextView | |||
android:id="@+id/tv_test" | |||
android:layout_width="match_parent" | |||
android:layout_height="350dp" /> | |||
</LinearLayout> | |||
</ScrollView> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1dp" | |||
android:background="?android:attr/listDivider" /> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" /> | |||
</LinearLayout> |
@@ -1,37 +1,34 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:orientation="vertical" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:focusable="true" | |||
android:focusableInTouchMode="true" | |||
> | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:focusable="true" | |||
android:focusableInTouchMode="true" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<Button | |||
android:id="@+id/btn" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/search" | |||
/> | |||
android:id="@+id/btn" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/search" /> | |||
<Button | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/stop" | |||
/> | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/stop" /> | |||
<Button | |||
android:id="@+id/clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/clear" | |||
/> | |||
android:id="@+id/clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/clear" | |||
/> | |||
</LinearLayout> | |||
@@ -40,28 +37,44 @@ | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
android:padding="5dp"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="名字:" /> | |||
<EditText | |||
android:id="@+id/et_filter_name" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:padding="5dp" | |||
android:text="AiLink" /> | |||
<Button | |||
android:id="@+id/filter" | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/filter" | |||
/> | |||
android:text="mac:" /> | |||
<EditText | |||
android:id="@+id/et_filter_mac" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1.5" | |||
android:digits="0123456789abcdefABCDEF" | |||
android:padding="5dp" | |||
android:text="" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/listview" | |||
android:layout_width="match_parent" | |||
android:padding="10dp" | |||
android:layout_height="match_parent" | |||
> | |||
android:id="@+id/listview" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:padding="10dp"> | |||
</ListView> |
@@ -0,0 +1,648 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" | |||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||
xmlns:tools="http://schemas.android.com/tools" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:gravity="center_horizontal" | |||
android:orientation="vertical" | |||
tools:context=".MainActivity"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:id="@+id/ll_one" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> | |||
<Button | |||
android:id="@+id/btn_connect" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="连接" /> | |||
<Button | |||
android:id="@+id/btn_disconnect" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="断开" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:id="@+id/ll_two" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_heartbeat" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="心跳" /> | |||
<Button | |||
android:id="@+id/btn_open_light" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="开灯" /> | |||
<Button | |||
android:id="@+id/btn_close_light" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关灯" /> | |||
<Button | |||
android:id="@+id/btn_time" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="时间" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:id="@+id/ll_three" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_start_boost" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="助力" /> | |||
<Button | |||
android:id="@+id/btn_start_no_boost" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="非助力" /> | |||
<Button | |||
android:id="@+id/btn_set_unit_km" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="公里" /> | |||
<Button | |||
android:id="@+id/btn_set_unit_mi" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="英里" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:id="@+id/ll_four" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_zero_start" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="0启动" /> | |||
<Button | |||
android:id="@+id/btn_no_zero_start" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="非0启动" /> | |||
<Button | |||
android:id="@+id/btn_constant_speed" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="定速" /> | |||
<Button | |||
android:id="@+id/btn_no_constant_speed" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="不定速" /> | |||
<Button | |||
android:id="@+id/btn_reset" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:visibility="gone" | |||
android:text="清空所有数据" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:id="@+id/ll_five" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_reset_device" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="恢复出厂设置" /> | |||
<Button | |||
android:id="@+id/btn_reset_mileage" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空里程" /> | |||
<Button | |||
android:id="@+id/btn_reset_time" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空时间" /> | |||
<Button | |||
android:id="@+id/btn_set_auto_shutdown_time" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="自动关机时间" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<EditText | |||
android:id="@+id/et_old_pwd" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:digits="0123456789" | |||
android:hint="oldPwd" | |||
android:maxLength="6" | |||
android:text="123456" /> | |||
<EditText | |||
android:id="@+id/et_new_pwd" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:digits="0123456789" | |||
android:hint="newPwd" | |||
android:maxLength="6" | |||
android:text="123456" /> | |||
<Button | |||
android:id="@+id/btn_setLockCarPassword" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="修改密码" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_read_auto_shutdown_time" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读自动关机时间" /> | |||
<Button | |||
android:id="@+id/btn_gear_speed" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设置档位速度" /> | |||
<Button | |||
android:id="@+id/btn_setMeterBackLight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设置背光" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_setControllerTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设置控制器的实时时间" /> | |||
<Button | |||
android:id="@+id/btn_readControllerTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读取控制器的时间" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_readControllerSingleMileage" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读取控制器单次行驶里程" /> | |||
<Button | |||
android:id="@+id/btn_readControllerAllMileage" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读取控制器总行驶里程" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_readControllerTemp" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读取控制器温度" /> | |||
<Button | |||
android:id="@+id/btn_readControllerDrivingCurrent" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读取控制器行驶电流" /> | |||
<Button | |||
android:id="@+id/btn_readControllerVoltage" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读电压" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_readAllPower" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读总容量" /> | |||
<Button | |||
android:id="@+id/btn_readLastPower" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读剩余容量" /> | |||
<Button | |||
android:id="@+id/btn_readBatteryDischargeNumber" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读充放电次数" /> | |||
<Button | |||
android:id="@+id/btn_readBatteryCode" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读电池信息" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_readCompanyVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读版本" /> | |||
<Button | |||
android:id="@+id/btn_readMotorPulse" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读电机脉冲" /> | |||
<Button | |||
android:id="@+id/btn_readMotorPulseInterval" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读电机脉冲间隔" /> | |||
<Button | |||
android:id="@+id/btn_readMotorParameter" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读电机参数" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_readWheelSize" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读车轮尺寸" /> | |||
<Button | |||
android:id="@+id/btn_readFlashDataVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读FLASH版本" /> | |||
<Button | |||
android:id="@+id/btn_readBootloaderVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读Boot版本" /> | |||
<Button | |||
android:id="@+id/btn_readMeterBackLight" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读背光亮度" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_setAutoNightMode" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="夜间模式" /> | |||
<Button | |||
android:id="@+id/btn_readNightMode" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读夜间模式" /> | |||
<Button | |||
android:id="@+id/btn_setCallPhone" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="来电" /> | |||
<Button | |||
android:id="@+id/btn_setSMSData" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="短信" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_setSoftwareData" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空消息" /> | |||
<Button | |||
android:id="@+id/btn_readBlePassword" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="密码查询" /> | |||
<Button | |||
android:id="@+id/btn_setNavigationMessage" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="导航推送" /> | |||
<Button | |||
android:id="@+id/btn_setResetCmd" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="重置指令" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_setLockCar" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="锁车/解锁" /> | |||
<Button | |||
android:id="@+id/btn_readServicePassword" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="售后密码" /> | |||
<Button | |||
android:id="@+id/btn_setWeather" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="天气信息推送" /> | |||
<Button | |||
android:id="@+id/btn_update_conditions" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="升级条件" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_setDeviceLanguage" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设置语言" /> | |||
<Button | |||
android:id="@+id/btn_getDeviceImageFontVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读字库版本" /> | |||
<Button | |||
android:id="@+id/btn_getControllerVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读控制器版本" /> | |||
<Button | |||
android:id="@+id/btn_getTpVersion" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读TP版本" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_setPair" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="配对" /> | |||
<Button | |||
android:id="@+id/btn_checkPwd" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="验证密码" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ota_boot" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="表头boot" /> | |||
<Button | |||
android:id="@+id/btn_ota_app" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="表头APP" /> | |||
<Button | |||
android:id="@+id/btn_ota_flash" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="表头flash" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ota_app_controller" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="控制器APP" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ota_type" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="静默升级" /> | |||
<Button | |||
android:id="@+id/btn_ble" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="BLE_OTA" /> | |||
<Button | |||
android:id="@+id/btn_ble_version" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="Ble_V" /> | |||
<EditText | |||
android:id="@+id/et_ble_ota_step" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" | |||
android:text="" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_get_test_status" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读测试状态" /> | |||
<Button | |||
android:id="@+id/btn_go_setProductionTest" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="进入整机测试" /> | |||
<Button | |||
android:id="@+id/btn_exit_setProductionTest" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="退出整机测试" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> | |||
<ListView | |||
android:id="@+id/listviewData" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll"> | |||
</ListView> | |||
</androidx.appcompat.widget.LinearLayoutCompat> |
@@ -0,0 +1,104 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" | |||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||
xmlns:tools="http://schemas.android.com/tools" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:gravity="center_horizontal" | |||
android:orientation="vertical" | |||
tools:context=".MainActivity"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:paddingBottom="10dp" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:id="@+id/ll_two" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal" | |||
android:gravity="center_vertical" | |||
> | |||
<Button | |||
android:id="@+id/btn_open_light" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/open_light" /> | |||
<Button | |||
android:id="@+id/btn_close_light" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/close_light" /> | |||
<TextView | |||
android:id="@+id/tv_ota_version" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="v" | |||
/> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ota_app" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:layout_weight="1" | |||
android:text="@string/upgrade_watch" /> | |||
<Button | |||
android:id="@+id/btn_check_version" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:layout_marginTop="10dp" | |||
/> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btn_ota_app_controller" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:layout_weight="1" | |||
android:text="@string/upgrade_controller" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> | |||
<ListView | |||
android:id="@+id/listviewData" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll"> | |||
</ListView> | |||
</androidx.appcompat.widget.LinearLayoutCompat> |
@@ -7,7 +7,7 @@ | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="0.5"> | |||
android:layout_weight="0.39"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
@@ -18,7 +18,7 @@ | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
> | |||
<Button | |||
android:id="@+id/clear" | |||
@@ -33,15 +33,25 @@ | |||
android:layout_height="wrap_content" | |||
android:text="获取版本" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/get_AIQ" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="IAQ数据" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/close_power" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="关闭电源" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
> | |||
<Button | |||
@@ -64,6 +74,27 @@ | |||
android:layout_height="wrap_content" | |||
android:text="风扇控制" | |||
android:textAllCaps="false" /> | |||
<Button | |||
android:id="@+id/set_mode" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="测试模式" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
> | |||
<Button | |||
android:id="@+id/set_payload" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="显示payload" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
@@ -25,12 +25,26 @@ | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<EditText | |||
android:id="@+id/et_type" | |||
android:layout_width="200dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:text="4" | |||
/> | |||
<Button | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="发送" | |||
/> | |||
<Button | |||
android:id="@+id/clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/clear" | |||
android:text="清空" | |||
/> | |||
</LinearLayout> | |||
@@ -25,7 +25,20 @@ | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<EditText | |||
android:id="@+id/et_type" | |||
android:layout_width="200dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:text="4" | |||
/> | |||
<Button | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="发送" | |||
/> | |||
<Button | |||
android:id="@+id/clear" |
@@ -25,6 +25,21 @@ | |||
android:layout_height="wrap_content" | |||
android:padding="10dp"> | |||
<EditText | |||
android:id="@+id/et_type" | |||
android:layout_width="200dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:text="4" | |||
/> | |||
<Button | |||
android:id="@+id/btn1" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="发送" | |||
/> | |||
<Button | |||
android:id="@+id/clear" | |||
android:layout_width="wrap_content" |