当前位置: 首页 > 知识库问答 >
问题:

Android BLE接近通知

华良才
2023-03-14

我一直在开发一个与BLE设备交互的应用程序。一切都很好,我可以扫描、连接和使用服务。

我已经阅读了所有的文档,我没有看到任何让开发人员可以选择监听BLE设备的内容。基本上,我想在设备进入BLE设备的范围时触发广播接收器。

我知道我可以不断地扫描它,但电池使用量太高了,我希望即使在我的应用程序没有被使用的时候也能调用它。

是否不支持此功能,或者我是否缺少讨论此功能的文档部分?

共有3个答案

樊宏邈
2023-03-14

我们需要一个广播事件,一旦到达具有特定服务UUID的BLE设备,它就会唤醒我们的应用程序。

您可能知道如何按服务UUID过滤扫描结果,所以我不会深入讨论。关于唤醒:如果你的应用html" target="_blank">程序正在扫描,根据定义它是唤醒的。它可能在前台,也可能不在前台,但它是清醒的。

也许现在有比两年前更好的BLE API可用。

自SDK版本21以来,有一个新的API可用于BLE扫描。据我所知,唯一的区别是您访问API的方式和底层功能(关于功耗等)没有改变。

关于扫描:
扫描确实是电池密集型的。即使是医生也这么说。

虽然强度是相对的。与完全不扫描相比,它是密集的,但它不够密集,会无可救药地耗尽你的电池。毕竟这叫低能量。

另一个答案是建议监视地理Geofence,只有当你知道自己在BLE设备范围内时才进行扫描。虽然这将降低ble扫描的电池消耗,但它将需要GPS的电池电源,否则它无法监测地理Geofence(当然,它可以,使用蜂窝/wifi数据,但这样的话它就不会那么准确)。

根据扫描的时间重要性(例如,如果附近有设备,您必须马上知道吗?或者如果它延迟几秒钟可以吗?)您可以在扫描之间实现暂停。

假设你扫描5秒,暂停5秒,再扫描5秒。这样你几乎可以一直扫描,但只消耗大约一半的电池电量。这些时间间隔可以根据您的情况进行调整。也许你可以扫描3秒并暂停10秒。(请注意,设备广播之间的最大时间为10.24秒)。

我有一个大约有50个用户的应用程序,它在后台以这样的暂停(扫描3秒,暂停3秒,重复)进行全天候扫描,并且没有收到任何关于电池过度使用的投诉。

宋稳
2023-03-14

Android上的BLE扫描相当耗电,而且绝对不是你想一直在后台做的事情。如果您正在使用您知道其位置的固定蓝牙设备(ibeacons)开发后台应用程序,则当您认为自己接近某个设备时,可以使用地理Geofence打开和关闭扫描。如果不小心,土工Geofence也会耗尽电池电量。

如果你不知道蓝牙设备的位置,我想你也可以玩ActivityRecognition的把戏,即只在用户走路时定期扫描,如果用户静止/跑步/骑自行车/在车内,则停止扫描。同样,活动识别功能也需要电池,所以你必须明智。

严成礼
2023-03-14

我最近做了一个项目,从我在你的问题中读到的,它与我做的有些相似。

我知道我可以不断地扫描它,但电池使用量太高了,我希望即使在我的应用程序没有被使用的时候也能调用它。

关于电池问题,一直打开蓝牙会耗电,但同时如果不打开蓝牙,则无法检测BLE。

我做了两个实验,都很有用,但都不同,我不能说哪一个是最好的,但你需要测试它,使其符合你的要求。

>

使用名为Altbeacon的软件包,有很多有用的功能,其中一个功能是自动节省电池,示例代码如下:

public class MyApplication extends Application implements BootstrapNotifier {
    private BackgroundPowerSaver backgroundPowerSaver;

    public void onCreate() {
        super.onCreate();
        // Simply constructing this class and holding a reference to it
        // in your custom Application class
        // enables auto battery saving of about 60%
        backgroundPowerSaver = new BackgroundPowerSaver(this);
    }
}

我们需要一个广播事件,一旦具有特定服务UUID的BLE设备触手可及,它就会唤醒我们的应用程序。也许现在有比两年前更好的BLE API可用。最节能、最精确的方法会得到回报。

你的另一部分,它被称为特定距离的触发动作。我仍然使用Altbeacon来检查信标范围和触发动作。示例代码类似于

@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    for (Beacon beacon : beacons) {
        if (beacon.getDistance() < 5.0) {
            Log.d(TAG, "I see a beacon that is less than 5 meters away.");
            // Perform distance-specific action here
        }
    }
}

也就是说,您还可以获得特定UUID的距离,我基于Altbeacon构建了一个方法,如下所示(查看for循环和if语句内部):

private void startRangeNotifier() {
    Log.i(TAG, "Starting range notifier...");
    beaconManager.setRangeNotifier(new BeaconRangeListener() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

            if (beacons.size() > 0) {
                for (Beacon beacon : beacons) {
                    Log.d(TAG, "uuid's: " + beacon);
                    Log.d(TAG, "uuid id1: " + beacon.getId1());
                    if (beacon.getId1().toString()
                            .equals("b9407f30-f5f8-466e-aff9-25556b57fe6d")) {
                        Log.d(TAG, "uuid id1 distance: " + beacon.getDistance());
                    }
                }

            }
        }
    });

    try {
        beaconManager.startRangingBeaconsInRegion(
                new Region(BEACON_MONITORING_ID, null, null, null));
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

我的日志输出:

D/Main activity:: uuid's: id1: b9407f30-f5f8-466e-aff9-25556b57fe6d id2: 31807 id3: 59251
D/Main activity:: uuid id1: b9407f30-f5f8-466e-aff9-25556b57fe6d
D/Main activity:: uuid id1 distance: 0.2108658568686884

在我的回答中,我想介绍我使用的概念,信标项目通常需要耐心。正如另一个答案所提到的,也可以将这里的解决方案与地理Geofence和活动识别相结合。

注意:由于蓝牙信标的性质,距离是接近而不是绝对的,有时甚至蓝牙信标是1米,它可能会显示2米或0.5米,所以请记住

链接参考:

  • https://altbeacon.github.io/android-beacon-library/distance-triggering.html
 类似资料:
  • 我想在我的Android应用程序中被动地扫描BLE广告商, 但我找不到如何做到这一点。 > < li> 根据蓝牙4.0核心规范,存在被动扫描模式。< br >第6卷:核心系统包[低能耗控制器卷],< br > D部分:4.1被动扫描< br > https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=282159 “设备可

  • 我必须构建一个Android应用程序,用于读取一种设备上的信息,该设备仅在过滤时在扫描时显示(一般扫描不会显示它)。该设备类似于信标,因此它仅通告数据,这些数据在通告上具有我想要的信息(它不可连接)。制造商给我的过滤器是原始数据。即: 0x02010612435542 我不能按名称过滤它,因为设备不会宣传它的名称。我也不能通过来完成,因为应用程序以前不会知道设备的地址(这将是许多此类设备)。 nr

  • 问题内容: 我正在创建一个应用程序,该应用程序使用GPS跟踪用户的位置,将经度和纬度存储在SQLite数据库中,并添加接近警报。 参考-http: //www.javacodegeeks.com/2011/01/android-proximity-alerts- tutorial.html 错误消息 LogCat: 错误代码行: 问题答案: 成员未在您调用的地方初始化或初始化失败。

  • 问题内容: 我想知道是否有可能找到一个最接近的元素的元素 ,是不是 在那里。 例如,如果我们具有[1,3,6,7]值,并且正在寻找最接近4的元素,则它应返回3,因为3是数组中的最大数字,小于4。 我希望这是有道理的,因为英语不是我的母语。 问题答案: 如果数组已排序,则可以在以下位置进行修改的二进制搜索:

  • 本文向大家介绍Android实现接近传感器,包括了Android实现接近传感器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现接近传感器的具体代码,供大家参考,具体内容如下 1.接近传感器检测物体与听筒(手机)的距离,单位是厘米。 一些接近传感器只能返回远和近两个状态,如我的手机魅族E2只能识别到两个距离:0CM(近距离)和5CM(远距离) 因此,接近传感器将最大距

  • 如何找到哪个公式更接近欧拉公式 没有编程 first=e=(11/n)^n 第一个=2.7048138294215285 秒=1/e=(1-1/n)^n 第二=2.7319990264290284 所以第一个更接近欧拉,但我的输出总是给我第二个为什么? 忘了提n是100