Search code examples
androidbluetooth-lowenergyibeaconibeacon-android

Android Beacon Library | IBeacon - Advertising multiple beacons using Mobile device


I am using the Android beacon library with, version -

compile 'org.altbeacon:android-beacon-library:2.15.1'

I am trying to develop one APK for transmitting multiple beacons from my mobile device. I need to perform this to test or POC to test, how many beacons a reader can read at a time.

I am using the below code to transmit the BLE messages with Android Beacon Library.

btn_transmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (isBluetoothEnabled)
                {
                    try
                    {
                        String  customUuid = "";
                        for(int i=0;i<=50;i++)
                        {
                            if( i < 10){
                                customUuid = "99999999-b00"+i+"-4807-b747-9aee23508620";
                            } else if ( i < 999){
                                customUuid = "99999999-b0"+i+"-4807-b747-9aee23508620";
                            }

                            Thread.sleep(5000);
                            trasmitClick(customUuid);
                            beaconTransmitter = null;
                        }
                    }
                    catch(Exception e)
                    {
                        Toast.makeText(BeaconTransmitterActivity.this, "Something went wronggg", Toast.LENGTH_LONG).show();
                    }
                }
                else
                    Toast.makeText(BeaconTransmitterActivity.this, "Check your bluetooth connection", Toast.LENGTH_LONG).show();
            }
        });

Here above I am dynamically trying to create 50 new Id's to transmit the beacons.

Method to createBeacon and transmit its advertisements

 public void trasmitClick(String customUuid) {

        if (beaconTransmitter == null) {

            String major, minor, uuid;

            uuid = customUuid;
            major = etMajorValue.getText().toString().trim();
            minor = etMinorValue.getText().toString().trim();

            if (TextUtils.isEmpty(uuid))
                uuid = customUuid;
            if (TextUtils.isEmpty(major))
                major = "8";
            if (TextUtils.isEmpty(minor))
                minor = "2";

            currentType=beaconLayout;
            currentuuid=uuid;
            currentmajorValue=major;
            currentminorValue=minor;

            beacon = new Beacon.Builder()
                    .setId1(uuid)
                    .setId2(major)
                    .setId3(minor)
                   //.setManufacturer(0x0118) // It is for AltBeacon.  Change this for other beacon layouts
                    .setManufacturer(0x004C)
                    .setTxPower(-59)
                    //.setDataFields(Arrays.asList(new Long[]{6l, 7l})) // Remove this for beacon layouts without d: fields
                    .build();

            // Change the layout below for other beacon types

            beaconParser = new BeaconParser()
                    .setBeaconLayout(parserLayout[beaconLayout]);

            beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
            beaconTransmitter.startAdvertising(beacon, new AdvertiseCallback() {
                @Override
                public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                    super.onStartSuccess(settingsInEffect);
                }

                @Override
                public void onStartFailure(int errorCode) {
                    super.onStartFailure(errorCode);
                }
            });
            btn_transmit.setText("Stop Advertising");
            btn_apply.setEnabled(false);


        } else {
            beaconTransmitter.startAdvertising();
            beaconTransmitter = null;
            btn_transmit.setText("Start Advertising");
            btn_apply.setEnabled(false);
        }

    }

I am able to make this code work, but what is the result is I am able to transmit only 4 messages, the rest of the messages are not being visible in the simulator.

I am trying to find if the library has some limitations or I am wrong above. Well I am novice in Android coding.

Below is the result that I can get in my simulator: enter image description here

I would like to know how can I transmit 50 messages in one go.


Solution

  • This is most certainly a limitation of the Bluetooth chip on your mobile phone. Different device models have different advertising limits. The Huawei P9 Lite, for example can transmit only one advertisement at a time. The Nexus 5x can advertise 10 or more. It is unlikely that many phone models (if any) support 50 simultaneous advertisements.

    There is no way to know the limit programmatically, as the OS provides no API to query this limit -- you just have to try. You can check when you get an error advertising by putting code in the onStartFailure callback.

    You might also use the [BeaconScope]((https://play.google.com/store/apps/details?id=com.davidgyoungtech.beaconscanner) app to test this. But remember that transmission limits are device-wide. If one app is advertising a beacon, that takes one advertisement slot away from the next app. And no, there is no way to know if other apps are advertising.