altbeacon-transmitter-android, 一个需要安卓的发射机应用

分享于 

9分钟阅读

GitHub

  繁體 雙語
A transmitter app requiring android L
  • 源代码名称:altbeacon-transmitter-android
  • 源代码网址:http://www.github.com/AltBeacon/altbeacon-transmitter-android
  • altbeacon-transmitter-android源代码文档
  • altbeacon-transmitter-android源代码下载
  • Git URL:
    git://www.github.com/AltBeacon/altbeacon-transmitter-android.git
    Git Clone代码到本地:
    git clone http://www.github.com/AltBeacon/altbeacon-transmitter-android
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/AltBeacon/altbeacon-transmitter-android
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    AltBeacon发送器

    IMPORANT: 这个项目是为Android的第一个预览版本开发的。 这些api在后续更新中被更改,因此这个项目不能与Android版本一起使用。

    这个应用演示了如何使用Android作为信标传输。 默认情况下,它将传输AltBeacon广告,但可以轻松修改以传输任何其他信标格式。

    如果你看不到传输,请确保你有一个可以检测AltBeacons的工具,如Android定位应用程序。 否则,更改代码以作为不同的信标类型传输。

    构建应用程序

    在 Eclipse 环境下,你必须拥有一个Android开发环境,你必须首先在 Eclipse 中构建并安装Android信标库的android-l-apis分支,这是一个依赖的Android库。

    这里应用程序调用QuickBeacon的更完整功能版本在这里的Google Play 商店中可用。

    在你的设备上获取 Google L

    Google L 是从谷歌下载的

    关键Android蓝牙LE功能:

    • 在 Android 4.4.3的广告代码中,Bug 不再是一个发布--广告的广告,需要充当信标的整个 25 -26字节。 这允许这个操作系统版本包含发射机功率校准值,允许在Android设备和信标设备之间进行距离估计。

    • 作为信标传输需要的api在 Android L 预览中是 public。 第三方可以开发这样的应用程序,并将它的安装到手机上,就像其他应用程序一样。 当然,在这个操作系统发布之前,--手机用户需要 root 访问来安装 Android,这并不太重要。 但这确认,非根Android设备将在年底以后将第三方应用程序作为信标运行。

    • api允许你选择四个不同级别的发送器电源。 这个特性非常重要,因为它允许在可以变距离( 首次检测到) 上触发一个动作,尤它的是在一般无法范围的iOS设备上。 测试这些不同的设置表明,它们确实在 Nexus 5上做了。 一个 iPhone 4S 在定位一米的时候,在下面的电源级别上选择了Android传输。 注意,超低设置确实是极低的--,但在 Nexus 5的旁边,iPhone甚至无法接收传输,尽管运行ScanBeacon的Mac机可能会出现异常。 (的天线比 iPhone 4S 要好。也要注意,高功率设置大致相当于iPhone的不可配置发射机功率,大约是 -59 dBm。

    SettingRSSI @1m ( iOS ) RSSI @1m ( Mac )
    ADVERTISE_TX_POWER_HIGH-56 dBm-55 dBm
    ADVERTISE_TX_POWER_MEDIUM-66 dBm-66 dBm
    ADVERTISE_TX_POWER_LOW-75 dBm-70 dBm
    ADVERTISE_TX_POWER_ULTRA_LOW( 未检测到)-79 dBm
    • 另一个设置允许你通过选择以下三种设置之一来配置发送器频率。 这是非常重要的,因为传输频率越频繁,远距离估计可以为Android或者iOS设备检测信号。 下面的设置与下列频率对应。 通过计算Mac蓝牙扫描仪检测到的数据包来测量频率,因此它们可能不准确。 注意 ADVERTISE_MODE_LOW_POWER 设置实际上传输最频繁的--,它应该使用更多的功率( 可能在命名的命名中表示一个 Bug )。
    设置传输频率
    ADVERTISE_MODE_LOW_LATENCY大约 1赫兹
    ADVERTISE_MODE_BALANCED大约 3赫兹
    ADVERTISE_MODE_LOW_POWER大约 10赫兹

    更新:ADVERTISE_MODE_LOW_POWER和ADVERTISE_MODE_LOW_LATENCY反向版本的异常已经在Android版本中修复。 上内容仅适用于Android的预览版本。

    ##Android L API更改

    由于Android现在有了新的api,所以所有这些改变都是可能的,因为它在 android.bluetooth.le 包下与蓝牙LE交互。 在某种程度上,它们似乎包装了相同的Bluedroid驱动程序,但更改是显著的。 Nexus 设备配置的源代码几天前已经发布,但更重要的源代码仍然不可以用,也不是完全文档。

    但是根据与二进制预览SDK的交互,一个新的Java API层与 http 4.4.3的交互没有什么相似之处。 一些需要作为蓝牙镜头外围传输的隐藏api已经被移动到 android.bluetooth.le 包中,并添加了许多新 api。 旧的public api仍然可用,但是新的api提供了更多的功能。

    用in的Android android.bluetooth.le 发送的代码与我们在 Android 4.4.3中使用 android.bluetooth api的方式有点不同。 首先要注意的是,你不再需要特殊的android.permission.BLUETOOTH_PRIVILEGED 许可来传输广告服务,只需在你的服务器上传输标准的android.permission.BLUETOOTH_ADMIN 许可

    :如何设置传输

    你必须先得到BluetoothAdapter的一个实例,然后使用新的BluetoothLeAdvertiser类来控制你的广告,才能告诉安卓传输信标字节序列。

    BluetoothManager bluetoothManager = (BluetoothManager) this.getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE);BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); BluetoothLeAdvertiser bluetoothAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser()

    接下来我们需要在bluetoothAdvertiser上设置 advertisingBytes。 新的api还允许你将 ManufacturerData ( 它将用蓝牙广告类型 0 xFF发送) 和 ServiceData ( 将用蓝牙广告类型 0 x16发送) 设置为信标,我们必须使用 ManufacturerData,因为设备期望查看 0xFF。

    AdvertisementData.Builder dataBuilder =newAdvertisementData.Builder();
    dataBuilder.setManufacturerData((int) 0, advertisingBytes);

    接下来,我们可以使用额外的控制 Android,让你通过广告。 发送器功率级别和频率("advertisemode") 均可以设置:

    AdvertiseSettings.Builder settingsBuilder =newAdvertiseSettings.Builder();
    settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED); 
    settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH); 
    settingsBuilder.setType(AdvertiseSettings.ADVERTISE_TYPE_NON_CONNECTABLE);

    最后一步是启动广告:

    bluetoothAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), advertiseCallback);

    你将注意到,这需要一个advertiseCallback定义,我们将定义与像这样的Android 4.4.3相同的方式:

    privateAdvertiseCallback advertiseCallback =newAdvertiseCallback() {
     @OverridepublicvoidonAdvertiseStart(intresult) {
     if (result ==BluetoothAdapter.ADVERTISE_CALLBACK_SUCCESS) {
     Log.d(TAG, "started advertising successfully."); 
     }
     else {
     Log.d(TAG, "did not start advertising successfully");
     }
     }
     @OverridepublicvoidonAdvertiseStop(intresult) {
     if (result ==BluetoothAdapter.ADVERTISE_CALLBACK_SUCCESS) {
     Log.d(TAG, "stopped advertising successfully");
     }
     else {
     Log.d(TAG, "did not stop advertising successfully");
     }
     }
    };