@@ -1,12 +1,12 @@ | |||
apply plugin: 'com.android.application' | |||
apply plugin: 'com.jakewharton.butterknife' | |||
android { | |||
compileSdkVersion 33 | |||
compileSdkVersion 34 | |||
defaultConfig { | |||
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | |||
minSdkVersion 21 | |||
targetSdkVersion 33 | |||
versionName "1.11.14" | |||
targetSdkVersion 34 | |||
versionName "1.15.05" | |||
versionCode getVersionCodeNumber(versionName) | |||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||
} | |||
@@ -18,8 +18,8 @@ android { | |||
} | |||
compileOptions { | |||
sourceCompatibility '1.8' | |||
targetCompatibility '1.8' | |||
sourceCompatibility JavaVersion.VERSION_1_8 | |||
targetCompatibility JavaVersion.VERSION_1_8 | |||
} | |||
repositories { | |||
@@ -66,10 +66,10 @@ dependencies { | |||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4' | |||
implementation 'androidx.cardview:cardview:1.0.0' | |||
testImplementation 'junit:junit:4.12' | |||
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.6'//蓝牙核心库 | |||
//OTA库,需要依赖核心库 | |||
// implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.1.6' | |||
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.4'//蓝牙解析库 | |||
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.17'//蓝牙核心库 | |||
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.6'//蓝牙解析库,需要依赖核心库 | |||
implementation 'com.github.elinkthings:AILinkMqttRepositoryAndroid:1.2.0'//MQTT库 | |||
implementation 'androidx.recyclerview:recyclerview:1.3.2' | |||
implementation 'com.jakewharton:butterknife:10.2.3' | |||
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' |
@@ -45,6 +45,7 @@ | |||
<activity android:name=".ClearShakeHandsActivity" /> | |||
<activity android:name=".ShowBleActivity" /> | |||
<activity android:name=".BabyCmdActivity" /> | |||
<activity android:name=".TempGunCmdActivity" /> | |||
@@ -57,9 +58,10 @@ | |||
<activity android:name=".ConnectBleTestActivity" /> | |||
<activity android:name=".ADWeightScaleCmdActivity" /> | |||
<activity android:name=".ADWeightScaleUserActivity" /> | |||
<activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" /> | |||
<activity android:name=".WeightScaleBleActivity" /> | |||
<activity android:name=".WifiConfigActivity" /> | |||
<activity android:name=".EightBodyfatActivity" /> | |||
<activity android:name=".modules.eight_bodyfat.EightBodyfatActivity" /> | |||
<activity android:name=".modules.blood_glucose.BloodGlucoseActivity" /> | |||
<activity android:name=".BabyBodyFatCmdActivity" /> | |||
<activity android:name=".BroadcastScaleActivity" /> | |||
@@ -117,9 +119,16 @@ | |||
android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity" | |||
android:screenOrientation="portrait" /> | |||
<activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" /> | |||
<activity android:name=".modules.wifi_ble_scale.WeightScaleWifiBleActivity" /> | |||
<activity android:name=".modules.BleDemoActivity" /> | |||
<activity android:name=".modules.PublicWifiBleOtaActivity" /> | |||
<activity android:name=".modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity" /> | |||
<activity android:name=".modules.PublicMqttActivity" /> | |||
<activity | |||
android:name=".modules.bw05watch.Bw05WatchActivity" | |||
android:screenOrientation="portrait" /> | |||
<activity android:name=".modules.ble_nutrition.BleNutritionNutrientActivity" /> | |||
<activity android:name=".modules.eight_bodyfat.EightBodyFatMcuActivity" /> | |||
<activity android:name=".modules.gasDetector.GasDetectorActivity" /> | |||
<provider | |||
android:name="androidx.core.content.FileProvider" | |||
@@ -130,7 +139,11 @@ | |||
android:name="android.support.FILE_PROVIDER_PATHS" | |||
android:resource="@xml/file_paths" /> | |||
</provider> | |||
<service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"/> | |||
<service | |||
android:name="org.eclipse.paho.android.service.MqttService" | |||
android:enabled="true" | |||
android:exported="true"></service> | |||
</application> | |||
</manifest> |
@@ -19,7 +19,6 @@ import android.widget.Toast; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleBleConfig; | |||
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData; | |||
@@ -5,7 +5,6 @@ import android.view.View; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity; | |||
/** | |||
* xing<br> | |||
* 2022/4/6<br> |
@@ -27,7 +27,6 @@ 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.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleErrListener; | |||
@@ -122,7 +121,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
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.btnClearShakeHands).setOnClickListener(this); | |||
findViewById(R.id.btnPause).setOnClickListener(this); | |||
findViewById(R.id.btnHandshake).setOnClickListener(this); | |||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||
@@ -172,7 +171,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid)); | |||
addShowData("连接设备"); | |||
break; | |||
case R.id.btnClear: | |||
case R.id.btnClearShakeHands: | |||
if (mList != null) | |||
mList.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
@@ -247,11 +246,16 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
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); | |||
try { | |||
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||
sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||
sendData(sendBleBean); | |||
} catch (NumberFormatException e) { | |||
e.printStackTrace(); | |||
Toast.makeText(this, "请输入正确的广播时间", Toast.LENGTH_SHORT).show(); | |||
} | |||
break; | |||
case R.id.btnDidRead: | |||
@@ -369,7 +373,6 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
public void onServiceSuccess() { | |||
addShowData("服务与界面建立连接成功"); | |||
CallbackDisIm.getInstance().addListListener(this); | |||
mAILinkBleManager.setOnCallbackBle(this); | |||
mAILinkBleManager.deviceConnectListener(mAddress, true); | |||
connectSuccess(); | |||
@@ -416,7 +419,6 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
@Override | |||
public void unbindServices() { | |||
CallbackDisIm.getInstance().removeListener(this); | |||
mAILinkBleManager.disconnectAll(); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.removeOnCallbackBle(this); | |||
@@ -436,7 +438,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
@Override | |||
public void onDisConnected(@NonNull String mac, int code) { | |||
//TODO 连接断开 | |||
L.iw(TAG, "连接断开"); | |||
L.i( "连接断开"); | |||
if (mAddress.equals(mac)) { | |||
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||
mBleDevice = null; | |||
@@ -621,7 +623,9 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
@Override | |||
public void onBleBroadcastTime(int time) { | |||
addShowData("广播间隔:" + time); | |||
if (etBroadcastTime != null) { | |||
etBroadcastTime.setText(String.valueOf(time)); | |||
} | |||
} | |||
@Override | |||
@@ -701,7 +705,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
"\n设备版本:" + mDeviceVersion + | |||
"\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) + | |||
"\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() + | |||
"\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString()+ | |||
"\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString() + | |||
"\n手机电量:" + systemBattery; | |||
L.iw(appData); | |||
@@ -195,7 +195,7 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall | |||
//与服务建立连接 | |||
mDevice = BroadcastScaleDeviceData.getInstance(); | |||
mDevice.setOnNotifyData(this); | |||
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(this); | |||
AILinkBleManager.getInstance().addOnBleBroadcastDataListener(this); | |||
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
} | |||
@@ -211,6 +211,7 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall | |||
mDevice.clear(); | |||
mDevice = null; | |||
} | |||
AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this); | |||
} | |||
@@ -52,8 +52,9 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
private BleDevice mBleDevice; | |||
private String mAddress; | |||
private BleSendCmdUtil mBleSendCmdUtil; | |||
private int type=0x01; | |||
private int mCid = 0x01; | |||
private byte unit = 0; | |||
private boolean mPauseRefresh = false; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
@@ -74,7 +75,7 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
setContentView(R.layout.activity_clear_shake_hands); | |||
mContext = this; | |||
mAddress = getIntent().getStringExtra("mac"); | |||
type = getIntent().getIntExtra("type", -1); | |||
mCid = getIntent().getIntExtra("cid", -1); | |||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
init(); | |||
@@ -86,9 +87,11 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
listView.setAdapter(listAdapter); | |||
findViewById(R.id.btnPause).setOnClickListener(this); | |||
findViewById(R.id.btn_set_unit).setOnClickListener(this); | |||
findViewById(R.id.btn1).setOnClickListener(this); | |||
findViewById(R.id.clear).setOnClickListener(this); | |||
findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||
et_type = findViewById(R.id.et_type); | |||
} | |||
@@ -107,17 +110,21 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
} | |||
break; | |||
case R.id.btnPause: | |||
mPauseRefresh = !mPauseRefresh; | |||
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){ | |||
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; | |||
bytes[i >> 1] = (byte) i1; | |||
} | |||
SendMcuBean sendDataBean = new SendMcuBean(); | |||
sendDataBean.setHex(type,bytes); | |||
sendDataBean.setHex(mCid, bytes); | |||
mBleDevice.sendData(sendDataBean); | |||
mList.add(TimeUtils.getTime() + "发送->" + BleStrUtils.byte2HexStr(bytes)); | |||
mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(bytes)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
case R.id.clear: | |||
@@ -125,6 +132,14 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
mList.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
case R.id.btnClearShakeHands: | |||
byte[] send = mBleSendCmdUtil.setClearShakeHands(); | |||
SendBleBean sendBleBean = new SendBleBean(); | |||
sendBleBean.setHex(send); | |||
mBleDevice.sendData(sendBleBean); | |||
mList.add(TimeUtils.getTime() + "发送(A6)->" + BleStrUtils.byte2HexStr(send)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
break; | |||
} | |||
} | |||
@@ -141,7 +156,7 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
data[1] = unit; | |||
sendMcuBean.setHex(0x01, data); | |||
mBleDevice.sendData(sendMcuBean); | |||
mList.add(TimeUtils.getTime() + "发送->" + BleStrUtils.byte2HexStr(data)); | |||
mList.add(TimeUtils.getTime() + "发送(A7)->" + BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -155,14 +170,13 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
//与服务建立连接 | |||
if (mAILinkBleManager != null) { | |||
mBleDevice = mAILinkBleManager.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); | |||
mBleDevice.sendData(new SendBleBean(mBleSendCmdUtil.getBleVersion())); | |||
} | |||
} | |||
@@ -228,25 +242,28 @@ public class ClearShakeHandsActivity extends BleBaseActivity implements OnCallba | |||
@Override | |||
public void onNotifyData(String uuid, byte[] hex, int type) { | |||
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(hex)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
addData("notify(A7)->" + BleStrUtils.byte2HexStr(hex)); | |||
} | |||
@Override | |||
public void onNotifyDataA6(byte[] hex) { | |||
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(hex)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
public void onNotifyDataA6(String uuid, byte[] hex) { | |||
addData("notify(A6)->" + BleStrUtils.byte2HexStr(hex)); | |||
} | |||
@Override | |||
public void onNotifyOtherData(byte[] data) { | |||
mList.add(TimeUtils.getTime() + "notify->" + BleStrUtils.byte2HexStr(data)); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
public void onNotifyOtherData(String uuid, byte[] data) { | |||
addData("notify(透传)->" + BleStrUtils.byte2HexStr(data)); | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
addData("版本号:" + version); | |||
} | |||
private void addData(String data) { | |||
if (mPauseRefresh) | |||
return; | |||
mList.add(TimeUtils.getTime() + "->" + data); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
@@ -26,12 +26,12 @@ 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.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | |||
@@ -60,7 +60,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@Override | |||
public void onServiceSuccess() { | |||
logList.add(0, "绑定服务成功"); | |||
addText(0, "绑定服务成功"); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.setOnCallbackBle(this); | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
@@ -81,7 +81,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@Override | |||
public void unbindServices() { | |||
if (mAILinkBleManager !=null) { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.removeOnCallbackBle(this); | |||
} | |||
} | |||
@@ -96,6 +96,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
listView = findViewById(R.id.listView); | |||
mMHandler = new WeakReference<>(new MHandler()).get(); | |||
findViewById(R.id.btnPause).setOnClickListener(this); | |||
findViewById(R.id.kg).setOnClickListener(this); | |||
findViewById(R.id.jin).setOnClickListener(this); | |||
findViewById(R.id.st_lb).setOnClickListener(this); | |||
@@ -143,8 +144,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mac.equals(mAddress)) { | |||
logList.add(0, "连接已经断开"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "连接已经断开"); | |||
} | |||
@@ -173,7 +173,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@Override | |||
public void onVersion(String version) { | |||
logList.add(0, "版本号:" + version); | |||
addText(0, "版本号:" + version); | |||
} | |||
@@ -197,7 +197,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
case HeightBodyFatBleUntils.MCU_SET_USER_RESULT: | |||
mMHandler.removeMessages(SETUSER); | |||
logList.add(0, "下发用户结果:" + resultStr); | |||
addText(0, "下发用户结果:" + resultStr); | |||
break; | |||
case HeightBodyFatBleUntils.MCU_SET_UNIT_RESULT: | |||
if (result == 0) { | |||
@@ -206,46 +206,45 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
if (currentHUnit == 0) { | |||
} | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
text.setText("体重单位: " + getWeightUnitStr(currentWUnit) + | |||
"\n身高单位: " + getHeightUnitStr(currentHUnit) + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
} | |||
mMHandler.removeMessages(SETUNIT); | |||
logList.add(0, "设置单位结果:" + resultStr); | |||
addText(0, "设置单位结果:" + resultStr); | |||
break; | |||
case HeightBodyFatBleUntils.MCU_SET_WORK_MODE_RESULT: | |||
if (result == 0) { | |||
currentMode = selectMode; | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
text.setText("体重单位: " + getWeightUnitStr(currentWUnit) + | |||
"\n身高单位: " + getHeightUnitStr(currentHUnit) + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
} | |||
mMHandler.removeMessages(SETMODE); | |||
logList.add(0, "设置工作模式:" + resultStr); | |||
addText(0, "设置工作模式:" + resultStr); | |||
break; | |||
case HeightBodyFatBleUntils.MUC_REQUEST_VOICE_SET_RESULT: | |||
if (result == 0) { | |||
currentVoice = selectVoice; | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
text.setText("体重单位: " + getWeightUnitStr(currentWUnit) + | |||
"\n身高单位: " + getHeightUnitStr(currentHUnit) + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
} | |||
mMHandler.removeMessages(VOICE); | |||
logList.add(0, "设置声音结果:" + resultStr); | |||
addText(0, "设置声音结果:" + resultStr); | |||
break; | |||
default:break; | |||
default: | |||
break; | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onMcuRequestUser() { | |||
logList.add(0, "请求下发用户,点击下发用户"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "请求下发用户,点击下发用户"); | |||
} | |||
@@ -259,17 +258,16 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
text.setText("体重单位: " + currentWUnit + | |||
"\n身高单位: " + currentHUnit + | |||
"\n模式:" + currentMode + " 声音: " + currentVoice); | |||
logList.add(0, "体重状态 模式:" + workMode + " 电池电量: " + battery + " 电池状态: " + batteryStatus | |||
+ "\n 体重单位: " + weightUnit + " 身高单位: " + heightUnit + " 声音状态: " + voice); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "体重状态 模式:" + workMode + " 电池电量: " + battery + " 电池状态: " + batteryStatus | |||
+ "\n 体重单位: " + getWeightUnitStr(weightUnit) + " 身高单位: " + getHeightUnitStr(heightUnit) + " 声音状态: " + voice); | |||
} | |||
@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(); | |||
addText(0, "体重体脂 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||
+ " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit)); | |||
if (weightMode == 2) { | |||
mMHandler.removeMessages(ADC); | |||
mMHandler.removeMessages(FINISH); | |||
@@ -281,9 +279,9 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@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(); | |||
addText(0, "抱婴体重 模式:" + workMode + " 测量状态:" + weightMode + " 成人体重:" + adultWeight + | |||
"\n 抱婴体重:" + adultBabyWeight + " 婴儿体重:" + babyWeight + " 小数位:" + decimals + " 单位" + getWeightUnitStr(unit)); | |||
if (weightMode == 2) { | |||
mMHandler.removeMessages(FINISH); | |||
@@ -295,14 +293,15 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@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(); | |||
addText(0, "体重 模式:" + workMode + " 测量状态: " + weightMode + "\n 体重: " + weight | |||
+ " 小数位: " + decimals + " 单位: " + getWeightUnitStr(unit)); | |||
if (weightMode == 2) { | |||
mMHandler.removeMessages(FINISH); | |||
mMHandler.sendEmptyMessageDelayed(FINISH, 40000); | |||
} | |||
if (mHeightBodyFatUser!=null) { | |||
if (mHeightBodyFatUser != null) { | |||
mHeightBodyFatUser.setWeight(weight); | |||
mHeightBodyFatUser.setDecimals(decimals); | |||
@@ -314,7 +313,7 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@Override | |||
public void onAdc(int workMode, int status, int adcType, long adc, int arithmetic) { | |||
mMHandler.removeMessages(ADC); | |||
logList.add(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType | |||
addText(0, "阻抗数据 模式:" + workMode + " 测量状态: " + status + "\n 阻抗类型: " + adcType | |||
+ " 阻抗: " + adc + " 算法位: " + arithmetic); | |||
// arithmetic | |||
@@ -326,55 +325,49 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
String weightToKg = AllUnitUtils.getWeightToKg(mHeightBodyFatUser.getUnit(), String.valueOf(mHeightBodyFatUser.getWeight()), mHeightBodyFatUser.getDecimals()); | |||
BodyFatData bodyFatData = AicareBleConfig.getBodyFatData(AlgorithmUtil.AlgorithmType.TYPE_AICARE, sex, mHeightBodyFatUser.getAge(), Double.parseDouble(weightToKg), | |||
mHeightBodyFatUser.getHeight(), mHeightBodyFatUser.getAdc()); | |||
logList.add( "体脂数据:" + "\n 体脂率: " + bodyFatData.getBfr() + " 皮下脂肪: " + bodyFatData.getSfr() + | |||
"\n 内脏脂肪: " + bodyFatData.getUvi() + " 肌肉率: " + bodyFatData.getRom() + | |||
"\n 基础代谢率: " + bodyFatData.getBmr() + " 身体年龄:" + bodyFatData.getBodyAge()+ | |||
"\n 水分: " + bodyFatData.getVwc() + " 蛋白率:" + bodyFatData.getPp()+ | |||
"\n BMI: " + bodyFatData.getBmi() + " 骨量:" + bodyFatData.getBm() | |||
); | |||
addText("体脂数据:" + "\n 体脂率: " + bodyFatData.getBfr() + " 皮下脂肪: " + bodyFatData.getSfr() + | |||
"\n 内脏脂肪: " + bodyFatData.getUvi() + " 肌肉率: " + bodyFatData.getRom() + | |||
"\n 基础代谢率: " + bodyFatData.getBmr() + " 身体年龄:" + bodyFatData.getBodyAge() + | |||
"\n 水分: " + bodyFatData.getVwc() + " 蛋白率:" + bodyFatData.getPp() + | |||
"\n BMI: " + bodyFatData.getBmi() + " 骨量:" + bodyFatData.getBm() | |||
); | |||
} | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
public void onHeart(int workMode, int status, int heart) { | |||
logList.add(0, "心率数据 模式:" + workMode + " 测量状态: " + status + " 心率: " + heart); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "心率数据 模式:" + workMode + " 测量状态: " + status + " 心率: " + heart); | |||
} | |||
@Override | |||
public void onTEMP(int workMode, int sign, int temp, int decimals, int unit) { | |||
logList.add(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "温度数据 模式:" + workMode + " 温度: " + temp + " 正负: " + sign + "小数 : " + decimals + " 单位 : " + unit); | |||
} | |||
@Override | |||
public void onHeight(int workMode, int height, int decimals, int unit) { | |||
logList.add(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + unit); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "身高数据 模式:" + workMode + " 身高: " + height + " 小数位: " + decimals + "单位 : " + getHeightUnitStr(unit)); | |||
} | |||
@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 | |||
addText(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 | |||
addText(0, "体脂数据 模式:" + workMode + " 骨量: " + bm + " 水分: " + water | |||
+ "\n 蛋白率: " + pp + " bmi: " + bmi + " 心率: " + heart + " \n肥胖等级" + obesityLevels); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
@@ -382,22 +375,19 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
@Override | |||
public void onVoice(int status) { | |||
mMHandler.removeMessages(VOICESTATUS); | |||
logList.add(0, "声音状态 模式:" + status); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "声音状态 模式:" + status); | |||
} | |||
@Override | |||
public void onFinish(int workMode) { | |||
logList.add(0, "测量完成 模式:" + workMode); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "测量完成 模式:" + workMode); | |||
mMHandler.removeMessages(FINISH); | |||
} | |||
@Override | |||
public void onError(int error) { | |||
logList.add(0, "错误码: " + error); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "错误码: " + error); | |||
} | |||
@Override | |||
@@ -407,48 +397,42 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
switch (v.getId()) { | |||
case R.id.kg: | |||
selectWUnit = 0; | |||
logList.add(0, "下发体重单位 :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
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(); | |||
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
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(); | |||
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
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)); | |||
addText(0, "下发体重单位 :" + getHeightUnitStr(currentHUnit)+","+getWeightUnitStr(selectWUnit)); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUnit(currentHUnit, currentHUnit)); | |||
mMHandler.removeMessages(SETUNIT); | |||
mMHandler.sendEmptyMessageDelayed(SETUNIT, 3000); | |||
break; | |||
case R.id.girl: | |||
logList.add(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
mHeightBodyFatUser=new HeightBodyFatUser(0,18,165,0,0); | |||
addText(0, "下用户 女 18岁 165cm :" + selectWUnit); | |||
mHeightBodyFatUser = new HeightBodyFatUser(0, 18, 165, 0, 0); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||
mMHandler.removeMessages(SETUSER); | |||
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
break; | |||
case R.id.man: | |||
logList.add(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
mHeightBodyFatUser=new HeightBodyFatUser(1,28,170,0,0); | |||
addText(0, "下用户 男 28岁 170cm :" + selectWUnit); | |||
mHeightBodyFatUser = new HeightBodyFatUser(1, 28, 170, 0, 0); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setUser(mHeightBodyFatUser.getSex(), mHeightBodyFatUser.getAge(), mHeightBodyFatUser.getHeight())); | |||
mMHandler.removeMessages(SETUSER); | |||
mMHandler.sendEmptyMessageDelayed(SETUSER, 3000); | |||
@@ -456,98 +440,93 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
break; | |||
case R.id.cm: | |||
selectHUnit = 0; | |||
logList.add(0, "下发身高单位 :" + selectHUnit); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||
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(); | |||
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||
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(); | |||
addText(0, "下发身高单位 :" + getHeightUnitStr(selectHUnit)+","+getWeightUnitStr(currentWUnit)); | |||
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(); | |||
addText(0, "下发工作模式 :" + selectMode); | |||
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(); | |||
addText(0, "下发工作模式 :" + selectMode); | |||
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(); | |||
addText(0, "下发工作模式 :" + selectMode); | |||
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(); | |||
addText(0, "下发工作模式 :" + selectMode); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setWorkMode(selectMode)); | |||
mMHandler.removeMessages(SETMODE); | |||
mMHandler.sendEmptyMessageDelayed(SETMODE, 3000); | |||
break; | |||
case R.id.deviceStatus: | |||
logList.add(0, "请求设备状态 :" ); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "请求设备状态 :"); | |||
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(); | |||
addText(0, "设置声音 :" + selectMode); | |||
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(); | |||
addText(0, "设置声音 :" + selectMode); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.setVoiceStatus(selectVoice)); | |||
mMHandler.removeMessages(VOICE); | |||
mMHandler.sendEmptyMessageDelayed(VOICE, 3000); | |||
break; | |||
case R.id.voice_status: | |||
logList.add(0, "获取声音状态"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "获取声音状态"); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.getVoiceStatus()); | |||
mMHandler.removeMessages(VOICESTATUS); | |||
mMHandler.sendEmptyMessageDelayed(VOICESTATUS, 3000); | |||
break; | |||
case R.id.finish: | |||
logList.add(0, "回复测量完成"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "回复测量完成"); | |||
HeightBodyFatBleData.getInstance().sendData(HeightBodyFatBleUntils.replyTestFinish()); | |||
break; | |||
case R.id.btnPause: | |||
pauseRefresh = !pauseRefresh; | |||
if (pauseRefresh) { | |||
addText(0, "暂停刷新"); | |||
} else { | |||
addText(0, "继续刷新"); | |||
} | |||
break; | |||
} | |||
@@ -560,40 +539,81 @@ public class HeightWeightScaleActivity extends BleBaseActivity implements OnCall | |||
super.handleMessage(msg); | |||
switch (msg.what) { | |||
case SETMODE: | |||
logList.add(0, "下发模式没有回复"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "下发模式没有回复"); | |||
break; | |||
case SETUNIT: | |||
logList.add(0, "下发单位没有回复"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "下发单位没有回复"); | |||
break; | |||
case SETUSER: | |||
logList.add(0, "下发用户没有回复"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "下发用户没有回复"); | |||
break; | |||
case FINISH: | |||
logList.add(0, "没有回复测量完成指令(\n为了检测是否有回复。" + | |||
addText(0, "没有回复测量完成指令(\n为了检测是否有回复。" + | |||
"app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量完成。" + | |||
"\n如果回复。此消息可以忽略)"+"\n 每次测量(母婴模式。的测量完成也只能发一次),测量完成的命令只能发一次!!!!。"); | |||
listAdapter.notifyDataSetChanged(); | |||
"\n如果回复。此消息可以忽略)" + "\n 每次测量(母婴模式。的测量完成也只能发一次),测量完成的命令只能发一次!!!!。"); | |||
break; | |||
case ADC: | |||
logList.add(0, "没有测量阻抗的指令(\n为了检测是否有回复。app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量阻抗的状态。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "没有测量阻抗的指令(\n为了检测是否有回复。app会在接收到稳定体重的时候。开启定时器。去确认设备是否有回复测量阻抗的状态。\n如果回复。此消息可以忽略)"); | |||
break; | |||
case DEVICESTATUS: | |||
logList.add(0, "没有接收到设备状态(\n为了检测是否有回复。app会在点击获取设备状态指令的时候。开启定时器。去确认设备是否有回复设备状态。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText("没有接收到设备状态(\n为了检测是否有回复。app会在点击获取设备状态指令的时候。开启定时器。去确认设备是否有回复设备状态。\n如果回复。此消息可以忽略)"); | |||
break; | |||
case VOICE: | |||
logList.add(0, "没有声音设置的回复(\n为了检测是否有回复。app会在点击设置声音的时候。开启定时器。去确认设备是否有回复设置声音。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText("没有声音设置的回复(\n为了检测是否有回复。app会在点击设置声音的时候。开启定时器。去确认设备是否有回复设置声音。\n如果回复。此消息可以忽略)"); | |||
break; | |||
case VOICESTATUS: | |||
logList.add(0, "没有声音状态的回复(\n为了检测是否有回复。app会在点击声音状态的时候。开启定时器。去确认设备是否有回复声音状态。\n如果回复。此消息可以忽略)"); | |||
listAdapter.notifyDataSetChanged(); | |||
addText(0, "没有声音状态的回复(\n为了检测是否有回复。app会在点击声音状态的时候。开启定时器。去确认设备是否有回复声音状态。\n如果回复。此消息可以忽略)"); | |||
break; | |||
} | |||
} | |||
} | |||
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 getHeightUnitStr(int unit) { | |||
switch (unit) { | |||
case 0: | |||
return "cm"; | |||
case 1: | |||
return "inch"; | |||
case 2: | |||
return "feet"; | |||
} | |||
return ""; | |||
} | |||
private boolean pauseRefresh = false; | |||
private void addText(String text) { | |||
addText(0, text); | |||
} | |||
private void addText(int index, String text) { | |||
if (pauseRefresh) { | |||
return; | |||
} | |||
logList.add(index, text); | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
} |
@@ -28,6 +28,8 @@ import androidx.core.app.ActivityCompat; | |||
import androidx.recyclerview.widget.LinearLayoutManager; | |||
import androidx.recyclerview.widget.RecyclerView; | |||
import com.pingwang.bluetoothlib.AILinkSDK; | |||
import com.pingwang.bluetoothlib.bean.BleHandshakeBean; | |||
import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
@@ -50,6 +52,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.MyBleStrUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | |||
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData; | |||
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig; | |||
@@ -145,14 +148,18 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
RecyclerView recyclerView = findViewById(R.id.rv_data); | |||
recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); | |||
recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources() | |||
.getColor(R.color.public_press_bg))); | |||
.getColor(R.color.public_press_bg))); | |||
Button btn = findViewById(R.id.btn); | |||
Button btn1 = findViewById(R.id.btn1); | |||
Button clear = findViewById(R.id.clear); | |||
EditText et_filter_name = findViewById(R.id.et_filter_name); | |||
EditText et_filter_mac = findViewById(R.id.et_filter_mac); | |||
EditText et_cid = findViewById(R.id.et_cid); | |||
et_cid.setText(String.valueOf(mScanCid)); | |||
if (mScanCid > 0) { | |||
et_cid.setText(MyBleStrUtils.getHexString(mScanCid)); | |||
} else { | |||
et_cid.setText(String.valueOf(mScanCid)); | |||
} | |||
btn.setOnClickListener(new View.OnClickListener() { | |||
@@ -162,24 +169,22 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
BleLog.i(TAG, "搜索设备"); | |||
try { | |||
String cidStr = et_cid.getText().toString().trim(); | |||
if (cidStr.startsWith("0x")) { | |||
mScanCid = Integer.parseInt(cidStr, 16); | |||
} else { | |||
mScanCid = Integer.parseInt(cidStr); | |||
} | |||
mScanCid = Integer.parseInt(cidStr, 16); | |||
} catch (NumberFormatException e) { | |||
mScanCid = -1; | |||
e.printStackTrace(); | |||
} | |||
mFilterName = et_filter_name.getText().toString().trim(); | |||
mFilterMac = et_filter_mac.getText().toString().trim(); | |||
long scanOut = 30 * 1000; | |||
if (mType == BleDeviceConfig.SMART_SCOOTER) { | |||
List<BleScanAddAilinkBean> list = new ArrayList<>(); | |||
list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST)); | |||
mAILinkBleManager.startScan(30 * 1000, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | |||
mAILinkBleManager.startScan(scanOut, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST); | |||
} else { | |||
//0000FEE7=手表 | |||
mAILinkBleManager.startScan(30 * 1000, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | |||
mAILinkBleManager.startScan(scanOut, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST); | |||
// BleScanUtil.scanLeDevice(AILinkBleManager.getInstance(), scanOut); | |||
} | |||
mBleValueList.clear(); | |||
listAdapter.notifyDataSetChanged(); | |||
@@ -191,7 +196,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
@Override | |||
public void onClick(View v) { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.stopScan(10000); | |||
mAILinkBleManager.stopScan(); | |||
} | |||
} | |||
}); | |||
@@ -214,8 +219,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
mVid = bleValueBean.getVid(); | |||
mPid = bleValueBean.getPid(); | |||
mBleName = bleValueBean.getName(); | |||
if (mType == BleDeviceConfig.CLEAR_SHAKE_HANDS) { | |||
//验证不握手,不加密的界面使用 | |||
//设置不握手 | |||
BleConfig.setHandshakeStatus(mac, false); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.stopScan(); | |||
@@ -226,6 +233,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
Intent intent = new Intent(); | |||
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class); | |||
intent.putExtra("type", mType); | |||
intent.putExtra("cid", mCid); | |||
intent.putExtra("mac", mac); | |||
startActivity(intent); | |||
@@ -283,10 +291,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
String data2 = BleStrUtils.byte2HexStr(bleValueBean.getManufacturerData()); | |||
showData.append(data2); | |||
HintDataDialogFragment.newInstance() | |||
.setTitle("自定义厂商数据", 0) | |||
.setContent(showData.toString(), false) | |||
.setOk("", 0) | |||
.show(getSupportFragmentManager()); | |||
.setTitle("自定义厂商数据", 0) | |||
.setContent(showData.toString(), false) | |||
.setOk("", 0) | |||
.show(getSupportFragmentManager()); | |||
} | |||
}); | |||
recyclerView.setAdapter(listAdapter); | |||
@@ -360,8 +368,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
@Override | |||
public void onServicesDiscovered(@NonNull String mac) { | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mac); | |||
initEncryption(bleDevice); | |||
if (mac.equalsIgnoreCase(mNoEncryptionMac)) { | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mac); | |||
bleDevice.setA7Encryption(false); | |||
mNoEncryptionMac = ""; | |||
@@ -614,4 +623,22 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||
startActivityForResult(intent, REQUEST_PERMISSION_CODE); | |||
} | |||
/** | |||
* 初始化加密 | |||
* 主要用于license设备,不用加密 | |||
*/ | |||
public static void initEncryption(BleDevice bleDevice) { | |||
if (bleDevice == null) { | |||
return; | |||
} | |||
BleValueBean bleValueBean = bleDevice.getBleValueBean(); | |||
if (bleValueBean != null) { | |||
BleHandshakeBean licenseDevice = AILinkSDK.getInstance().isLicenseDevice(bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid()); | |||
if (licenseDevice != null) { | |||
//license设备,不用加密 | |||
bleDevice.setA7Encryption(false); | |||
} | |||
} | |||
} | |||
} |
@@ -20,19 +20,22 @@ import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.device.SendDataBean; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleMtuListener; | |||
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import com.pingwang.bluetoothlib.utils.UuidUtils; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import java.util.UUID; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
/** | |||
* xing<br> | |||
@@ -50,7 +53,7 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
private Context mContext; | |||
private EditText et_cmd, et_uuid, et_uuid_server, et_time, et_notify; | |||
private EditText et_cmd, et_uuid, et_uuid_server, et_time, et_notify, etIncrementNumber; | |||
private BleDevice mBleDevice; | |||
private String mAddress; | |||
private int sendTime = 1000; | |||
@@ -58,10 +61,13 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
private UUID sendUuidServer = null; | |||
private String uuidEnd = "-0000-1000-8000-00805F9B34FB"; | |||
private String sendCmd; | |||
private byte[] sendCmdB; | |||
private long mSendNumber = 0; | |||
private long mReceiveNumber = 0; | |||
private boolean mShowLog = true; | |||
private int mNum = 1; | |||
private boolean mIncrementSend = false; | |||
private int mNum = 0; | |||
private int mNumMax = 514; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(Message msg) { | |||
@@ -74,16 +80,34 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
break; | |||
case SEND_DATA: | |||
if (sendUuid != null && sendUuidServer != null) { | |||
mNum++; | |||
SendDataBean sendDataBean = new SendDataBean(String.valueOf(mNum).getBytes(), sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | |||
mBleDevice.sendData(sendDataBean); | |||
if (sendTime > 0) { | |||
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime); | |||
int intervalTime = sendTime; | |||
if (sendUuid != null && sendUuidServer != null && mBleDevice != null) { | |||
byte[] sendData = sendCmdB; | |||
if (mIncrementSend) { | |||
//递增字节发送 | |||
mNum++; | |||
if (mNum > mNumMax) { | |||
addLog("递增发送结束"); | |||
mNum = 1; | |||
return; | |||
} | |||
sendData = new byte[mNum]; | |||
for (int i = 0; i < mNum; i++) { | |||
sendData[i] = (byte) (i); | |||
} | |||
intervalTime = sendTime + mNum; | |||
addLog("发送数据量:" + mNum); | |||
} | |||
SendDataBean sendDataBean = new SendDataBean(sendData, sendUuid, BleConfig.WRITE_DATA, sendUuidServer); | |||
mBleDevice.sendDataNow(sendDataBean); | |||
if (intervalTime > 0) { | |||
mHandler.sendEmptyMessageDelayed(SEND_DATA, intervalTime); | |||
} | |||
mSendNumber += sendDataBean.getHex().length; | |||
tv_send_number.setText(String.valueOf(mSendNumber)); | |||
} else { | |||
addLog("请先设置特征UUID和服务UUID"); | |||
} | |||
break; | |||
@@ -115,7 +139,9 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
findViewById(R.id.btn_notify_status).setOnClickListener(this); | |||
findViewById(R.id.btn_uuid_server).setOnClickListener(this); | |||
findViewById(R.id.btn_log).setOnClickListener(this); | |||
findViewById(R.id.btnIncrementSend).setOnClickListener(this); | |||
etIncrementNumber = findViewById(R.id.etIncrementNumber); | |||
et_cmd = findViewById(R.id.et_cmd); | |||
et_uuid = findViewById(R.id.et_uuid); | |||
et_time = findViewById(R.id.et_time); | |||
@@ -130,7 +156,14 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btn1: | |||
try { | |||
mNumMax = Integer.parseInt(etIncrementNumber.getText().toString().trim()); | |||
} catch (NumberFormatException e) { | |||
e.printStackTrace(); | |||
mNumMax = 514; | |||
} | |||
sendCmd = et_cmd.getText().toString().trim(); | |||
sendCmdB = BleDensityUtil.getInstance().toBytes(sendCmd); | |||
mHandler.removeMessages(SEND_DATA); | |||
mHandler.sendEmptyMessage(SEND_DATA); | |||
break; | |||
@@ -151,19 +184,23 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
case R.id.btn_uuid: | |||
String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
sendUuid = UuidUtils.getUuid(uuid); | |||
addLog("设置特征UUID"); | |||
break; | |||
case R.id.btn_uuid_server: | |||
String uuidServer = et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
sendUuidServer = UuidUtils.getUuid(uuidServer); | |||
addLog("设置服务UUID"); | |||
break; | |||
case R.id.btn_time: | |||
String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
sendTime = Integer.parseInt(time); | |||
addLog("设置时间间隔(ms):" + sendTime); | |||
break; | |||
case R.id.btn_notify: | |||
String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||
readNotify(notify, mNotify); | |||
addLog("设置Notify UUID"); | |||
break; | |||
case R.id.btn_notify_status: | |||
mNotify = !mNotify; | |||
@@ -174,6 +211,12 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
((Button) v).setText("log:" + (mShowLog ? "Y" : "N")); | |||
break; | |||
case R.id.btnIncrementSend: | |||
mIncrementSend = !mIncrementSend; | |||
// mBleDevice.setMtu(mNumMax); | |||
((Button) v).setText("递增发送:" + (mIncrementSend ? "Y" : "N")); | |||
break; | |||
} | |||
} | |||
@@ -197,6 +240,13 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
} | |||
} | |||
private void addLog(String log) { | |||
if (mShowLog) { | |||
mList.add(TimeUtils.getTimeSSS() + log); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
} | |||
//---------------------------------服务--------------------------------------------------- | |||
@@ -210,7 +260,12 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
if (mBleDevice != null) { | |||
mBleDevice.setOnBleOtherDataListener(this); | |||
mBleDevice.setOnBleDeviceDataListener(this); | |||
mBleDevice.setOnBleMtuListener(new OnBleMtuListener() { | |||
@Override | |||
public void OnMtu(int mtu) { | |||
addLog("系统返回MTU:" + mtu); | |||
} | |||
}); | |||
} | |||
} | |||
} | |||
@@ -246,8 +301,9 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
//TODO 连接断开 | |||
BleLog.i(TAG, "连接断开"); | |||
mList.add(TimeUtils.getTime() + "连接断开"); | |||
mHandler.removeMessages(SEND_DATA); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
finish(); | |||
} | |||
@Override | |||
@@ -264,6 +320,8 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
@Override | |||
public void bleClose() { | |||
mHandler.removeMessages(SEND_DATA); | |||
addLog("蓝牙关闭"); | |||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
} | |||
@@ -292,8 +350,8 @@ public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, O | |||
@Override | |||
public void onNotifyOtherData(String uuid, byte[] hex) { | |||
if (mBleDevice != null) { | |||
hex[0]= (byte) (hex[0]+1); | |||
SendDataBean sendDataBean = new SendDataBean(hex,BleConfig.UUID_WRITE_AILINK,BleConfig.WRITE_DATA,BleConfig.UUID_SERVER_AILINK); | |||
hex[0] = (byte) (hex[0] + 1); | |||
SendDataBean sendDataBean = new SendDataBean(hex, BleConfig.UUID_WRITE_AILINK, BleConfig.WRITE_DATA, BleConfig.UUID_SERVER_AILINK); | |||
mBleDevice.sendDataNow(sendDataBean); | |||
} | |||
if (mShowLog) { |
@@ -35,8 +35,8 @@ import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | |||
public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback { | |||
private TextView tv_device_info; | |||
private EditText et, et_cid,et_a6,et_customize,et_name; | |||
private Button send,send_a6, bt_clear, bt_clear_log,bt_cid,send_customize; | |||
private EditText et, et_cid, et_a6, et_customize, et_name; | |||
private Button send, send_a6, bt_clear, bt_clear_log, bt_cid, send_customize; | |||
private ListView mListView; | |||
private List<String> mlogList; | |||
private final int ToRefreUi = 1; | |||
@@ -44,6 +44,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
private ArrayAdapter listAdapter; | |||
private String mAddress; | |||
private TransmissionDeviceData mTransmissionDeviceData; | |||
private boolean isPause = false; | |||
@Override | |||
public void onServiceSuccess() { | |||
@@ -55,8 +56,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
mAILinkBleManager.setOnCallbackBle(this); | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
if (tv_device_info!=null) { | |||
tv_device_info.setText("MAC:"+bleDevice.getMac()); | |||
if (tv_device_info != null) { | |||
tv_device_info.setText("MAC:" + bleDevice.getMac()); | |||
} | |||
mTransmissionDeviceData = new TransmissionDeviceData(bleDevice); | |||
mTransmissionDeviceData.setMyBleCallback(this); | |||
@@ -73,7 +74,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
public void unbindServices() { | |||
if (mAILinkBleManager !=null) { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.removeOnCallbackBle(this); | |||
} | |||
} | |||
@@ -104,6 +105,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
send_a6.setOnClickListener(this); | |||
send_customize.setOnClickListener(this); | |||
findViewById(R.id.send_name).setOnClickListener(this); | |||
findViewById(R.id.btPause).setOnClickListener(this); | |||
bt_clear.setOnClickListener(this); | |||
bt_cid.setOnClickListener(this); | |||
bt_clear_log.setOnClickListener(this); | |||
@@ -128,6 +130,8 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
} | |||
} else if (id == R.id.bt_clear) { | |||
et.setText(""); | |||
et_a6.setText(""); | |||
et_customize.setText(""); | |||
} else if (id == R.id.bt_clear_log) { | |||
mlogList.clear(); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
@@ -136,28 +140,30 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
if (mTransmissionDeviceData != null) { | |||
mTransmissionDeviceData.getCid(); | |||
} | |||
}else if (id == R.id.send_a6) { | |||
} else if (id == R.id.send_a6) { | |||
String hex = et_a6.getText().toString().toUpperCase().trim(); | |||
if (!TextUtils.isEmpty(hex)) { | |||
byte[] hexStr = BleStrUtils.stringToByte(hex); | |||
if (mTransmissionDeviceData != null) { | |||
mTransmissionDeviceData.setSendDataA6( hexStr); | |||
mTransmissionDeviceData.setSendDataA6(hexStr); | |||
} | |||
} | |||
}else if (id == R.id.send_customize) { | |||
} else if (id == R.id.send_customize) { | |||
String hex = et_customize.getText().toString().toUpperCase().trim(); | |||
if (!TextUtils.isEmpty(hex)) { | |||
byte[] hexStr = BleStrUtils.stringToByte(hex); | |||
if (mTransmissionDeviceData != null) { | |||
mTransmissionDeviceData.setSendDataCustomize( hexStr); | |||
mTransmissionDeviceData.setSendDataCustomize(hexStr); | |||
} | |||
} | |||
}else if (id == R.id.send_name) { | |||
} else if (id == R.id.send_name) { | |||
String name = et_name.getText().toString().trim(); | |||
if (!TextUtils.isEmpty(name)) { | |||
byte[] names = BleDataUtils.getInstance().getBleName(name); | |||
mTransmissionDeviceData.setSendDataA6(BleSendCmdUtil.getInstance().setBleName(names)); | |||
} | |||
}else if (id == R.id.btPause){ | |||
isPause = !isPause; | |||
} | |||
} | |||
@@ -168,8 +174,7 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
public void showData(String data, int type) { | |||
mlogList.add(0, "收 payload数据" + TimeUtils.getTimeSSS() +"cid=" + type + "\n" + data); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
addLog( "收A7 payload数据" + TimeUtils.getTimeSSS() + "cid=" + type + "\n" + data); | |||
} | |||
@Override | |||
@@ -179,24 +184,30 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
public void onCid(int cid, int vid, int pid) { | |||
mlogList.add(0, "收" + TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
addLog("收" + TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid); | |||
} | |||
@Override | |||
public void otherData(byte[] hex, String data) { | |||
mlogList.add(0, "收 透传数据" + TimeUtils.getTime() + data); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
addLog("收 透传数据" + TimeUtils.getTime() + data); | |||
} | |||
@Override | |||
public void sendData(String data) { | |||
mlogList.add(0, "发 " + TimeUtils.getTimeSSS() + data); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
public void a6Data(byte[] hex, String data) { | |||
addLog("收A6 payload数据" + TimeUtils.getTime() + data); | |||
} | |||
@Override | |||
public void sendData(String data) { | |||
addLog("发 " + TimeUtils.getTimeSSS() + data); | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
mlogList.add(0, "连接断开: " + mac + " code:" + code); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
} | |||
private class MHandler extends Handler { | |||
@Override | |||
@@ -220,8 +231,18 @@ public class TransmissionActivity extends BleBaseActivity implements View.OnClic | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
if (mAILinkBleManager !=null) { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.disconnectAll(); | |||
} | |||
} | |||
private void addLog(String log) { | |||
if (isPause){ | |||
return; | |||
} | |||
mlogList.add(0, log); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
} | |||
} |
@@ -53,7 +53,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
private List<User> mUsers; | |||
private User selectUser; | |||
private int weighunit = BodyFatDataUtil.KG; | |||
private ListView loglistView; | |||
private ListView loglistView; | |||
private ListView userlistView; | |||
@Override | |||
@@ -66,13 +66,9 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
initdata(); | |||
} | |||
private void initView(){ | |||
private void initView() { | |||
findViewById(R.id.history).setOnClickListener(this); | |||
findViewById(R.id.userlist).setOnClickListener(this); | |||
findViewById(R.id.user).setOnClickListener(this); | |||
@@ -89,7 +85,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
} | |||
private void initdata(){ | |||
private void initdata() { | |||
mAddress = getIntent().getStringExtra("mac"); | |||
WeakReference weakReference = new WeakReference(new MHandler()); | |||
@@ -99,7 +96,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||
loglistView.setAdapter(listAdapter); | |||
User defaultUser=getdefault(); | |||
User defaultUser = getdefault(); | |||
selectUser = defaultUser; | |||
mUsers = new ArrayList<>(); | |||
@@ -112,7 +109,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
userlistView.setAdapter(userAdapter); | |||
} | |||
private User getdefault(){ | |||
private User getdefault() { | |||
User user = new User(); | |||
user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||
user.setSex(BodyFatDataUtil.SEX_MAN); | |||
@@ -123,6 +120,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
user.setId(1); | |||
return user; | |||
} | |||
private void setUnitinit() { | |||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
@@ -199,7 +197,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
public void unbindServices() { | |||
mlogList.add(0, "服务与界面建立断开连接成功"); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
if (mAILinkBleManager !=null) { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.removeOnCallbackBle(this); | |||
} | |||
} | |||
@@ -257,10 +255,17 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
@Override | |||
public void onWeightData(int status, float weight, int weightUnit, int decimals) { | |||
String data = "体重数据类型:" + (status==BodyFatDataUtil.WEIGHT_TESTING?"实时":"稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals; | |||
String data = "体重数据类型:" + (status == BodyFatDataUtil.WEIGHT_TESTING ? "实时" : "稳定") + "\n体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals; | |||
if (mOldData.equals(data)) { | |||
return; | |||
} | |||
if (status == BodyFatDataUtil.WEIGHT_RESULT) { | |||
//稳定体重 | |||
selectUser.setWeight(weight); | |||
mMHandler.sendEmptyMessage(TO_REFRE_USER); | |||
} | |||
mOldData = data; | |||
mlogList.add(0, data); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
@@ -323,6 +328,8 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
@Override | |||
public void onAdc(int adc, int algorithmic) { | |||
mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | |||
selectUser.setAdc(adc); | |||
mMHandler.sendEmptyMessage(TO_REFRE_USER); | |||
mMHandler.sendEmptyMessage(ToRefreUi); | |||
} | |||
@@ -529,6 +536,7 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
} | |||
private final int ToRefreUi = 300; | |||
private final int TO_REFRE_USER = 301; | |||
private class MHandler extends Handler { | |||
@@ -541,6 +549,17 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
case TO_REFRE_USER: | |||
if (userAdapter != null) { | |||
mUserlogList.clear(); | |||
if (mUsers!=null) { | |||
for (User user : mUsers) { | |||
mUserlogList.add(user.toString()); | |||
} | |||
} | |||
userAdapter.notifyDataSetChanged(); | |||
} | |||
break; | |||
} | |||
} |
@@ -28,6 +28,7 @@ public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHol | |||
public interface OnItemClickListener { | |||
void onItemClick(int position); | |||
void onLongClick(int position); | |||
} | |||
@@ -50,7 +51,7 @@ public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHol | |||
@Override | |||
public void onBindViewHolder(@NonNull KeyViewHolder holder, int position) { | |||
BleValueBean data = mList.get(position); | |||
String showData=data.getMac()+"="+data.getName()+"=" + data.getCid() + ";" + data.getVid() + ";" + data.getPid()+"="+data.getRssi(); | |||
String showData = data.getMac() + "=" + data.getRssi() + "\n" + data.getName() + "=" + getHexString(data.getCid()) + ";" + getHexString(data.getVid()) + ";" + getHexString(data.getPid()); | |||
holder.mTvTitle.setText(showData); | |||
holder.mTvTitle.setOnClickListener(v -> { | |||
if (listener != null) | |||
@@ -97,5 +98,12 @@ public class StringAdapter extends RecyclerView.Adapter<StringAdapter.KeyViewHol | |||
} | |||
} | |||
private String getHexString(int value) { | |||
if (value < 10) { | |||
return "0x0" + Integer.toHexString(value); | |||
} | |||
return "0x" + Integer.toHexString(value); | |||
} | |||
} |
@@ -0,0 +1,253 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.base; | |||
import android.content.Context; | |||
import android.content.pm.ActivityInfo; | |||
import android.os.Build; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Message; | |||
import android.view.KeyEvent; | |||
import android.view.MenuItem; | |||
import android.view.View; | |||
import android.widget.TextView; | |||
import androidx.annotation.Nullable; | |||
import androidx.appcompat.widget.Toolbar; | |||
import java.lang.ref.WeakReference; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||
/** | |||
* 2019/4/16 11:55 | |||
* activity的基类, 共有的功能都可以写在这里 | |||
*/ | |||
public abstract class BleAppNewBaseActivity extends BleNewBaseActivity { | |||
/** | |||
* 上下文对象 | |||
*/ | |||
protected Context mContext; | |||
protected String TAG = this.getClass().getName(); | |||
protected Handler mHandler = new MyHandler(this); | |||
@Nullable | |||
protected TextView mTvTopTitle; | |||
@Nullable | |||
protected Toolbar mToolbar; | |||
//--------------ble--------------- | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
if (getLayoutId() != 0) { | |||
initWindows(); | |||
setContentView(getLayoutId()); | |||
SaveActivityData(savedInstanceState); | |||
mContext = this; | |||
init(); | |||
} else if (getLayoutView() != null) { | |||
initWindows(); | |||
setContentView(getLayoutView()); | |||
SaveActivityData(savedInstanceState); | |||
mContext = this; | |||
init(); | |||
} | |||
} | |||
protected void SaveActivityData(Bundle savedInstanceState) { | |||
} | |||
/** | |||
* handler消息,使用弱引用,避免泄露问题 | |||
*/ | |||
private static class MyHandler extends Handler { | |||
private WeakReference<BleAppNewBaseActivity> mActivity; | |||
MyHandler(BleAppNewBaseActivity activity) { | |||
mActivity = new WeakReference<>(activity); | |||
} | |||
@Override | |||
public void handleMessage(Message msg) { | |||
if (mActivity.get() == null) { | |||
return; | |||
} | |||
mActivity.get().uiHandlerMessage(msg); | |||
} | |||
} | |||
/** | |||
* handler消息处理 | |||
*/ | |||
protected abstract void uiHandlerMessage(Message msg); | |||
/** | |||
* 在绑定布局前的操作(状态,任务栏等的设置) | |||
*/ | |||
protected void initWindows() { | |||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||
//设置状态栏文字为黑色 | |||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); | |||
} | |||
} | |||
/** | |||
* 获取当前activity的布局 | |||
* | |||
* @return int | |||
*/ | |||
protected abstract int getLayoutId(); | |||
/** | |||
* 获取当前activity的布局 | |||
* | |||
* @return View | |||
*/ | |||
protected View getLayoutView() { | |||
return null; | |||
} | |||
/** | |||
* 初始化 | |||
*/ | |||
protected final void init() { | |||
addInit(); | |||
initView(); | |||
initData(); | |||
initListener(); | |||
} | |||
protected void addInit() { | |||
} | |||
//-----------------------权限---------------------------------------- | |||
protected void initPermissions() { | |||
new CheckPermissionUtils(this).checkPermissions(new CheckPermissionUtils.OnPermissionListener() { | |||
@Override | |||
public void onPermissionsOk() { | |||
BleAppNewBaseActivity.this.onPermissionsOk(); | |||
} | |||
}); | |||
} | |||
/** | |||
* 权限ok | |||
*/ | |||
protected void onPermissionsOk() { | |||
} | |||
/** | |||
* 初始化事件 | |||
*/ | |||
protected abstract void initListener(); | |||
/** | |||
* 初始化数据 | |||
*/ | |||
protected abstract void initData(); | |||
/** | |||
* 初始化,绑定布局 | |||
*/ | |||
protected abstract void initView(); | |||
// @Override | |||
// public boolean onCreateOptionsMenu(Menu menu) { | |||
// getMenuInflater().inflate(R.menu.public_toolbar_menu, menu); | |||
// MenuItem item = menu.findItem(R.id.img_public_right); | |||
// if (item != null) { | |||
// item.setIcon(R.drawable.me_manssage); | |||
// } | |||
// return true; | |||
// } | |||
@Override | |||
public boolean onOptionsItemSelected(MenuItem item) { | |||
int i = item.getItemId(); | |||
if (i == android.R.id.home) { | |||
myFinish(); | |||
return true; | |||
} | |||
return super.onOptionsItemSelected(item); | |||
} | |||
/** | |||
* 返回键 | |||
*/ | |||
@Override | |||
public boolean onKeyDown(int keyCode, KeyEvent event) { | |||
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { | |||
myFinish(); | |||
return true; | |||
} | |||
return super.onKeyDown(keyCode, event); | |||
} | |||
/** | |||
* 返回 | |||
*/ | |||
protected void myFinish() { | |||
finish(); | |||
} | |||
protected void onClickRight() { | |||
} | |||
@Override | |||
protected void onStart() { | |||
super.onStart(); | |||
} | |||
@Override | |||
protected void onRestart() { | |||
super.onRestart(); | |||
} | |||
@Override | |||
protected void onResume() { | |||
super.onResume(); | |||
} | |||
@Override | |||
protected void onPause() { | |||
super.onPause(); | |||
} | |||
@Override | |||
protected void onStop() { | |||
super.onStop(); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
if (mHandler != null) { | |||
mHandler.removeCallbacksAndMessages(null); | |||
} | |||
} | |||
} |
@@ -4,7 +4,6 @@ import android.app.Application; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
public class MyApplication extends Application { | |||
private static MyApplication sInstance; |
@@ -79,6 +79,20 @@ public class BleDeviceConfig { | |||
* 八电极体脂秤 | |||
*/ | |||
public final static int EIGHT_BODY_FAT_SCALE = 0x13; | |||
/** | |||
* 八电极体脂秤 MCU算法 | |||
*/ | |||
public final static int EIGHT_BODY_FAT_SCALE_MCU = 0x32; | |||
/** | |||
* 八电极体脂秤(双频_APP) | |||
*/ | |||
public final static int EIGHT_BODY_FAT_SCALE_DUAL_BAND_APP = 0x0052; | |||
/** | |||
* 八电极体脂秤(双频_MCU) | |||
*/ | |||
public final static int EIGHT_BODY_FAT_SCALE_DUAL_BAND_MCU = 0x0068; | |||
/** | |||
* 风速计 | |||
@@ -117,6 +131,10 @@ public class BleDeviceConfig { | |||
* 蓝牙营养秤 | |||
*/ | |||
public final static int BLE_NUTRITION_SCALE = 0x0034; | |||
/** | |||
* 蓝牙营养秤(支持营养元素) | |||
*/ | |||
public final static int BLE_NUTRITION_SCALE_NUTRIENT = 0x006C; | |||
/** | |||
* 蓝牙牙刷 | |||
@@ -257,6 +275,12 @@ public class BleDeviceConfig { | |||
* 气压温湿度计 | |||
*/ | |||
public static final int BAROMETRIC_TEMP_HUMIDITY = 0x005C; | |||
/** | |||
* 气体检测仪(BLE) | |||
*/ | |||
public static final int BLE_GAS_DETECTOR = 0x006F; | |||
//------------------特殊 | |||
/** |
@@ -1,6 +1,5 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
import java.util.ArrayList; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity; | |||
@@ -14,10 +13,10 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity; | |||
@@ -30,19 +29,27 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicMqttActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicWifiBleOtaActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionNutrientActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.bw05watch.Bw05WatchActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyFatMcuActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band.EightDoubleBodyfatActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetector.GasDetectorActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity; | |||
@@ -74,123 +81,144 @@ public class HomeDataManager { | |||
*/ | |||
public static ArrayList<JumpBean> getHomeDataList() { | |||
ArrayList<JumpBean> beanList = new ArrayList<>(); | |||
Class<?> publicJumpActivity = ShowBleActivity.class; | |||
// 不握手不加密 | |||
// beanList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, publicJumpActivity, ClearShakeHandsActivity.class)); | |||
// Ble通用设置 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_GENERAL_SETTINGS, R.string.item_ble_general_settings, null, BleCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_GENERAL_SETTINGS, R.string.item_ble_general_settings, publicJumpActivity, BleCmdActivity.class)); | |||
// BLE通用配网 | |||
beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, null, PublicBleNetworkCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, publicJumpActivity, PublicBleNetworkCmdActivity.class)); | |||
// Ble test | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, null, TestCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, publicJumpActivity, TestCmdActivity.class)); | |||
// Ble connect test | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, ConnectBleTestActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, null, ConnectBleTestActivity.class)); | |||
// OTA通用 | |||
// beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_ota, publicJumpActivity, TestOtaActivity.class)); | |||
//MQTT通用 | |||
beanList.add(new JumpBean(BleDeviceConfig.OTA, R.string.item_mqtt, null, PublicMqttActivity.class)); | |||
// 透传 | |||
beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, null, TransmissionActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, publicJumpActivity, TransmissionActivity.class)); | |||
//气体检测仪 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_GAS_DETECTOR, R.string.gas_detector, publicJumpActivity, GasDetectorActivity.class)); | |||
// 广播秤 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_broadcast, BroadcastScaleActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_broadcast, null, BroadcastScaleActivity.class)); | |||
// Ble体脂秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_ble, null, WeightScaleBleActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_ble, publicJumpActivity, WeightScaleBleActivity.class)); | |||
// 4G体脂秤 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_4g, BodyScale4GActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_4g, null, BodyScale4GActivity.class)); | |||
// WiFi+Ble体脂秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.item_body_fat_scale_wifi_ble, null, WeightScaleWifiBleActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.item_body_fat_scale_wifi_ble, publicJumpActivity, WeightScaleWifiBleActivity.class)); | |||
// 八极秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_eight, null, EightBodyfatActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_eight, publicJumpActivity, EightBodyfatActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE_MCU, R.string.item_body_fat_scale_eight_mcu, publicJumpActivity, EightBodyFatMcuActivity.class)); | |||
//八电极秤,双频 APP | |||
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE_DUAL_BAND_APP, R.string.item_body_fat_scale_eight_dual_band, publicJumpActivity, EightDoubleBodyfatActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE_DUAL_BAND_MCU, R.string.item_body_fat_scale_eight_dual_band_mcu, publicJumpActivity, EightDoubleBodyfatActivity.class)); | |||
// 艾迪体脂秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD, R.string.item_body_fat_scale_aidi, null, ADWeightScaleCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD, R.string.item_body_fat_scale_aidi, publicJumpActivity, ADWeightScaleCmdActivity.class)); | |||
// 婴儿秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.BABY_SCALE, R.string.item_baby_scale, null, BabyCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BABY_SCALE, R.string.item_baby_scale, publicJumpActivity, BabyCmdActivity.class)); | |||
// 婴儿体脂两用秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.BABY_BODY_FAT, R.string.item_baby_body_fat_scale, null, BabyBodyFatCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BABY_BODY_FAT, R.string.item_baby_body_fat_scale, publicJumpActivity, BabyBodyFatCmdActivity.class)); | |||
// Ble体重秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_SCALE, R.string.item_weight_scale_ble, null, WeightScaleActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_SCALE, R.string.item_weight_scale_ble, publicJumpActivity, WeightScaleActivity.class)); | |||
// 广播体重秤 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_weight_scale_broadcast, BroadcastWeightScaleActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_weight_scale_broadcast, null, BroadcastWeightScaleActivity.class)); | |||
// 蓝牙营养秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE, R.string.item_nutritional_scale_ble, null, BleNutritionActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE, R.string.item_nutritional_scale_ble, publicJumpActivity, BleNutritionActivity.class)); | |||
//支持营养元素的营养秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE_NUTRIENT, R.string.item_nutritional_scale_ble_nutrient, publicJumpActivity, BleNutritionNutrientActivity.class)); | |||
// 广播营养秤 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_nutritional_scale_broadcast, BroadNutritionActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_nutritional_scale_broadcast, null, BroadNutritionActivity.class)); | |||
// 咖啡秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.COFFEE_SCALE, R.string.item_coffee_scale, null, CoffeeScaleActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.COFFEE_SCALE, R.string.item_coffee_scale, publicJumpActivity, CoffeeScaleActivity.class)); | |||
// 身高体脂秤 | |||
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_BODY_FAT, R.string.item_height_body_fat_scale, null, HeightWeightScaleActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_BODY_FAT, R.string.item_height_body_fat_scale, publicJumpActivity, HeightWeightScaleActivity.class)); | |||
// 身高仪 | |||
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_METER, R.string.item_height_measuring_ble, null, HeightCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_METER, R.string.item_height_measuring_ble, publicJumpActivity, HeightCmdActivity.class)); | |||
// 广播身高仪 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_height_measuring_broadcast, BroadcastHeightActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_height_measuring_broadcast, null, BroadcastHeightActivity.class)); | |||
// BLE血压计 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_PRESSURE, R.string.item_sphygmometer_ble, null, SphyCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_PRESSURE, R.string.item_sphygmometer_ble, publicJumpActivity, SphyCmdActivity.class)); | |||
// wifi血压计 | |||
beanList.add(new JumpBean(BleDeviceConfig.SPHY_WIFI_BLE, R.string.item_sphygmometer_wifi, null, WifiBleSphyActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SPHY_WIFI_BLE, R.string.item_sphygmometer_wifi, publicJumpActivity, WifiBleSphyActivity.class)); | |||
// 血压计透传 | |||
beanList.add(new JumpBean(BleDeviceConfig.SPHYGMOMETER_PENETRATE, R.string.item_sphygmometer_penetrate, null, BloodPressureTcActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SPHYGMOMETER_PENETRATE, R.string.item_sphygmometer_penetrate, publicJumpActivity, BloodPressureTcActivity.class)); | |||
// 血糖仪 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_GLUCOSE, R.string.item_blood_glucose_meter_ble, null, BloodGlucoseActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_GLUCOSE, R.string.item_blood_glucose_meter_ble, publicJumpActivity, BloodGlucoseActivity.class)); | |||
// 4G血糖仪 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_blood_glucose_meter_4g, BloodSugar4GActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_blood_glucose_meter_4g, null, BloodSugar4GActivity.class)); | |||
// 血氧仪(广播) | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_oximeter_broadcast, BroadcastBloodOxygenActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_oximeter_broadcast, null, BroadcastBloodOxygenActivity.class)); | |||
// 血氧(连接) | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_BOOLD_OXYGEN, R.string.item_oximeter_ble, null, BloodOxygenActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_BOOLD_OXYGEN, R.string.item_oximeter_ble, publicJumpActivity, BloodOxygenActivity.class)); | |||
// 额温枪 | |||
beanList.add(new JumpBean(BleDeviceConfig.INFRARED_THERMOMETER, R.string.item_infrared_thermometer, null, TempGunCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.INFRARED_THERMOMETER, R.string.item_infrared_thermometer, publicJumpActivity, TempGunCmdActivity.class)); | |||
// 体温计 | |||
beanList.add(new JumpBean(BleDeviceConfig.THERMOMETER, R.string.item_thermometer, null, TempCmdActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.THERMOMETER, R.string.item_thermometer, publicJumpActivity, TempCmdActivity.class)); | |||
// 测温仪 | |||
beanList.add(new JumpBean(BleDeviceConfig.TEMP_INSTRUMENT, R.string.item_auto_thermometer, null, TempInstrumentActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.TEMP_INSTRUMENT, R.string.item_auto_thermometer, publicJumpActivity, TempInstrumentActivity.class)); | |||
// 食品温度计 | |||
beanList.add(new JumpBean(BleDeviceConfig.FOOD_TEMP, R.string.item_food_thermometer, null, FoodTempActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.FOOD_TEMP, R.string.item_food_thermometer, publicJumpActivity, FoodTempActivity.class)); | |||
// 食物探针 | |||
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE, R.string.item_meat_probe, null, MeatProbeActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE, R.string.item_meat_probe, publicJumpActivity, MeatProbeActivity.class)); | |||
// 探针充电盒 | |||
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, null, MeatProbeChargerActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, publicJumpActivity, MeatProbeChargerActivity.class)); | |||
// 牙刷(wifi+ble) | |||
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, null, ToothBrushWifiBleActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, publicJumpActivity, ToothBrushWifiBleActivity.class)); | |||
// 牙刷测试 | |||
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, null, ToothbrushTestActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, publicJumpActivity, ToothbrushTestActivity.class)); | |||
// 口罩 | |||
beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, null, SmartMaskActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, publicJumpActivity, SmartMaskActivity.class)); | |||
// 筋膜枪 | |||
beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, null, FasciaGunActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, publicJumpActivity, FasciaGunActivity.class)); | |||
// 跳绳 | |||
beanList.add(new JumpBean(BleDeviceConfig.ROPE_SKIPPING, R.string.item_rope_skipping, null, RopeSkippingActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.ROPE_SKIPPING, R.string.item_rope_skipping, publicJumpActivity, RopeSkippingActivity.class)); | |||
// 跳绳设置模式 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_rope_skipping_set_mode, RopeSkippingSetActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_rope_skipping_set_mode, null, RopeSkippingSetActivity.class)); | |||
// 温湿度计 | |||
beanList.add(new JumpBean(BleDeviceConfig.TEMP_Humidity, R.string.item_hygrothermograph, null, TempHumidityActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.TEMP_Humidity, R.string.item_hygrothermograph, publicJumpActivity, TempHumidityActivity.class)); | |||
// 气压温湿度计 | |||
beanList.add(new JumpBean(BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY, R.string.item_barothermohygrograph, null, BarometricTempHygrometerActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY, R.string.item_barothermohygrograph, publicJumpActivity, BarometricTempHygrometerActivity.class)); | |||
// ble噪音计 | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_NOISE_METER, R.string.item_noise_meter_ble, null, BleNoiseMeterActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.BLE_NOISE_METER, R.string.item_noise_meter_ble, publicJumpActivity, BleNoiseMeterActivity.class)); | |||
// wifi+ble噪音计 | |||
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_NOISE_METER, R.string.item_noise_meter_wifi_ble, null, WifiBleNoiseMeterActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_NOISE_METER, R.string.item_noise_meter_wifi_ble, publicJumpActivity, WifiBleNoiseMeterActivity.class)); | |||
// 空气检测仪 | |||
beanList.add(new JumpBean(BleDeviceConfig.MQTT_AIR_DETECTOR, R.string.item_air_Detector, null, AirDetectorActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.MQTT_AIR_DETECTOR, R.string.item_air_Detector, publicJumpActivity, AirDetectorActivity.class)); | |||
// 电滑板Cm02 | |||
beanList.add(new JumpBean(BleDeviceConfig.SMART_SCOOTER_CM02, R.string.item_scooter_cm02, null, AiLinkScooterActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SMART_SCOOTER_CM02, R.string.item_scooter_cm02, publicJumpActivity, AiLinkScooterActivity.class)); | |||
// 共享充电器 | |||
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CHARGER, R.string.item_shared_charger, null, ShareChargerActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CHARGER, R.string.item_shared_charger, publicJumpActivity, ShareChargerActivity.class)); | |||
// 共享插座 | |||
beanList.add(new JumpBean(BleDeviceConfig.SHARE_SOCKET, R.string.item_shared_socket, null, ShareSocketActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SHARE_SOCKET, R.string.item_shared_socket, publicJumpActivity, ShareSocketActivity.class)); | |||
// 共享套套机 | |||
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CONDOM, R.string.item_condom, null, ShareCondomActivity.class)); | |||
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CONDOM, R.string.item_condom, publicJumpActivity, ShareCondomActivity.class)); | |||
// 寻物器 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_finder, FindDeviceNewActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_finder, null, FindDeviceNewActivity.class)); | |||
// LeaOne测试 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_leaone, LeaOneBroadcastActivity.class, null)); | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_leaone, null, LeaOneBroadcastActivity.class)); | |||
// wifi+ble ota工具 | |||
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_OTA, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.wifi_ble_ota_tool, publicJumpActivity, PublicWifiBleOtaActivity.class)); | |||
//bw05暨芯手表 | |||
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_bw05_watch, null, Bw05WatchActivity.class)); | |||
return beanList; | |||
} | |||
public static ArrayList<JumpBean> getHideDataList() { | |||
ArrayList<JumpBean> hideList = new ArrayList<>(); | |||
Class<?> publicJumpActivity = ShowBleActivity.class; | |||
// 不握手不加密 | |||
hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, null, ClearShakeHandsActivity.class)); | |||
hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, publicJumpActivity, ClearShakeHandsActivity.class)); | |||
// wifi 配置 | |||
hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, WifiConfigActivity.class, null)); | |||
hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, null, WifiConfigActivity.class)); | |||
return hideList; | |||
} | |||
/** | |||
* 要跳转的目标Activity | |||
* | |||
* @param type | |||
* @return | |||
*/ |
@@ -1,5 +1,7 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
import java.util.List; | |||
/** | |||
* 说明: | |||
* | |||
@@ -9,6 +11,7 @@ package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
public class JumpBean { | |||
private int itemType; | |||
private List<Integer> itemTypeList; | |||
/** | |||
* cid | |||
*/ | |||
@@ -18,7 +21,7 @@ public class JumpBean { | |||
*/ | |||
private int itemNameResId; | |||
/** | |||
* 需要单独跳转的 Activity | |||
* 需要单独跳转的 Activity, null 表示不需要跳转 | |||
*/ | |||
private Class<?> jumpActivityClass; | |||
@@ -8,9 +8,16 @@ import android.graphics.Canvas; | |||
import android.graphics.Rect; | |||
import android.os.Build; | |||
import android.os.Bundle; | |||
import android.os.Handler; | |||
import android.os.Looper; | |||
import android.os.Message; | |||
import android.text.Editable; | |||
import android.text.TextUtils; | |||
import android.text.TextWatcher; | |||
import android.view.Menu; | |||
import android.view.MenuItem; | |||
import android.view.View; | |||
import android.widget.EditText; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
@@ -25,6 +32,8 @@ import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||
import com.pingwang.bluetoothlib.AILinkBleManager; | |||
import com.pingwang.bluetoothlib.AILinkSDK; | |||
import com.pingwang.bluetoothlib.bean.AilinkLicenseBean; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import java.util.ArrayList; | |||
@@ -45,6 +54,19 @@ public class MainActivity extends AppCompatActivity { | |||
private Context mContext; | |||
private RecyclerView rvList; | |||
private ArrayList<JumpBean> mList = new ArrayList<>(); | |||
private ArrayList<JumpBean> homeDataList = HomeDataManager.getHomeDataList(); | |||
private CharSequence inputData = ""; | |||
private HomeListAdapter mHomeListAdapter; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
if (mHomeListAdapter != null) { | |||
mHomeListAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
@@ -56,7 +78,73 @@ public class MainActivity extends AppCompatActivity { | |||
initListener(); | |||
int bodyComposition = new BhBodyComposition().getBodyComposition(); | |||
L.i("bodyComposition:" + bodyComposition); | |||
EditText etSearch = findViewById(R.id.etSearch); | |||
etSearch.addTextChangedListener(new TextWatcher() { | |||
/** | |||
* @param s 年代 | |||
* @param start 开始 | |||
* @param count 数 | |||
* @param after | |||
*/ | |||
@Override | |||
public void beforeTextChanged(CharSequence s, int start, int count, int after) { | |||
} | |||
/** | |||
* 文本更改 | |||
* | |||
* @param s 年代 | |||
* @param start 开始 | |||
* @param before 之前 | |||
* @param count 数 | |||
*/ | |||
@Override | |||
public void onTextChanged(CharSequence s, int start, int before, int count) { | |||
inputData = s; | |||
} | |||
/** | |||
* 文本更改后 | |||
* | |||
* @param s 年代 | |||
*/ | |||
@Override | |||
public void afterTextChanged(Editable s) { | |||
String data = inputData.toString().trim(); | |||
if (TextUtils.isEmpty(data)) { | |||
//未输入内容,显示全部 | |||
mList.clear(); | |||
mList.addAll(homeDataList); | |||
mHandler.sendEmptyMessage(1); | |||
} else { | |||
refreshList(data); | |||
} | |||
} | |||
}); | |||
findViewById(R.id.ivClear).setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
etSearch.setText(""); | |||
} | |||
}); | |||
} | |||
private void refreshList(String data) { | |||
ArrayList<JumpBean> list = new ArrayList<>(); | |||
for (JumpBean jumpBean : homeDataList) { | |||
String name = mContext.getString(jumpBean.getItemNameResId()).toUpperCase(); | |||
if (name.contains(data.toUpperCase())) { | |||
list.add(jumpBean); | |||
} | |||
} | |||
mList.clear(); | |||
mList.addAll(list); | |||
mHandler.sendEmptyMessage(1); | |||
} | |||
@@ -73,10 +161,24 @@ public class MainActivity extends AppCompatActivity { | |||
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01)); | |||
list.add(new AilinkLicenseBean(65544, 103, 0)); | |||
list.add(new AilinkLicenseBean(65544, 21, 0)); | |||
list.add(new AilinkLicenseBean(0x02, 0x99, 0x01)); | |||
AILinkSDK.getInstance().initLicense(list); | |||
} | |||
private int count = 0; | |||
private OnCallbackBle mOnCallbackBle = new OnCallbackBle() { | |||
@Override | |||
public void onStartScan() { | |||
OnCallbackBle.super.onStartScan(); | |||
} | |||
@Override | |||
public void onScanning(BleValueBean data) { | |||
// AILinkBleManager.getInstance().removeOnCallbackBle(mOnCallbackBle); | |||
} | |||
}; | |||
} | |||
protected void initView() { | |||
BleLog.init(true); | |||
@@ -86,11 +188,12 @@ public class MainActivity extends AppCompatActivity { | |||
AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | |||
@Override | |||
public void onInitSuccess() { | |||
AILinkBleManager.getInstance().startScan(0); | |||
// AILinkBleManager.getInstance().setOnCallbackBle(mOnCallbackBle); | |||
} | |||
@Override | |||
public void onInitFailure() { | |||
L.e("初始化失败"); | |||
} | |||
}); | |||
@@ -98,15 +201,20 @@ public class MainActivity extends AppCompatActivity { | |||
rvList = findViewById(R.id.rv_list); | |||
rvList.setLayoutManager(new LinearLayoutManager(this)); | |||
HomeListAdapter adapter = new HomeListAdapter(this, HomeDataManager.getHomeDataList()); | |||
rvList.setAdapter(adapter); | |||
adapter.setItemClickListener(new HomeListAdapter.ItemClickListener() { | |||
mList.clear(); | |||
mList.addAll(homeDataList); | |||
mHomeListAdapter = new HomeListAdapter(this, mList); | |||
rvList.setAdapter(mHomeListAdapter); | |||
mHomeListAdapter.setItemClickListener(new HomeListAdapter.ItemClickListener() { | |||
@Override | |||
public void onItemClick(JumpBean bean) { | |||
count = 0; | |||
if (bean.getJumpActivityClass() != null) { | |||
startActivity(bean.getJumpActivityClass()); | |||
startActivity(bean.getItemType(), bean.getCid(), bean.getJumpActivityClass()); | |||
} else if (bean.getTargetActivityClass() != null) { | |||
startActivity(bean.getTargetActivityClass()); | |||
} else { | |||
startActivity(bean.getItemType(),bean.getCid()); | |||
startActivity(bean.getItemType(), bean.getCid(), ShowBleActivity.class); | |||
} | |||
} | |||
}); | |||
@@ -126,8 +234,8 @@ public class MainActivity extends AppCompatActivity { | |||
}); | |||
} | |||
private void startActivity(int type,int cid) { | |||
Intent intent = new Intent(this, ShowBleActivity.class); | |||
private void startActivity(int type, int cid, Class<?> activityClass) { | |||
Intent intent = new Intent(this, activityClass); | |||
intent.putExtra("type", type); | |||
intent.putExtra("cid", cid); | |||
startActivity(intent); |
@@ -19,7 +19,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
* | |||
* @author xing | |||
*/ | |||
public class BleDemoActivity extends BleBaseActivity { | |||
public class BleDemoActivity extends BleBaseActivity { | |||
private ListView list_view; | |||
@@ -0,0 +1,246 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules; | |||
import android.os.Message; | |||
import android.text.TextUtils; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.TextView; | |||
import com.elinkthings.elinkmqttlib.listener.OnMqttConnectListener; | |||
import com.elinkthings.elinkmqttlib.listener.OnMqttMessageListener; | |||
import com.elinkthings.elinkmqttlib.listener.OnMqttOtherMessageListener; | |||
import com.elinkthings.elinkmqttlib.mqtt.MqttDevice; | |||
import com.elinkthings.elinkmqttlib.mqtt.MqttManager; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
import java.util.ArrayList; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
/** | |||
* 公共mqtt界面 | |||
* | |||
* @author xing | |||
* @date 2024/04/19 | |||
*/ | |||
public class PublicMqttActivity extends AppBaseActivity implements View.OnClickListener, OnMqttMessageListener, OnMqttOtherMessageListener { | |||
private final int REFRESH_DATA = 1; | |||
private EditText etAppUserId; | |||
private EditText etDeviceId; | |||
private EditText etSendData; | |||
private EditText etSendDataDeviceId; | |||
private TextView tvDeviceList; | |||
private List<String> mList; | |||
private ArrayAdapter listAdapter; | |||
private ListView lv_log; | |||
/** | |||
* _mac地址用于加解密,这里随便写一个,实际使用时需要替换 | |||
*/ | |||
private String mMac = "00:00:00:00:00:00"; | |||
@Override | |||
protected void uiHandlerMessage(Message msg) { | |||
if (msg.what == REFRESH_DATA) { | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
@Override | |||
protected int getLayoutId() { | |||
return R.layout.activity_public_mqtt; | |||
} | |||
@Override | |||
protected void initListener() { | |||
MqttManager.getInstance().addOnMqttConnectListener(new OnMqttConnectListener() { | |||
@Override | |||
public void onConnected() { | |||
addLog("Mqtt连接成功"); | |||
} | |||
@Override | |||
public void onConnecting() { | |||
addLog("Mqtt正在连接中"); | |||
} | |||
@Override | |||
public void onDisconnect(int errCode) { | |||
addLog("Mqtt断开连接,错误码:" + errCode); | |||
} | |||
@Override | |||
public void onSubscribeSuccess(String... topics) { | |||
addLog("订阅成功:\n" + Arrays.toString(topics)); | |||
for (String topic : topics) { | |||
MqttDevice device = MqttManager.getInstance().getDeviceForTopic(topic); | |||
device.setOnMqttMessageListener(PublicMqttActivity.this); | |||
device.setOnMqttOtherMessageListener(PublicMqttActivity.this); | |||
device.setOnA7EncryptionListener(new MqttDevice.OnA7EncryptionListener() { | |||
@Override | |||
public byte[] onA7Encryption(int cid, byte[] cidBytes, byte[] payload) { | |||
// return AiLinkPwdUtil.mcuEncrypt(cidBytes, getMacByte(mMac), payload); | |||
return payload; | |||
} | |||
}); | |||
} | |||
} | |||
@Override | |||
public void onSubscribeFail(String... topics) { | |||
addLog("订阅失败:\n" + Arrays.toString(topics)); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void onMessage(String topic, String deviceId, int cid, byte[] payload) { | |||
addLog("设备ID:" + deviceId + " 接收到消息:" + BleStrUtils.byte2HexStr(payload)); | |||
} | |||
@Override | |||
public void onSendSuccess(String topic, String deviceId, byte[] payload) { | |||
addLog("设备ID:" + deviceId + " 发送消息成功:" + BleStrUtils.byte2HexStr(payload)); | |||
} | |||
@Override | |||
public void onSendFailure(String topic, String deviceId, byte[] payload, int errCode, int retryCount) { | |||
addLog("设备ID:" + deviceId + " 发送消息失败:" + BleStrUtils.byte2HexStr(payload)); | |||
} | |||
@Override | |||
public void onOtherMessage(String topic, String deviceId, byte[] hex) { | |||
addLog("设备ID:" + deviceId + " 接收到透传消息:" + BleStrUtils.byte2HexStr(hex)); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
int id = v.getId(); | |||
if (id == R.id.btnClearShakeHands) { | |||
mList.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} else if (id == R.id.btnConnectMqtt) { | |||
String appId = etAppUserId.getText().toString(); | |||
if (TextUtils.isEmpty(appId)) { | |||
addLog("App Id不能为空"); | |||
return; | |||
} | |||
//禁止etAppUserId编辑 | |||
etAppUserId.setEnabled(false); | |||
MqttManager.getInstance().init(this, appId); | |||
addLog("正在连接Mqtt:" + appId); | |||
MqttManager.getInstance().connectMqtt(); | |||
} else if (id == R.id.btnDisconnectMqtt) { | |||
etAppUserId.setEnabled(true); | |||
addLog("正在断开Mqtt连接"); | |||
MqttManager.getInstance().disconnect(); | |||
} else if (id == R.id.btnAddDevice) { | |||
String deviceId = etDeviceId.getText().toString(); | |||
MqttManager.getInstance().addDevice(deviceId); | |||
addLog("添加设备:" + deviceId); | |||
etDeviceId.setText(""); | |||
refreshDeviceList(); | |||
} else if (id == R.id.btnRemoveDevice) { | |||
String deviceId = etDeviceId.getText().toString(); | |||
MqttManager.getInstance().removeDevice(deviceId); | |||
addLog("移除设备:" + deviceId); | |||
etDeviceId.setText(""); | |||
refreshDeviceList(); | |||
} else if (id == R.id.btnSendData) { | |||
String data = etSendData.getText().toString().trim(); | |||
data = data.replaceAll(" ", ""); | |||
if (TextUtils.isEmpty(data)) { | |||
addLog("发送数据不能为空"); | |||
return; | |||
} | |||
String deviceId = etSendDataDeviceId.getText().toString(); | |||
if (TextUtils.isEmpty(deviceId)) { | |||
addLog("设备Id不能为空"); | |||
return; | |||
} | |||
byte[] bytes = new byte[0]; | |||
try { | |||
bytes = BleStrUtils.stringToByte(data); | |||
} catch (Exception e) { | |||
e.printStackTrace(); | |||
} | |||
MqttDevice device = MqttManager.getInstance().getDevice(deviceId); | |||
if (device != null) { | |||
if (bytes.length == 0) { | |||
addLog("发送数据不能为空"); | |||
return; | |||
} | |||
device.sendData(bytes); | |||
addLog("发送数据:" + data + " 设备:" + deviceId); | |||
} else { | |||
addLog("设备不存在或者未连接:" + deviceId); | |||
} | |||
} | |||
} | |||
@Override | |||
protected void initData() { | |||
mList = new ArrayList<>(); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
lv_log.setAdapter(listAdapter); | |||
} | |||
@Override | |||
protected void initView() { | |||
findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||
findViewById(R.id.btnConnectMqtt).setOnClickListener(this); | |||
findViewById(R.id.btnDisconnectMqtt).setOnClickListener(this); | |||
etAppUserId = (EditText) findViewById(R.id.etAppUserId); | |||
etDeviceId = (EditText) findViewById(R.id.etDeviceId); | |||
findViewById(R.id.btnAddDevice).setOnClickListener(this); | |||
findViewById(R.id.btnRemoveDevice).setOnClickListener(this); | |||
tvDeviceList = (TextView) findViewById(R.id.tvDeviceList); | |||
lv_log = findViewById(R.id.lv_log); | |||
etSendData = (EditText) findViewById(R.id.etSendData); | |||
etSendDataDeviceId = (EditText) findViewById(R.id.etSendDataDeviceId); | |||
findViewById(R.id.btnSendData).setOnClickListener(this); | |||
} | |||
private void refreshDeviceList() { | |||
List<String> deviceList = MqttManager.getInstance().getDeviceList(); | |||
String deviceListStr = TextUtils.join(",", deviceList); | |||
tvDeviceList.setText(deviceListStr); | |||
} | |||
/** | |||
* 添加日志 | |||
* | |||
* @param log 日志 | |||
*/ | |||
private void addLog(String log) { | |||
log = TimeUtils.getTimeSSS() + log; | |||
mList.add(0, log); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||
} | |||
/** | |||
* 获取mac字节 | |||
* | |||
* @param mac mac | |||
* @return {@link byte[]} | |||
*/ | |||
private byte[] getMacByte(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; | |||
} | |||
} |
@@ -100,7 +100,7 @@ public class TempInstrumentActivity extends BleBaseActivity implements OnCallbac | |||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||
findViewById(R.id.btn_get_did).setOnClickListener(this); | |||
findViewById(R.id.btnClear).setOnClickListener(this); | |||
findViewById(R.id.btnClearShakeHands).setOnClickListener(this); | |||
findViewById(R.id.btnGetConfig).setOnClickListener(this); | |||
findViewById(R.id.btnSetUnit).setOnClickListener(this); | |||
@@ -219,7 +219,7 @@ public class TempInstrumentActivity extends BleBaseActivity implements OnCallbac | |||
mBleDevice.sendData(sendBleBean); | |||
break; | |||
case R.id.btnClear: | |||
case R.id.btnClearShakeHands: | |||
if (mList != null) | |||
mList.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_DATA); |
@@ -1,6 +1,9 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector; | |||
import android.app.AlertDialog; | |||
import android.content.ClipData; | |||
import android.content.ClipboardManager; | |||
import android.content.Context; | |||
import android.content.Intent; | |||
import android.os.Message; | |||
import android.util.SparseArray; | |||
@@ -185,11 +188,28 @@ public class AirDetectorActivity extends BleAppBaseActivity implements AirDetect | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
listAdapterPayload = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mListPayload); | |||
list_view.setAdapter(listAdapter); | |||
list_view.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { | |||
@Override | |||
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { | |||
copyTextToClipboard(AirDetectorActivity.this, mList.get(position)); | |||
return true; | |||
} | |||
}); | |||
list_view_payload.setAdapter(listAdapterPayload); | |||
initSettingTypes(); | |||
initAlarmModeSP(); | |||
} | |||
private void copyTextToClipboard(Context context, String text) { | |||
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); | |||
if (clipboard != null) { | |||
clipboard.setPrimaryClip(ClipData.newPlainText("label", text)); | |||
Toast.makeText(context, "已复制到剪切板", Toast.LENGTH_SHORT).show(); | |||
} | |||
} | |||
private void initAlarmModeSP() { | |||
ArrayList<String> modeList = new ArrayList<>(); | |||
modeList.add("选择模式"); | |||
@@ -599,6 +619,9 @@ public class AirDetectorActivity extends BleAppBaseActivity implements AirDetect | |||
@Override | |||
public void onNotifyOtherData(String uuid, byte[] hex) { | |||
if (stopFlag) { | |||
return; | |||
} | |||
String data = BleStrUtils.byte2HexStr(hex); | |||
addTextWithTime("接收到未知指令:" + data); | |||
} |
@@ -8,8 +8,8 @@ import java.util.LinkedHashMap; | |||
import cn.net.aicare.modulelibrary.module.airDetector.AirConst; | |||
import cn.net.aicare.modulelibrary.module.airDetector.AlarmClockStatement; | |||
import cn.net.aicare.modulelibrary.module.airDetector.BrightnessStatement; | |||
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean; | |||
import cn.net.aicare.modulelibrary.module.airDetector.SupportBean; | |||
import cn.net.aicare.modulelibrary.module.airDetector.StatusBean; | |||
/** | |||
* @author yesp |
@@ -10,7 +10,9 @@ import android.widget.RadioButton; | |||
import androidx.annotation.Nullable; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnBleSettingListener; | |||
import java.math.BigDecimal; | |||
import java.text.SimpleDateFormat; | |||
@@ -20,9 +22,11 @@ import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionData; | |||
import cn.net.aicare.modulelibrary.module.BleNutrition.BleNutritionHistoryBean; | |||
public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback { | |||
public class BleNutritionActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionData.BleNutritionCallback, OnBleSettingListener { | |||
private static final String TAG = "Tag1"; | |||
@@ -37,7 +41,7 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private boolean mBuzzOpen = false; | |||
private BleNutritionData mBleNutritionData; | |||
@Override | |||
@@ -53,6 +57,10 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
btn_clear.setOnClickListener(this); | |||
btn_set_unit.setOnClickListener(this); | |||
btn_set_zero.setOnClickListener(this); | |||
findViewById(R.id.btnVoice).setOnClickListener(this); | |||
findViewById(R.id.btnReadHistory).setOnClickListener(this); | |||
findViewById(R.id.btnClearHistory).setOnClickListener(this); | |||
findViewById(R.id.btnSynTime).setOnClickListener(this); | |||
rb_list = new ArrayList<>(); | |||
rb_list.add(findViewById(R.id.rb_g)); | |||
@@ -97,6 +105,19 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
} else if (id == R.id.btn_set_zero) { | |||
// 去皮指令 | |||
setZero(); | |||
} else if (id == R.id.btnVoice) { | |||
//蜂鸣器开关切换 | |||
mBuzzOpen = !mBuzzOpen; | |||
setBuzz(mBuzzOpen); | |||
} else if (id == R.id.btnReadHistory) { | |||
// 获取历史数据 | |||
getHistoryData(); | |||
} else if (id == R.id.btnClearHistory) { | |||
// 清空历史数据 | |||
clearHistoryData(); | |||
} else if (id == R.id.btnSynTime) { | |||
// 同步时间 | |||
appSynTime(); | |||
} | |||
} | |||
@@ -112,6 +133,7 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
public void onServiceSuccess() { | |||
mBleDevice = mAILinkBleManager.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mBleDevice.setOnBleSettingListener(this); | |||
mBleNutritionData = new BleNutritionData(mBleDevice); | |||
mBleNutritionData.setBleNutritionCallback(this); | |||
addText("连接成功:" + mMac); | |||
@@ -226,6 +248,31 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
addText(str); | |||
} | |||
@Override | |||
public void onHistoryRecord(int schedule, List<BleNutritionHistoryBean> list) { | |||
if (schedule < 99) { | |||
addText("获取历史数据:进度" + schedule + "%"); | |||
return; | |||
} | |||
addText("获取历史数据:进度" + schedule + "%"); | |||
addText("获取历史数据:" + list.size() + "条"); | |||
StringBuilder str = new StringBuilder(); | |||
for (BleNutritionHistoryBean bean : list) { | |||
str.append("时间:").append(TimeUtils.getTimeNoNewline(bean.getTime() * 1000L)).append(";"); | |||
str.append("重量:").append(bean.getSymbol() == 1 ? "-" : "").append(bean.getWeight()).append(";"); | |||
str.append("单位:").append(getUnitStr(bean.getUnit())).append(";"); | |||
str.append("小数点:").append(bean.getDecimal()).append(";"); | |||
str.append("\n"); | |||
} | |||
addText("历史数据:\n" + str.toString()); | |||
addText("APP获取历史数据完成"); | |||
} | |||
@Override | |||
public void onClearHistoryRecord(int status) { | |||
addText("清除历史数据结果:" + (status == 0x00 ? "成功" : "失败")); | |||
} | |||
private SimpleDateFormat sdf; | |||
// 添加一条文本 | |||
@@ -260,6 +307,19 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
} | |||
} | |||
/** | |||
* 设置蜂鸣器 | |||
* | |||
* @param open 开放 | |||
*/ | |||
private void setBuzz(boolean open) { | |||
if (mBleNutritionData != null) { | |||
mBleNutritionData.setBuzz(open); | |||
addText("APP下发蜂鸣器指令:" + open); | |||
} | |||
} | |||
/** | |||
* APP 下发单位 | |||
*/ | |||
@@ -326,4 +386,39 @@ public class BleNutritionActivity extends BleBaseActivity implements View.OnClic | |||
} | |||
return unitStr; | |||
} | |||
/** | |||
* 获取历史数据 | |||
*/ | |||
public void getHistoryData() { | |||
if (mBleNutritionData != null) { | |||
mBleNutritionData.getHistoryData(0); | |||
addText("APP下发获取历史数据指令"); | |||
} | |||
} | |||
public void clearHistoryData() { | |||
if (mBleNutritionData != null) { | |||
mBleNutritionData.clearHistoryData(); | |||
} | |||
} | |||
/** | |||
* 应用同步时间 | |||
*/ | |||
public void appSynTime() { | |||
if (mBleNutritionData != null) { | |||
mBleNutritionData.appSynTime(); | |||
addText("APP下发同步时间指令"); | |||
} | |||
} | |||
@Override | |||
public void OnSettingReturn(int cmdType, int cmdData) { | |||
if (cmdType == CmdConfig.SET_DEVICE_TIME_UNIX) { | |||
addText("MCU上发同步时间结果:" + (cmdData == 0 ? "成功" : "失败")); | |||
} | |||
} | |||
} |
@@ -0,0 +1,419 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition; | |||
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 androidx.annotation.Nullable; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnBleSettingListener; | |||
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 aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
import cn.net.aicare.modulelibrary.module.ble_nutrition_nutrient.BleNutritionNutrientData; | |||
import cn.net.aicare.modulelibrary.module.ble_nutrition_nutrient.FoodNutrientBean; | |||
/** | |||
* 支持营养元素的蓝牙营养秤 | |||
* | |||
* @author xing | |||
* @date 2024/06/15 | |||
*/ | |||
public class BleNutritionNutrientActivity extends BleBaseActivity implements View.OnClickListener, BleNutritionNutrientData.OnNutritionNutrientListener, OnBleSettingListener { | |||
private static final String TAG = "Tag1"; | |||
private Button btn_clear; | |||
private ListView list_view; | |||
private Button btn_set_unit; | |||
private Button btn_set_zero; | |||
private List<RadioButton> rb_list; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private BleNutritionNutrientData mBleNutritionNutrientData; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_ble_nutrition_nutrient); | |||
btn_clear = findViewById(R.id.btn_clear); | |||
list_view = findViewById(R.id.list_view); | |||
btn_set_unit = findViewById(R.id.btn_set_unit); | |||
btn_set_zero = findViewById(R.id.btn_set_zero); | |||
btn_clear.setOnClickListener(this); | |||
btn_set_unit.setOnClickListener(this); | |||
btn_set_zero.setOnClickListener(this); | |||
findViewById(R.id.btnSendApple).setOnClickListener(this); | |||
findViewById(R.id.btnSendBeef).setOnClickListener(this); | |||
rb_list = new ArrayList<>(); | |||
rb_list.add(findViewById(R.id.rb_g)); | |||
rb_list.add(findViewById(R.id.rb_ml)); | |||
rb_list.add(findViewById(R.id.rb_lb_oz)); | |||
rb_list.add(findViewById(R.id.rb_oz)); | |||
rb_list.add(findViewById(R.id.rb_kg)); | |||
rb_list.add(findViewById(R.id.rb_jin)); | |||
rb_list.add(findViewById(R.id.rb_milk_ml)); | |||
rb_list.add(findViewById(R.id.rb_water_ml)); | |||
rb_list.add(findViewById(R.id.rb_milk_fl_oz)); | |||
rb_list.add(findViewById(R.id.rb_water_fl_oz)); | |||
rb_list.add(findViewById(R.id.rb_lb)); | |||
// 单位只能单选 | |||
for (RadioButton radioButton : rb_list) { | |||
radioButton.setOnClickListener(v -> { | |||
for (RadioButton rb : rb_list) { | |||
rb.setChecked(rb == v); | |||
} | |||
}); | |||
} | |||
// 获取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_clear) { | |||
// 清空文本框 | |||
clearText(); | |||
} else if (id == R.id.btn_set_unit) { | |||
// 设置单位 | |||
setUnit(); | |||
} else if (id == R.id.btn_set_zero) { | |||
// 去皮指令 | |||
setZero(); | |||
} else if (id == R.id.btnSendApple) { | |||
// 苹果 | |||
sendFoodApple(); | |||
} else if (id == R.id.btnSendBeef) { | |||
// 牛肉 | |||
sendFoodBeef(); | |||
} | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.disconnectAll(); | |||
} | |||
super.onDestroy(); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
mBleDevice = mAILinkBleManager.getBleDevice(mMac); | |||
if (mBleDevice != null) { | |||
mBleDevice.setOnBleSettingListener(this); | |||
mBleNutritionNutrientData = new BleNutritionNutrientData(mBleDevice); | |||
mBleNutritionNutrientData.setBleNutritionCallback(this); | |||
addText("连接成功:" + mMac); | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void onBmVersion(String version) { | |||
addText("MCU上发BM版本:" + version); | |||
} | |||
@Override | |||
public void onSupportUnit(List<SupportUnitBean> list) { | |||
String str = ""; | |||
for (SupportUnitBean supportUnitBean : list) { | |||
str += supportUnitBean.toString() + ";"; | |||
if (supportUnitBean.getType() != null && supportUnitBean.getType().equals("8")) { | |||
// 遍历所有单位,有这个支持单位就显示 | |||
for (int i = 0; i < rb_list.size(); i++) { | |||
boolean hasUnit = false; | |||
for (Integer integer : supportUnitBean.getSupportUnit()) { | |||
if (integer != null && integer == i) { | |||
hasUnit = true; | |||
break; | |||
} | |||
} | |||
rb_list.get(i).setEnabled(hasUnit); | |||
} | |||
// 再次遍历,如果选中了不支持的单位,就重新选择 | |||
boolean unitDisable = false; | |||
for (int i = 0; i < rb_list.size(); i++) { | |||
if (!rb_list.get(i).isEnabled() && rb_list.get(i).isChecked()) { | |||
unitDisable = true; | |||
rb_list.get(i).setChecked(false); | |||
} | |||
if (rb_list.get(i).isEnabled() && unitDisable) { | |||
unitDisable = false; | |||
rb_list.get(i).setChecked(true); | |||
} | |||
} | |||
} | |||
} | |||
addText("MCU上发支持单位列表:\n" + str); | |||
} | |||
@Override | |||
public void onWeight(int no, int weight, int unit, int decimal, int symbol, int type) { | |||
float w = weight; | |||
// 正负 | |||
if (symbol == 1) { | |||
w *= -1; | |||
} | |||
// 小数点 | |||
w = (float) (w / Math.pow(10, decimal)); | |||
// 保留小数位 | |||
String weightStr = getPreFloatStr(w, decimal); | |||
String str = "MCU上发重量:" + weightStr + getUnitStr(unit) + "\n流水号:" + no + ",原始重量:" + weight + ",单位:" + unit + ",小数点:" + decimal + ",符号:" + symbol + ",重量类型:" + type; | |||
addText(str); | |||
if (type == 2) { | |||
if (foodNutrientBean != null ) { | |||
//稳定重量 | |||
if (unit == 0x04) { | |||
foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*1000); | |||
}else if (unit == 0x05){ | |||
foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)*500); | |||
}else if (unit == 0x00){ | |||
foodNutrientBean.setWeightToG(Double.parseDouble(weightStr)); | |||
}else if (unit == 0x03){ | |||
foodNutrientBean.setWeightToG(UnitUtils.ozToG(Float.parseFloat(weightStr))); | |||
}else { | |||
addText("不支持的重量单位,当前只支持g,oz,kg,斤:" + unit); | |||
return; | |||
} | |||
mBleNutritionNutrientData.setNutrient(foodNutrientBean); | |||
addText("APP下发营养元素数据:" + foodNutrientBean.toString()); | |||
addText("APP下发营养元素数据(Int):" + foodNutrientBean.toStringInt()); | |||
} else { | |||
L.i("未选择食物"); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onUnitResult(int status) { | |||
String statusStr = ""; | |||
switch (status) { | |||
case 0: | |||
statusStr = "成功"; | |||
break; | |||
case 1: | |||
statusStr = "失败"; | |||
break; | |||
case 2: | |||
statusStr = "不支持"; | |||
break; | |||
} | |||
String str = "MCU上发设置单位结果:" + statusStr; | |||
addText(str); | |||
} | |||
@Override | |||
public void onErr(int weightErr, int batteryErr) { | |||
String weightErrStr = ""; | |||
switch (weightErr) { | |||
case 0: | |||
weightErrStr = "正常"; | |||
break; | |||
case 1: | |||
weightErrStr = "超重"; | |||
break; | |||
} | |||
String batteryErrStr = ""; | |||
switch (batteryErr) { | |||
case 0: | |||
batteryErrStr = "正常"; | |||
break; | |||
case 1: | |||
batteryErrStr = "低电"; | |||
break; | |||
} | |||
String str = "MCU上发异常报警:\n重量状态:" + weightErrStr + "\n电池状态:" + batteryErrStr; | |||
addText(str); | |||
} | |||
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); | |||
} | |||
// 清空文本 | |||
private void clearText() { | |||
mList.clear(); | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
// 保留小数位 | |||
private String getPreFloatStr(float f, int decimal) { | |||
BigDecimal bigDecimal = new BigDecimal(f); | |||
return bigDecimal.setScale(decimal, BigDecimal.ROUND_HALF_UP).toString(); | |||
} | |||
/** | |||
* APP 发送归零指令 | |||
*/ | |||
private void setZero() { | |||
if (mBleNutritionNutrientData != null) { | |||
mBleNutritionNutrientData.setZero(); | |||
addText("APP下发去皮指令"); | |||
} | |||
} | |||
private FoodNutrientBean foodNutrientBean; | |||
private void sendFoodApple() { | |||
foodNutrientBean = new FoodNutrientBean(); | |||
foodNutrientBean.setKcal(65); | |||
foodNutrientBean.setFat(0.16); | |||
foodNutrientBean.setSatFat(0); | |||
foodNutrientBean.setTransFat(0); | |||
foodNutrientBean.setCholesterol(0); | |||
foodNutrientBean.setNa(1); | |||
foodNutrientBean.setK(104); | |||
foodNutrientBean.setTotalCarbohydrate(15.4); | |||
foodNutrientBean.setFiber(2.1); | |||
foodNutrientBean.setSugar(13.3); | |||
foodNutrientBean.setProtein(0.15); | |||
addText("选择 苹果"); | |||
} | |||
private void sendFoodBeef() { | |||
foodNutrientBean = new FoodNutrientBean(); | |||
foodNutrientBean.setKcal(164); | |||
foodNutrientBean.setFat(9.4); | |||
foodNutrientBean.setSatFat(3.55); | |||
foodNutrientBean.setTransFat(0.389); | |||
foodNutrientBean.setCholesterol(58); | |||
foodNutrientBean.setNa(51); | |||
foodNutrientBean.setK(332); | |||
foodNutrientBean.setTotalCarbohydrate(20); | |||
foodNutrientBean.setFiber(0); | |||
foodNutrientBean.setSugar(0); | |||
foodNutrientBean.setProtein(20.1); | |||
addText("选择 牛肉"); | |||
} | |||
/** | |||
* APP 下发单位 | |||
*/ | |||
private void setUnit() { | |||
if (mBleNutritionNutrientData != null) { | |||
int unit = -1; | |||
for (int i = 0; i < rb_list.size(); i++) { | |||
if (rb_list.get(i).isChecked()) { | |||
unit = i; | |||
break; | |||
} | |||
} | |||
if (unit == -1) { | |||
addText("APP下发单位:失败:未选择单位"); | |||
return; | |||
} | |||
mBleNutritionNutrientData.setUnit(unit); | |||
addText("APP下发单位:" + unit + ":" + getUnitStr(unit)); | |||
} | |||
} | |||
/** | |||
* 获取单位字符串 | |||
* | |||
* @param unit 0 | |||
* @return g | |||
*/ | |||
private String getUnitStr(int unit) { | |||
String unitStr = ""; | |||
switch (unit) { | |||
case 0x00: | |||
unitStr = "g"; | |||
break; | |||
case 0x01: | |||
unitStr = "ml"; | |||
break; | |||
case 0x02: | |||
unitStr = "lb:oz"; | |||
break; | |||
case 0x03: | |||
unitStr = "oz"; | |||
break; | |||
case 0x04: | |||
unitStr = "kg"; | |||
break; | |||
case 0x05: | |||
unitStr = "斤"; | |||
break; | |||
case 0x06: | |||
unitStr = "牛奶ml"; | |||
break; | |||
case 0x07: | |||
unitStr = "水ml"; | |||
break; | |||
case 0x08: | |||
unitStr = "牛奶floz"; | |||
break; | |||
case 0x09: | |||
unitStr = "水floz"; | |||
break; | |||
case 0x0A: | |||
unitStr = "lb"; | |||
break; | |||
} | |||
return unitStr; | |||
} | |||
@Override | |||
public void OnSettingReturn(int cmdType, int cmdData) { | |||
if (cmdType == CmdConfig.SET_DEVICE_TIME_UNIX) { | |||
addText("MCU上发同步时间结果:" + (cmdData == 0 ? "成功" : "失败")); | |||
} | |||
} | |||
} |
@@ -52,7 +52,7 @@ public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackB | |||
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); | |||
log_list.setAdapter(listAdapter); | |||
mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { |
@@ -33,6 +33,7 @@ import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
import cn.net.aicare.algorithmutil.AlgorithmUtil; | |||
import cn.net.aicare.algorithmutil.BodyFatData; | |||
@@ -62,7 +63,8 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
private EditText et_vid; | |||
private EditText et_pid; | |||
private String url = "https://ailink.aicare.net.cn"; | |||
private String userId = "622733"; | |||
private String roomId = "4376156"; | |||
private SeekBar seek_height; | |||
private SeekBar seek_age; | |||
private TextView tv_height; | |||
@@ -73,6 +75,10 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
private int mHeight; | |||
private int mAge; | |||
private int mGender; | |||
private String mCid; | |||
private String mVid; | |||
private String mPid; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
@@ -188,7 +194,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
} | |||
public void login() throws Throwable { | |||
String mUrl=url + "/api/user/login?key=inet_elink&username=10037&password=5abd06d6f6ef0e022e11b8a41f57ebda"; | |||
String mUrl = url + "/api/user/login?key=inet_elink&username=" + userId + "&password=a0277db099cbb609cbda238c74a44aae"; | |||
URL uri = new URL(mUrl); | |||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
// Post请求必须设置允许输出 | |||
@@ -199,8 +205,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
httpURLConnection.setRequestMethod("POST"); | |||
httpURLConnection.setInstanceFollowRedirects(true); | |||
// 配置请求Content-Type | |||
httpURLConnection.setRequestProperty("Content-Type", | |||
"application/x-www-form-urlencode"); | |||
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode"); | |||
// 设置连接超时时间 | |||
httpURLConnection.setConnectTimeout(6 * 1000); | |||
// 开始连接 | |||
@@ -244,7 +249,17 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
} | |||
public void getDeviceId() throws Throwable { | |||
public void getMyDeviceId() throws Throwable { | |||
String cid = et_cid.getText().toString().trim(); | |||
String vid = et_vid.getText().toString().trim(); | |||
String pid = et_pid.getText().toString().trim(); | |||
if (TextUtils.isEmpty(cid) || TextUtils.isEmpty(vid) || TextUtils.isEmpty(pid)) { | |||
loglist.add(0, "请先输入CID,VID,PID"); | |||
logAdapter.notifyDataSetChanged(); | |||
return; | |||
} | |||
StringBuilder stringBuilder = new StringBuilder(); | |||
stringBuilder.append(url); | |||
stringBuilder.append("/api/device/getDeviceBySN?key=inet_elink&appUserId="); | |||
@@ -253,6 +268,12 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
stringBuilder.append(token); | |||
stringBuilder.append("&deviceSN="); | |||
stringBuilder.append(imei); | |||
stringBuilder.append("&cid="); | |||
stringBuilder.append(cid); | |||
stringBuilder.append("&vid="); | |||
stringBuilder.append(vid); | |||
stringBuilder.append("&pid="); | |||
stringBuilder.append(pid); | |||
Log.e(TAG, stringBuilder.toString()); | |||
URL uri = new URL(stringBuilder.toString()); | |||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
@@ -288,6 +309,9 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
try { | |||
if (datajson.length() > 0) { | |||
myDeviceId = datajson.getJSONObject(0).getString("deviceId"); | |||
mCid = datajson.getJSONObject(0).getString("cid"); | |||
mVid = datajson.getJSONObject(0).getString("vid"); | |||
mPid = datajson.getJSONObject(0).getString("pid"); | |||
} | |||
loglist.add(0, "设备信息" + result); | |||
logAdapter.notifyDataSetChanged(); | |||
@@ -321,8 +345,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
httpURLConnection.setRequestMethod("POST"); | |||
httpURLConnection.setInstanceFollowRedirects(true); | |||
// 配置请求Content-Type | |||
httpURLConnection.setRequestProperty("Content-Type", | |||
"application/x-www-form-urlencode"); | |||
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode"); | |||
// 设置连接超时时间 | |||
httpURLConnection.setConnectTimeout(6 * 1000); | |||
// 开始连接 | |||
@@ -358,17 +381,24 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
private boolean isFirstBind = true; | |||
public void bindDevice() throws Throwable { | |||
if (TextUtils.isEmpty(mCid) || TextUtils.isEmpty(mVid) || TextUtils.isEmpty(mPid)) { | |||
runOnUiThread(() -> { | |||
loglist.add(0, "请先获取设备ID"); | |||
logAdapter.notifyDataSetChanged(); | |||
}); | |||
return; | |||
} | |||
StringBuilder stringBuilder = new StringBuilder(); | |||
stringBuilder.append(url); | |||
stringBuilder.append("/api/device/add?key=inet_elink&appUserId=" + appid); | |||
stringBuilder.append("&token=" + token); | |||
stringBuilder.append("&deviceSN=" + imei); | |||
stringBuilder.append("&mac=" + imei); | |||
stringBuilder.append("&roomId=" + 86360); | |||
stringBuilder.append("&roomId=" + roomId); | |||
stringBuilder.append("&deviceName=" + "4G体脂秤"); | |||
stringBuilder.append("&cid=" + et_cid.getText().toString()); | |||
stringBuilder.append("&vid=" + et_vid.getText().toString()); | |||
stringBuilder.append("&pid=" + et_pid.getText().toString()); | |||
stringBuilder.append("&cid=" + mCid); | |||
stringBuilder.append("&vid=" + mVid); | |||
stringBuilder.append("&pid=" + mPid); | |||
stringBuilder.append("&supportUnit=" + ""); | |||
// stringBuilder.append("&version=" + "1.0"); | |||
Log.e(TAG, stringBuilder.toString()); | |||
@@ -382,8 +412,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
httpURLConnection.setRequestMethod("POST"); | |||
httpURLConnection.setInstanceFollowRedirects(true); | |||
// 配置请求Content-Type | |||
httpURLConnection.setRequestProperty("Content-Type", | |||
"application/x-www-form-urlencode"); | |||
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencode"); | |||
// 设置连接超时时间 | |||
httpURLConnection.setConnectTimeout(6 * 1000); | |||
// 开始连接 | |||
@@ -452,7 +481,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
stringBuilder.append(myDeviceId); | |||
stringBuilder.append("&maxId="); | |||
stringBuilder.append(maxId); | |||
stringBuilder.append("&subUserId=0"); | |||
stringBuilder.append("&subUserId=0&source=1"); | |||
Log.e(TAG, stringBuilder.toString()); | |||
URL uri = new URL(stringBuilder.toString()); | |||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||
@@ -497,8 +526,15 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
int algorithm = json.getInt("deviceAlgorithm"); | |||
BigDecimal bigDecimal = BigDecimal.valueOf(weightSource / Math.pow(10, weightDecimal)); | |||
String weightStr = bigDecimal.setScale(weightDecimal, BigDecimal.ROUND_HALF_UP).toString(); | |||
String weightStr = bigDecimal.setScale(weightDecimal, BigDecimal.ROUND_HALF_UP) | |||
.toString(); | |||
if (weightUnit == 4){ | |||
float[] floats = UnitUtils.LbToSt(Float.parseFloat(weightStr)); | |||
weightStr = (int)floats[0] + ":" + UnitUtils.getHoldDecimal(weightDecimal,floats[1]); | |||
} | |||
BodyFatData bodyFatData = AlgorithmUtil.getBodyFatData(algorithm, (mGender == 0 ? 2 : 1), mAge, bigDecimal.floatValue(), mHeight, adc); | |||
switch (weightUnit) { | |||
@@ -584,7 +620,7 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
@Override | |||
public void run() { | |||
try { | |||
getDeviceId(); | |||
getMyDeviceId(); | |||
} catch (Throwable throwable) { | |||
throwable.printStackTrace(); | |||
} | |||
@@ -631,9 +667,13 @@ public class BodyScale4GActivity extends AppCompatActivity implements View.OnCli | |||
}).start(); | |||
} else if (v.getId() == R.id.btn_produce) { | |||
url = "https://ailink.aicare.net.cn"; | |||
userId = "622733"; | |||
roomId = "4376156"; | |||
} else if (v.getId() == R.id.btn_test) { | |||
url = "http://test.ailink.app.aicare.net.cn"; | |||
userId = "21578"; | |||
roomId = "82731"; | |||
} | |||
} |
@@ -11,6 +11,7 @@ import androidx.annotation.Nullable; | |||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
import com.pingwang.bluetoothlib.listener.OnBleBroadcastDataListener; | |||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
import com.pingwang.bluetoothlib.utils.BleLog; | |||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
@@ -25,7 +26,7 @@ import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
public class BroadNutritionActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener { | |||
public class BroadNutritionActivity extends BleBaseActivity implements View.OnClickListener, OnScanFilterListener, OnBleBroadcastDataListener { | |||
private ListView list_view; | |||
private Button btn_start; | |||
@@ -70,6 +71,7 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl | |||
protected void onDestroy() { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.stopScan(); | |||
mAILinkBleManager.removeOnBleBroadcastDataListener(this); | |||
} | |||
super.onDestroy(); | |||
} | |||
@@ -77,6 +79,7 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl | |||
@Override | |||
public void onServiceSuccess() { | |||
mAILinkBleManager.setOnScanFilterListener(this); | |||
mAILinkBleManager.addOnBleBroadcastDataListener(this); | |||
} | |||
@Override | |||
@@ -99,13 +102,14 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl | |||
private String mMac; | |||
@Override | |||
public void onScanRecord(BleValueBean bleValueBean) { | |||
byte[] manufacturerData = bleValueBean.getManufacturerData(); | |||
public void onBleBroadcastData(BleValueBean bleValueBean, byte[] payload) { | |||
mMac = bleValueBean.getMac(); | |||
onNotifyData("",manufacturerData, bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid()); | |||
notifyData(payload); | |||
} | |||
private String mOldText = ""; | |||
private SimpleDateFormat mSdf; | |||
// 添加一条文本 | |||
@@ -113,7 +117,12 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl | |||
if (mSdf == null) { | |||
mSdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
} | |||
mList.add(mSdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
if (mOldText.equals(text)) { | |||
return; | |||
} | |||
mOldText = text; | |||
String log = mSdf.format(System.currentTimeMillis()) + ":\n" + text; | |||
mList.add(log); | |||
mListAdapter.notifyDataSetChanged(); | |||
list_view.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
@@ -179,7 +188,7 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl | |||
* | |||
* @param hex payloads | |||
*/ | |||
private void notifyData(byte[] hex) { | |||
public void notifyData(byte[] hex) { | |||
if (hex.length >= 10) { | |||
int no = hex[0] & 0xff; | |||
int type = hex[1] & 0xff; | |||
@@ -209,4 +218,6 @@ public class BroadNutritionActivity extends BleBaseActivity implements View.OnCl | |||
BigDecimal dc = new BigDecimal(f); | |||
return dc.setScale(decimal, BigDecimal.ROUND_HALF_UP).toString(); | |||
} | |||
} |
@@ -188,7 +188,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
if (AILinkBleManager.getInstance() != null) { | |||
mDevice = BroadcastWeightScaleDeviceData.getInstance(); | |||
mDevice.setOnNotifyData(this); | |||
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(this); | |||
AILinkBleManager.getInstance().addOnBleBroadcastDataListener(this); | |||
AILinkBleManager.getInstance().startScan(0, BleConfig.UUID_SERVER_BROADCAST_AILINK); | |||
} | |||
} | |||
@@ -197,7 +197,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements | |||
public void onServiceErr() { | |||
BleLog.i("ljl", "服务与界面连接断开"); | |||
//与服务断开连接 | |||
AILinkBleManager.getInstance().setOnBleBroadcastDataListener(null); | |||
AILinkBleManager.getInstance().removeOnBleBroadcastDataListener(this); | |||
} | |||
@Override |
@@ -0,0 +1,511 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.bw05watch; | |||
import android.Manifest; | |||
import android.annotation.SuppressLint; | |||
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.Editable; | |||
import android.text.TextUtils; | |||
import android.text.TextWatcher; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.Button; | |||
import android.widget.CheckBox; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.Toast; | |||
import androidx.annotation.Nullable; | |||
import androidx.core.app.ActivityCompat; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||
import cn.net.aicare.modulelibrary.module.bw05.Bw05WatchBleDevice; | |||
import cn.net.aicare.modulelibrary.module.bw05.OnBw05WatchDataListener; | |||
/** | |||
* @author ljl | |||
* on 2024/6/4 | |||
*/ | |||
public class Bw05WatchActivity extends BleBaseActivity implements OnBw05WatchDataListener, | |||
View.OnClickListener, OnCallbackDis { | |||
//01:B6:EC:E6:C8:8D | |||
private String connectMac = ""; | |||
private Button btnSetTime, btnQueryInfo, btnQueryThreshold; | |||
private Button btnSetCheckTime, btnSetBleName, btnSetThreshold; | |||
private Button btnConnect, btnClearLog; | |||
private EditText etCheckTime, etBleName; | |||
private EditText etHrMin, etHrMax; | |||
private EditText etSpo2Min, etSpo2Max; | |||
private EditText etTempMin, etTempMax; | |||
private EditText etSbpMin, etSbpMax; | |||
private EditText etDbpMin, etDbpMax; | |||
private EditText etMac; | |||
private CheckBox cbCheckTime; | |||
private ListView log_list; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private String checkTimeOp; | |||
private Bw05WatchBleDevice mBw05WatchBleDevice; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_bw05_watch); | |||
initView(); | |||
initData(); | |||
} | |||
private void initView() { | |||
btnSetTime = findViewById(R.id.btnSetTime); | |||
btnSetTime.setOnClickListener(this); | |||
btnQueryInfo = findViewById(R.id.btnQueryInfo); | |||
btnQueryInfo.setOnClickListener(this); | |||
btnQueryThreshold = findViewById(R.id.btnQueryThreshold); | |||
btnQueryThreshold.setOnClickListener(this); | |||
btnSetCheckTime = findViewById(R.id.btnSetCheckTime); | |||
btnSetCheckTime.setOnClickListener(this); | |||
btnSetBleName = findViewById(R.id.btnSetBleName); | |||
btnSetBleName.setOnClickListener(this); | |||
btnSetThreshold = findViewById(R.id.btnSetThreshold); | |||
btnSetThreshold.setOnClickListener(this); | |||
btnConnect = findViewById(R.id.btnConnect); | |||
btnConnect.setOnClickListener(this); | |||
btnClearLog = findViewById(R.id.btnClearLog); | |||
btnClearLog.setOnClickListener(this); | |||
etCheckTime = findViewById(R.id.etCheckTime); | |||
etBleName = findViewById(R.id.etBleName); | |||
etHrMin = findViewById(R.id.etHrMin); | |||
etHrMax = findViewById(R.id.etHrMax); | |||
etSpo2Min = findViewById(R.id.etSpo2Min); | |||
etSpo2Max = findViewById(R.id.etSpo2Max); | |||
etTempMin = findViewById(R.id.etTempMin); | |||
etTempMax = findViewById(R.id.etTempMax); | |||
etSbpMin = findViewById(R.id.etSbpMin); | |||
etSbpMax = findViewById(R.id.etSbpMax); | |||
etDbpMin = findViewById(R.id.etDbpMin); | |||
etDbpMax = findViewById(R.id.etDbpMax); | |||
etMac = findViewById(R.id.etMac); | |||
cbCheckTime = findViewById(R.id.cbCheckTime); | |||
checkTimeOp = cbCheckTime.isChecked() ? "1" : "0"; | |||
cbCheckTime.setOnCheckedChangeListener((buttonView, isChecked) -> { | |||
if (isChecked) { | |||
checkTimeOp = "1"; | |||
} else { | |||
checkTimeOp = "0"; | |||
} | |||
}); | |||
etTempMin.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) { | |||
if (s.toString().length() == 1 && s.toString().equals(".")) { | |||
s.clear(); | |||
} | |||
} | |||
}); | |||
etTempMax.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) { | |||
if (s.toString().length() == 1 && s.toString().equals(".")) { | |||
s.clear(); | |||
} | |||
} | |||
}); | |||
log_list = findViewById(R.id.log_list); | |||
} | |||
private void initData() { | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
log_list.setAdapter(mListAdapter); | |||
new CheckPermissionUtils(this).checkPermissions(() -> { | |||
}); | |||
// 没有蓝牙权限就请求蓝牙权限 | |||
if (!hasBluetooth()) { | |||
requestBluetooth(); | |||
return; | |||
} | |||
// 没有定位权限就请求定位权限 | |||
if (!hasLocationPermission()) { | |||
requestLocationPermission(this); | |||
return; | |||
} | |||
// 没有定位服务就请求定位服务 | |||
if (!hasLocationService()) { | |||
requestLocationService(); | |||
return; | |||
} | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
if (v == null) { | |||
return; | |||
} | |||
switch (v.getId()) { | |||
case R.id.btnSetTime: | |||
//设置时间 | |||
if (mBw05WatchBleDevice != null) { | |||
mBw05WatchBleDevice.setTime(); | |||
} | |||
break; | |||
case R.id.btnQueryInfo: | |||
//查询信息 | |||
if (mBw05WatchBleDevice != null) { | |||
mBw05WatchBleDevice.queryInfo(); | |||
} | |||
break; | |||
case R.id.btnQueryThreshold: | |||
//查询阈值 | |||
if (mBw05WatchBleDevice != null) { | |||
mBw05WatchBleDevice.queryThreshold(); | |||
} | |||
break; | |||
case R.id.btnSetCheckTime: | |||
//设置检测间隔时间 | |||
if (!TextUtils.isEmpty(etCheckTime.getText().toString())) { | |||
if (etCheckTime.getText().toString().length() < 4 && mBw05WatchBleDevice != null) { | |||
mBw05WatchBleDevice.setCheckTime(checkTimeOp + formatDataStr(etCheckTime.getText().toString(), 3)); | |||
} | |||
} | |||
break; | |||
case R.id.btnSetBleName: | |||
//设置蓝牙名称 | |||
if (!TextUtils.isEmpty(etBleName.getText().toString())) { | |||
if (mBw05WatchBleDevice != null) { | |||
mBw05WatchBleDevice.setBleName(etBleName.getText().toString()); | |||
} | |||
} | |||
break; | |||
case R.id.btnSetThreshold: | |||
//设置阈值 | |||
if (!TextUtils.isEmpty(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())) | |||
&& !TextUtils.isEmpty(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString()))) { | |||
if (mBw05WatchBleDevice != null) { | |||
StringBuilder stringBuilder = new StringBuilder(); | |||
stringBuilder.append(getIntThresholdValue(etHrMin.getText().toString(), etHrMin.getHint().toString())); | |||
stringBuilder.append(getIntThresholdValue(etHrMax.getText().toString(), etHrMax.getHint().toString())); | |||
stringBuilder.append(getIntThresholdValue(etSpo2Min.getText().toString(), etSpo2Min.getHint().toString())); | |||
stringBuilder.append(getIntThresholdValue(etSpo2Max.getText().toString(), etSpo2Max.getHint().toString())); | |||
// stringBuilder.append(getIntThresholdValue(etSbpMin.getText().toString(), etSbpMin.getHint().toString())); | |||
// stringBuilder.append(getIntThresholdValue(etSbpMax.getText().toString(), etSbpMax.getHint().toString())); | |||
// stringBuilder.append(getIntThresholdValue(etDbpMin.getText().toString(), etDbpMin.getHint().toString())); | |||
// stringBuilder.append(getIntThresholdValue(etDbpMax.getText().toString(), etDbpMax.getHint().toString())); | |||
stringBuilder.append(getFloatThresholdValue(etTempMin.getText().toString(), etTempMin.getHint().toString())); | |||
stringBuilder.append(getFloatThresholdValue(etTempMax.getText().toString(), etTempMax.getHint().toString())); | |||
String payLoadStr = stringBuilder.toString(); | |||
mBw05WatchBleDevice.setRangeValue(payLoadStr); | |||
} | |||
} | |||
break; | |||
case R.id.btnConnect: | |||
//连接设备 | |||
if (btnConnect.getText().toString().equals("连接")) { | |||
if (!TextUtils.isEmpty(etMac.getText().toString()) && isValidMacAddress(etMac.getText().toString()) && mAILinkBleManager != null) { | |||
connectMac = etMac.getText().toString(); | |||
connectBle(connectMac.toUpperCase()); | |||
} else { | |||
Toast.makeText(this, "地址出错", Toast.LENGTH_SHORT).show(); | |||
} | |||
} else { | |||
if (mAILinkBleManager != null && !TextUtils.isEmpty(connectMac)) { | |||
mAILinkBleManager.disconnect(connectMac.toUpperCase()); | |||
} | |||
} | |||
break; | |||
case R.id.btnClearLog: | |||
clearText(); | |||
break; | |||
default: | |||
break; | |||
} | |||
} | |||
// 清空文本 | |||
private void clearText() { | |||
mList.clear(); | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
private SimpleDateFormat mSdf; | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
if (mSdf == null) { | |||
mSdf = new SimpleDateFormat("HH:mm:ss:SSS", Locale.US); | |||
} | |||
mList.add(mSdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
log_list.smoothScrollToPosition(mList.size() - 1); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
CallbackDisIm.getInstance().addListListener(this); | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void bleClose() { | |||
addText("蓝牙未开启,请退出打开蓝牙重试"); | |||
} | |||
@Override | |||
public void onDataStr(String dataStr) { | |||
addText(dataStr); | |||
} | |||
@Override | |||
public void onConnecting(String mac) { | |||
addText("正在连接设备:" + mac); | |||
} | |||
@Override | |||
public void onConnectionSuccess(String mac) { | |||
BleConfig.setHandshakeStatus(mac, false); | |||
} | |||
@Override | |||
public void onServicesDiscovered(String mac) { | |||
addText("连接成功:" + mac); | |||
if (mAILinkBleManager != null) { | |||
runOnUiThread(() -> { | |||
btnConnect.setText("断开"); | |||
}); | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mac); | |||
Bw05WatchBleDevice.init(bleDevice); | |||
mBw05WatchBleDevice = Bw05WatchBleDevice.getInstance(); | |||
mBw05WatchBleDevice.setOnBw05WatchDataListener(this); | |||
} | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
addText("连接断开:" + mac + "错误码:" + code); | |||
runOnUiThread(() -> { | |||
btnConnect.setText("连接"); | |||
}); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
CallbackDisIm.getInstance().removeListener(this); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.disconnect(connectMac); | |||
} | |||
} | |||
/** | |||
* 转整数 | |||
* | |||
* @param inputStr 输入的数据 | |||
* @return | |||
*/ | |||
private int getIntData(String inputStr) { | |||
try { | |||
return Integer.parseInt(inputStr); | |||
} catch (Exception e) { | |||
return -1000; | |||
} | |||
} | |||
/** | |||
* 转浮点型 | |||
* | |||
* @param inputStr 输入的数据 | |||
* @return | |||
*/ | |||
private float getFloatData(String inputStr) { | |||
try { | |||
return Float.parseFloat(inputStr); | |||
} catch (Exception e) { | |||
return -1000; | |||
} | |||
} | |||
/** | |||
* 阈值整数数值处理 | |||
* | |||
* @param inputStr | |||
* @param hintStr | |||
* @return | |||
*/ | |||
private String getIntThresholdValue(String inputStr, String hintStr) { | |||
if (TextUtils.isEmpty(inputStr)) { | |||
return formatDataStr(hintStr, 3); | |||
} else { | |||
return formatDataStr(inputStr, 3); | |||
} | |||
} | |||
private String getFloatThresholdValue(String inputStr, String hintStr) { | |||
if (TextUtils.isEmpty(inputStr)) { | |||
return hintStr; | |||
} else { | |||
if ((Float.parseFloat(inputStr) + "").length() > 4) { | |||
Toast.makeText(this, "输入的范围过大", Toast.LENGTH_SHORT).show(); | |||
return ""; | |||
} else { | |||
return formatDataStr((Float.parseFloat(inputStr) + ""), 4); | |||
} | |||
} | |||
} | |||
/** | |||
* 不足有效数据位需要补零 | |||
* | |||
* @param dataStr 输入的数据 | |||
* @param digit 该数据的有效数据位 | |||
* @return | |||
*/ | |||
private String formatDataStr(String dataStr, int digit) { | |||
if (dataStr.length() < digit) { | |||
int diff = digit - dataStr.length(); | |||
StringBuilder newDataStr = new StringBuilder(); | |||
for (int i = 0; i < diff; i++) { | |||
newDataStr.append("0"); | |||
} | |||
newDataStr.append(dataStr); | |||
return newDataStr.toString(); | |||
} else { | |||
return dataStr; | |||
} | |||
} | |||
/** | |||
* 判断输入的是否是合法的mac地址 | |||
* | |||
* @param inputMacStr | |||
* @return | |||
*/ | |||
private boolean isValidMacAddress(String inputMacStr) { | |||
String regex = "^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$"; | |||
return inputMacStr.matches(regex); | |||
} | |||
public static final int REQUEST_PERMISSION_CODE = 1500; | |||
/** | |||
* 是否有定位权限 | |||
* | |||
* @return boolean | |||
*/ | |||
private boolean hasLocationPermission() { | |||
return ActivityCompat.checkSelfPermission(this, 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) this.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); | |||
} | |||
/** | |||
* 申请打开蓝牙 | |||
*/ | |||
@SuppressLint("MissingPermission") | |||
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); | |||
} | |||
} |
@@ -14,6 +14,9 @@ import androidx.annotation.Nullable; | |||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
@@ -24,11 +27,18 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import cn.net.aicare.modulelibrary.module.CoffeeScale.CoffeeScaleData; | |||
public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback { | |||
/** | |||
* 咖啡秤 | |||
* | |||
* @author xing | |||
* @date 2024/04/18 | |||
*/ | |||
public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClickListener, CoffeeScaleData.CoffeeScaleCallback, OnCallbackDis { | |||
private static final String TAG = "Tag1"; | |||
private Button btn_clear; | |||
private Button btnPause; | |||
private Button btn_zero; | |||
private Button btn_set_weight_unit; | |||
private Button btn_set_temp_unit; | |||
@@ -74,7 +84,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
private boolean mPauseRefresh = false; | |||
private String mMac; | |||
private BleDevice mBleDevice; | |||
private CoffeeScaleData mCoffeeScaleData; | |||
@@ -85,6 +95,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
setContentView(R.layout.activity_coffee_scale); | |||
btn_clear = findViewById(R.id.btn_clear); | |||
btnPause = findViewById(R.id.btnPause); | |||
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); | |||
@@ -129,6 +140,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
list_view = findViewById(R.id.list_view); | |||
btn_clear.setOnClickListener(this); | |||
btnPause.setOnClickListener(this); | |||
btn_zero.setOnClickListener(this); | |||
btn_set_weight_unit.setOnClickListener(this); | |||
btn_set_temp_unit.setOnClickListener(this); | |||
@@ -148,6 +160,8 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
CallbackDisIm.getInstance().addListListener(this); | |||
} | |||
@Override | |||
@@ -157,8 +171,13 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
// 清空文本框 | |||
clearText(); | |||
break; | |||
case R.id.btnPause: | |||
// 清空文本框 | |||
mPauseRefresh = !mPauseRefresh; | |||
break; | |||
case R.id.btn_zero: | |||
// APP下发去皮功能(归零功能) | |||
//某些秤可能需要进入冲煮模式才能使用,并且设备上面的定时和归零可用 | |||
appSetZero(); | |||
break; | |||
case R.id.btn_set_weight_unit: | |||
@@ -206,6 +225,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
@Override | |||
protected void onDestroy() { | |||
CallbackDisIm.getInstance().removeListener(this); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.disconnectAll(); | |||
} | |||
@@ -344,6 +364,20 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
} | |||
@Override | |||
public void onWeightResult(int status, int weightUnit, int weightDecimal, int weightSource, int err) { | |||
String weightStr = (status == 1 ? "稳定重量" : "实时重量") + ":" + BleDensityUtil.getInstance().holdDecimals(weightSource, weightDecimal) + getWeightUnitStr(weightUnit); | |||
String text = "体重数据:" + weightStr; | |||
addText(text); | |||
} | |||
@Override | |||
public void onTempResult(int tempUnit, int tempDecimal, int tempSource) { | |||
String tempStr = BleDensityUtil.getInstance().holdDecimals(tempSource, tempDecimal) + getTempUnitStr(tempUnit); | |||
String text = "温度数据:" + tempStr; | |||
addText(text); | |||
} | |||
// APP下发去皮功能(归零功能) | |||
private void appSetZero() { | |||
Log.i(TAG, "去皮功能(归零功能)"); | |||
@@ -504,9 +538,11 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
} | |||
SimpleDateFormat sdf; | |||
// 添加一条文本 | |||
private void addText(String text) { | |||
if (mPauseRefresh) { | |||
return; | |||
} | |||
if (sdf == null) { | |||
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
} | |||
@@ -608,7 +644,7 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
} | |||
return ""; | |||
} | |||
private String getAlertOpStr(int op) { | |||
switch (op) { | |||
case 0: | |||
@@ -628,4 +664,13 @@ public class CoffeeScaleActivity extends BleBaseActivity implements View.OnClick | |||
} | |||
return ""; | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mac.equalsIgnoreCase(mMac)) { | |||
addText("设备:" + mac + "断开连接:" + code); | |||
finish(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,378 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.CompoundButton; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import androidx.annotation.Nullable; | |||
import com.pingwang.bluetoothlib.AILinkBleManager; | |||
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 aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatMcuDeviceData; | |||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
/** | |||
* 八电极秤 MCU | |||
*/ | |||
public class EightBodyFatMcuActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, EightBodyFatMcuDeviceData.onEightBodyFatMcuCallback { | |||
private List<String> loglist; | |||
private ListView log_list; | |||
private ArrayAdapter listAdapter; | |||
private String mAddress; | |||
private EightBodyFatMcuDeviceData mEightBodyFatDeviceData; | |||
private RadioButton kg, jing, stlb, lb, C, F; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_eight_body_fata); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
init(); | |||
loglist = new ArrayList<>(); | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
log_list.setAdapter(listAdapter); | |||
} | |||
private void init() { | |||
log_list = findViewById(R.id.log_list); | |||
kg = findViewById(R.id.kg); | |||
jing = findViewById(R.id.jin); | |||
stlb = findViewById(R.id.st_lb); | |||
lb = findViewById(R.id.lb); | |||
C = findViewById(R.id.c); | |||
F = findViewById(R.id.f); | |||
findViewById(R.id.support_unit).setOnClickListener(this); | |||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.KG); | |||
} | |||
} | |||
}); | |||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.JIN); | |||
} | |||
} | |||
}); | |||
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.ST); | |||
} | |||
} | |||
}); | |||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.setWeightUnit(EightBodyFatUtil.LB); | |||
} | |||
} | |||
}); | |||
C.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.setTempUnit(EightBodyFatUtil.C); | |||
} | |||
} | |||
}); | |||
F.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.setTempUnit(EightBodyFatUtil.F); | |||
} | |||
} | |||
}); | |||
kg.setChecked(true); | |||
C.setChecked(true); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
loglist.add(0, "绑定服务成功"); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.setOnCallbackBle(this); | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
mEightBodyFatDeviceData = new EightBodyFatMcuDeviceData(bleDevice); | |||
mEightBodyFatDeviceData.setEightBodyFatCallback(this); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.removeOnCallbackBle(this); | |||
} | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mAddress.equals(mac)) { | |||
addLog("连接断开:" + code); | |||
} | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
if (v.getId() == R.id.support_unit) { | |||
if (mEightBodyFatDeviceData != null) | |||
mEightBodyFatDeviceData.getUnitList(); | |||
} | |||
} | |||
@Override | |||
public void onState(int opCode, int result) { | |||
//0x01 : 校准 0x02 : 温度单位切换 0x03:重量单位切换 | |||
String opCodeStr = ""; | |||
if (opCode == 0x01) { | |||
opCodeStr = "校准"; | |||
} else if (opCode == 0x02) { | |||
opCodeStr = "温度单位切换"; | |||
} else if (opCode == 0x03) { | |||
opCodeStr = "重量单位切换"; | |||
} | |||
String resultStr = ""; | |||
if (result == 0x00) { | |||
resultStr = "操作成功"; | |||
} else if (result == 0x01) { | |||
resultStr = "操作失败"; | |||
} else if (result == 0x02) { | |||
resultStr = "正在操作中"; | |||
} | |||
addLog("设备返回操作指令:" + opCodeStr + " 结果:" + resultStr); | |||
} | |||
private double weightValue; | |||
@Override | |||
public void onWeight(int status, int weight, int unit, int decimal) { | |||
String statusStr = ""; | |||
if (status == 0x01) { | |||
statusStr = "实时体重"; | |||
} else if (status == 0x02) { | |||
statusStr = "稳定体重"; | |||
} | |||
if (decimal == 0) { | |||
weightValue = weight; | |||
} else { | |||
weightValue = weight / (decimal * 10.0); | |||
} | |||
String unitStr = ""; | |||
if (unit == EightBodyFatUtil.KG) { | |||
unitStr = "kg"; | |||
} else if (unit == EightBodyFatUtil.JIN) { | |||
unitStr = "斤"; | |||
} else if (unit == EightBodyFatUtil.ST) { | |||
unitStr = "lb(未转换为st:lb)"; | |||
} else if (unit == EightBodyFatUtil.LB) { | |||
unitStr = "lb"; | |||
} | |||
addLog("体重:" + statusStr + " " + weightValue + unitStr); | |||
} | |||
@Override | |||
public void onHeight(int status, int height, int unit) { | |||
String statusStr = ""; | |||
if (status == 0x01) { | |||
statusStr = "测量中"; | |||
} else if (status == 0x03) { | |||
statusStr = "测量失败"; | |||
} else if (status == 0x02) { | |||
statusStr = "测量完成"; | |||
} | |||
String unitStr = ""; | |||
if (unit == 0x00) { | |||
unitStr = "cm"; | |||
} else if (unit == 0x01) { | |||
unitStr = "inch"; | |||
} else if (unit == 0x02) { | |||
unitStr = "ft-in"; | |||
} | |||
addLog("身高:" + statusStr + " " + height + unitStr); | |||
} | |||
@Override | |||
public void onImpedance(int status, EightBodyFatMcuDeviceData.EightBodyFatAdc eightBodyFatAdc, int arithmetic) { | |||
String statusStr = ""; | |||
if (status == EightBodyFatUtil.IMPEDANCE_MEASUREMENT) { | |||
statusStr = "测量中"; | |||
} else if (status == EightBodyFatUtil.IMPEDANCE_FAILED) { | |||
statusStr = "测量失败"; | |||
} else if (status == EightBodyFatUtil.IMPEDANCE_SUCCESS_MCU) { | |||
statusStr = "测量完成"; | |||
} | |||
String partStr = ""; | |||
int part = eightBodyFatAdc.getPart(); | |||
int adc = eightBodyFatAdc.getAdc(); | |||
if (part == 0x00) { | |||
partStr = "双脚阻抗"; | |||
} else if (part == 0x01) { | |||
partStr = "双手阻抗"; | |||
} else if (part == 0x02) { | |||
partStr = "左手阻抗"; | |||
} else if (part == 0x03) { | |||
partStr = "右手阻抗"; | |||
} else if (part == 0x04) { | |||
partStr = "左脚阻抗"; | |||
} else if (part == 0x05) { | |||
partStr = "右脚阻抗"; | |||
} else if (part == 0x06) { | |||
partStr = "左全身阻抗"; | |||
} else if (part == 0x07) { | |||
partStr = "右全身阻抗"; | |||
} else if (part == 0x08) { | |||
partStr = "右手左脚阻抗"; | |||
} else if (part == 0x09) { | |||
partStr = "左手右脚阻抗"; | |||
} else if (part == 0x0A) { | |||
partStr = "躯干阻抗"; | |||
} | |||
addLog("阻抗:" + statusStr + " " + partStr + " : " + adc); | |||
} | |||
@Override | |||
public void onHeartRate(int status, int heartRate) { | |||
String statusStr = ""; | |||
if (status == EightBodyFatUtil.HEART_RATE_MEASUREMENT) { | |||
statusStr = "测量中"; | |||
} else if (status == EightBodyFatUtil.HEART_RATE_SUCCESS) { | |||
statusStr = "测量成功"; | |||
} else if (status == EightBodyFatUtil.HEART_RATE_FAILED) { | |||
statusStr = "测量失败"; | |||
} | |||
addLog("心率:" + statusStr + " " + heartRate); | |||
} | |||
@Override | |||
public void onTemp(int sign, int temp, int unit, int decimal) { | |||
double tempValue = temp / (decimal * 10.0); | |||
if (decimal == 0) { | |||
tempValue = temp; | |||
} | |||
if (sign == 1) { | |||
tempValue = -tempValue; | |||
} | |||
String unitStr = ""; | |||
if (unit == EightBodyFatUtil.C) { | |||
unitStr = "℃"; | |||
} else if (unit == EightBodyFatUtil.F) { | |||
unitStr = "℉"; | |||
} | |||
addLog("温度:" + tempValue + unitStr); | |||
} | |||
@Override | |||
public void onSyncUserInfo() { | |||
addLog("请求同步用户信息:" + "默认传入用户:用户ID:1, 普通人:0, 性别:男,身高:180,年龄27"); | |||
if (mEightBodyFatDeviceData != null) { | |||
mEightBodyFatDeviceData.setUserInfo(1, 0, 1, 27, 180); | |||
} | |||
} | |||
@Override | |||
public void onCompletionData() { | |||
addLog("请求补充体脂数据"); | |||
} | |||
@Override | |||
public void onBodyFatData(int step, EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) { | |||
addLog("体脂测量中,步骤:" + step); | |||
} | |||
@Override | |||
public void onTestSuccess(EightBodyFatMcuDeviceData.EightBodyFatInfo bodyFat) { | |||
addLog("体脂数据:" + bodyFat.toString()); | |||
} | |||
@Override | |||
public void onErrCode(int code) { | |||
addLog("错误码:" + code); | |||
} | |||
@Override | |||
public void onVersion(String version) { | |||
addLog("当前版本:" + version); | |||
} | |||
@Override | |||
public void onSupportUnit(List<SupportUnitBean> list) { | |||
addLog("支持单位:"); | |||
for (SupportUnitBean supportUnitBean : list) { | |||
addLog(supportUnitBean.toString()); | |||
} | |||
} | |||
@Override | |||
public void showData(String data) { | |||
addLog(data); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
AILinkBleManager.getInstance().disconnect(mAddress); | |||
} | |||
private String mOldLog = ""; | |||
/** | |||
* 添加日志 | |||
* | |||
* @param log 日志 | |||
*/ | |||
private void addLog(String log) { | |||
if (mOldLog.equalsIgnoreCase(log)) { | |||
return; | |||
} | |||
mOldLog = log; | |||
loglist.add(0, log); | |||
if (listAdapter != null) { | |||
listAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
} |
@@ -1,4 +1,4 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | |||
import android.os.Bundle; | |||
import android.view.View; | |||
@@ -16,6 +16,7 @@ import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean; | |||
@@ -45,19 +46,19 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
log_list.setAdapter(listAdapter); | |||
weight = 60; | |||
if (mEightBodyfatAdc == null) { | |||
mEightBodyfatAdc = new EightBodyfatAdc(); | |||
} | |||
mEightBodyfatAdc.setAdcFoot(5784349); | |||
mEightBodyfatAdc.setAdcHand(5121114); | |||
mEightBodyfatAdc.setAdcLeftHand(12854746); | |||
mEightBodyfatAdc.setAdcRightHand(15738341); | |||
mEightBodyfatAdc.setAdcLeftFoot(1074604); | |||
mEightBodyfatAdc.setAdcRightFoot(13046299); | |||
mEightBodyfatAdc.setAdcLeftBody(7480094); | |||
mEightBodyfatAdc.setAdcRightBody(7480094); | |||
kaimengJieMi(mEightBodyfatAdc); | |||
// weight = 60; | |||
// if (mEightBodyfatAdc == null) { | |||
// mEightBodyfatAdc = new EightBodyfatAdc(); | |||
// } | |||
// mEightBodyfatAdc.setAdcFoot(5784349); | |||
// mEightBodyfatAdc.setAdcHand(5121114); | |||
// mEightBodyfatAdc.setAdcLeftHand(12854746); | |||
// mEightBodyfatAdc.setAdcRightHand(15738341); | |||
// mEightBodyfatAdc.setAdcLeftFoot(1074604); | |||
// mEightBodyfatAdc.setAdcRightFoot(13046299); | |||
// mEightBodyfatAdc.setAdcLeftBody(7480094); | |||
// mEightBodyfatAdc.setAdcRightBody(7480094); | |||
// kaimengJieMi(mEightBodyfatAdc); | |||
} | |||
@@ -1,19 +1,55 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat; | |||
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; | |||
/** | |||
* 算法ID | |||
*/ | |||
private int algorithms; | |||
@@ -0,0 +1,464 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band; | |||
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.CompoundButton; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import android.widget.RadioButton; | |||
import androidx.annotation.NonNull; | |||
import androidx.annotation.Nullable; | |||
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 java.util.Map; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.JsonLoader; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.UnitUtils; | |||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.BaseEightDoubleBodyFatData; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatAdcBean; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBean; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleConfig; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleDeviceData; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.EightDoubleBodyFatBleMcuDeviceData; | |||
import cn.net.aicare.modulelibrary.module.EightDoubleBodyfatScale.OnEightDoubleBodyFatCallback; | |||
/** | |||
* 双频八电极秤(mcu算法) | |||
* | |||
* @author xing | |||
* @date 2024/03/14 | |||
*/ | |||
public class EightDoubleBodyfatActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, OnEightDoubleBodyFatCallback { | |||
/** | |||
* 刷新键 | |||
*/ | |||
private final int REFRESH_KEY = 0x01; | |||
private List<String> mLoglist; | |||
private ListView log_list; | |||
private ArrayAdapter mAdapter; | |||
private String mAddress; | |||
private BaseEightDoubleBodyFatData mEightDoubleBodyFatData; | |||
private RadioButton kg, jing, stlb, lb; | |||
private EditText et_weight, et_height, et_age, et_sex; | |||
private String mWeightKg = "78"; | |||
private UserInfoBean mUserInfoBean; | |||
private Map<String, String> mMap; | |||
private int mCid; | |||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
@Override | |||
public void handleMessage(@NonNull Message msg) { | |||
super.handleMessage(msg); | |||
if (msg.what == REFRESH_KEY) { | |||
if (mAdapter != null) { | |||
mAdapter.notifyDataSetChanged(); | |||
} | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
setContentView(R.layout.activity_eight_double_body_fata); | |||
mAddress = getIntent().getStringExtra("mac"); | |||
mCid = getIntent().getIntExtra("cid", 0); | |||
initView(); | |||
initListener(); | |||
initData(); | |||
} | |||
private void initData() { | |||
mLoglist = new ArrayList<>(); | |||
mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLoglist); | |||
log_list.setAdapter(mAdapter); | |||
mMap = JsonLoader.loadJsonFromAsset(this, "text.json"); | |||
initUserInfo(); | |||
Button test_bodyfit = findViewById(R.id.test_bodyfit); | |||
test_bodyfit.setOnClickListener(new View.OnClickListener() { | |||
@Override | |||
public void onClick(View v) { | |||
List<EightDoubleBodyFatAdcBean> list = new ArrayList<>(); | |||
EightDoubleBodyFatAdcBean adcBean = new EightDoubleBodyFatAdcBean(); | |||
adcBean.setAdcRightHand(2433844368L); | |||
adcBean.setAdcLeftHand(3781622117L); | |||
adcBean.setAdcBody(1349958013L); | |||
adcBean.setAdcRightFoot(1365295937L); | |||
adcBean.setAdcLeftFoot(1903359127L); | |||
adcBean.setFrequencyId(0x01); | |||
adcBean.setAlgorithmsId(0x01); | |||
list.add(adcBean); | |||
EightDoubleBodyFatAdcBean adcBean100 = new EightDoubleBodyFatAdcBean(); | |||
adcBean100.setAdcRightHand(2447381468L); | |||
adcBean100.setAdcLeftHand(1909750593L); | |||
adcBean100.setAdcBody(2954962439L); | |||
adcBean100.setAdcRightFoot(4036701847L); | |||
adcBean100.setAdcLeftFoot(2421978775L); | |||
adcBean100.setFrequencyId(0x02); | |||
adcBean100.setAlgorithmsId(0x01); | |||
list.add(adcBean100); | |||
onTestCompleted(list); | |||
} | |||
}); | |||
} | |||
private void initUserInfo() { | |||
mWeightKg = et_weight.getText().toString().trim(); | |||
String height = et_height.getText().toString().trim(); | |||
String age = et_age.getText().toString().trim(); | |||
String sex = et_sex.getText().toString().trim(); | |||
if (mUserInfoBean == null) { | |||
mUserInfoBean = new UserInfoBean(); | |||
} | |||
mUserInfoBean.setAge(Integer.parseInt(age)); | |||
mUserInfoBean.setSex(Integer.parseInt(sex)); | |||
mUserInfoBean.setHeightCm(Integer.parseInt(height)); | |||
mUserInfoBean.setWeightKg(Float.parseFloat(mWeightKg)); | |||
} | |||
private void initView() { | |||
et_weight = findViewById(R.id.et_weight); | |||
et_height = findViewById(R.id.et_height); | |||
et_age = findViewById(R.id.et_age); | |||
et_sex = findViewById(R.id.et_sex); | |||
log_list = findViewById(R.id.log_list); | |||
kg = findViewById(R.id.kg); | |||
jing = findViewById(R.id.jin); | |||
stlb = findViewById(R.id.st_lb); | |||
lb = findViewById(R.id.lb); | |||
} | |||
private void initListener() { | |||
findViewById(R.id.support_unit).setOnClickListener(this); | |||
findViewById(R.id.btn_clear_log).setOnClickListener(this); | |||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightDoubleBodyFatData != null) { | |||
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.KG); | |||
} | |||
} | |||
} | |||
}); | |||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightDoubleBodyFatData != null) { | |||
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.JIN); | |||
} | |||
} | |||
} | |||
}); | |||
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightDoubleBodyFatData != null) { | |||
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.ST); | |||
} | |||
} | |||
} | |||
}); | |||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
@Override | |||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
if (isChecked) { | |||
if (mEightDoubleBodyFatData != null) { | |||
mEightDoubleBodyFatData.setWeightUnit(EightBodyFatUtil.LB); | |||
} | |||
} | |||
} | |||
}); | |||
kg.setChecked(true); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
showData("绑定服务成功"); | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.setOnCallbackBle(this); | |||
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
if (bleDevice != null) { | |||
if (mCid == EightDoubleBodyFatBleConfig.CID_APP) { | |||
mEightDoubleBodyFatData = EightDoubleBodyFatBleDeviceData.init(bleDevice); | |||
} else if (mCid == EightDoubleBodyFatBleConfig.CID_MCU) { | |||
mEightDoubleBodyFatData = EightDoubleBodyFatBleMcuDeviceData.init(bleDevice); | |||
} else { | |||
L.e("无效的CID:" + mCid); | |||
return; | |||
} | |||
mEightDoubleBodyFatData.setEightBodyFatCallback(this); | |||
} | |||
} | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
if (mAILinkBleManager != null) { | |||
mAILinkBleManager.removeOnCallbackBle(this); | |||
} | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
showData("连接断开:" + mac + " code=" + code); | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
if (v.getId() == R.id.support_unit) { | |||
if (mEightDoubleBodyFatData != null) { | |||
mEightDoubleBodyFatData.getUnitList(); | |||
} | |||
} else if (v.getId() == R.id.btn_clear_log) { | |||
mLoglist.clear(); | |||
mHandler.sendEmptyMessage(REFRESH_KEY); | |||
} | |||
} | |||
@Override | |||
public void onErrCode(int state) { | |||
showData("错误码:" + state); | |||
} | |||
@Override | |||
public void onUnitState(int state) { | |||
showData("单位状态:" + state); | |||
} | |||
@Override | |||
public void onTestCompleted(List<EightDoubleBodyFatAdcBean> adcBeanList) { | |||
initUserInfo(); | |||
mLoglist.add(0, "测试完成:" + adcBeanList.size()); | |||
for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | |||
String data = ""; | |||
data += (adcBean.getFrequencyId() == 0x01) ? "频率:20kHz" : "频率:100kHz"; | |||
data += "\n 左手阻抗:" + adcBean.getAdcLeftHand(); | |||
data += "\n 右手阻抗:" + adcBean.getAdcRightHand(); | |||
data += "\n 左脚阻抗:" + adcBean.getAdcLeftFoot(); | |||
data += "\n 右脚阻抗:" + adcBean.getAdcRightFoot(); | |||
data += "\n 躯干阻抗:" + adcBean.getAdcBody(); | |||
data += "\n 算法:" + adcBean.getAlgorithmsId(); | |||
mLoglist.add(0, data); | |||
} | |||
mLoglist.add(0, "用户信息:" + mUserInfoBean.toString()); | |||
mHandler.sendEmptyMessage(REFRESH_KEY); | |||
getBodyFatData(adcBeanList); | |||
} | |||
// private HetaiHttpUtils mHetaiHttpUtils; | |||
private void getBodyFatData(List<EightDoubleBodyFatAdcBean> adcBeanList) { | |||
if (mCid != EightDoubleBodyFatBleConfig.CID_APP) { | |||
return; | |||
} | |||
// ParamsHetaiBean paramsHetaiBean = new ParamsHetaiBean(); | |||
// paramsHetaiBean.setAge(String.valueOf(mUserInfoBean.getAge())); | |||
// paramsHetaiBean.setSex(String.valueOf(mUserInfoBean.getSex())); | |||
// paramsHetaiBean.setHeightCm(String.valueOf(mUserInfoBean.getHeightCm())); | |||
// paramsHetaiBean.setWeightKg(String.valueOf(mUserInfoBean.getWeightKg())); | |||
// for (EightDoubleBodyFatAdcBean adcBean : adcBeanList) { | |||
// if (adcBean.getFrequencyId() == 0x01) { | |||
// //20khz | |||
// paramsHetaiBean.setZ20KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand())); | |||
// paramsHetaiBean.setZ20KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand())); | |||
// paramsHetaiBean.setZ20KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot())); | |||
// paramsHetaiBean.setZ20KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot())); | |||
// paramsHetaiBean.setZ20KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody())); | |||
// | |||
// } else if (adcBean.getFrequencyId() == 0x02) { | |||
// //100khz | |||
// paramsHetaiBean.setZ100KhzLeftArmEnCode(String.valueOf(adcBean.getAdcLeftHand())); | |||
// paramsHetaiBean.setZ100KhzRightArmEnCode(String.valueOf(adcBean.getAdcRightHand())); | |||
// paramsHetaiBean.setZ100KhzLeftLegEnCode(String.valueOf(adcBean.getAdcLeftFoot())); | |||
// paramsHetaiBean.setZ100KhzRightLegEnCode(String.valueOf(adcBean.getAdcRightFoot())); | |||
// paramsHetaiBean.setZ100KhzTrunkEnCode(String.valueOf(adcBean.getAdcBody())); | |||
// } | |||
// } | |||
// //获取数据 | |||
// if (mHetaiHttpUtils == null) { | |||
// mHetaiHttpUtils = new HetaiHttpUtils(); | |||
// } | |||
// mHetaiHttpUtils.postGetBody270(paramsHetaiBean, new OnHttpListener<HttpHetaiListBean>() { | |||
// @Override | |||
// public void onSuccess(HttpHetaiListBean data) { | |||
// List<HttpHetaiBean> httpHetaiBeans = data.getData(); | |||
// if (httpHetaiBeans != null) { | |||
// mLoglist.add(0, "获取数据成功:" + httpHetaiBeans.size()); | |||
// for (HttpHetaiBean httpHetaiBean : httpHetaiBeans) { | |||
// String show = mMap.get(httpHetaiBean.getName()) + ":" + httpHetaiBean.getValue() + " " + | |||
// (httpHetaiBean.getUnit() == null ? "" : httpHetaiBean.getUnit()) + | |||
// (httpHetaiBean.getLevel() == null ? "" : "\n" + httpHetaiBean.getLevel().toString()); | |||
// mLoglist.add(0, show); | |||
// L.i(httpHetaiBean.toString()); | |||
// } | |||
// mHandler.sendEmptyMessage(REFRESH_KEY); | |||
// } else { | |||
// showData("体脂数据为空:" + data.toString()); | |||
// } | |||
// | |||
// } | |||
// | |||
// @Override | |||
// public void onFailed(HttpHetaiListBean data) { | |||
// showData("获取数据失败"); | |||
// } | |||
// }); | |||
} | |||
@Override | |||
public void onWeight(int state, int weight, int decimal, int unit, int batteryStatus, int power) { | |||
//测量状态 1实时体重 2稳定体重 | |||
float weightF = Float.parseFloat(UnitUtils.getHoldDecimal(decimal, weight)); | |||
String stateStr = ""; | |||
if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_REAL_TIME_WEIGH) { | |||
stateStr = "实时体重"; | |||
} else if (state == EightDoubleBodyFatBleConfig.STATUS_WEIGHT_STABILIZATION_WEIGHT) { | |||
stateStr = "稳定体重"; | |||
mWeightKg = String.valueOf(weightF); | |||
if (et_weight != null) { | |||
et_weight.setText(mWeightKg); | |||
} | |||
} | |||
if (unit == EightDoubleBodyFatBleConfig.STATUS_ST) { | |||
showData("测量状态:" + state + stateStr + " 体重:" + lbToStlb(weightF) + " 体重单位:" + unit + " 小数点位" + decimal); | |||
} else { | |||
showData("测量状态:" + state + stateStr + " 体重:" + weightF + " 体重单位:" + unit + " 小数点位" + decimal); | |||
} | |||
} | |||
public static String lbToStlb(float lb) { | |||
int st = (int) lb / 14; | |||
float mlb = lb % 14f; | |||
return st + ":" + mlb; | |||
} | |||
@Override | |||
public void onImpedanceStatus(int status) { | |||
String adc = ""; | |||
switch (status) { | |||
case EightDoubleBodyFatBleConfig.STATUS_IMPEDANCE_MEASUREMENT: | |||
adc = "阻抗测量中"; | |||
break; | |||
case EightDoubleBodyFatBleConfig.STATUS_IMPEDANCE_SUCCESS: | |||
//阻抗测量成功 | |||
adc = "阻抗测量成功"; | |||
break; | |||
case EightDoubleBodyFatBleConfig.STATUS_IMPEDANCE_FAILED: | |||
adc = "阻抗测量失败"; | |||
//阻抗测量失败 | |||
break; | |||
} | |||
showData(adc); | |||
} | |||
@Override | |||
public void onVersion(String version) { | |||
showData("当前版本:" + version); | |||
} | |||
@Override | |||
public void onSupportUnit(List<SupportUnitBean> list) { | |||
mLoglist.add(0, "支持单位:"); | |||
for (SupportUnitBean supportUnitBean : list) { | |||
mLoglist.add(0, supportUnitBean.toString()); | |||
} | |||
mHandler.sendEmptyMessage(REFRESH_KEY); | |||
} | |||
@Override | |||
public void onBodyFat(EightDoubleBodyFatBean bodyFatBean) { | |||
if (bodyFatBean == null) { | |||
showData("体脂数据为空"); | |||
return; | |||
} | |||
showData("体脂数据:" + bodyFatBean); | |||
} | |||
@Override | |||
public void onHeartRate(int status, int heartRate) { | |||
String statusStr = ""; | |||
if (status == 0x01) { | |||
statusStr = "心率测量中"; | |||
} else if (status == 0x02) { | |||
statusStr = "心率测量成功:" + heartRate; | |||
} else if (status == 0x03) { | |||
statusStr = "心率测量失败"; | |||
} | |||
showData(statusStr); | |||
} | |||
@Override | |||
public void onTemperature(int temp, int unit, int decimal) { | |||
showData("温度:" + temp + " 单位:" + unit + " 小数点位" + decimal); | |||
} | |||
@Override | |||
public void onSyncUser() { | |||
if (mEightDoubleBodyFatData != null && mEightDoubleBodyFatData instanceof EightDoubleBodyFatBleMcuDeviceData) { | |||
((EightDoubleBodyFatBleMcuDeviceData) mEightDoubleBodyFatData).setUserInfo(0, 0, mUserInfoBean.getAge(), mUserInfoBean.getSex(), mUserInfoBean.getHeightCm()); | |||
} | |||
showData("设备请求同步用户信息"); | |||
} | |||
private String mOldData = ""; | |||
@Override | |||
public void showData(String data) { | |||
if (mOldData.equals(data)) { | |||
return; | |||
} | |||
mOldData = data; | |||
mLoglist.add(0, data); | |||
mHandler.sendEmptyMessage(REFRESH_KEY); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
if (mAILinkBleManager!=null) { | |||
mAILinkBleManager.disconnectAll(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.dual_band; | |||
public class UserInfoBean { | |||
private int age; | |||
private int heightCm; | |||
private float weightKg; | |||
private int sex; | |||
public int getAge() { | |||
return age; | |||
} | |||
public void setAge(int age) { | |||
this.age = age; | |||
} | |||
public int getHeightCm() { | |||
return heightCm; | |||
} | |||
public void setHeightCm(int heightCm) { | |||
this.heightCm = heightCm; | |||
} | |||
public float getWeightKg() { | |||
return weightKg; | |||
} | |||
public void setWeightKg(float weightKg) { | |||
this.weightKg = weightKg; | |||
} | |||
public int getSex() { | |||
return sex; | |||
} | |||
public void setSex(int sex) { | |||
this.sex = sex; | |||
} | |||
@Override | |||
public String toString() { | |||
return "UserInfoBean{" + "age=" + age + ", heightCm=" + heightCm + ", weightKg=" + weightKg + ", sex=" + sex + '}'; | |||
} | |||
} |
@@ -0,0 +1,395 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.gasDetector; | |||
import android.os.Message; | |||
import android.text.TextUtils; | |||
import android.view.View; | |||
import android.widget.ArrayAdapter; | |||
import android.widget.EditText; | |||
import android.widget.ListView; | |||
import com.pingwang.bluetoothlib.AILinkBleManager; | |||
import com.pingwang.bluetoothlib.device.BleDevice; | |||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
import java.text.SimpleDateFormat; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppNewBaseActivity; | |||
import cn.net.aicare.modulelibrary.module.gasDetector.GasDetectorCurrentInfoBean; | |||
import cn.net.aicare.modulelibrary.module.gasDetector.GasDetectorDevice; | |||
import cn.net.aicare.modulelibrary.module.gasDetector.GasDetectorHistoryInfoBean; | |||
import cn.net.aicare.modulelibrary.module.gasDetector.OnGasDetectorInfoListener; | |||
/** | |||
* 气体探测器界面 | |||
* | |||
* @author xing | |||
* @date 2024/09/05 | |||
*/ | |||
public class GasDetectorActivity extends BleAppNewBaseActivity implements View.OnClickListener, OnCallbackBle, OnGasDetectorInfoListener { | |||
private String mMac = ""; | |||
private EditText etInterval, etDensity, etHpa, etInHg; | |||
private GasDetectorDevice mGasDetectorDevice; | |||
private ListView list_view; | |||
private List<String> mList; | |||
private ArrayAdapter mListAdapter; | |||
@Override | |||
protected void uiHandlerMessage(Message msg) { | |||
} | |||
@Override | |||
protected int getLayoutId() { | |||
return R.layout.activity_gas_detector; | |||
} | |||
@Override | |||
protected void initListener() { | |||
} | |||
@Override | |||
public void onClick(View v) { | |||
switch (v.getId()) { | |||
case R.id.btnGetCurInfo: | |||
//实时信息 | |||
mGasDetectorDevice.getCurrentInfo(); | |||
addText("获取实时信息"); | |||
break; | |||
case R.id.btnSyncTime: | |||
//同步时间 | |||
mGasDetectorDevice.setSyncTime(); | |||
addText("同步时间"); | |||
break; | |||
case R.id.btnGetCO2Density: | |||
//CO2报警浓度 | |||
mGasDetectorDevice.getCo2Alarm(); | |||
addText("获取CO2报警浓度"); | |||
break; | |||
case R.id.btnGetCODensity: | |||
//CO报警浓度 | |||
mGasDetectorDevice.getCoAlarm(); | |||
addText("获取CO报警浓度"); | |||
break; | |||
case R.id.btnGetO2Density: | |||
//O2报警浓度 | |||
mGasDetectorDevice.getO2Alarm(); | |||
addText("获取O2报警浓度"); | |||
break; | |||
case R.id.btnGetCO2Interval: | |||
//CO2间隔 | |||
mGasDetectorDevice.getCo2Interval(); | |||
addText("获取CO2间隔"); | |||
break; | |||
case R.id.btnGetCOInterval: | |||
//CO间隔 | |||
mGasDetectorDevice.getCoInterval(); | |||
addText("获取CO间隔"); | |||
break; | |||
case R.id.btnGetHistoryInterval: | |||
//历史记录间隔 | |||
mGasDetectorDevice.getOfflineHistoryInterval(); | |||
addText("获取历史记录间隔"); | |||
break; | |||
case R.id.btnGetCO2Switch: | |||
//CO2开关 | |||
mGasDetectorDevice.getCo2Switch(); | |||
addText("获取CO2开关"); | |||
break; | |||
case R.id.btnGetCOSwitch: | |||
//CO开关 | |||
mGasDetectorDevice.getCoSwitch(); | |||
addText("获取CO开关"); | |||
break; | |||
case R.id.btnGetSoundSwitch: | |||
//声音开关 | |||
mGasDetectorDevice.getSoundSwitch(); | |||
addText("获取声音开关"); | |||
break; | |||
case R.id.btnGetShakeSwitch: | |||
//震动开关 | |||
mGasDetectorDevice.getShockSwitch(); | |||
addText("获取震动开关"); | |||
break; | |||
case R.id.btnGetTempUnit: | |||
//温度单位 | |||
mGasDetectorDevice.getTempUnit(); | |||
addText("获取温度单位"); | |||
break; | |||
case R.id.btnGetPressureUnit: | |||
//气压单位 | |||
mGasDetectorDevice.getAirPressureUnit(); | |||
addText("获取气压单位"); | |||
break; | |||
case R.id.btnGetScreenOffTime: | |||
//息屏时间 | |||
mGasDetectorDevice.getScreenOffTime(); | |||
addText("获取息屏时间"); | |||
break; | |||
case R.id.btnGetShutdownTime: | |||
//关机时间 | |||
mGasDetectorDevice.getShutdownTime(); | |||
addText("获取关机时间"); | |||
break; | |||
case R.id.btnGetHistory: | |||
//历史记录 | |||
mGasDetectorDevice.getOfflineHistory(0); | |||
addText("获取历史记录"); | |||
break; | |||
case R.id.btnClearHistory: | |||
//清空历史记录 | |||
mGasDetectorDevice.setClearOfflineHistory(); | |||
addText("清空历史记录"); | |||
break; | |||
case R.id.btnSetCo2Density: | |||
//设置Co2浓度 | |||
try { | |||
int densityCo2 = Integer.parseInt(etDensity.getText().toString()); | |||
mGasDetectorDevice.setCo2Alarm(densityCo2); | |||
addText("设置CO2报警浓度:" + densityCo2); | |||
} catch (NumberFormatException e) { | |||
addText("请输入正确的数字"); | |||
} | |||
break; | |||
case R.id.btnSetO2Density: | |||
//设置O2浓度 | |||
try { | |||
int densityO2 = Integer.parseInt(etDensity.getText().toString()); | |||
mGasDetectorDevice.setO2Alarm(densityO2); | |||
addText("设置O2报警浓度:" + densityO2); | |||
} catch (NumberFormatException e) { | |||
addText("请输入正确的数字"); | |||
} | |||
break; | |||
case R.id.btnSetCo2Interval: | |||
//设置CO2间隔 | |||
try { | |||
int intervalCo2 = Integer.parseInt(etInterval.getText().toString()); | |||
mGasDetectorDevice.setCo2Interval(intervalCo2); | |||
addText("设置CO2间隔:" + intervalCo2); | |||
} catch (NumberFormatException e) { | |||
addText("请输入正确的数字"); | |||
} | |||
break; | |||
case R.id.btnSetCoInterval: | |||
//设置CO间隔 | |||
try { | |||
int intervalCo = Integer.parseInt(etInterval.getText().toString()); | |||
mGasDetectorDevice.setCoInterval(intervalCo); | |||
addText("设置CO间隔:" + intervalCo); | |||
} catch (NumberFormatException e) { | |||
addText("请输入正确的数字"); | |||
} | |||
break; | |||
case R.id.btnSetPressureCali: | |||
//气压校准 | |||
try { | |||
int hpa = Integer.parseInt(etHpa.getText().toString()); | |||
int inHg = Integer.parseInt(etInHg.getText().toString()); | |||
mGasDetectorDevice.setAirPressureCalibration(hpa, inHg); | |||
addText("设置气压校准:hpa=" + hpa + " inHg=" + inHg); | |||
} catch (NumberFormatException e) { | |||
addText("请输入正确的数字"); | |||
} | |||
break; | |||
} | |||
} | |||
@Override | |||
protected void initData() { | |||
mMac = getIntent().getStringExtra("mac"); | |||
mList = new ArrayList<>(); | |||
mListAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
list_view.setAdapter(mListAdapter); | |||
addText("连接成功:" + mMac); | |||
onServiceSuccess(); | |||
} | |||
@Override | |||
protected void initView() { | |||
etDensity = (EditText) findViewById(R.id.etDensity); | |||
etInterval = (EditText) findViewById(R.id.etInterval); | |||
etHpa = (EditText) findViewById(R.id.etHpa); | |||
etInHg = (EditText) findViewById(R.id.etInHg); | |||
list_view = findViewById(R.id.list_view); | |||
} | |||
@Override | |||
public void onServiceSuccess() { | |||
if (TextUtils.isEmpty(mMac)) { | |||
return; | |||
} | |||
if (mGasDetectorDevice != null) { | |||
return; | |||
} | |||
AILinkBleManager.getInstance().setOnCallbackBle(this); | |||
BleDevice bleDevice = AILinkBleManager.getInstance().getBleDevice(mMac); | |||
mGasDetectorDevice = GasDetectorDevice.init(bleDevice); | |||
mGasDetectorDevice.addOnGasDetectorInfoListener(this); | |||
mGasDetectorDevice.setOnShowData(new GasDetectorDevice.OnShowData() { | |||
@Override | |||
public void showData(String data) { | |||
addText("收到的vlaue数据:" + data); | |||
} | |||
}); | |||
} | |||
@Override | |||
public void onServiceErr() { | |||
} | |||
@Override | |||
public void unbindServices() { | |||
} | |||
@Override | |||
public void onDisConnected(String mac, int code) { | |||
if (mac.equals(this.mMac)) { | |||
if (mGasDetectorDevice != null) { | |||
mGasDetectorDevice.removeOnGasDetectorInfoListener(this); | |||
mGasDetectorDevice = null; | |||
} | |||
addText("断开连接:" + mac + " code:" + code); | |||
} | |||
} | |||
@Override | |||
public void onCurrentInfo(GasDetectorCurrentInfoBean currentInfoBean) { | |||
addText("当前信息:" + currentInfoBean.toString()); | |||
} | |||
@Override | |||
public void onCo2Density(int density) { | |||
addText("CO2报警浓度(单位ppm):" + density); | |||
} | |||
@Override | |||
public void onCo2Interval(int interval) { | |||
addText("CO2间隔(单位min)0代表一直:" + interval); | |||
} | |||
@Override | |||
public void onCo2Switch(int status) { | |||
addText("CO2开关:" + (status == 0 ? "打开" : "关闭")); | |||
} | |||
@Override | |||
public void onCoDensity(int density) { | |||
addText("CO报警浓度(单位ppm):" + density); | |||
} | |||
@Override | |||
public void onCoInterval(int interval) { | |||
addText("CO间隔(单位min)0代表一直:" + interval); | |||
} | |||
@Override | |||
public void onCoSwitch(int status) { | |||
addText("CO开关:" + (status == 0 ? "打开" : "关闭")); | |||
} | |||
@Override | |||
public void onO2Density(int density) { | |||
addText("O2报警浓度(单位%):" + density); | |||
} | |||
@Override | |||
public void onHistorySaveInterval(int interval) { | |||
addText("历史记录保存间隔(单位:分钟,0代表一直):" + interval); | |||
} | |||
@Override | |||
public void onTempUnit(int unit) { | |||
addText("温度单位:" + (unit == 0 ? "℃" : "℉")); | |||
} | |||
@Override | |||
public void onPressureUnit(int unit) { | |||
addText("气压单位:" + (unit == 0 ? "hPa" : "inHg")); | |||
} | |||
@Override | |||
public void onPressureCalibration(int hpa, int inHg) { | |||
addText("气压校准:hpa=" + hpa + " inHg=" + inHg); | |||
} | |||
@Override | |||
public void onBrightness(int brightness) { | |||
addText("亮度:" + brightness); | |||
} | |||
@Override | |||
public void onSoundSwitch(int status) { | |||
addText("声音开关:" + (status == 0 ? "打开" : "关闭")); | |||
} | |||
@Override | |||
public void onShockSwitch(int status) { | |||
addText("震动开关:" + (status == 0 ? "打开" : "关闭")); | |||
} | |||
@Override | |||
public void onSyncTime(long time) { | |||
addText("同步时间成功:time=" + time + " 格式化:" + sdf.format(time * 1000)); | |||
} | |||
@Override | |||
public void onScreenOffTime(int time) { | |||
addText("息屏时间(单位,秒)0代表从不:" + time); | |||
} | |||
@Override | |||
public void onShutdownTime(int time) { | |||
addText("关机时间(单位,小时)0代表从不:" + time); | |||
} | |||
@Override | |||
public void onHistoryInfo(GasDetectorHistoryInfoBean historyInfoBean) { | |||
addText("历史记录:" + historyInfoBean.toString()); | |||
if (historyInfoBean.getAllCount() != historyInfoBean.getCount()) { | |||
mGasDetectorDevice.getOfflineHistory(historyInfoBean.getCount()); | |||
} | |||
} | |||
@Override | |||
public void onClearHistory() { | |||
addText("清空历史记录成功"); | |||
} | |||
private SimpleDateFormat sdf; | |||
private String mOldText = ""; | |||
private void addText(String text) { | |||
if (mOldText.equals(text)) { | |||
return; | |||
} | |||
if (sdf == null) { | |||
sdf = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||
} | |||
mList.add(0, sdf.format(System.currentTimeMillis()) + ":\n" + text); | |||
mListAdapter.notifyDataSetChanged(); | |||
} | |||
@Override | |||
protected void onDestroy() { | |||
super.onDestroy(); | |||
AILinkBleManager.getInstance().removeOnCallbackBle(this); | |||
if (mGasDetectorDevice != null) { | |||
mGasDetectorDevice.clear(); | |||
} | |||
} | |||
} |
@@ -205,7 +205,7 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On | |||
*/ | |||
private void cancelDialog() { | |||
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList) | |||
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
@Override | |||
public void onItemListener(int position) { | |||
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show(); |
@@ -0,0 +1,114 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
import com.pingwang.bluetoothlib.AILinkBleManager; | |||
import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean; | |||
import com.pingwang.bluetoothlib.config.BleConfig; | |||
import com.pingwang.bluetoothlib.server.ELinkBleServer; | |||
import com.pingwang.bluetoothlib.utils.UuidUtils; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.UUID; | |||
/** | |||
* 蓝牙扫描设备工具 | |||
* 因为 AILink 现在接了不是 AILink 协议的设备,比如旧的营养秤 UUID 不同 | |||
*/ | |||
public class BleScanUtil { | |||
/** | |||
* 开始扫描设备 | |||
* | |||
* @param blueToothService 蓝牙服务 | |||
* @param timeout 延迟 ms | |||
*/ | |||
public static void scanLeDevice(ELinkBleServer blueToothService, long timeout) { | |||
blueToothService.scanLeDevice(timeout, getScanLeDeviceMap()); | |||
} | |||
public static void scanLeDevice(AILinkBleManager aiLinkBleManager, long timeout) { | |||
aiLinkBleManager.startScan(timeout, getScanLeDeviceMap()); | |||
} | |||
public static List<BleScanAddAilinkBean> getScanLeDeviceMap() { | |||
List<BleScanAddAilinkBean> list = new ArrayList<>(); | |||
list.add(getAifresh()); | |||
list.add(getAifit02()); | |||
list.add(getAifit03()); | |||
list.add(getOkOk()); | |||
return list; | |||
} | |||
public static UUID[] getScanLeDeviceUUID() { | |||
UUID[] uuids = new UUID[]{UUID.fromString("0000FFB0-0000-1000-8000-00805F9B34FB"),// 旧的营养秤 AC05 | |||
// UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"),// 华盛达手表 | |||
BleConfig.UUID_SERVER_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK}; | |||
return uuids; | |||
} | |||
/** | |||
* 好营养AC05的设备 | |||
* | |||
* @return {@link BleScanAddAilinkBean} | |||
*/ | |||
private static BleScanAddAilinkBean getAifresh() { | |||
// 旧的营养秤 | |||
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||
byte[] bytes = new byte[]{(byte) 0xAC, 0x05}; | |||
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||
bleScanAddAilinkBean.setCid(0x0037); | |||
bleScanAddAilinkBean.setVid(0x0000); | |||
bleScanAddAilinkBean.setPid(0x0000); | |||
return bleScanAddAilinkBean; | |||
} | |||
/** | |||
* 好身材AC02的体脂秤,带温度 | |||
* | |||
* @return {@link BleScanAddAilinkBean} | |||
*/ | |||
private static BleScanAddAilinkBean getAifit02() { | |||
// 旧的好身材 | |||
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||
byte[] bytes = new byte[]{(byte) 0xAC, 0x02}; | |||
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||
bleScanAddAilinkBean.setCid(0x005E); | |||
bleScanAddAilinkBean.setVid(0x0070); | |||
bleScanAddAilinkBean.setPid(0x0001); | |||
return bleScanAddAilinkBean; | |||
} | |||
/** | |||
* 好身材AC03的体脂秤,带温度 | |||
* | |||
* @return {@link BleScanAddAilinkBean} | |||
*/ | |||
private static BleScanAddAilinkBean getAifit03() { | |||
// 旧的好身材 | |||
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
bleScanAddAilinkBean.setDeviceServiceUUID(new UUID[]{UuidUtils.getUuid("0000FFB0-0000-1000-8000-00805F9B34FB")}); | |||
byte[] bytes = new byte[]{(byte) 0xAC, 0x03}; | |||
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 0, bytes.length); | |||
bleScanAddAilinkBean.setCid(0x005E); | |||
bleScanAddAilinkBean.setVid(0x0070); | |||
bleScanAddAilinkBean.setPid(0x0001); | |||
return bleScanAddAilinkBean; | |||
} | |||
private static BleScanAddAilinkBean getOkOk() { | |||
// OKOK广播秤 | |||
BleScanAddAilinkBean bleScanAddAilinkBean = new BleScanAddAilinkBean(); | |||
bleScanAddAilinkBean.setDeviceServiceUUID(null); | |||
byte[] bytes = new byte[]{(byte) 0x00, 0x00}; | |||
bleScanAddAilinkBean.setDeviceBroadcast(bytes, 6, 6+bytes.length); | |||
bleScanAddAilinkBean.setCid(0x08+0xFFFF); | |||
bleScanAddAilinkBean.setVid(0x0001); | |||
bleScanAddAilinkBean.setPid(0x0002); | |||
return bleScanAddAilinkBean; | |||
} | |||
} |
@@ -8,7 +8,7 @@ import com.holtek.libHTBodyfat.HTBodyResultAllBody; | |||
import java.util.Locale; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatAdc; | |||
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.eight_bodyfat.EightBodyfatAdc; | |||
public class EightBodyFatAlgorithms { | |||
@@ -58,10 +58,43 @@ public class EightBodyFatAlgorithms { | |||
BhErrorType bhErrorType = BhErrorType.values()[bhBodyComposition.getBodyComposition()]; | |||
if (bhErrorType == BhErrorType.NONE) { | |||
eightBodyFatBean.setBhSkeletalMuscleKg(bhBodyComposition.bhSkeletalMuscleKg + ""); | |||
eightBodyFatBean.setBhSkeletalMuscleKgLevel(bhBodyComposition.bhSkeletalMuscleKgLevel + ""); | |||
eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(bhBodyComposition.bhMuscleKgListStandardOrExcellent + ""); | |||
eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard + ""); | |||
eightBodyFatBean.setWeight(String.valueOf(bhBodyComposition.bhWeightKg)); | |||
eightBodyFatBean.setBmi(Adecimal(bhBodyComposition.bhBMI)); | |||
eightBodyFatBean.setBmr((float) bhBodyComposition.bhBMR); | |||
eightBodyFatBean.setUvi((float) bhBodyComposition.bhVFAL); | |||
eightBodyFatBean.setBm(String.valueOf(bhBodyComposition.bhBoneKg)); | |||
eightBodyFatBean.setBfr(Adecimal(bhBodyComposition.bhBodyFatRate)); | |||
eightBodyFatBean.setVwc(Adecimal(bhBodyComposition.bhWaterRate)); | |||
eightBodyFatBean.setRom(Adecimal(bhBodyComposition.bhMuscleRate)); | |||
eightBodyFatBean.setBodyAge(bhBodyComposition.bhBodyAge); | |||
eightBodyFatBean.setPp(Adecimal(bhBodyComposition.bhProteinRate)); | |||
eightBodyFatBean.setSfr(Adecimal(bhBodyComposition.bhBodyFatSubCutRate)); | |||
eightBodyFatBean.setFatMassBody(String.valueOf(bhBodyComposition.bhBodyFatKgTrunk)); | |||
eightBodyFatBean.setFatMassLeftTop(String.valueOf(bhBodyComposition.bhBodyFatKgLeftArm)); | |||
eightBodyFatBean.setFatMassLeftBottom(String.valueOf(bhBodyComposition.bhBodyFatKgLeftLeg)); | |||
eightBodyFatBean.setFatMassRightTop(String.valueOf(bhBodyComposition.bhBodyFatKgRightArm)); | |||
eightBodyFatBean.setFatMassRightBottom(String.valueOf(bhBodyComposition.bhBodyFatKgRightLeg)); | |||
eightBodyFatBean.setArithmetic(algorithms); | |||
eightBodyFatBean.setBhSkeletalMuscleKg(String.valueOf(bhBodyComposition.bhSkeletalMuscleKg)); | |||
eightBodyFatBean.setBhSkeletalMuscleKgLevel(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgLevel)); | |||
eightBodyFatBean.setBhSkeletalMuscleKgListStandardOrExcellent(String.valueOf(bhBodyComposition.bhMuscleKgListStandardOrExcellent)); | |||
eightBodyFatBean.setBhSkeletalMuscleKgListUnderOrStandard(String.valueOf(bhBodyComposition.bhSkeletalMuscleKgListUnderOrStandard)); | |||
// System.out.println("解密阻抗-左側全身(Ω)=" + body.bhZLeftBodyDeCode); | |||
// System.out.println("解密阻抗-左手(Ω)=" + body.bhZLeftArmDeCode); | |||
// System.out.println("解密阻抗-右手(Ω)=" + body.bhZRightArmDeCode); | |||
// System.out.println("解密阻抗-左腳(Ω)=" + body.bhZLeftLegDeCode); | |||
// System.out.println("解密阻抗-右腳(Ω)=" + body.bhZRightLegDeCode); | |||
eightBodyFatBean.setAdcLeftHand(bhBodyComposition.bhZLeftArmDeCode); | |||
eightBodyFatBean.setAdcRightHand(bhBodyComposition.bhZRightArmDeCode); | |||
eightBodyFatBean.setAdcLeftFoot(bhBodyComposition.bhZLeftLegDeCode); | |||
eightBodyFatBean.setAdcRightFoot(bhBodyComposition.bhZRightLegDeCode); | |||
eightBodyFatBean.setAdcLeftBody(bhBodyComposition.bhZLeftBodyDeCode); | |||
} else { | |||
L.e("getAlgorithmsData: " + bhErrorType.toString()); | |||
} | |||
break; |
@@ -1,51 +1,148 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
public class EightBodyFatBean { | |||
/** | |||
* 体重 | |||
*/ | |||
private String weight; //体重, | |||
/** | |||
* 身体质量指数 | |||
*/ | |||
private float bmi; //体质指数, | |||
/** | |||
* 体脂率 | |||
*/ | |||
private float bfr; //体脂率, | |||
/** | |||
* 皮下脂肪率 | |||
*/ | |||
private float sfr; //皮下脂肪率, | |||
/** | |||
* 内脏脂肪率 | |||
*/ | |||
private float uvi; //内脏脂肪率, | |||
/** | |||
* 肌肉率 | |||
*/ | |||
private float rom; //肌肉率, | |||
/** | |||
* 基础代谢率 | |||
*/ | |||
private float bmr; //基础代谢率, | |||
/** | |||
* 骨量 | |||
*/ | |||
private String bm; //骨骼质量, | |||
/** | |||
* 水分 | |||
*/ | |||
private float vwc; //水含量, | |||
/** | |||
* 身体年龄 | |||
*/ | |||
private int bodyAge; //身体年龄, | |||
/** | |||
* 蛋白率 | |||
*/ | |||
private float pp; //蛋白率, | |||
/** | |||
* 双脚阻抗 | |||
*/ | |||
private double adcFoot; //双脚阻抗, | |||
/** | |||
* 双手阻抗 | |||
*/ | |||
private double adcHand;//双手阻抗 | |||
/** | |||
* 阻抗左手 | |||
*/ | |||
private double adcLeftHand; //左手阻抗 | |||
/** | |||
* 阻抗右手 | |||
*/ | |||
private double adcRightHand; //右手阻抗 | |||
/** | |||
* 阻抗左脚 | |||
*/ | |||
private double adcLeftFoot; //左脚阻抗 | |||
private double adcRightFoot; //右脚阻抗 | |||
/** | |||
* 阻抗右脚 | |||
*/ | |||
private double adcRightFoot; | |||
/** | |||
* 阻抗左身体 | |||
*/ | |||
private double adcLeftBody; | |||
/** | |||
* 阻抗右身体 | |||
*/ | |||
private double adcRightBody; | |||
/** | |||
* 阻抗右手左脚 | |||
*/ | |||
private double adcRightHandLeftFoot; | |||
/** | |||
* 阻抗左手右脚 | |||
*/ | |||
private double adcLeftHandRightFoot; | |||
/** | |||
* adc身体 | |||
*/ | |||
private double adcBody; | |||
/** | |||
* 算术 | |||
* 算法ID | |||
*/ | |||
private int arithmetic; | |||
/** | |||
* 心率 | |||
*/ | |||
private int heartRate; | |||
/** | |||
* 体脂-右上 | |||
*/ | |||
private String fatMassRightTop; //体脂-右上 | |||
/** | |||
* 体脂-右下 | |||
*/ | |||
private String fatMassRightBottom; //体脂-右下 | |||
/** | |||
* 体脂-左上 | |||
*/ | |||
private String fatMassLeftTop; //体脂-左上 | |||
/** | |||
* 体脂-左下 | |||
*/ | |||
private String fatMassLeftBottom; //体脂-左下 | |||
/** | |||
* 体脂-躯干 | |||
*/ | |||
private String fatMassBody; //体脂-躯干 | |||
/** | |||
* 肌肉-右上 | |||
*/ | |||
private String muscleMassRightTop; //肌肉-右上 | |||
/** | |||
* 肌肉-右下 | |||
*/ | |||
private String muscleMassRightBottom; //肌肉-右下 | |||
/** | |||
* 肌肉-左上 | |||
*/ | |||
private String muscleMassLeftTop; //肌肉-左上 | |||
/** | |||
* 肌肉-左下 | |||
*/ | |||
private String muscleMassLeftBottom; //肌肉-左下 | |||
/** | |||
* 肌肉-躯干 | |||
*/ | |||
private String muscleMassBody; //肌肉-躯干 | |||
/** | |||
* 测试阻抗 | |||
*/ | |||
private String testAdc; | |||
/** | |||
@@ -382,9 +479,19 @@ public class EightBodyFatBean { | |||
@Override | |||
public String toString() { | |||
return "EightBodyFatBean{" + "weight='" + weight + '\'' + ", bmi=" + bmi + ", bfr=" + bfr + ", sfr=" + sfr + ", uvi=" + uvi + ", rom=" + rom + ", bmr=" + bmr + ", bm='" + bm + '\'' + ", " + | |||
"vwc=" + vwc + ", bodyAge=" + bodyAge + ", pp=" + pp + ", adcFoot=" + adcFoot + ", adcHand=" + adcHand + ", adcLeftHand=" + adcLeftHand + ", adcRightHand=" + adcRightHand + ", " + | |||
"adcLeftFoot=" + adcLeftFoot + ", adcRightFoot=" + adcRightFoot + ", adcLeftBody=" + adcLeftBody + ", adcRightBody=" + adcRightBody + ", adcRightHandLeftFoot=" + adcRightHandLeftFoot + ", adcLeftHandRightFoot=" + adcLeftHandRightFoot + ", adcBody=" + adcBody + ", arithmetic=" + arithmetic + ", heartRate=" + heartRate + ", fatMassRightTop='" + fatMassRightTop + '\'' + ", fatMassRightBottom='" + fatMassRightBottom + '\'' + ", fatMassLeftTop='" + fatMassLeftTop + '\'' + ", fatMassLeftBottom='" + fatMassLeftBottom + '\'' + ", fatMassBody='" + fatMassBody + '\'' + ", muscleMassRightTop='" + muscleMassRightTop + '\'' + ", muscleMassRightBottom='" + muscleMassRightBottom + '\'' + ", muscleMassLeftTop='" + muscleMassLeftTop + '\'' + ", muscleMassLeftBottom='" + muscleMassLeftBottom + '\'' + ", muscleMassBody='" + muscleMassBody + '\'' + ", testAdc='" + testAdc + '\'' + '}'; | |||
return "EightBodyFatBean{" + "体重=" + weight + ", bmi=" + bmi + ", 体脂率=" + bfr + | |||
", 皮下脂肪率=" + sfr + ", 内脏脂肪率=" + uvi + ", 肌肉率=" + rom + ", 基础代谢率=" + bmr + ", 骨量=" + bm + | |||
", 水分=" + vwc + ", 身体年龄=" + bodyAge + ", 蛋白率=" + pp + ", 双脚阻抗=" + adcFoot + | |||
", 双手阻抗=" + adcHand + ", 阻抗左手=" + adcLeftHand + ", 阻抗右手=" + adcRightHand + | |||
", 阻抗左脚=" + adcLeftFoot + ", 阻抗右脚=" + adcRightFoot + ", 阻抗左身体=" + adcLeftBody + | |||
", 阻抗右身体=" + adcRightBody + ", 阻抗右手左脚=" + adcRightHandLeftFoot + | |||
", 阻抗左手右脚=" + adcLeftHandRightFoot + ", 身体阻抗=" + adcBody + | |||
", 算法ID=" + arithmetic + ", 心率=" + heartRate + ", fatMassRightTop=" + fatMassRightTop + | |||
", fatMassRightBottom=" + fatMassRightBottom + ", fatMassLeftTop=" + fatMassLeftTop + | |||
", fatMassLeftBottom=" + fatMassLeftBottom + ", fatMassBody=" + fatMassBody + | |||
", muscleMassRightTop=" + muscleMassRightTop + ", muscleMassRightBottom=" + muscleMassRightBottom + | |||
", muscleMassLeftTop=" + muscleMassLeftTop + ", muscleMassLeftBottom=" + muscleMassLeftBottom | |||
+ ", muscleMassBody=" + muscleMassBody + ", testAdc=" + testAdc + '}'; | |||
} | |||
} |
@@ -5,10 +5,10 @@ import android.content.Intent; | |||
import android.net.Uri; | |||
import android.os.Build; | |||
import androidx.core.content.FileProvider; | |||
import java.io.File; | |||
import androidx.core.content.FileProvider; | |||
/** | |||
* 兼容android 7.0以上获取uri异常的工具类 | |||
*/ |
@@ -0,0 +1,65 @@ | |||
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
import android.content.Context; | |||
import android.content.res.AssetManager; | |||
import org.json.JSONArray; | |||
import org.json.JSONException; | |||
import org.json.JSONObject; | |||
import java.io.BufferedReader; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.InputStreamReader; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
/** | |||
* json装载机 | |||
* | |||
* @author xing | |||
* @date 2024/04/29 | |||
*/ | |||
public class JsonLoader { | |||
public static JSONObject loadJSONFromAsset(Context context, String fileName) { | |||
JSONObject jsonObject = null; | |||
AssetManager manager = context.getAssets(); | |||
try (InputStream is = manager.open(fileName); | |||
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"))) { | |||
StringBuilder sb = new StringBuilder(); | |||
String line; | |||
while ((line = reader.readLine()) != null) { | |||
sb.append(line); | |||
} | |||
jsonObject = new JSONObject(sb.toString()); | |||
} catch (IOException | JSONException e) { | |||
e.printStackTrace(); | |||
} | |||
return jsonObject; | |||
} | |||
public static Map<String, String> loadJsonFromAsset(Context context, String fileName) { | |||
JSONObject jsonObject = loadJSONFromAsset(context, fileName); | |||
Map<String, String> map = new HashMap<>(); | |||
try { | |||
if (jsonObject != null) { | |||
JSONArray dataList = jsonObject.getJSONArray("data"); | |||
for (int i = 0; i < dataList.length(); i++) { | |||
JSONObject data = dataList.getJSONObject(i); | |||
String nameEn = data.getString("name"); | |||
String nameZh = nameEn; | |||
if (data.has("nameNew")) { | |||
nameZh = data.getString("nameNew"); | |||
} | |||
map.put(nameEn, nameZh); | |||
} | |||
} | |||
} catch (JSONException e) { | |||
e.printStackTrace(); | |||
} | |||
return map; | |||
} | |||
} |
@@ -130,6 +130,12 @@ public class L { | |||
} | |||
} | |||
public static void iStack(String msg) { | |||
if (isLog) { | |||
logContent("", msg+"\n"+Log.getStackTraceString(new Throwable()), 0); | |||
} | |||
} | |||
/** | |||
* 信息日志 | |||
*/ |
@@ -37,8 +37,12 @@ public class MyBleStrUtils { | |||
* @return 16进制String | |||
*/ | |||
public static String getHexString(int number) { | |||
return Integer.toHexString(number); | |||
if (number<10) { | |||
return "0"+Integer.toHexString(number).toUpperCase(); | |||
} | |||
return Integer.toHexString(number).toUpperCase(); | |||
} | |||
} |
@@ -28,6 +28,11 @@ public class TimeUtils { | |||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||
return format.format(time)+":\n"; | |||
} | |||
public static String getTimeNoNewline(long time){ | |||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||
return format.format(time); | |||
} | |||
/** | |||
* 返回当前年 | |||
*/ |
@@ -122,7 +122,7 @@ public class UnitUtils { | |||
public static float CToF(float c) { | |||
float f = c * 1.8F + 32; | |||
return f; | |||
} | |||
} | |||
public static float CToFOne(float c) { | |||
@@ -137,6 +137,7 @@ public class UnitUtils { | |||
float c = (f - 32) / 1.8f; | |||
return c; | |||
} | |||
/** | |||
* 华氏度转度 | |||
*/ | |||
@@ -219,6 +220,12 @@ public class UnitUtils { | |||
//----------转换用---------- | |||
public static String getHoldDecimal(int decimal, int value) { | |||
float v = (float) (value / (Math.pow(10,decimal))); | |||
return getHoldDecimal(decimal, v); | |||
} | |||
/** | |||
* 保留小数位,不足后面补0 | |||
* | |||
@@ -238,7 +245,7 @@ public class UnitUtils { | |||
return df.format(value).replace(",", "."); | |||
} | |||
String s = String.format(Locale.US, "%."+decimal+"f", value); | |||
String s = String.format(Locale.US, "%." + decimal + "f", value); | |||
return s; | |||
} | |||
@@ -0,0 +1,5 @@ | |||
<vector android:height="24dp" android:tint="#F30606" | |||
android:viewportHeight="24" android:viewportWidth="24" | |||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> | |||
<path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/> | |||
</vector> |
@@ -26,7 +26,7 @@ | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btnClear" | |||
android:id="@+id/btnClearShakeHands" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="@string/clear" /> | |||
@@ -249,7 +249,9 @@ | |||
android:id="@+id/etBroadcastTime" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0987654321" /> | |||
android:digits="0987654321" | |||
android:text="100" | |||
/> | |||
</LinearLayout> | |||
<LinearLayout | |||
@@ -318,7 +320,8 @@ | |||
android:layout_weight="1" | |||
android:padding="10dp" | |||
android:stackFromBottom="true" | |||
android:transcriptMode="alwaysScroll"> | |||
android:transcriptMode="alwaysScroll" | |||
> | |||
</ListView> |
@@ -2,7 +2,9 @@ | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
xmlns:tools="http://schemas.android.com/tools" | |||
android:orientation="vertical" | |||
tools:context="com.pinwang.ailinkblesdk.modules.ble_nutrition.BleNutritionActivity"> | |||
<ScrollView | |||
android:layout_width="match_parent" | |||
@@ -51,6 +53,12 @@ | |||
android:layout_height="wrap_content" | |||
android:text="设置单位" /> | |||
<Button | |||
android:id="@+id/btnVoice" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="蜂鸣器开关" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
@@ -136,6 +144,33 @@ | |||
</LinearLayout> | |||
<LinearLayout | |||
android:orientation="horizontal" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnReadHistory" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="读取历史" | |||
/> | |||
<Button | |||
android:id="@+id/btnClearHistory" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清除历史" | |||
/> | |||
<Button | |||
android:id="@+id/btnSynTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="同步时间" | |||
/> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> |
@@ -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" | |||
xmlns:tools="http://schemas.android.com/tools" | |||
android:orientation="vertical" | |||
tools:context="com.pinwang.ailinkblesdk.modules.ble_nutrition.BleNutritionActivity"> | |||
<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> | |||
<View | |||
android:layout_width="match_parent" | |||
android:layout_height="1dp" | |||
android:background="?android:attr/listDivider" /> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_margin="5dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btn_set_zero" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="去皮指令" /> | |||
<Button | |||
android:id="@+id/btn_set_unit" | |||
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_marginStart="5dp" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_g" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="g" /> | |||
<RadioButton | |||
android:id="@+id/rb_ml" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="ml" /> | |||
<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_kg" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="kg" /> | |||
<RadioButton | |||
android:id="@+id/rb_jin" | |||
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_marginStart="5dp" | |||
android:orientation="horizontal"> | |||
<RadioButton | |||
android:id="@+id/rb_milk_ml" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="牛奶ml" /> | |||
<RadioButton | |||
android:id="@+id/rb_water_ml" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="水ml" /> | |||
<RadioButton | |||
android:id="@+id/rb_milk_fl_oz" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="牛奶floz" /> | |||
<RadioButton | |||
android:id="@+id/rb_water_fl_oz" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="水floz" /> | |||
<RadioButton | |||
android:id="@+id/rb_lb" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="lb" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:orientation="vertical" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnSendApple" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="选择食物:苹果" | |||
/> | |||
<Button | |||
android:id="@+id/btnSendBeef" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="选择食物:牛肉" | |||
/> | |||
</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> |
@@ -4,6 +4,11 @@ | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<TextView | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:text="请先登录,然后获取设备ID,再绑定设备." | |||
/> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
@@ -24,7 +29,7 @@ | |||
android:id="@+id/ed_imei" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:text="866156054199057" /> | |||
android:text="" /> | |||
</LinearLayout> | |||
@@ -45,7 +50,7 @@ | |||
<EditText | |||
android:id="@+id/et_cid" | |||
android:inputType="number" | |||
android:text="57" | |||
android:text="" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" /> | |||
@@ -60,7 +65,7 @@ | |||
<EditText | |||
android:id="@+id/et_vid" | |||
android:inputType="number" | |||
android:text="44" | |||
android:text="" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" /> | |||
@@ -75,7 +80,7 @@ | |||
<EditText | |||
android:id="@+id/et_pid" | |||
android:inputType="number" | |||
android:text="1" | |||
android:text="" | |||
android:layout_width="50dp" | |||
android:layout_height="wrap_content" /> | |||
@@ -0,0 +1,333 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
xmlns:app="http://schemas.android.com/apk/res-auto" | |||
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"> | |||
<EditText | |||
android:id="@+id/etMac" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:hint="请输入需要连接的设备MAC地址" | |||
android:paddingStart="20dp" | |||
android:inputType="textCapCharacters" | |||
android:digits="0123456789abcdefABCDEF:" | |||
android:maxLength="17" | |||
android:textSize="14dp" /> | |||
<Button | |||
android:id="@+id/btnConnect" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="连接" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="10dp" | |||
android:layout_marginTop="10dp" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btnSetTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="设置时间" /> | |||
<Button | |||
android:id="@+id/btnQueryInfo" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="查询信息" /> | |||
<Button | |||
android:id="@+id/btnQueryThreshold" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="获取本地存储数据" /> | |||
<Button | |||
android:id="@+id/btnClearLog" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="清空log" /> | |||
</LinearLayout> | |||
<androidx.appcompat.widget.LinearLayoutCompat | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<EditText | |||
android:id="@+id/etCheckTime" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:hint="检测间隔时间(分)" | |||
android:paddingStart="20dp" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<CheckBox | |||
android:id="@+id/cbCheckTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:checked="true" | |||
android:text="开启/关闭测量"/> | |||
<Button | |||
android:id="@+id/btnSetCheckTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="设置检测间隔时间" /> | |||
</androidx.appcompat.widget.LinearLayoutCompat> | |||
<androidx.appcompat.widget.LinearLayoutCompat | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<EditText | |||
android:id="@+id/etBleName" | |||
android:layout_width="0dp" | |||
android:layout_height="match_parent" | |||
android:layout_weight="1" | |||
android:hint="蓝牙名称" | |||
android:paddingStart="20dp" | |||
android:inputType="text" | |||
android:textSize="14dp" /> | |||
<Button | |||
android:id="@+id/btnSetBleName" | |||
android:layout_width="wrap_content" | |||
android:layout_height="match_parent" | |||
android:text="设置检测间隔时间" /> | |||
</androidx.appcompat.widget.LinearLayoutCompat> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="心率:低值" /> | |||
<EditText | |||
android:id="@+id/etHrMin" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="60" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="高值" /> | |||
<EditText | |||
android:id="@+id/etHrMax" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="120" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="10dp" | |||
android:text="血氧:低值" /> | |||
<EditText | |||
android:id="@+id/etSpo2Min" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="95" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="高值" /> | |||
<EditText | |||
android:id="@+id/etSpo2Max" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="100" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:visibility="gone" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="收缩压:低值" /> | |||
<EditText | |||
android:id="@+id/etSbpMin" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="90" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="高值" /> | |||
<EditText | |||
android:id="@+id/etSbpMax" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="140" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_marginStart="10dp" | |||
android:text="舒张压:低值" /> | |||
<EditText | |||
android:id="@+id/etDbpMin" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="60" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="高值" /> | |||
<EditText | |||
android:id="@+id/etDbpMax" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="90" | |||
android:inputType="number" | |||
android:maxLength="3" | |||
android:textSize="14dp" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" | |||
android:gravity="center_vertical" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="温度:低值" /> | |||
<EditText | |||
android:id="@+id/etTempMin" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="36.0" | |||
android:inputType="numberDecimal" | |||
android:maxLength="4" | |||
android:textSize="14dp" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="高值" /> | |||
<EditText | |||
android:id="@+id/etTempMax" | |||
android:layout_width="0dp" | |||
android:layout_height="wrap_content" | |||
android:layout_weight="1" | |||
android:gravity="center" | |||
android:hint="38.0" | |||
android:inputType="numberDecimal" | |||
android:maxLength="4" | |||
android:textSize="14dp" /> | |||
<Button | |||
android:id="@+id/btnSetThreshold" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:layout_gravity="center" | |||
android:layout_marginStart="10dp" | |||
android:layout_marginEnd="10dp" | |||
android:text="设置阈值" /> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/log_list" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_marginTop="10dp" /> | |||
</LinearLayout> |
@@ -29,7 +29,7 @@ | |||
android:id="@+id/et_type" | |||
android:layout_width="200dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:hint="A7 payload数据" | |||
android:text="01" | |||
android:digits="0123456789abcdefABCDEF" | |||
/> | |||
@@ -61,6 +61,20 @@ | |||
android:text="set_unit" | |||
/> | |||
<Button | |||
android:id="@+id/btnPause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停" | |||
/> | |||
<Button | |||
android:id="@+id/btnClearShakeHands" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="解除握手加密" | |||
/> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> |
@@ -26,6 +26,12 @@ | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> | |||
<Button | |||
android:id="@+id/btnPause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停" /> | |||
</LinearLayout> | |||
<LinearLayout |
@@ -0,0 +1,142 @@ | |||
<?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_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:layout_below="@+id/edit_Userid" | |||
android:orientation="horizontal"> | |||
<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> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="年龄:" /> | |||
<EditText | |||
android:id="@+id/et_age" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:inputType="number" | |||
android:text="34" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="性别(女=0,男=1):" /> | |||
<EditText | |||
android:id="@+id/et_sex" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:inputType="number" | |||
android:text="1" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="身高(CM):" /> | |||
<EditText | |||
android:id="@+id/et_height" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:inputType="number" | |||
android:text="178" /> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="体重(kg):" /> | |||
<EditText | |||
android:id="@+id/et_weight" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:inputType="number" | |||
android:text="78" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:orientation="horizontal" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/support_unit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="查询支持单位" /> | |||
<Button | |||
android:id="@+id/btn_clear_log" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空log" /> | |||
</LinearLayout> | |||
<Button | |||
android:id="@+id/test_bodyfit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="计算体脂数据" /> | |||
<ListView | |||
android:id="@+id/log_list" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:layout_below="@id/unit" | |||
android:layout_marginTop="20dp"> | |||
</ListView> | |||
</LinearLayout> |
@@ -0,0 +1,283 @@ | |||
<?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" | |||
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" | |||
android:padding="5dp"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnGetCurInfo" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="实时信息" /> | |||
<Button | |||
android:id="@+id/btnSyncTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="同步时间" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnGetCO2Density" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="CO2报警浓度" /> | |||
<Button | |||
android:id="@+id/btnGetCODensity" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="CO报警浓度" /> | |||
<Button | |||
android:id="@+id/btnGetO2Density" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="O2报警浓度" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnGetCO2Interval" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="CO2间隔" /> | |||
<Button | |||
android:id="@+id/btnGetCOInterval" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="CO间隔" /> | |||
<Button | |||
android:id="@+id/btnGetHistoryInterval" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="历史记录间隔" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnGetCO2Switch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="CO2开关" /> | |||
<Button | |||
android:id="@+id/btnGetCOSwitch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="CO开关" /> | |||
<Button | |||
android:id="@+id/btnGetSoundSwitch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="声音开关" /> | |||
<Button | |||
android:id="@+id/btnGetShakeSwitch" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="震动开关" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnGetTempUnit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="温度单位" /> | |||
<Button | |||
android:id="@+id/btnGetPressureUnit" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="气压单位" /> | |||
<Button | |||
android:id="@+id/btnGetScreenOffTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="息屏时间" /> | |||
<Button | |||
android:id="@+id/btnGetShutdownTime" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="关机时间" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnGetHistory" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="历史记录" /> | |||
<Button | |||
android:id="@+id/btnClearHistory" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="清空历史记录" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<EditText | |||
android:id="@+id/etDensity" | |||
android:layout_width="160dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="报警浓度(单位ppm)" | |||
android:inputType="number" | |||
android:textSize="14dp" /> | |||
<Button | |||
android:id="@+id/btnSetCo2Density" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="设置Co2浓度" /> | |||
<Button | |||
android:id="@+id/btnSetO2Density" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="设置O2浓度" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<EditText | |||
android:id="@+id/etInterval" | |||
android:layout_width="160dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="间隔(min)0代表一直" | |||
android:inputType="number" | |||
android:textSize="14dp" /> | |||
<Button | |||
android:id="@+id/btnSetCo2Interval" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="设置CO2间隔" /> | |||
<Button | |||
android:id="@+id/btnSetCoInterval" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="设置CO间隔" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<EditText | |||
android:id="@+id/etHpa" | |||
android:layout_width="120dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="气压(hPa,0-9999)" | |||
android:inputType="number" | |||
android:textSize="14dp" /> | |||
<EditText | |||
android:id="@+id/etInHg" | |||
android:layout_width="120dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="气压(hPa,0-9999)" | |||
android:inputType="number" | |||
android:textSize="14dp" /> | |||
<Button | |||
android:id="@+id/btnSetPressureCali" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:onClick="onClick" | |||
android:text="气压校准" /> | |||
</LinearLayout> | |||
</LinearLayout> | |||
</ScrollView> | |||
<ListView | |||
android:id="@+id/list_view" | |||
android:layout_width="match_parent" | |||
android:layout_height="0dp" | |||
android:layout_weight="1" | |||
/> | |||
</androidx.appcompat.widget.LinearLayoutCompat> |
@@ -172,7 +172,22 @@ | |||
android:text="回复测量完成" | |||
android:textAllCaps="false" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content"> | |||
<Button | |||
android:id="@+id/btnPause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停" | |||
/> | |||
</LinearLayout> | |||
<ListView | |||
android:id="@+id/listView" | |||
android:layout_width="match_parent" |
@@ -5,6 +5,31 @@ | |||
android:layout_height="match_parent" | |||
android:orientation="vertical"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="搜索:" /> | |||
<EditText | |||
android:id="@+id/etSearch" | |||
android:layout_width="300dp" | |||
android:layout_height="50dp" | |||
android:hint=" 请输入关键字" /> | |||
<ImageView | |||
android:id="@+id/ivClear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:src="@drawable/baseline_delete_24" /> | |||
</LinearLayout> | |||
<androidx.recyclerview.widget.RecyclerView | |||
android:id="@+id/rv_list" | |||
android:layout_width="match_parent" |
@@ -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" | |||
android:padding="10dp"> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<Button | |||
android:id="@+id/btnClearShakeHands" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> | |||
<TextView | |||
android:id="@+id/tvDeviceList" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="当前APPID:" /> | |||
<EditText | |||
android:id="@+id/etAppUserId" | |||
android:layout_width="80dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:text="1" /> | |||
<Button | |||
android:id="@+id/btnConnectMqtt" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="连接MQTT" /> | |||
<Button | |||
android:id="@+id/btnDisconnectMqtt" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="断开MQTT" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:orientation="horizontal"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设备ID:" /> | |||
<EditText | |||
android:id="@+id/etDeviceId" | |||
android:layout_width="80dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="请输入设备ID" | |||
android:text="1" /> | |||
<Button | |||
android:id="@+id/btnAddDevice" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="添加设备" /> | |||
<Button | |||
android:id="@+id/btnRemoveDevice" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="移除设备" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:orientation="horizontal" | |||
android:layout_height="wrap_content"> | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="设备ID:" | |||
/> | |||
<EditText | |||
android:id="@+id/etSendDataDeviceId" | |||
android:layout_width="80dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
/> | |||
<EditText | |||
android:id="@+id/etSendData" | |||
android:layout_width="0dp" | |||
android:layout_weight="1" | |||
android:layout_height="wrap_content" | |||
android:text="" | |||
android:hint="请输入要发送的数据" | |||
android:textSize="12dp" | |||
android:digits="0123456789abcdefABCDEF" | |||
/> | |||
<Button | |||
android:id="@+id/btnSendData" | |||
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> |
@@ -34,8 +34,8 @@ | |||
android:id="@+id/et_cid" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
android:digits="-0123456789" | |||
android:hint="CID(decimal)" /> | |||
android:digits="-0123456789abcdefABCDEF" | |||
android:hint="CID" /> | |||
</LinearLayout> |
@@ -43,7 +43,7 @@ | |||
android:text="Battery" /> | |||
<Button | |||
android:id="@+id/btnClear" | |||
android:id="@+id/btnClearShakeHands" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> |
@@ -25,8 +25,9 @@ | |||
android:id="@+id/et_cmd" | |||
android:layout_width="180dp" | |||
android:layout_height="wrap_content" | |||
android:hint="透传数据" | |||
android:text="4" /> | |||
android:digits="0123456789ABCDEFabcdef" | |||
android:hint="16进制数据(hex)" | |||
android:text="04" /> | |||
<Button | |||
android:id="@+id/btn1" | |||
@@ -130,10 +131,10 @@ | |||
android:id="@+id/et_time" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789-" | |||
android:hint="发送间隔" | |||
android:maxLines="1" | |||
android:digits="0123456789-" | |||
android:text="1000" /> | |||
android:text="100" /> | |||
<Button | |||
android:id="@+id/btn_time" | |||
@@ -156,6 +157,32 @@ | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:paddingStart="10dp" | |||
android:paddingEnd="5dp"> | |||
<EditText | |||
android:id="@+id/etIncrementNumber" | |||
android:layout_width="100dp" | |||
android:layout_height="wrap_content" | |||
android:digits="0123456789" | |||
android:hint="递增数" | |||
android:maxLines="1" | |||
android:text="517" /> | |||
<Button | |||
android:id="@+id/btnIncrementSend" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="递增发送:N" /> | |||
</LinearLayout> | |||
<LinearLayout | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
@@ -179,8 +206,8 @@ | |||
<TextView | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="发送:" | |||
android:layout_marginStart="50dp" | |||
android:text="发送:" | |||
android:textSize="18dp" /> | |||
<TextView |
@@ -8,6 +8,7 @@ | |||
android:id="@+id/tv_device_info" | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:textColor="@color/colorAccent" | |||
/> | |||
<LinearLayout | |||
@@ -136,13 +137,18 @@ | |||
android:id="@+id/bt_clear" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空" /> | |||
android:text="清空输入" /> | |||
<Button | |||
android:id="@+id/bt_clear_log" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="清空log" /> | |||
<Button | |||
android:id="@+id/btPause" | |||
android:layout_width="wrap_content" | |||
android:layout_height="wrap_content" | |||
android:text="暂停" /> | |||
</LinearLayout> |
@@ -7,7 +7,7 @@ | |||
android:layout_marginStart="16dp" | |||
android:layout_marginEnd="16dp" | |||
android:layout_marginBottom="10dp" | |||
app:cardBackgroundColor="@color/white" | |||
app:cardBackgroundColor="@color/colorPrimary" | |||
app:cardCornerRadius="8dp" | |||
android:foreground="?attr/selectableItemBackground" | |||
app:cardElevation="0dp" | |||
@@ -18,7 +18,7 @@ | |||
android:layout_width="match_parent" | |||
android:layout_height="wrap_content" | |||
android:gravity="center" | |||
android:textColor="@color/black" | |||
android:textColor="@color/white" | |||
android:textSize="18dp" | |||
tools:text="item" /> | |||
@@ -1,5 +1,5 @@ | |||
<resources> | |||
<string name="app_name" translatable="false">AILink联调工具</string> | |||
<string name="app_name" translatable="false">AILinkSDKDemo</string> | |||
<string name="clear">Vide</string> | |||
<string name="handshake">serrer la main</string> | |||
@@ -43,4 +43,5 @@ | |||
<string name="check_version">version:</string> | |||
<string name="upgrade_controller">Contrôleur de mise à niveau</string> | |||
<string name="upgrade_watch">Mettre à niveau l\'instrument</string> | |||
<string name="gas_detector">Détecteur de gaz</string> | |||
</resources> |
@@ -118,18 +118,22 @@ | |||
<string name="connecting_wifi">正在连接wifi...</string> | |||
<string name="cancel">取消</string> | |||
<string name="select_wifi">选择WIFI</string> | |||
<string name="item_ble_general_settings">Ble通用设置</string> | |||
<string name="item_ble_universal_distribution_network">BLE通用配网</string> | |||
<string name="item_ble_test">Ble test</string> | |||
<string name="item_ble_connect_test">Ble connect test</string> | |||
<string name="item_ota">OTA通用</string> | |||
<string name="item_mqtt">MQTT通用</string> | |||
<string name="item_penetrate">透传</string> | |||
<string name="item_body_fat_scale_broadcast">广播秤</string> | |||
<string name="item_body_fat_scale_ble">Ble体脂秤</string> | |||
<string name="item_body_fat_scale_4g">4G体脂秤</string> | |||
<string name="item_body_fat_scale_wifi_ble">WiFi+Ble体脂秤</string> | |||
<string name="item_body_fat_scale_eight">八极秤</string> | |||
<string name="item_body_fat_scale_eight">八极秤(单频)APP</string> | |||
<string name="item_body_fat_scale_eight_mcu">八极秤(单频)MCU</string> | |||
<string name="item_body_fat_scale_eight_dual_band">八极秤(双频)APP</string> | |||
<string name="item_body_fat_scale_eight_dual_band_mcu">八极秤(双频)MCU</string> | |||
<string name="item_body_fat_scale_aidi">艾迪体脂秤</string> | |||
<string name="item_baby_scale">婴儿秤</string> | |||
<string name="item_baby_body_fat_scale">婴儿体脂两用秤</string> | |||
@@ -178,4 +182,6 @@ | |||
<string name="about_us">关于我们</string> | |||
<string name="share">分享</string> | |||
<string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string> | |||
<string name="item_bw05_watch">BW05手表</string> | |||
<string name="gas_detector">气体检测仪</string> | |||
</resources> |
@@ -5,6 +5,6 @@ | |||
<color name="colorAccent">#D81B60</color> | |||
<color name="public_white">#FFFFFF</color> | |||
<color name="public_press_bg">#dcdcdc</color> | |||
<color name="black">#FF000000</color> | |||
<color name="white">#FFFFFFFF</color> | |||
<color name="black">#000000</color> | |||
<color name="white">#FFFFFF</color> | |||
</resources> |
@@ -6,7 +6,6 @@ | |||
<string name="baby_hold">锁定</string> | |||
<string name="rtk_dfu_progress_state_origin"> ready to upgrade </string> | |||
<string name="rtk_dfu_state_abort_processing">waiting for cancellation...</string> | |||
<string name="rtk_dfu_state_aborted"> has been cancelled</string> | |||
@@ -44,7 +43,7 @@ | |||
<string name="upgrade_controller">Upgrade controller</string> | |||
<string name="upgrade_watch">Upgrade instrument</string> | |||
<!-- wifi+ble体脂秤 --> | |||
<!-- wifi+ble体脂秤 --> | |||
<string name="check_wifi_status">Check wifi status</string> | |||
<string name="search_wifi_hotspots">Search wifi hotspots</string> | |||
<string name="select_wifi_serial_number">Select wifi serial number</string> | |||
@@ -127,12 +126,16 @@ | |||
<string name="item_ble_test">Ble test</string> | |||
<string name="item_ble_connect_test">Ble connect test</string> | |||
<string name="item_ota">OTA</string> | |||
<string name="item_mqtt">MQTT</string> | |||
<string name="item_penetrate">Penetrate</string> | |||
<string name="item_body_fat_scale_broadcast">Body fat scale (Broadcast)</string> | |||
<string name="item_body_fat_scale_ble">Body fat scale (Ble)</string> | |||
<string name="item_body_fat_scale_4g">Body fat scale (4G)</string> | |||
<string name="item_body_fat_scale_wifi_ble">Body fat scale (WiFi+Ble)</string> | |||
<string name="item_body_fat_scale_eight">Eight-electrode body fat scale</string> | |||
<string name="item_body_fat_scale_eight">Eight-electrode body fat scale app</string> | |||
<string name="item_body_fat_scale_eight_mcu">Eight-electrode body fat scale MCU</string> | |||
<string name="item_body_fat_scale_eight_dual_band">Eight-electrode body fat scale(dual band)APP</string> | |||
<string name="item_body_fat_scale_eight_dual_band_mcu">Eight-electrode body fat scale(dual band)MCU</string> | |||
<string name="item_body_fat_scale_aidi">Body fat scale (Aidi)</string> | |||
<string name="item_baby_scale">Baby scale</string> | |||
<string name="item_baby_body_fat_scale">Baby body fat scale</string> | |||
@@ -180,5 +183,8 @@ | |||
<string name="item_wifi_config">WIFI config</string> | |||
<string name="about_us">About us</string> | |||
<string name="share">Share</string> | |||
<string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string> | |||
<string name="wifi_ble_ota_tool">WIFI+BLE OTA Tools</string> | |||
<string name="item_bw05_watch">BW05 WATCH</string> | |||
<string name="item_nutritional_scale_ble_nutrient">Bluetooth Nutrition Scale-Nutrients</string> | |||
<string name="gas_detector">Gas detector</string> | |||
</resources> |
@@ -4,8 +4,8 @@ buildscript { | |||
repositories { | |||
google() | |||
mavenCentral() | |||
jcenter() | |||
maven { url 'https://jitpack.io' } | |||
jcenter() | |||
} | |||
dependencies { | |||
classpath 'com.android.tools.build:gradle:7.1.2' | |||
@@ -19,8 +19,8 @@ allprojects { | |||
repositories { | |||
google() | |||
mavenCentral() | |||
jcenter() | |||
maven { url 'https://jitpack.io' } | |||
jcenter() | |||
} | |||
} | |||