连接蓝牙,配网
This commit is contained in:
@@ -138,6 +138,32 @@ public class AddDeviceActivity_copy extends BaseActivity<AddDeviceLayoutBinding,
|
||||
initListener();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化监听g
|
||||
*/
|
||||
private void initListener() {
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.tvScanAdd);
|
||||
setClick(viewBinding.btnBleScan);
|
||||
|
||||
if(bleAdapter != null){
|
||||
bleAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
WaterDeviceEntity device = mDeviceList.get(position);
|
||||
String deviceName = TextUtils.isEmpty(device.getDeviceName()) ?
|
||||
"未知设备" : device.getDeviceName();
|
||||
// 停止扫描
|
||||
stopBleScan();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG,100);
|
||||
bundle.putSerializable("ble_device_entity",mDeviceList.get(position));
|
||||
goTo(mContext, SelectWifiActivity.class,bundle);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始 BLE 扫描
|
||||
*/
|
||||
@@ -192,7 +218,7 @@ public class AddDeviceActivity_copy extends BaseActivity<AddDeviceLayoutBinding,
|
||||
ToastUtil.showShort(mContext, "扫描失败,错误码: " + errorCode);
|
||||
}
|
||||
};
|
||||
scanner.startScan(null, settings, mScanCallback);
|
||||
scanner.startScan(filters, settings, mScanCallback);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -206,148 +232,7 @@ public class AddDeviceActivity_copy extends BaseActivity<AddDeviceLayoutBinding,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接蓝牙设备
|
||||
*/
|
||||
private void connectToDevice(String deviceAddress, String deviceName) {
|
||||
if (waterDeviceManager != null) {
|
||||
// 断开之前的连接
|
||||
waterDeviceManager.disconnect().enqueue();
|
||||
waterDeviceManager.close();
|
||||
}
|
||||
|
||||
// 根据地址获取 BluetoothDevice
|
||||
BluetoothDevice device = bluetoothAdapter.getRemoteDevice(deviceAddress);
|
||||
if (device == null) {
|
||||
ToastUtil.showShort(mContext, "设备无效");
|
||||
return;
|
||||
}
|
||||
|
||||
waterDeviceManager = new WaterDeviceManager(mContext);
|
||||
|
||||
// 设置数据回调
|
||||
waterDeviceManager.setOnDataReceivedListener(bytes -> {
|
||||
Log.e("TEST", "设备响应: " + Arrays.toString(bytes));
|
||||
runOnUiThread(() -> {
|
||||
// TODO: 处理设备返回的数据,比如 WiFi 配置响应
|
||||
handleDeviceResponse(bytes);
|
||||
});
|
||||
});
|
||||
|
||||
// 连接设备
|
||||
waterDeviceManager.connect(device)
|
||||
.retry(3, 100) // 重试3次,间隔100ms
|
||||
.done(bluetoothDevice -> {
|
||||
Log.e("TEST", "连接成功: " + deviceName);
|
||||
runOnUiThread(() -> {
|
||||
ToastUtil.showShort(mContext, "连接成功: " + deviceName);
|
||||
// TODO: 连接成功后,发送 WiFi 配置
|
||||
// sendWifiConfig("SSID", "PASSWORD");
|
||||
});
|
||||
})
|
||||
.fail((bluetoothDevice, status) -> {
|
||||
Log.e("TEST", "连接失败: " + status);
|
||||
runOnUiThread(() -> {
|
||||
ToastUtil.showShort(mContext, "连接失败,请重试");
|
||||
});
|
||||
})
|
||||
.enqueue();
|
||||
|
||||
waterDeviceManager.setConnectionObserver(new ConnectionObserver() {
|
||||
|
||||
@Override
|
||||
public void onDeviceConnecting(@NonNull BluetoothDevice device) {
|
||||
Log.e("TEST", "onDeviceConnecting");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceConnected(@NonNull BluetoothDevice device) {
|
||||
Log.e("TEST", "onDeviceConnected");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceFailedToConnect(@NonNull BluetoothDevice device, int reason) {
|
||||
Log.e("TEST", "onDeviceFailedToConnect");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceReady(@NonNull BluetoothDevice device) {
|
||||
Log.e("TEST", "onDeviceReady");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceDisconnecting(@NonNull BluetoothDevice device) {
|
||||
Log.e("TEST", "onDeviceDisconnecting");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceDisconnected(
|
||||
@NonNull BluetoothDevice device,
|
||||
int reason) {
|
||||
|
||||
Log.e("TEST", "onDeviceDisconnected reason=" + reason);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送 WiFi 配置到设备
|
||||
*/
|
||||
public void sendWifiConfig(String ssid, String password) {
|
||||
if (waterDeviceManager == null || !waterDeviceManager.isBlConnected()) {
|
||||
Log.e("TEST", "设备未连接,无法发送WiFi配置");
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: 根据设备协议组装数据
|
||||
// 示例:假设协议是 [header(1) + ssid_len(1) + ssid(n) + pwd_len(1) + pwd(m)]
|
||||
byte[] ssidBytes = ssid.getBytes();
|
||||
byte[] pwdBytes = password.getBytes();
|
||||
|
||||
byte[] data = new byte[2 + ssidBytes.length + 2 + pwdBytes.length];
|
||||
int index = 0;
|
||||
data[index++] = 0x01; // header
|
||||
data[index++] = (byte) ssidBytes.length;
|
||||
System.arraycopy(ssidBytes, 0, data, index, ssidBytes.length);
|
||||
index += ssidBytes.length;
|
||||
data[index++] = (byte) pwdBytes.length;
|
||||
System.arraycopy(pwdBytes, 0, data, index, pwdBytes.length);
|
||||
|
||||
waterDeviceManager.send(data);
|
||||
Log.e("TEST", "发送WiFi配置: SSID=" + ssid + ", PWD=" + password);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理设备响应数据
|
||||
*/
|
||||
private void handleDeviceResponse(byte[] data) {
|
||||
if (data == null || data.length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: 根据设备协议解析响应数据
|
||||
// 示例:假设响应格式是 [type(1) + status(1) + ...]
|
||||
Log.e("TEST", "处理设备响应: " + Arrays.toString(data));
|
||||
|
||||
if (data.length >= 2) {
|
||||
byte type = data[0];
|
||||
byte status = data[1];
|
||||
|
||||
switch (type) {
|
||||
case 0x01: // WiFi配置响应
|
||||
if (status == 0x00) {
|
||||
ToastUtil.showShort(mContext, "WiFi配置成功");
|
||||
// TODO: 下一步操作
|
||||
} else {
|
||||
ToastUtil.showShort(mContext, "WiFi配置失败,错误码: " + status);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Log.e("TEST", "未知响应类型: " + type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化蓝牙适配器
|
||||
@@ -405,34 +290,6 @@ public class AddDeviceActivity_copy extends BaseActivity<AddDeviceLayoutBinding,
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void initListener() {
|
||||
setClick(viewBinding.includedTitle.imgBack);
|
||||
setClick(viewBinding.tvScanAdd);
|
||||
setClick(viewBinding.btnBleScan);
|
||||
|
||||
if(bleAdapter != null){
|
||||
bleAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
|
||||
WaterDeviceEntity device = mDeviceList.get(position);
|
||||
String deviceName = TextUtils.isEmpty(device.getDeviceName()) ?
|
||||
"未知设备" : device.getDeviceName();
|
||||
String deviceAddress = device.getMacAddress();
|
||||
|
||||
ToastUtil.showShort(mContext, "正在连接: " + deviceName);
|
||||
|
||||
// 停止扫描
|
||||
stopBleScan();
|
||||
|
||||
// 连接设备
|
||||
connectToDevice(deviceAddress, deviceName);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void setClick(View view) {
|
||||
view.setOnClickListener(this::onClick);
|
||||
}
|
||||
@@ -443,12 +300,6 @@ public class AddDeviceActivity_copy extends BaseActivity<AddDeviceLayoutBinding,
|
||||
finish();
|
||||
break;
|
||||
|
||||
// case R.id.img_device_item:
|
||||
// Bundle bundle = new Bundle();
|
||||
// bundle.putInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG,100);
|
||||
// goTo(mContext, SelectWifiActivity.class,bundle);
|
||||
// break;
|
||||
|
||||
case R.id.tv_scan_add:
|
||||
//检测有无相机权限
|
||||
String readPermission = Manifest.permission.CAMERA;
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.core.app.ActivityCompat;
|
||||
@@ -21,6 +22,8 @@ import com.ckkj.water.databinding.DeviceResetWifiBinding;
|
||||
import com.ckkj.water.device.mvp.DeviceContract;
|
||||
import com.ckkj.water.device.mvp.DeviceImpl;
|
||||
import com.ckkj.water.device.mvp.DevicePresenter;
|
||||
import com.ckkj.water.espBle.EspProvisionManager;
|
||||
import com.ckkj.water.espBle.ProvisionCallback;
|
||||
import com.ckkj.water.index.entity.WaterDeviceEntity;
|
||||
import com.ckkj.water.network.BaseBean;
|
||||
import com.ckkj.water.permission.PermissionActivity;
|
||||
@@ -34,6 +37,9 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 配置wifi
|
||||
*/
|
||||
public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, DevicePresenter>
|
||||
implements DeviceContract.DeviceView {
|
||||
|
||||
@@ -45,6 +51,11 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
|
||||
private String mWifiName = "";
|
||||
|
||||
private WaterDeviceEntity mBleDeviceEntity;
|
||||
private EspProvisionManager espProvisionManager;
|
||||
private boolean isBleConnecting = false;
|
||||
private boolean isBleConnected = false;
|
||||
|
||||
@Override
|
||||
public DevicePresenter createPresenter() {
|
||||
return new DevicePresenter(new DeviceImpl());
|
||||
@@ -70,12 +81,22 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
unregisterReceiver(wifiScanReceiver);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (WITCH_FROM_CODE == 100 && espProvisionManager != null) {
|
||||
espProvisionManager.disconnect();
|
||||
espProvisionManager.setCallback(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initData(Bundle savedInstanceState) {
|
||||
super.initData(savedInstanceState);
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
if(bundle != null){
|
||||
WITCH_FROM_CODE = bundle.getInt(ConstantUtil.ACTIVITY_NAVIGATE_FLAG);
|
||||
mBleDeviceEntity = (WaterDeviceEntity) bundle.getSerializable("ble_device_entity");
|
||||
}
|
||||
|
||||
ImmersionBar.with(this)
|
||||
@@ -90,6 +111,10 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
|
||||
initListener();
|
||||
initWifiList();
|
||||
if (WITCH_FROM_CODE == 100) {
|
||||
initEspProvision();
|
||||
connectBleDevice();
|
||||
}
|
||||
}
|
||||
|
||||
private void initWifiList() {
|
||||
@@ -142,7 +167,7 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
return;
|
||||
}
|
||||
if(WITCH_FROM_CODE == 100){
|
||||
goTo(mContext,DeviceConnectActivity.class,null);
|
||||
provisionWifi();
|
||||
}else{
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("wifi_name",mWifiName);
|
||||
@@ -154,6 +179,98 @@ public class SelectWifiActivity extends BaseActivity<DeviceResetWifiBinding, Dev
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置网络
|
||||
*/
|
||||
private void provisionWifi() {
|
||||
if (espProvisionManager == null) {
|
||||
ToastUtil.showShort(mContext, "设备连接未初始化");
|
||||
return;
|
||||
}
|
||||
if (!isBleConnected) {
|
||||
if (!isBleConnecting) {
|
||||
connectBleDevice();
|
||||
}
|
||||
ToastUtil.showShort(mContext, "设备连接中,请稍后再试");
|
||||
return;
|
||||
}
|
||||
espProvisionManager.provisionWifi(mWifiName, viewBinding.etInputPsd.getText().toString());
|
||||
// goTo(mContext,DeviceConnectActivity.class,null);
|
||||
}
|
||||
|
||||
private void initEspProvision() {
|
||||
espProvisionManager = EspProvisionManager.init(mContext).setCallback(new ProvisionCallback() {
|
||||
@Override
|
||||
public void onConnecting() {
|
||||
isBleConnecting = true;
|
||||
isBleConnected = false;
|
||||
Log.i("TEST","onConnecting");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnected() {
|
||||
isBleConnecting = false;
|
||||
isBleConnected = true;
|
||||
Log.i("TEST","onConnected设备连接成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProvisioning(int progress) {
|
||||
Log.i("TEST","WIFI连接进度 == " + progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(String deviceName, String deviceType) {
|
||||
Log.i("TEST","deviceName:" + deviceName + "连接成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailed(int errorCode, String message) {
|
||||
isBleConnecting = false;
|
||||
if (errorCode != 0) {
|
||||
isBleConnected = espProvisionManager != null && espProvisionManager.isConnected();
|
||||
}
|
||||
Log.i("TEST","errorCode == " + errorCode + " message == " + message);
|
||||
ToastUtil.showShort(mContext, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisconnected() {
|
||||
isBleConnecting = false;
|
||||
isBleConnected = false;
|
||||
Log.i("TEST","onDisconnected");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWifiListReceived(String[] wifiList) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWifiListFailed(String message) {
|
||||
Log.i("TEST","onWifiListFailed-Msg==" + message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProvisioningRejected() {
|
||||
Log.i("TEST","onProvisioningRejected");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接设备
|
||||
*/
|
||||
private void connectBleDevice() {
|
||||
if (WITCH_FROM_CODE != 100 || mBleDeviceEntity == null || espProvisionManager == null) {
|
||||
return;
|
||||
}
|
||||
if (isBleConnected || isBleConnecting) {
|
||||
return;
|
||||
}
|
||||
espProvisionManager.connect(mBleDeviceEntity.getMacAddress(), mBleDeviceEntity.getDeviceName());
|
||||
}
|
||||
|
||||
private void scanWifi() {
|
||||
showLoadingDialog();
|
||||
viewBinding.tvNext.setVisibility(View.GONE);
|
||||
|
||||
Reference in New Issue
Block a user