首页 文章

使用AltBeacon库查找iBeacon

提问于
浏览
0

我是一名法国学生,我正在学习Android语言 . 我的朋友和我必须创建一个基于iBeacon技术的Android应用程序 . 我几天前发现了AltBeacon库,我发现它很棒,但我有一些问题要问 .

首先,你必须明白我是编程的新手,我的问题将是你的白痴 . 但是我真的需要帮助;)

Android提供了Bluetooth.LE Api,我明白我可以使用startLeScan()方法来获取BluetoothDevice . 但是,如果我想使用AltBeacon库,这是允许我们扫描iBeacon设备并获得Beacon对象的等效方法?

另一个问题,如果我使用startLeScan()并获得一个BluetoothDevice,我怎样才能将它转换为Beacon才能使用AltBeacon方法?

我很抱歉我的英语错误,我希望我的问题是可以理解的 . 再见

3 回答

  • 1

    您可以轻松使用Android Beacon Library扫描信标并使用"Ranging APIs"返回结果,如下所述:

    http://altbeacon.github.io/android-beacon-library/samples.html

    如果要直接调用 startLeScan() 并使用库代码将结果转换为信标对象,可以在扫描回调中调用以下方法:

    Beacon beacon = beaconParser.fromScanData(scanData, rssi, bluetoothDevice)

    但是,如果使用专有信标格式(如来自Apple),则需要使用正确的布局构造 BeaconParser . 这是专有信息,但您可以进行Google搜索,找出构建专有布局 BeaconParser 的正确方法 .

  • 1

    我认为nv-bluetooth是从广告包中提取iBeacon的最简单方法 . 下面是onLeScan方法的示例实现 .

    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
    {
        // Parse the payload of the advertising packet.
        List<ADStructure> structures =
            ADPayloadParser.getInstance().parse(scanRecord);
    
        // For each AD structure contained in the advertising packet.
        for (ADStructure structure : structures)
        {
            if (structure instanceof IBeacon)
            {
                // iBeacon was found.
                IBeacon iBeacon = (IBeacon)structure;
    
                // Proximity UUID, major number, minor number and power.
                UUID uuid = iBeacon.getUUID();
                int major = iBeacon.getMajor();
                int minor = iBeacon.getMinor();
                int power = iBeacon.getPower();
    
                ........
    

    有关详细信息,请参阅“iBeacon as a kind of AD structures” .

  • 1

    这是我们用来检测iBeacons并使用AltBeacon lib在Android服务中获取信标对象的方法 .

    设置BeaconManager

    BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.setForegroundScanPeriod(5100);
    beaconManager.setForegroundBetweenScanPeriod(2000);
    beaconManager.setBackgroundScanPeriod(5100);
    beaconManager.setBackgroundBetweenScanPeriod(2000);
    
    //Parse IBeacon structure
    beaconManager.getBeaconParsers().add(new BeaconParser().
                    setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    beaconManager.bind(this);
    

    开始测量信标

    private void startBeaconRangeFinderService() {
            beaconManager.setRangeNotifier(new RangeNotifier() {
    
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, org.altbeacon.beacon.Region region) {
                try {
                    if (beacons.size() > 0) {
                        for (Beacon b : beacons) {
                            processYourBeaconInThisMethod(b);
                        }
                    }
                } catch (Exception ex) {
                    Log.e(TAG_BEACON_ACTIVITY, "Error was thrown: " + ex.getMessage());
                }
            }
        });
        try {
            beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {
            Log.e(TAG_BEACON_ACTIVITY, "Error was thrown: " + e.getMessage());
        }
    }
    

相关问题