【Android】蓝牙连接使用

本文实现蓝牙连接,使用的GitHub开源库实现,调用封装好的API。

1.依赖
implementation 'com.vise.xiaoyaoyou:baseble:2.0.6'
2.权限申请
//android 6.0+以上需要进行动态权限申请
    <uses-permission android:name="android.permission.BLUETOOTH" /> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
3.实现
public class BLEDeviceManager {

    private static final String TAG = "BLEDevice";
    private static volatile BLEDeviceManager instance;
    private DeviceMirrorPool mDeviceMirrorPool;
    private Context mContext;
    private BluetoothLeDevice bluetoothLeDevice;

    private DetStatus detStatus;

    private BLEDeviceManager() {
    }

    /**
     * 单例模式 确保全局只有一个实例
     */
    public static BLEDeviceManager getInstance() {
        if (instance == null) {
            synchronized (BLEDeviceManager.class) {
                if (instance == null) {
                    instance = new BLEDeviceManager();
                }
            }
        }
        return instance;
    }

    /**
     * 蓝牙管理初始化
     *
     * @param context 环境
     */
    public void init(Context context) {
        if (context == null) {
            return;
        }
        mContext = context;
        //蓝牙相关配置修改
        ViseBle.config()
                .setScanTimeout(-1)//扫描超时时间,这里设置为永久扫描
                .setConnectTimeout(10 * 1000)//连接超时时间
                .setOperateTimeout(5 * 1000)//设置数据操作超时时间
                .setConnectRetryCount(3)//设置连接失败重试次数
                .setConnectRetryInterval(1000)//设置连接失败重试间隔时间
                .setOperateRetryCount(3)//设置数据操作失败重试次数
                .setOperateRetryInterval(1000)//设置数据操作失败重试间隔时间
                .setMaxConnectCount(3);//设置最大连接设备数量
        //蓝牙信息初始化,全局唯一,必须在应用初始化时调用
        ViseBle.getInstance().init(context.getApplicationContext());
        mDeviceMirrorPool = ViseBle.getInstance().getDeviceMirrorPool();
        detStatus = new DetStatus();
    }

    /**
     * 连接设备
     *
     * @param bleMAC 设备mac地址
     */
    public void connect(String bleMAC) {
        ViseBle.getInstance().connectByMac(bleMAC, connectCallback);
    }

    /**
     * 断开指定设备
     *
     * @param bluetoothLeDevice 设备名
     */
    public void disconnect(BluetoothLeDevice bluetoothLeDevice) {
        ViseBle.getInstance().disconnect(bluetoothLeDevice);
    }

    /**
     * 判断设备是否连接
     *
     * @param bluetoothLeDevice 设备名
     */
    public boolean isConnected(BluetoothLeDevice bluetoothLeDevice) {
        return ViseBle.getInstance().isConnect(bluetoothLeDevice);
    }

    /**
     * 连接回调
     */
    private IConnectCallback connectCallback = new IConnectCallback() {

        @Override
        public void onConnectSuccess(final DeviceMirror deviceMirror) {
            Log.e(TAG, "连接成功!");
            bluetoothLeDevice = deviceMirror.getBluetoothLeDevice();
            Log.e(TAG, "地址:" + bluetoothLeDevice.getAddress());

            List<BluetoothGattService> gattServices = deviceMirror.getBluetoothGatt().getServices();
            UUID serviceUUID = null;
            UUID characterUUID = null;
            UUID descUUID = null;
            if (gattServices.size() > 0) {
                Iterator<BluetoothGattService> serviceIterator = gattServices.iterator();
                label36:
                while (serviceIterator.hasNext()) {
                    BluetoothGattService gattService = serviceIterator.next();
                    UUID sUUID = gattService.getUuid();
                    if (sUUID.toString().contains("0000ffe0")) {
                        List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
                        if (gattCharacteristics.size() > 0) {
                            characterUUID = gattCharacteristics.get(0).getUuid();
                            List<BluetoothGattDescriptor> gattDescriptors = gattCharacteristics.get(0).getDescriptors();

                            for (BluetoothGattDescriptor bgd : gattDescriptors) {
                                UUID dUUID = bgd.getUuid();
                                if (dUUID.toString().contains("00002902")) {
                                    serviceUUID = sUUID;
                                    descUUID = dUUID;
                                    break label36;
                                }
                            }
                        }
                        break;
                    }
                }
            }
            bindChannel(bluetoothLeDevice,
                    PropertyType.PROPERTY_NOTIFY,
                    serviceUUID,
                    characterUUID,
                    descUUID);
        }

        @Override
        public void onConnectFailure(BleException exception) {
            Log.e(TAG, "连接失败!");

        }

        @Override
        public void onDisconnect(boolean isActive) {
            Log.e(TAG, "已断开!");
           

        }
    };

    /**
     * 绑定数据通道,用于接收数据
     *
     * @param bluetoothLeDevice  设备名
     * @param propertyType       绑定方式
     * @param serviceUUID        服务UUID
     * @param characteristicUUID 特征UUID
     * @param descriptorUUID     描述UUID
     */
    public void bindChannel(BluetoothLeDevice bluetoothLeDevice, PropertyType propertyType, UUID serviceUUID,
                            UUID characteristicUUID, UUID descriptorUUID) {
        DeviceMirror deviceMirror = mDeviceMirrorPool.getDeviceMirror(bluetoothLeDevice);
        if (deviceMirror != null) {
            BluetoothGattChannel bluetoothGattChannel = new BluetoothGattChannel.Builder()
                    .setBluetoothGatt(deviceMirror.getBluetoothGatt())
                    .setPropertyType(propertyType)
                    .setServiceUUID(serviceUUID)
                    .setCharacteristicUUID(characteristicUUID)
                    .setDescriptorUUID(descriptorUUID)
                    .builder();
            deviceMirror.bindChannel(bleCallback, bluetoothGattChannel);
            deviceMirror.registerNotify(false);
        }
    }

    /**
     * 数据回调
     */
    private IBleCallback bleCallback = new IBleCallback() {
        @Override
        public void onSuccess(final byte[] data, BluetoothGattChannel bluetoothGattInfo, BluetoothLeDevice bluetoothLeDevice) {
            Log.e(TAG, "数据回调成功");
            DeviceMirror deviceMirror = mDeviceMirrorPool.getDeviceMirror(bluetoothLeDevice);
            deviceMirror.setNotifyListener(bluetoothGattInfo.getGattInfoKey(), receiveCallback);
        }

        @Override
        public void onFailure(BleException exception) {
            Log.e(TAG, "数据回调失败");
            
        }
    };

    /**
     * 接收数据回调
     */
    private IBleCallback receiveCallback = new IBleCallback() {
        @Override
        public void onSuccess(final byte[] data, BluetoothGattChannel bluetoothGattInfo, BluetoothLeDevice bluetoothLeDevice) {
            if (data == null) {
                return;
            }
            Log.e(TAG, "处理数据");
            //此时进行获取数据的处理
           
        }

        @Override
        public void onFailure(BleException exception) {
            if (exception == null) {
                return;
            }
            Log.e(TAG, "数据接收失败");
          
        }
    };

    /**
     * 断开连接
     */
    public void destroy() {
        if (isConnected(bluetoothLeDevice)) {
            disconnect(bluetoothLeDevice);
        }
    }
}

4.调用
//蓝牙连接
BLEDeviceManager.getInstance().init(this);
BLEDeviceManager.getInstance().connect("BA:7C:9B:23:65:00");
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
A:Android蓝牙连接需要以下步骤: 1. 获取蓝牙适配器 首先要获取蓝牙适配器BluetoothAdapter,可以使用以下代码: BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 2. 打开蓝牙 如果蓝牙没有被打开,需要请求用户授权打开蓝牙。可以使用以下代码: if(!bluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } 3. 搜索蓝牙设备 要搜索蓝牙设备,我们需要注册一个广播接收器,接收系统发送的蓝牙广播。可以使用以下代码: private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 这里可以获取到搜索到的蓝牙设备 } } }; IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(bluetoothReceiver, filter); bluetoothAdapter.startDiscovery(); 4. 连接蓝牙设备 要连接蓝牙设备,我们需要获取设备的地址,然后通过BluetoothDevice对象建立蓝牙连接。可以使用以下代码: BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); 5. 发送和接收数据 连接成功后,可以通过socket获取输入输出流来发送和接收数据。可以使用以下代码: InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值