蓝牙实现签到功能(中央与周边)
16lz
2021-01-26
谁做server(中心),谁做client(周边),则取决于具体数据传输的情况。
1、如果活动追踪的BLE设备需要向 Android设备传输数据,则BLE设备自然成为了中心端(server);
2、如果活动追踪的BLE设备需要从Android设备获取更新信息,则 Android设备作为中心端可能更合适。
由于搜索需要尽量减少功耗,因此在实际使用时需要注意:
1、当找到对应的设备后,立即停止扫描;
2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描, 消耗电量。
普通蓝牙和BLE设备是完全独立的,不能同时搜索得到
连接设备后会得到多个服务(Service),每个服务下会对应多个特征值(Characteristic)
中央设备扫描寻求广播,外围设备发出广播
周边设备同一时刻只能被一个中心设备连,而中心设备可以同时连多个周边设备
5.0以上的手机能够当主办方也能够当参与者
5.0以下手机只能够当参与者
发布服务在API 21以上才能 (5.0以上)
查找设备4.3以上都可以。mAdapter.getBluetoothLeScanner().startScan()
mAdapter.startLeScan(mLeScanCallback);
5.0以上手机可以是主办方也可以是参与者 (可以发布服务也可以扫描设备)
5.0以下手机只能是参与者(只能扫描设备)
综上可见:主办方是发布服务,并且查找设备
参与者是查找设备,并且连接
- 开启蓝牙
BluetoothManager manager = (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mAdapter = manager.getAdapter(); if (mAdapter == null || !mAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 1); return; }
- 发布特定UUID的服务
private void publish(String UUID) { //发布UUID if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { BluetoothManager manager = (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mAdapter = manager.getAdapter(); BluetoothGattCharacteristic character = new BluetoothGattCharacteristic( java.util.UUID.fromString(UUID), BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ); BluetoothGattService service = new BluetoothGattService( java.util.UUID.fromString(UUID), BluetoothGattService.SERVICE_TYPE_PRIMARY); service.addCharacteristic(character); BluetoothGattServer server = manager.openGattServer(getActivity(), new BluetoothGattServerCallback() { @Override public void onConnectionStateChange(BluetoothDevice device, int status, int newState) { super.onConnectionStateChange(device, status, newState); } }); BluetoothLeAdvertiser advertiser = mAdapter.getBluetoothLeAdvertiser(); server.addService(service); AdvertiseData data = new AdvertiseData.Builder() .addServiceUuid(ParcelUuid.fromString(UUID)).build(); AdvertiseSettings settings = new AdvertiseSettings.Builder().setConnectable(true).build(); advertiser.startAdvertising(settings, data, new AdvertiseCallback() { @Override public void onStartSuccess(AdvertiseSettings settingsInEffect) { super.onStartSuccess(settingsInEffect); Log.i("ysc","服务发布成功"); } }); } }
- 搜索特定UUID的服务
//搜索 活动 private void search(String uuid) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { BluetoothManager manager = (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE); final BluetoothAdapter mAdapter = manager.getAdapter(); List bleScanFilters = new ArrayList<>(); bleScanFilters.add( new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(uuid)).build()); ScanSettings bleScanSettings = new ScanSettings.Builder().build(); mAdapter.getBluetoothLeScanner().startScan(bleScanFilters,bleScanSettings,new ScanCallback() { @Override public void onBatchScanResults(List results) { super.onBatchScanResults(results); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onScanResult(int callbackType, ScanResult re) { super.onScanResult(callbackType, re); } @Override public void onScanFailed(int errorCode) { super.onScanFailed(errorCode); } }); } }
更多相关文章
- Android(安卓)C2DM学习——客户端代码开发
- Google 终于要让 20 亿 Android(安卓)设备能玩上高性能的 AR 了
- 使用Android辅助服务AccessibilityService实现的微信自动抢红包
- 高仿android 版微信(服务端,客户端都有)
- Android设备使用USB的硬件接口
- 移动广告商的最爱——iPad
- 移动大变局下的抉择—移动开发者大会刊首语
- 调查显示Android和iOS设备正慢慢侵蚀PC市场
- Android的音视频处理