I want to display data to Android Application the data is coming from Esp32 module to Android Application but I can't split this array its seems it string and when I get the index value 9 ..its gave me array array index out of bound
data = ups/testing/00.2/232/322/433/4323/332/32/332/332/543/453/3454/343/结束这是Esp32服务器模块数据
我从 Docklight 应用程序发送此数据
***我想拆分此数据,但它显示数组索引超出范围,请帮助我,这是我的第一个工作项目,我想尽快完成此任务。
//这是我的Android应用程序的java代码
public void onCharacteristicChanged(最终字节[]数据){
runOnUiThread(new Runnable() {
@Override
public void run() {
String ipData = HexUtil.formatHexString(data);
Log.d(Tag+"OP",ipData);
if (ipData!=null) {
String [] data=ipData.split("/");
builderList.clear();
convertHaxToASCII(data);
setButtonText();
setText();
alarms.checkAlert(builderList.get(9).toString(), DetailBLE.this);
}
if (!builderList.isEmpty())
{
setTitle(builderList.get(1).toString());
setArrowsStatus();
setBatteryImage();
}
}
});
}
**我要分割这个数据data = ups/123/334/233/244/24/24/545/56/343/54634/454/End 以数组的形式,然后我通过索引在用户屏幕上显示它 ** 就像 ups --get(0)
就像电源一样--get(1) 就像太阳能--get(2) 就像非太阳能--get(3) 就像电池电量低--get(4) 就像放电电流--get(5)
package com.eaproups.test.mynavapp.activity;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.clj.fastble.BleManager;
import com.clj.fastble.callback.BleIndicateCallback;
import com.clj.fastble.callback.BleMtuChangedCallback;
import com.clj.fastble.callback.BleWriteCallback;
import com.clj.fastble.data.BleDevice;
import com.clj.fastble.exception.BleException;
import com.clj.fastble.utils.HexUtil;
import com.eaproups.test.mynavapp.classes.Alarms;
import com.eaproups.test.mynavapp.classes.ClickDialog;
import com.eaproups.test.mynavapp.classes.ConnectWithMAC;
import com.eaproups.test.mynavapp.classes.NotificationService;
import com.eaproups.test.mynavapp.R;
import com.eaproups.test.mynavapp.conn.Observer;
import com.eaproups.test.mynavapp.conn.ObserverManager;
import com.google.android.material.snackbar.Snackbar;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class DetailBLE extends AppCompatActivity implements Serializable, Observer {
BluetoothAdapter mBluetoothAdapter;
public static final String Tag="DetailBle";
boolean MAINSSTATUS;
boolean SOLARSTATUS;
boolean UPSSTATUS;
boolean BATTERYFULL;
String CHARGING_STATUS,CHARGING_LABEL;
View view;
LinearLayout statusLayout;
int psckecked;
Alarms alarms;
List<StringBuilder> builderList;
List<BluetoothGattCharacteristic> characteristicsList = new ArrayList<>();
List<BluetoothGattService> servicesList;
BleDevice bleDevice;
BluetoothGattService service;
LinearLayout solarArrowLoad, solarArrowBattery, gridArrowLoad, gridArrowBattery,batteryArrowLoad;
TextView solarToloadP,solarToBatteryCur,gridToLoadP,gridToBatteryCu;
TextView todayPS, totalPS,solarPower,solarCurrent,batteryVolt,batteryCurrent, gridVolt,loadPersent;
TextView connetionStatus;
Button upsStatus,upsMode,highCharging,powerSaving;
ImageView solarPanel,battery,homeLoad,supply;
int writeFlag;
ClickDialog clickDialog;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_ble2);
ObserverManager.getInstance().addObserver(this);
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
BleDevice bleDevice1 = getIntent().getParcelableExtra("bleDevice"); //BLE class object
if (bleDevice1 != null){
start(bleDevice1);
}
else {
Toast.makeText(this, "Please Reconnect", Toast.LENGTH_SHORT).show();
}
}
void start(BleDevice bleDevice1){
bleDevice=bleDevice1;
if (bleDevice!=null){
if (BleManager.getInstance().isConnected(bleDevice)){
initView();
setData();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
//notifyClick();
write("HELLO");
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
indicate();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
setMTU();
}
else
Toast.makeText(this, "Device is not connected", Toast.LENGTH_SHORT).show();
Log.d(Tag+"onCreate","Device id not connected");
}
setConnectivityStatus();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
//start handler as activity become visible
// startCkeckStatus();
super.onResume();
}
private void setConnectivityStatus() {
if (getConnectivityStatus()) {
connetionStatus.setText(getText(R.string.connected));
Log.d(Tag,"Connected");
}
else {
connetionStatus.setText(R.string.active_disconnected);
Log.d(Tag,"Disconnected");
}
}
private boolean getConnectivityStatus() {
return BleManager.getInstance().isConnected(bleDevice);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (bleDevice!=null){
BleManager.getInstance().disconnect(bleDevice);
BleManager.getInstance().destroy();}
stopNotification();
}
private void initView() {
servicesList = new ArrayList<>();
builderList= new ArrayList<>();
connetionStatus=findViewById(R.id.connected_status);
solarToloadP=findViewById(R.id.solar_to_load_power);
solarToBatteryCur=findViewById(R.id.solar_to_battery_current);
gridToLoadP=findViewById(R.id.grid_to_load_power);
gridToBatteryCu=findViewById(R.id.grid_to_battery_current);
todayPS=findViewById(R.id.today_power_saved);
totalPS=findViewById(R.id.total_power_saved);
solarPower=findViewById(R.id.solar_power);
// solarCurrent=findViewById(R.id.solar_current);
gridVolt =findViewById(R.id.ip_volt);
loadPersent=findViewById(R.id.load_presentge);
batteryVolt=findViewById(R.id.battery_volt);
batteryCurrent=findViewById(R.id.battrery_to_load_power);
upsStatus=findViewById(R.id.ups_status);
upsMode=findViewById(R.id.ups_mode);
highCharging=findViewById(R.id.high_charging);
powerSaving=findViewById(R.id.power_saving);
solarPanel=findViewById(R.id.solar_panel);
supply=findViewById(R.id.supply);
battery=findViewById(R.id.battery);
homeLoad=findViewById(R.id.load);
gridArrowLoad =findViewById(R.id.grid_arroweup);
gridArrowBattery =findViewById(R.id.grid_arrowdown);
solarArrowLoad =findViewById(R.id.solar_arrow_up);
solarArrowBattery =findViewById(R.id.solar_arrow_mid);
batteryArrowLoad =findViewById(R.id.battery_to_load);
}
private void setData() {
BluetoothGatt gatt = BleManager.getInstance().getBluetoothGatt(bleDevice);
alarms=new Alarms(DetailBLE.this);
clickDialog = new ClickDialog(DetailBLE.this);
view =getWindow().getDecorView().findViewById(android.R.id.content);
for (BluetoothGattService service : gatt.getServices()) {
servicesList.add(service);
}
service = servicesList.get(2);
for (BluetoothGattCharacteristic characteristic : service.getCharacteristics()) {
characteristicsList.add(characteristic);
}
/* ************************************* Button ******************************************* */
upsStatus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!builderList.isEmpty()) {
if (upsStatus.getText() == getString(R.string.ups_on)) {
// String input = builderList.get(1).toString() + "%" + getString(R.string.ups_off) + "%" + "END";
String input = builderList.get(1).toString() + "%" + "OFF"+ "%" + "END";
int status = write(input);
if (status == 1)
upsStatus.setText(getString(R.string.ups_off));
else
Toast.makeText(DetailBLE.this, "Operation Fail try again",
Toast.LENGTH_SHORT).show();
} else {
// String input = builderList.get(1).toString() + "%" + getString(R.string.ups_on) + "%" + "END";
String input = builderList.get(1).toString() + "%" + " ON"+ "%" + "END";
int status = write(input);
if (status == 1)
upsStatus.setText(getString(R.string.ups_on));
else
Toast.makeText(DetailBLE.this, "Operation Fail try again",
Toast.LENGTH_SHORT).show();
}
}
}
});
upsMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!builderList.isEmpty()) {
if (upsMode.getText() == getString(R.string.ups_mode)) {
// String input = builderList.get(1).toString() + "%" + getString(R.string.normal_mode)
// + "%" + "END";
String input = builderList.get(1).toString() + "%" + "NOR"+ "%" + "END";
int status = write(input);
if (status == 1)
upsMode.setText(getString(R.string.normal_mode));
else
Toast.makeText(DetailBLE.this, "Operation Fail try again",
Toast.LENGTH_SHORT).show();
} else {
//String input = builderList.get(1).toString() + "%" +
// getString(R.string.ups_mode) + "%" + "END";
String input = builderList.get(1).toString() + "%" + "UPS"+ "%" + "END";
int status = write(input);
if (status == 1)
upsMode.setText(getString(R.string.ups_mode));
else
Toast.makeText(DetailBLE.this, "Operation Fail try again",
Toast.LENGTH_SHORT).show();
}
}
}
});
highCharging.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!builderList.isEmpty()) {
if (highCharging.getText() == getString(R.string.high_charging)) {
// String input = builderList.get(1).toString() + "%" + getString(R.string.low_charging) + "%" + "END";
String input = builderList.get(1).toString() + "%" + "LOW"+ "%" + "END";
int status = write(input);
if (status == 1)
highCharging.setText(getString(R.string.low_charging));
else
Toast.makeText(DetailBLE.this, "Operation Fail try again",
Toast.LENGTH_SHORT).show();
} else {
// String input = builderList.get(1).toString() + "%" +
// getString(R.string.high_charging) + "%" + "END";
String input = builderList.get(1).toString() + "%" + "HIG"+ "%" + "END";
int status = write(input);
if (status == 1)
highCharging.setText(getString(R.string.high_charging));
else
Toast.makeText(DetailBLE.this, "Operation Fail try again",
Toast.LENGTH_SHORT).show();
}
}
}
});
powerSaving.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!builderList.isEmpty())
powerSavingDialog();
}
});
/*------------------------------------ImageView--------------------------------------------*/
solarPanel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// parameters to pass
if (builderList.isEmpty()){
clickDialog.solarDialog( "0A","0A");
}else {
clickDialog.solarDialog((builderList.get(14).toString() + "A"), (builderList.get(13).toString() + "A"));
}
}
});
supply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (builderList.isEmpty()){
clickDialog.supplyDialog("0V", "0Hz");
}
else {
clickDialog.supplyDialog((builderList.get(2).toString() + "V"), (builderList.get(6).toString() + "Hz"));
}
}
});
battery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (builderList.isEmpty()) {
clickDialog.batteryDialog("0V", 0, "--", "Charging Current");
}
else {
int charged = Integer.parseInt(builderList.get(9).toString());
float gridChargingCurrent = Float.parseFloat(builderList.get(10).toString());
float solarChargingcurrent = Float.parseFloat(builderList.get(12).toString());
float disChargingCurrent = Float.parseFloat(builderList.get(11).toString());
float solarCapicity = Float.parseFloat(builderList.get(14).toString());
float batteryChargingCurrent = 0;
String batteryvolt = ((!builderList.isEmpty()) ? (builderList.get(3).toString() + "V") : "0 V");
String chargingStatus = "null";
String currentLable = "Current";
if ((MAINSSTATUS) & (SOLARSTATUS)) {
currentLable = getString(R.string.charging_current);
if ((charged & 128) == 128) {
chargingStatus = "Full Charged";
batteryChargingCurrent = gridChargingCurrent;
} else {
if (gridChargingCurrent >= 10.0) {
chargingStatus = "Charging From Grid+Solar";
batteryChargingCurrent = gridChargingCurrent + solarChargingcurrent;
} else if (solarChargingcurrent > 1.0) {
chargingStatus = "Charging From Solar";
batteryChargingCurrent = solarChargingcurrent;
}
else {
chargingStatus="Idle";
batteryChargingCurrent=gridChargingCurrent;
}
}
} else if ((MAINSSTATUS) & (!SOLARSTATUS)) {
currentLable = getString(R.string.charging_current);
batteryChargingCurrent = gridChargingCurrent;
if ((charged & 128) == 128) {
chargingStatus = "Full Charged";
} else {
if (gridChargingCurrent > 0.2) {
chargingStatus = "Charging From Grid";
} else {
chargingStatus = "Idle";
}
}
} else if (SOLARSTATUS) {
if ((charged & 128) == 128) {
chargingStatus = "Full Charged";
currentLable = getString(R.string.charging_current);
batteryChargingCurrent = solarChargingcurrent;
} else {
if (disChargingCurrent > 0.2) {
chargingStatus = "Discharging";
currentLable = getString(R.string.discharging);
batteryChargingCurrent = disChargingCurrent;
} else if (solarChargingcurrent > 0.2) {
chargingStatus = "Charging From Solar";
currentLable = getString(R.string.charging_current);
batteryChargingCurrent = solarChargingcurrent;
}
else {
chargingStatus=getString(R.string.idle);
currentLable=getString(R.string.charging_current);
batteryChargingCurrent = solarChargingcurrent;
}
}
} else {
if ((charged & 128) == 128) {
chargingStatus = "Full Charged";
currentLable = getString(R.string.charging_current);
batteryChargingCurrent = gridChargingCurrent;
} else {
if (UPSSTATUS) {
chargingStatus = "Discharging";
currentLable = getString(R.string.discharging);
batteryChargingCurrent = disChargingCurrent;
} else {
chargingStatus = "Idle";
currentLable = getString(R.string.charging_current);
batteryChargingCurrent = gridChargingCurrent;
}
}
}
clickDialog.batteryDialog(batteryvolt, batteryChargingCurrent, chargingStatus, currentLable);
}
}
});
homeLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (builderList.isEmpty()) {
clickDialog.lodDiaog("0%", "--", "0V");
}
else {
int loadINT = Integer.parseInt(builderList.get(4).toString());
String load = "null";
String loadRunon = "null";
if (((MAINSSTATUS) & (!SOLARSTATUS)) | ((MAINSSTATUS) & (SOLARSTATUS))) {
load = "Not Available During Grid";
loadRunon = "Grid";
} else if (SOLARSTATUS) {
if ((UPSSTATUS) & (loadINT > 5)) {
float disChargingCurrent = Float.parseFloat(builderList.get(11).toString());
float solarCapicity = Float.parseFloat(builderList.get(14).toString());
if (disChargingCurrent > 0.2) {
loadRunon = "Solar+Battery";
load = ((!builderList.isEmpty()) ? (builderList.get(4).toString() + "%") : "0 %");
} else {
loadRunon = "Solar";
load = ((!builderList.isEmpty()) ? (builderList.get(4).toString() + "%") : "0 %");
}
} else {
loadRunon = "No load";
load = "0 %";
}
} else {
if ((UPSSTATUS) & (loadINT > 5)) {
loadRunon = "Battery";
load = ((!builderList.isEmpty()) ? (builderList.get(4).toString() + "%") : "0 %");
} else {
loadRunon = "No load";
load = "0 %";
}
}
String opVolt = ((!builderList.isEmpty()) ? (builderList.get(5).toString() + "V") : "0 V");
clickDialog.lodDiaog(load, loadRunon, opVolt);
}
}
});
}
void indicate() {
BleManager.getInstance().indicate(
bleDevice,
service.getUuid().toString(),
characteristicsList.get(0).getUuid().toString(),
new BleIndicateCallback() {
@Override
public void onIndicateSuccess() {
}
@Override
public void onIndicateFailure(BleException exception) {
}
@Override
public void onCharacteristicChanged(final byte[] data) {
runOnUiThread(() -> {
String ipData = Arrays.toString(HexUtil.formatHexString(data).split("/"));
Log.d(Tag+"OP",ipData);
if (ipData!=null) {
String [] data1 =ipData.split("/");
// first convert it the used it
convertHaxToASCII(data1);
builderList.clear();
setButtonText();
setText();
alarms.checkAlert(builderList.get(9).toString(), DetailBLE.this);
}
if (!builderList.isEmpty())
{
setTitle(builderList.get(1).toString());
setArrowsStatus();
setBatteryImage();
}
});
}
});
}
void stopIndicate(){
BleManager.getInstance().stopIndicate(
bleDevice,
service.getUuid().toString(),
characteristicsList.get(6).getUuid().toString());
}
void convertHaxToASCII(String[] data){ // first convert it then chhange it
builderList.clear();
if (data.length>0.2) {
for (String datum : data) {
if (datum.length() % 2 != 0) {
Toast.makeText(this, "Invalid HaxCode",
Toast.LENGTH_SHORT).show();
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < datum.length(); i = i + 2) {
String s = datum.substring(i, i + 2);
int n = Integer.valueOf(s, 16);
builder.append((char) n);
}
Log.d(Tag + "Builder", builder.toString());
builderList.add(builder);
}
}
}