【问题标题】:Can an Android device act as an iBeacon?Android 设备可以充当 iBeacon 吗?
【发布时间】:2013-11-05 08:14:24
【问题描述】:

Android 设备能否充当 iBeacon 并确定其他 Android 设备何时进入其范围?其他 Android 设备是否需要开启蓝牙?

如果客户来到我的商店,但他的设备上没有安装我的应用程序,iBeacon 可以工作,还是必须先安装应用程序?每天有很多顾客光顾我们的商店,但如果他们没有安装我的应用程序,iBeacon 概念是否有效?

【问题讨论】:

标签: android bluetooth bluetooth-lowenergy ibeacon android-bluetooth


【解决方案1】:

YES 这在 Android 5+ 上是可能的,您可以在 Android Beacon Library 中找到 open-source code for transmitting as a beacon。在 Google Play 商店的Beacon Scope 应用程序中还有一个全功能版本的信标发射器。

以下是使用 Android Beacon 库传输 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);

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

具有 BluetoothLE 的 Android 4.3 设备可以看到 iBeacons 但不能充当 iBeacons,因为 Android 4.3 不支持外围模式。三星 Android 设备包含一个单独的专有 SDK,但它也不允许设备充当 iBeacons。请参阅:Make Samsung Android device advertise as an iBeacon) 但是,iOS 设备可以充当 iBeacon。

通常,iBeacon 技术不适用于手机查看其他手机。但是你可以按照你在 iOS 上的建议去做,方法是制作一个自定义应用程序,让手机充当 iBeacon,并在它们周围寻找其他 iBeacon。这将允许使用该应用程序的任何人看到附近使用相同应用程序的其他人。所有手机都需要打开蓝牙。

要回答您的第二个问题,是的,Android 或 iOS 移动设备必须安装应用程序才能利用 iBeacons。当前,当看到 iBeacon 时,这两个操作系统都不会做任何事情,除非安装了专门为做某事而设计的应用程序。因此,到达商店的顾客必须已经安装了应用程序,否则他们将无法与 iBeacons 交互。

【讨论】:

  • 还有这个!参见“BLE 外设模式”->android-developers.blogspot.com/2014/06/…
  • You can also transmit as a beacon on rooted Android 4.4.3 devices, but it requires an app installed with system privileges. 我该怎么做?
  • 如果你发布一个新问题,我会回答——没有足够的空间在 cmets 中解释。
  • 不错且内容丰富的答案。但我对这句话有疑问:“目前只有三星设备才能在 Android 上执行此操作。”就在你上面一点点说三星 SDK 不允许设备像 iBeacons 一样运行(并链接到具有相同答案的问题)。如果是这样的话……如果 Android SDK 不允许,三星设备怎么能像 iBeacons 一样工作,而三星 SDK 也没有这种功能呢?
  • 这是一个重要的澄清,是的。 Android 5.x+ 上的传输不仅需要芯片组支持,还需要 ROM 中的支持。例如,Nexus 5 设备支持芯片组,但谷歌在官方 ROM 中禁用了支持。我在这里整理了一份已知支持和不支持传输的设备列表:altbeacon.github.io/android-beacon-library/…
【解决方案2】:

是的,Android 设备可以充当 iBeacon。我使用 android 5.X 和 AltBeacon library 实现了这一点。 Radius Networks 的 AltBeacon 库提供了将 android 构建为信标发射器和接收器的类。 这里有一段代码可以作为 iBeacon 在 android 上运行:

 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

【讨论】:

  • 感谢分享。 :)
  • 这需要root设备吗?
  • 不,不需要root设备:))
  • 如何在 react-native 中做到这一点?
  • 如何在cordova中实现这个?
【解决方案3】:

纯 Android SDK。零 3rd 方代码 - 有利于开源尽职调查

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 放在有效负载中的这些位置,但保持前两个字节不变。

【讨论】:

  • 感谢您的回答,我已经让它工作了,但是只有在向有效负载添加一个额外的字节后,使用 tx 电源。
  • 您是如何确定制造商数据的?我的意思是 Android 会有哪些数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2013-12-12
  • 1970-01-01
相关资源
最近更新 更多