安卓设备能够充当 iBeacon 吗?

81

安卓设备能否作为iBeacon并检测其他安卓设备进入其范围?其他安卓设备需要开启蓝牙吗?

如果客户来到我的商店,他的设备上没有安装我的应用程序,iBeacon能够工作吗?还是必须先安装应用程序?每天有很多客户来我们店,但如果他们没有安装我的应用程序,iBeacon的概念是否仍然适用?


你应该摆脱“IBeacon”,将其分解为一个通用术语,并进行一些研究。 - JoxTraex
@JoxTraex 我已经阅读了这篇教程: http://www.devfright.com/ibeacons-tutorial-ios-7-clbeaconregion-clbeacon/ 但我还是有些疑惑,所以在这里问一个问题。如果你对这个问题有任何想法,请帮帮我。 - Hardik Joshi
请查看以下链接,将您的Android 5.0手机转换为iBeacon设备: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-android-5.html - Zack S
3个回答

77

是的,在Android 5+上可以实现此功能,并且您可以在Android Beacon Library中找到用于传输信标的开源代码。Google Play商店中的Beacon Scope应用程序中还有一个完整功能的信标发射器。

以下是使用Android Beacon Library传输iBeacon的示例:

Beacon beacon = new Beacon.Builder()
        .setId1("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6")
        .setId2("1")
        .setId3("2")
        .setManufacturer(0x004c)
        .setTxPower(-59)
        .build();
BeaconParser beaconParser = new BeaconParser()
        .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser); 
beaconTransmitter.startAdvertising(beacon);

您也可以在已root的Android 4.4.3设备上作为信标进行传输,但需要安装具有系统特权的应用程序。

带有BluetoothLE的Android 4.3设备可以看到iBeacon,但无法充当iBeacon,因为Android 4.3不支持外围模式。三星Android设备包含一个单独的专有SDK,但它也不允许设备充当iBeacon。请参见:使三星Android设备作为iBeacon广告)然而,iOS设备可以充当iBeacon。

通常,iBeacon技术并不是用于手机看到其他手机的。但是,您可以通过制作一个自定义应用程序,在iOS上做出您所建议的事情,使手机充当iBeacon并寻找周围的其他iBeacon。这将允许任何具有该应用程序的人看到附近拥有相同应用程序的其他人。所有手机都需要打开蓝牙。

回答你的第二个问题,是的,无论是Android还是iOS移动设备,都必须安装一个应用程序才能利用iBeacons。除非安装了专门编程执行某些操作的应用程序,否则两种操作系统目前不会在检测到iBeacon时做任何事情。因此,到店的客户必须已经安装了应用程序,否则他们无法与iBeacons互动。


1
还有这个!请参见“BLE Peripheral Mode”-> http://android-developers.blogspot.com/2014/06/developer-preview-and-play-services-5.html - Alexis
1
你也可以在已root的Android 4.4.3设备上作为信标进行传输,但需要安装具有系统特权的应用程序。 我该怎么做? - Raiv
2
如果您发布了一个新问题,我会回答——在评论中没有足够的空间来解释。 - davidgyoung
这个类https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html不就是答案吗? - Marian Paździoch
1
这是一个重要的澄清,没错。在Android 5.x+上进行传输不仅需要芯片组支持,还需要ROM支持。例如,Nexus 5设备具有芯片组支持,但Google在官方ROM中禁用了支持。我已经编制了一个已知支持和不支持传输的设备列表,网址为:http://altbeacon.github.io/android-beacon-library/beacon-transmitter-devices.html - davidgyoung
显示剩余5条评论

19

是的,Android设备可以作为iBeacon。我使用Android 5.X和AltBeacon库实现了这一点。Radius Networks的AltBeacon库提供了将Android打造成信标发射器和接收器所需的类。 以下是可以用于将Android设备变成iBeacon的代码:

 Beacon beacon = new Beacon.Builder()
        .setId1("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6") // UUID for beacon
        .setId2("1") // Major for beacon
        .setId3("5") // Minor for beacon
        .setManufacturer(0x004C) // Radius Networks.0x0118  Change this for other beacon layouts//0x004C for iPhone
        .setTxPower(-56) // Power in dB
        .setDataFields(Arrays.asList(new Long[] {0l})) // Remove this for beacon layouts without d: fields
        .build();

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

BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser); 
beaconTransmitter.startAdvertising(beacon, new AdvertiseCallback() {

            @Override
            public void onStartFailure(int errorCode) {
                Log.e(TAG, "Advertisement start failed with code: "+errorCode);
            }

            @Override
            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                Log.i(TAG, "Advertisement start succeeded.");
            }
        });

希望这对正在搜索 Android 作为 iBeacon 的用户有所帮助。jj


感谢分享。 :) - Hardik Joshi
这需要一个已经root的设备吗? - Amitabh
不需要root设备:)) - Yogesh
如何在React Native中实现这个? - user43286
如何在Cordova中实现这个? - Atul Verma
@Yogesh Android的制造商数据是什么? - Sumit Shukla

8

纯净的Android SDK。零第三方代码-适用于开源尽职调查。

byte[] payload = {(byte)0x02, (byte)0x15, // this makes it a iBeacon
            (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // uuid
            (byte)0x00, (byte)0x00,  // Major
            (byte)0x00, (byte)0x00}; // Minor


    AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
    dataBuilder.addManufacturerData(0x004C, payload); // 0x004c is for Apple inc.
    AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();

    settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
    settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
    settingsBuilder.setConnectable(false);

    mAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), this);

将您的UUID“Minor”和“Mayor”放在负载中的相应位置,但是将前两个字节保留为原样。

谢谢您的回答,我已经解决了问题,但是只有在添加了一个额外的字节到有效载荷中,并且调整了发射功率后才成功。 - José Pereda
你是怎么确定制造商数据的呢?我的意思是 Android 会有哪些数据? - Sumit Shukla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接