如何从信标获取 id 或 major 或 minor?

How to get id or major or minor from a beacon?

此代码检测到信标,但我无法从中获取 ID 或主要或次要。我尝试使用 beacon.id1() 函数,但它总是 returns null。 我从 3 天开始就尝试实现这个,但我无法弄清楚我是信标技术的新手。我想从信标中获取一个 id。 此代码检测到信标,但我无法从中获取 ID 或主要或次要。我尝试使用 beacon.id1() 函数,但它总是 returns null。 我从 3 天开始就尝试实现这个,但我无法弄清楚我是信标技术的新手。我想从信标中获取一个 id。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    beaconManager = BeaconManager.getInstanceForApplication(this);

     beaconManager.getBeaconParsers().add(new BeaconParser().
           setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));

    beaconManager.bind( this);


    ToggleButton toggle = (ToggleButton) findViewById(R.id.togglebutton);
    toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                // The toggle is enabled
                Intent eintent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                int intVal=1;
                startActivityForResult(eintent, intVal);
            } else {
                // The toggle is disabled
                BluetoothAdapter bAdapter = BluetoothAdapter.getDefaultAdapter();
                bAdapter.disable();
            }
        }
    });


}
@Override
protected void onDestroy() {
    super.onDestroy();
    beaconManager.unbind((BeaconConsumer) this);
}

public void onBeaconServiceConnect() {
    beaconManager.removeAllMonitorNotifiers();
    beaconManager.addMonitorNotifier(new MonitorNotifier() {


        @Override
        public void didEnterRegion(Region region) {
            Context context = getApplicationContext();
            CharSequence text = "Beacon Found";
            int duration = Toast.LENGTH_LONG;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
            Log.d(TAG, "I just saw a beacon for the first time!");

            a=beacon.getServiceUuid();

            Toast toastt = Toast.makeText(context,"" + a, duration);
            toastt.show();
        }

        @Override
        public void didExitRegion(org.altbeacon.beacon.Region region) {
            Log.i(TAG, "I no longer see a beacon");
        }

        @Override
        public void didDetermineStateForRegion(int i, org.altbeacon.beacon.Region region) {
            //Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
        }

    });

   try {
        beaconManager.startMonitoringBeaconsInRegion(new org.altbeacon.beacon.Region("MY_UUID", null, null, null));
        //beaconManager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("myranging", null, null, null));
    }
    catch (RemoteException e) {    }
}

@Override
public void onPointerCaptureChanged(boolean hasCapture) {

}

了解使用监控 API,只有当 any 信标(一个或多个)位于与您的 Region 定义相匹配的附近时,您才会收到回调。所示代码定义了一个将所有标识符设置为空的区域。这就是所谓的通配符区域,因为它匹配任何信标。

当您收到 didEnterRegion 的回调时,它会传递您用于开始监视的相同 Region 定义的副本。并且因为您将所有标识符都设置为空(通配符定义),这就是您在检查传递给该方法的 Region 对象的标识符时得到的结果。这些 API 旨在告诉您 信标中的任何一个何时出现。

如果你想知道可见信标的具体标识符,你只需要使用测距API。而不是:

beaconManager.startMonitoringBeaconsInRegion(new org.altbeacon.beacon.Region("MY_UUID", null, null, null));

通话:

 beaconManager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("MY_UUID", null, null, null));

然后像这样设置回调通知程序:

beaconManager.addRangeNotifier(new RangeNotifier() {
    @Override
    public void didRangeBeaconsInRegion(Region region, Collection<Beacon> beacons) {
        for (Beacon beacon: beacons} {
          Log.d(TAG, "I see a beacon with ID1 of: "+beacon.getID1());
        }
    }
});