From b2340ac4ce1c9ea2070c0e7fb72a03fb2b2500ad Mon Sep 17 00:00:00 2001
From: wjc <1243177876@qq.com>
Date: 星期四, 19 三月 2026 15:27:32 +0800
Subject: [PATCH] 2026年03月19日15:27:21 蓝牙开发中
---
app/src/main/java/com/hdl/photovoltaic/utils/BleWifiConfiguratorUtils.java | 132 +++++++++++++++++++++----------------------
1 files changed, 64 insertions(+), 68 deletions(-)
diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/BleWifiConfiguratorUtils.java b/app/src/main/java/com/hdl/photovoltaic/utils/BleWifiConfiguratorUtils.java
index f23abd4..3b9e8a4 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/BleWifiConfiguratorUtils.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/BleWifiConfiguratorUtils.java
@@ -46,28 +46,21 @@
public class BleWifiConfiguratorUtils {
private static final String TAG = "BleWifiConfigurator";
-
// 榛樿鐨� UUID锛堣澶囩闇�瑕佸畾涔変互涓嬫湇鍔″拰鐗瑰緛锛�
//杩欐槸涓绘湇鍔★紝鍖呭惈鎵�鏈夐厤缃戠浉鍏崇殑鐗瑰緛銆�
- public static final UUID DEFAULT_SERVICE_UUID = UUID.fromString("0000fff0-0000-1000-8000-00805f9b34fb");
+ public static final UUID DEFAULT_SERVICE_UUID = UUID.fromString("000000ff-0000-1000-8000-00805f9b34fb");
//鐗瑰緛鍊� 1: 0000fff1-0000-1000-8000-00805f9b34fb (SSID)
//鐢ㄩ�旓細鍐欏叆 Wi-Fi 鐨� SSID 鍚嶇О
//灞炴�э細Write (鍙啓)
//鏁版嵁绫诲瀷锛歎TF-8 瀛楃涓�
//绀轰緥锛�"MyWiFi_5G"
- public static final UUID DEFAULT_SSID_CHAR_UUID = UUID.fromString("0000fff1-0000-1000-8000-00805f9b34fb");
- //鐗瑰緛鍊� 2: 0000fff2-0000-1000-8000-00805f9b34fb (瀵嗙爜)
- // 鐢ㄩ�旓細鍐欏叆 Wi-Fi 瀵嗙爜
- //灞炴�э細Write (鍙啓)
- //鏁版嵁绫诲瀷锛歎TF-8 瀛楃涓�
- //绀轰緥锛�"password123"
- public static final UUID DEFAULT_PWD_CHAR_UUID = UUID.fromString("0000fff2-0000-1000-8000-00805f9b34fb");
+ public static final UUID DEFAULT_CHAR_UUID = UUID.fromString("0000ff01-0000-1000-8000-00805f9b34fb");
//鐗瑰緛鍊� 3: 0000fff3-0000-1000-8000-00805f9b34fb (閫氱煡锛屽彲閫�)
//鐢ㄩ�旓細鎺ユ敹璁惧绔殑鍝嶅簲娑堟伅
//灞炴�э細Notify (閫氱煡)
//鏁版嵁绫诲瀷锛歎TF-8 瀛楃涓�
//绀轰緥鍝嶅簲锛�"SUCCESS", "FAIL: Invalid SSID"
- public static final UUID DEFAULT_NOTIFY_CHAR_UUID = UUID.fromString("0000fff3-0000-1000-8000-00805f9b34fb"); // 鍙�夛紝鐢ㄤ簬鎺ユ敹璁惧鍝嶅簲
+ public static final UUID DEFAULT_NOTIFY_CHAR_UUID = UUID.fromString("0000ff01-0000-1000-8000-00805f9b34fb"); // 鍙�夛紝鐢ㄤ簬鎺ユ敹璁惧鍝嶅簲
// 涓婁笅鏂�
private Context context;
@@ -79,14 +72,12 @@
// GATT 鐩稿叧
private BluetoothGatt bluetoothGatt;
private BluetoothGattService targetService;
- private BluetoothGattCharacteristic ssidCharacteristic;
- private BluetoothGattCharacteristic pwdCharacteristic;
+ private BluetoothGattCharacteristic characteristic;
private BluetoothGattCharacteristic notifyCharacteristic; // 鍙��
// 鑷畾涔� UUID锛堝厑璁歌皟鐢ㄨ�呬慨鏀癸級
private UUID serviceUuid = DEFAULT_SERVICE_UUID;
- private UUID ssidCharUuid = DEFAULT_SSID_CHAR_UUID;
- private UUID pwdCharUuid = DEFAULT_PWD_CHAR_UUID;
+ private UUID charUuid = DEFAULT_CHAR_UUID;
private UUID notifyCharUuid = DEFAULT_NOTIFY_CHAR_UUID;
// 鍥炶皟鎺ュ彛
@@ -97,9 +88,7 @@
// 鍐呴儴鐘舵��
private boolean isScanning = false;
private boolean isConnected = false;
- private int writeState = 0; // 0: idle, 1: writing ssid, 2: writing pwd
- private String ssidToWrite;
- private String pwdToWrite;
+ private String dataToWrite; // 寰呭啓鍏ョ殑鏁版嵁
// 鐢ㄤ簬灏� BLE 鍥炶皟鎶涘埌涓荤嚎绋�
private final Handler callbackHandler = new Handler(Looper.getMainLooper());
@@ -126,17 +115,10 @@
}
/**
- * 璁剧疆鑷畾涔� SSID 鐗瑰緛 UUID锛堝彲閫夛級
+ * 璁剧疆鑷畾涔夌壒寰� UUID锛堝彲閫夛級
*/
- public void setSsidCharUuid(UUID ssidCharUuid) {
- this.ssidCharUuid = ssidCharUuid;
- }
-
- /**
- * 璁剧疆鑷畾涔夊瘑鐮佺壒寰� UUID锛堝彲閫夛級
- */
- public void setPwdCharUuid(UUID pwdCharUuid) {
- this.pwdCharUuid = pwdCharUuid;
+ public void setCharUuid(UUID charUuid) {
+ this.charUuid = charUuid;
}
/**
@@ -144,6 +126,13 @@
*/
public void setNotifyCharUuid(UUID notifyCharUuid) {
this.notifyCharUuid = notifyCharUuid;
+ }
+
+ /**
+ * 妫�鏌ヨ摑鐗欒繛鎺ョ姸鎬�
+ */
+ public boolean getBluetoothStatus() {
+ return this.isConnected;
}
// ==================== 鏉冮檺妫�鏌� ====================
@@ -156,6 +145,7 @@
public List<String> getMissingPermissions() {
List<String> missing = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ //鍦ㄥ簲鐢ㄩ噷--鏉冮檺鍚嶇О--闄勮繎鐨勮澶�
if (context.checkSelfPermission(android.Manifest.permission.BLUETOOTH_SCAN) != android.content.pm.PackageManager.PERMISSION_GRANTED) {
missing.add(android.Manifest.permission.BLUETOOTH_SCAN);
Log.d(TAG, "No Permissions: android.Manifest.permission.BLUETOOTH_SCAN");
@@ -225,7 +215,7 @@
isScanning = true;
Log.d(TAG, "BLE scan started");
} catch (Exception e) {
-
+ Log.d(TAG, "BLE scan fail");
}
}
@@ -249,6 +239,29 @@
@Override
public void onScanResult(int callbackType, ScanResult result) {
BluetoothDevice device = result.getDevice();
+// // 鍏抽敭锛氳幏鍙栬澶囩殑钃濈墮绫诲瀷
+// int bluetoothType = device.getType();
+// switch (bluetoothType) {
+// case BluetoothDevice.DEVICE_TYPE_CLASSIC:
+// Log.d(TAG, "馃摓 缁忓吀钃濈墮璁惧锛�" + device.getName());
+// // 渚嬪锛氳摑鐗欒�虫満銆佽溅杞介煶鍝�
+// break;
+//
+// case BluetoothDevice.DEVICE_TYPE_LE:
+// Log.d(TAG, "馃挕 浣庡姛鑰楄摑鐗欒澶囷細" + device.getName());
+// // 渚嬪锛氭墜鐜�佹櫤鑳界伅銆佷綘鐨� HDL 璁惧
+// break;
+//
+// case BluetoothDevice.DEVICE_TYPE_DUAL:
+// Log.d(TAG, "馃攧 鍙屾ā璁惧锛堟敮鎸佷袱绉嶏級锛�" + device.getName());
+// // 渚嬪锛氶珮绔摑鐗欒�虫満
+// break;
+//
+// case BluetoothDevice.DEVICE_TYPE_UNKNOWN:
+// Log.d(TAG, "鉂� 鏈煡绫诲瀷");
+// break;
+// }
+
Log.d("===", "onDeviceFound: " + Objects.requireNonNull(result.getScanRecord()).getDeviceName());
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
@@ -266,7 +279,7 @@
int rssi = result.getRssi();
byte[] scanRecord = result.getScanRecord() != null ? result.getScanRecord().getBytes() : null;
if (scanListener != null) {
- callbackHandler.post(() -> scanListener.onDeviceFound(device, rssi, scanRecord));
+ callbackHandler.post(() -> scanListener.onDeviceFound(device, rssi, scanRecord, result));
}
}
@@ -293,7 +306,7 @@
// ==================== 杩炴帴鐩稿叧 ====================
/**
- * 杩炴帴鎸囧畾鐨� BLE 璁惧(绯荤粺榛樿杩炴帴瓒呮椂30绉� )
+ * 杩炴帴鎸囧畾鐨� BLE 璁惧(绯荤粺榛樿杩炴帴瓒呮椂30绉�)
*
* @param deviceAddress 鐩爣璁惧BluetoothDevice
* @param listener 杩炴帴鐘舵�佸洖璋�
@@ -309,7 +322,9 @@
callbackHandler.post(() -> this.connectListener.onConnectionFailed("No permissions")); // 娌℃湁鏉冮檺
return;
}
+
if (bluetoothGatt != null) {
+ bluetoothGatt.disconnect(); // 鍏堟柇寮�杩炴帴
bluetoothGatt.close();
bluetoothGatt = null;
}
@@ -340,8 +355,7 @@
}
isConnected = false;
targetService = null;
- ssidCharacteristic = null;
- pwdCharacteristic = null;
+ characteristic = null;
notifyCharacteristic = null;
}
@@ -371,15 +385,14 @@
notifyConnectionFailed("Service not found");
return;
}
- ssidCharacteristic = targetService.getCharacteristic(ssidCharUuid);
- pwdCharacteristic = targetService.getCharacteristic(pwdCharUuid);
+ characteristic = targetService.getCharacteristic(charUuid);
notifyCharacteristic = targetService.getCharacteristic(notifyCharUuid);
- if (ssidCharacteristic == null || pwdCharacteristic == null) {
+ if (characteristic == null) {
Log.e(TAG, "Required characteristics not found");
notifyConnectionFailed("Characteristics not found");
return;
}
-
+ Log.e(TAG, "Required characteristics find");
// 濡傛灉鏀寔閫氱煡锛屽彲浠ュ紑鍚�氱煡锛堝彲閫夛級
if (notifyCharacteristic != null) {
enableNotification(notifyCharacteristic);
@@ -401,25 +414,16 @@
boolean success = status == BluetoothGatt.GATT_SUCCESS;
if (!success) {
Log.e(TAG, "Write failed, status: " + status);
- writeState = 0;
if (writeListener != null) {
callbackHandler.post(() -> writeListener.onWriteFailed(status));
}
return;
}
- if (writeState == 1 && characteristic.getUuid().equals(ssidCharUuid)) {
- // SSID 鍐欏叆鎴愬姛锛屽紑濮嬪啓瀵嗙爜
- writeState = 2;
+ if (characteristic.getUuid().equals(charUuid)) {
+ //鍐欏叆鎴愬姛
if (writeListener != null) {
- callbackHandler.post(() -> writeListener.onSsidWriteSuccess());
- }
- writeCharacteristic(pwdCharacteristic, pwdToWrite);
- } else if (writeState == 2 && characteristic.getUuid().equals(pwdCharUuid)) {
- // 瀵嗙爜鍐欏叆鎴愬姛
- writeState = 0;
- if (writeListener != null) {
- callbackHandler.post(() -> writeListener.onPasswordWriteSuccess());
+ callbackHandler.post(() -> writeListener.onWriteSuccess());
callbackHandler.post(() -> writeListener.onWriteComplete(true));
}
}
@@ -446,6 +450,7 @@
// }
// }
}
+
};
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
@@ -468,6 +473,7 @@
// 绗� 4 姝ワ細鍐欏叆鎻忚堪绗﹀埌璁惧
//鈫� 鍙湁鍐欏叆鎴愬姛鍚庯紝鍛婅瘔璁惧绔紝璁惧鎵嶄細寮�濮嬪彂閫侀�氱煡锛�
bluetoothGatt.writeDescriptor(descriptor);
+ Log.e(TAG, "writeDescriptor success");
}
}
}
@@ -482,27 +488,22 @@
// ==================== 鍐欏叆鍑瘉 ====================
/**
- * 鍐欏叆 Wi-Fi SSID 鍜屽瘑鐮侊紙蹇呴』鍦ㄨ繛鎺ユ垚鍔熷悗璋冪敤锛�
+ * 鍐欏叆鏁版嵁锛堝繀椤诲湪杩炴帴鎴愬姛鍚庤皟鐢級
*
- * @param ssid Wi-Fi SSID
- * @param password Wi-Fi 瀵嗙爜
+ * @param data 鏁版嵁
* @param listener 鍐欏叆缁撴灉鍥炶皟
*/
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
- public void writeCredentials(String ssid, String password, WriteListener listener) {
+ public void writeCredentials(String data, WriteListener listener) {
this.writeListener = listener;
- if (!isConnected || ssidCharacteristic == null || pwdCharacteristic == null) {
+ if (!isConnected || characteristic == null) {
if (listener != null) {
callbackHandler.post(() -> listener.onWriteFailed(-1)); // 鑷畾涔夐敊璇爜
}
return;
}
- this.ssidToWrite = ssid;
- this.pwdToWrite = password;
-
- // 寮�濮嬪啓 SSID
- writeState = 1;
- writeCharacteristic(ssidCharacteristic, ssid);
+ // 寮�濮嬪啓
+ writeCharacteristic(characteristic, data);
}
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
@@ -521,7 +522,7 @@
/**
* 妫�鏌ヨ摑鐗欐槸鍚﹀紑鍚�
*/
- private boolean checkBluetoothEnabled() {
+ public boolean checkBluetoothEnabled() {
return bluetoothAdapter != null && bluetoothAdapter.isEnabled();
}
@@ -547,7 +548,7 @@
/**
* 鍙戠幇璁惧锛堝彲鑳藉娆″洖璋冿級
*/
- void onDeviceFound(BluetoothDevice device, int rssi, byte[] scanRecord);
+ void onDeviceFound(BluetoothDevice device, int rssi, byte[] scanRecord, ScanResult scanResult);
/**
* 鎵弿澶辫触
@@ -574,14 +575,9 @@
public interface WriteListener {
/**
- * SSID 鍐欏叆鎴愬姛
+ * 鍐欏叆鎴愬姛
*/
- void onSsidWriteSuccess();
-
- /**
- * 瀵嗙爜鍐欏叆鎴愬姛
- */
- void onPasswordWriteSuccess();
+ void onWriteSuccess();
/**
* 鍏ㄩ儴鍐欏叆瀹屾垚锛堟垚鍔熶负 true锛�
--
Gitblit v1.8.0