diff --git a/app/build.gradle b/app/build.gradle index 64b68ec..601b418 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -226,6 +226,7 @@ dependencies { implementation "androidx.camera:camera-camera2:1.0.2" implementation "androidx.camera:camera-lifecycle:1.0.2" implementation "androidx.camera:camera-view:1.0.0-alpha25" + //蓝牙扫描 implementation 'no.nordicsemi.android.support.v18:scanner:1.6.0' //蓝牙通讯 implementation 'no.nordicsemi.android:ble:2.11.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c16671f..9d670e7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,6 +35,14 @@ + + + + + + diff --git a/app/src/main/java/com/ckkj/water/AppConfig.java b/app/src/main/java/com/ckkj/water/AppConfig.java index 6b9c1e0..22d7c4a 100644 --- a/app/src/main/java/com/ckkj/water/AppConfig.java +++ b/app/src/main/java/com/ckkj/water/AppConfig.java @@ -120,4 +120,7 @@ public class AppConfig { public static String APP_CLIENT_ID = "428a8310cd442757ae699df5d894f051"; public static String APP_USER_TYPE = "app_user"; + //蓝牙设备的uuid + public static String BLUETOOTH_DEVICE_UUID = "1775244d-6b43-439b-877c-060f2d9bed07"; + } diff --git a/app/src/main/java/com/ckkj/water/device/AddDeviceActivity_copy.java b/app/src/main/java/com/ckkj/water/device/AddDeviceActivity_copy.java index c2f6e89..d6b476d 100644 --- a/app/src/main/java/com/ckkj/water/device/AddDeviceActivity_copy.java +++ b/app/src/main/java/com/ckkj/water/device/AddDeviceActivity_copy.java @@ -29,7 +29,9 @@ import com.ckkj.water.BuildConfig; import com.ckkj.water.ConstantUtil; import com.ckkj.water.R; import com.ckkj.water.base.BaseActivity; +import com.ckkj.water.custom.GridSpacingItemDecoration; import com.ckkj.water.databinding.AddDeviceLayoutBinding; +import com.ckkj.water.device.adapter.BleScanDeviceAdapter; import com.ckkj.water.device.mvp.DeviceContract; import com.ckkj.water.device.mvp.DeviceImpl; import com.ckkj.water.device.mvp.DevicePresenter; @@ -72,6 +74,8 @@ public class AddDeviceActivity_copy extends BaseActivity mDeviceList = new ArrayList<>(); @Override public DevicePresenter createPresenter() { @@ -90,6 +94,10 @@ public class AddDeviceActivity_copy extends BaseActivity uuids = - record.getServiceUuids(); - Log.e("TEST", "uuids=" + uuids); - } - - ToastUtil.showShort(mContext, "扫描到: " + deviceName); } @Override @@ -238,7 +242,6 @@ public class AddDeviceActivity_copy extends BaseActivity { + private Context mContext; + public BleScanDeviceAdapter(Context context,int layoutResId, @Nullable List data) { + super(layoutResId, data); + mContext = context; + } + + @Override + protected void convert(BaseViewHolder helper, WaterDeviceEntity item) { + helper.setText(R.id.tv_device_name,item.getDeviceName()); + } +} diff --git a/app/src/main/java/com/ckkj/water/utils/manager/WaterDeviceManager.java b/app/src/main/java/com/ckkj/water/utils/manager/WaterDeviceManager.java new file mode 100644 index 0000000..ec5f7ed --- /dev/null +++ b/app/src/main/java/com/ckkj/water/utils/manager/WaterDeviceManager.java @@ -0,0 +1,92 @@ +package com.ckkj.water.utils.manager; + +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.content.Context; +import android.util.Log; + +import androidx.annotation.NonNull; + +import java.util.Arrays; +import java.util.UUID; + +import no.nordicsemi.android.ble.BleManager; + +/** + * @author fengxiaoyang + * @date 2026/6/3 + * @description 蓝牙设备管理 + */ +public class WaterDeviceManager extends BleManager { + private BluetoothGattCharacteristic writeCharacteristic; + private BluetoothGattCharacteristic notifyCharacteristic; + + public WaterDeviceManager(@NonNull Context context) { + super(context); + } + + @NonNull + @Override + protected BleManagerGattCallback getGattCallback() { + return new DeviceGattCallback(); + } + + private class DeviceGattCallback extends BleManagerGattCallback { + + @Override + protected void initialize() { + + setNotificationCallback(notifyCharacteristic) + .with((device, data) -> { + + byte[] bytes = data.getValue(); + + Log.e("TEST", "收到数据: " + + Arrays.toString(bytes)); + }); + + enableNotifications(notifyCharacteristic) + .enqueue(); + } + + @Override + public boolean isRequiredServiceSupported(@NonNull BluetoothGatt gatt) { + + BluetoothGattService service = + gatt.getService(UUID.fromString( + "0000ffff-0000-1000-8000-00805f9b34fb")); + + if (service == null) { + return false; + } + + writeCharacteristic = + service.getCharacteristic(UUID.fromString( + "0000ff01-0000-1000-8000-00805f9b34fb")); + + notifyCharacteristic = + service.getCharacteristic(UUID.fromString( + "0000ff02-0000-1000-8000-00805f9b34fb")); + + return writeCharacteristic != null + && notifyCharacteristic != null; + } + + @Override + protected void onServicesInvalidated() { + writeCharacteristic = null; + notifyCharacteristic = null; + } + } + + public void send(byte[] data) { + + if (writeCharacteristic == null) { + return; + } + + writeCharacteristic(writeCharacteristic, data) + .enqueue(); + } +} diff --git a/app/src/main/res/layout/add_device_layout.xml b/app/src/main/res/layout/add_device_layout.xml index 29ee08a..77ef5fd 100644 --- a/app/src/main/res/layout/add_device_layout.xml +++ b/app/src/main/res/layout/add_device_layout.xml @@ -1,5 +1,7 @@ + android:src="@drawable/anim_add_device_scan" + android:visibility="visible"/> - + + + + \ No newline at end of file