android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

本文介绍了Android从5.0开始支持的BLE广播功能,允许手机模拟BLE设备进行广播。详细讲解了如何使用BluetoothLeAdvertiser进行广播设置、数据构建,并通过实例展示了广播数据的解析。同时提到了广播数据中的ManufacturerData、ServerUUID以及ServerData的使用场景和注意事项,以及在扫描设备时如何利用特定UUID进行过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 从4.3系统开始可以连接BLE设备,这个大家都知道了。iOS是从7.0版本开始支持BLE。

android 进入5.0时代时,开放了一个新功能,手机可以模拟设备发出BLE广播, 这个新功能其实是 对标于 iOS系统的手机模拟iBeacon设备。


先介绍一下BLE的广播, BLE设备之所以能被手机扫描到,是因为 BLE设备一直在每隔 一段时间广播一次,这个广播里面包含很多数据。

手机扫描BLE设备代码如下:

        public void startScan(){
	        bluetoothAdapter.startLeScan(leScanCallback);
        }

	public void stopScan(){
		bluetoothAdapter.stopLeScan(leScanCallback);
	}
	private LeScanCallback leScanCallback=new LeScanCallback() {
		
		@Override
		public void onLeScan(BluetoothDevice bluetoothdeivce, int rssi, byte[] scandata) {
			//把byte数组转成16进制字符串,方便查看
			Log.e("TAG","scandata:"+ CYUtils.Bytes2HexString(scandata));
		}
	};

ok,这段代码大家在做连接BLE设备进行通讯的时候,已经很熟悉了。其中的 byte数组 scandata就是 BLE设备的广播数据。


那么接下来,我们开始使用 手机1 模拟成BLE设备来发送广播,然后用手机2 来进行扫描查看广播数据 scandata

首先获取 BluetoothAdapter, 熟悉的代码:

BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);

bluetoothAdapter = bluetoothManager.getAdapter();


进行广播的时候需要用到BluetoothLeAdvertiser,进行实例化:


mBluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser();

实例化好之后就可以进行广播数据了,开启广播方法是:



BluetoothLeAdvertiser: 
public void startAdvertising(AdvertiseSettings settings,
            AdvertiseData advertiseData, final AdvertiseCallback callback)

其中, AdvertiseSettings 是广播的一些设置,比如,广播间隔,是否可以连接等等; AdvertiseData 就是广播数据了, AdvertiseCallback是广播回调,会告诉你广播成功还是失败。


先给一段完整广播代码如下:


    public void startAction(View v){
        byte[] broadcastData ={0x34,0x56};
        mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true, 0), createAdvertiseData(broadcastData), mAdvertiseCallback);
    }
    public void stopAction(View v) {
        mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);
    }

    public AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {
        AdvertiseSettings.Builder mSettingsbuilder = new AdvertiseSettings.Builder();
        mSettingsbuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
        mSettingsbuilder.setConnectable(connectable);
        mSettingsbuilder.setTimeout(timeoutMillis);
        AdvertiseSettings mAdvertiseSettings = mSettingsbuilder.build();
        return mAdvertiseSettings;
    }

    public AdvertiseData createAdvertiseData(byte[] data) {
        AdvertiseData.Builder mDataBuilder = new AdvertiseData.Builder();
        mDataBuilder.addManufacturerData(0x01AC, data);
        AdvertiseData mAdvertiseData = mDataBuilder.build();
        return mAdvertiseData;
    }
    private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);

            ToastUtils.showToast(MainActivity.this, "开启广播成功", 2000);
        }

        @Override
        public void onStartFailure(int errorCode) {
            super.onStartFailure(errorCode);
            ToastUtils.showToast(MainActivity.this, "开启广播失败 errorCode:" + errorCode, 2000);
        }
    };


其中,广播数据broadcastData 我暂时直接先定死为2个字节 0x3456,同样在createAdvertiseData里面

也有定死的数据 0x01AC . 开启成功之后

我们使用手机2 来扫描看下广播的数据是什么:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值