最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android檢測IBeacon熱點的方法

 更新時間:2018年10月31日 08:57:51   作者:周孫靜  
這篇文章主要介紹了Android檢測IBeacon熱點的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

IBeacon是BLE的一種,搜索iBeacon基站關(guān)鍵在于設(shè)備掃描到的scanRecord數(shù)組,識別是否有下面加粗斜體的02 15這兩個數(shù)字。如果有,搜索到的藍(lán)牙設(shè)備就是IBeacon。
// AirLocate:
// 02 01 1a 1a ff 4c 00 02 15 # Apple's fixed iBeacon advertising prefix
// e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile uuid
// 00 00 # major
// 00 00 # minor
// c5 # The 2's complement of the calibrated Tx Power

下面分步驟來實現(xiàn)檢測IBeacon熱點。

一、獲得手機(jī)藍(lán)牙控制權(quán)限

在manifest 文件中寫上:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

二、檢測手機(jī)是否支持藍(lán)牙,并獲取mBluetoothAdapter 對象

if (!getPackageManager().hasSystemFeature(
        PackageManager.FEATURE_BLUETOOTH_LE))
    {
      Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT)
          .show();
      finish();
    }
    final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();

    if (mBluetoothAdapter == null)
    {
      Toast.makeText(this, R.string.error_bluetooth_not_supported,
          Toast.LENGTH_SHORT).show();
      finish();
      return;
    }

三、實現(xiàn)LeScanCallback回調(diào)接口

設(shè)備每次檢測到一個藍(lán)牙設(shè)備,就會回調(diào)這個接口中的onLeScan()方法,并且傳入掃描到的device,rssi,scanRecord等參數(shù)。

private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback()
  {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi,
        byte[] scanRecord)
    {
      //在這里處理掃描到的參數(shù)
      //判斷是不是IBeacon設(shè)備,做相應(yīng)的處理。
    }
  };

四、處理掃描到的參數(shù)的方法

public class iBeaconClass
{

  static public class iBeacon
  {
    public String name;
    public int major;
    public int minor;
    public String proximityUuid;
    public String bluetoothAddress;
    public int txPower;
    public int rssi;
  }


  /**
   * 將掃描到的信息傳入這個方法
   * 該方法會判斷掃描到的設(shè)備是不是IBeacon
   * 如果是就返回一個IBeacon對象
   * 如果不是就返回null
   * @param device
   * @param rssi
   * @param scanData
   * @return
   */
  public static iBeacon fromScanData(BluetoothDevice device, int rssi,
      byte[] scanData)
  {

    int startByte = 2;
    boolean patternFound = false;
    while (startByte <= 5)
    {
      if (((int) scanData[startByte + 2] & 0xff) == 0x02
          && ((int) scanData[startByte + 3] & 0xff) == 0x15)
      {
        // yes! This is an iBeacon
        patternFound = true;
        break;
      } else if (((int) scanData[startByte] & 0xff) == 0x2d
          && ((int) scanData[startByte + 1] & 0xff) == 0x24
          && ((int) scanData[startByte + 2] & 0xff) == 0xbf
          && ((int) scanData[startByte + 3] & 0xff) == 0x16)
      {
        iBeacon iBeacon = new iBeacon();
        iBeacon.major = 0;
        iBeacon.minor = 0;
        iBeacon.proximityUuid = "00000000-0000-0000-0000-000000000000";
        iBeacon.txPower = -55;
        return iBeacon;
      } else if (((int) scanData[startByte] & 0xff) == 0xad
          && ((int) scanData[startByte + 1] & 0xff) == 0x77
          && ((int) scanData[startByte + 2] & 0xff) == 0x00
          && ((int) scanData[startByte + 3] & 0xff) == 0xc6)
      {

        iBeacon iBeacon = new iBeacon();
        iBeacon.major = 0;
        iBeacon.minor = 0;
        iBeacon.proximityUuid = "00000000-0000-0000-0000-000000000000";
        iBeacon.txPower = -55;
        return iBeacon;
      }
      startByte++;
    }

    if (patternFound == false)
    {
      // This is not an iBeacon
      return null;
    }

    iBeacon iBeacon = new iBeacon();

    iBeacon.major = (scanData[startByte + 20] & 0xff) * 0x100
        + (scanData[startByte + 21] & 0xff);
    iBeacon.minor = (scanData[startByte + 22] & 0xff) * 0x100
        + (scanData[startByte + 23] & 0xff);
    iBeacon.txPower = (int) scanData[startByte + 24]; // this one is signed
    iBeacon.rssi = rssi;

    // AirLocate:
    // 02 01 1a 1a ff 4c 00 02 15 # Apple's fixed iBeacon advertising prefix
    // e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile
    // uuid
    // 00 00 # major
    // 00 00 # minor
    // c5 # The 2's complement of the calibrated Tx Power

    // Estimote:
    // 02 01 1a 11 07 2d 24 bf 16
    // 394b31ba3f486415ab376e5c0f09457374696d6f7465426561636f6e00000000000000000000000000000000000000000000000000

    byte[] proximityUuidBytes = new byte[16];
    System.arraycopy(scanData, startByte + 4, proximityUuidBytes, 0, 16);
    String hexString = bytesToHexString(proximityUuidBytes);
    StringBuilder sb = new StringBuilder();
    sb.append(hexString.substring(0, 8));
    sb.append("-");
    sb.append(hexString.substring(8, 12));
    sb.append("-");
    sb.append(hexString.substring(12, 16));
    sb.append("-");
    sb.append(hexString.substring(16, 20));
    sb.append("-");
    sb.append(hexString.substring(20, 32));
    iBeacon.proximityUuid = sb.toString();

    if (device != null)
    {
      iBeacon.bluetoothAddress = device.getAddress();
      iBeacon.name = device.getName();
    }

    return iBeacon;
  }

  private static String bytesToHexString(byte[] src)
  {
    StringBuilder stringBuilder = new StringBuilder("");
    if (src == null || src.length <= 0)
    {
      return null;
    }
    for (int i = 0; i < src.length; i++)
    {
      int v = src[i] & 0xFF;
      String hv = Integer.toHexString(v);
      if (hv.length() < 2)
      {
        stringBuilder.append(0);
      }
      stringBuilder.append(hv);
    }
    return stringBuilder.toString();
  }
}

五、開啟藍(lán)牙

mBluetoothAdapter.enable();

六、開始掃描

mBluetoothAdapter.startLeScan(mLeScanCallback);

代碼改自鏈接地址

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android開發(fā)之圖形圖像與動畫(三)Animation效果的XML實現(xiàn)

    Android開發(fā)之圖形圖像與動畫(三)Animation效果的XML實現(xiàn)

    使用XML來定義Tween Animation動畫的XML文件在工程中res/anim目錄,這個文件必須包含一個根元素,感興趣的友可以了解一下,希望本文對你有所幫助
    2013-01-01
  • Android控件Spinner實現(xiàn)下拉列表及監(jiān)聽功能

    Android控件Spinner實現(xiàn)下拉列表及監(jiān)聽功能

    這篇文章主要介紹了Android控件Spinner實現(xiàn)下拉列表及監(jiān)聽功能,這是在Web開發(fā)中一個必不可少的交互性組件,而在Android中的對應(yīng)實現(xiàn)就是Spinner。需要的朋友可以參考下
    2018-07-07
  • Flutter中獲取屏幕及Widget的寬高示例代碼

    Flutter中獲取屏幕及Widget的寬高示例代碼

    這篇文章主要給大家介紹了關(guān)于Flutter中如何獲取屏幕及Widget的寬高的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Android仿QQ長按彈出刪除復(fù)制框

    Android仿QQ長按彈出刪除復(fù)制框

    這篇文章主要為大家詳細(xì)介紹了Android仿QQ長按彈出刪除、復(fù)制、轉(zhuǎn)發(fā)框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android開發(fā)中的文件操作工具類FileUtil完整實例

    Android開發(fā)中的文件操作工具類FileUtil完整實例

    這篇文章主要介紹了Android開發(fā)中的文件操作工具類FileUtil,結(jié)合完整實例形式分析了Android文件操作的常用技巧,包括文件的獲取、遍歷、搜索、復(fù)制、刪除、判斷等功能,需要的朋友可以參考下
    2017-11-11
  • 2013年 移動App設(shè)計13項注意細(xì)節(jié)總結(jié)

    2013年 移動App設(shè)計13項注意細(xì)節(jié)總結(jié)

    在過去的一年里,移動成主流也讓眾多的移動應(yīng)用如雨后春筍般層出不窮,在眾多開發(fā)者從中獲利的同時競爭也愈演愈烈,如何才能保證自己立于不敗之地接下來介紹移動App設(shè)計的13大精髓感興趣的朋友可以了解下啊
    2013-01-01
  • android6.0運行時權(quán)限完美封裝方法

    android6.0運行時權(quán)限完美封裝方法

    今天小編就為大家分享一篇android6.0運行時權(quán)限完美封裝方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android實現(xiàn)數(shù)據(jù)按照時間排序

    Android實現(xiàn)數(shù)據(jù)按照時間排序

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)數(shù)據(jù)按照時間排序的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Android實現(xiàn)懸浮按鈕功能

    Android實現(xiàn)懸浮按鈕功能

    在很多場景中,我們希望在應(yīng)用或系統(tǒng)任意界面上都能看到一個小的“懸浮按鈕”(Floating Button),用來快速啟動工具、展示未讀信息或快捷操作,所以本文給大家介紹了如何在Android中實現(xiàn)懸浮按鈕功能,需要的朋友可以參考下
    2025-04-04
  • Android開發(fā)Kotlin?DSL使用技巧掌握

    Android開發(fā)Kotlin?DSL使用技巧掌握

    這篇文章主要為大家介紹了Android開發(fā)Kotlin?DSL使用技巧的掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評論

台中县| 清水县| 高平市| 台南县| 马山县| 晋宁县| 洛南县| 木兰县| 乐至县| 通榆县| 尖扎县| 闵行区| 墨竹工卡县| 留坝县| 奈曼旗| 白水县| 积石山| 阿拉善右旗| 双峰县| 曲沃县| 岳普湖县| 体育| 潢川县| 延寿县| 安乡县| 天台县| 阳新县| 大竹县| 达孜县| 会理县| 乌拉特中旗| 通许县| 遂昌县| 瑞金市| 安溪县| 河南省| 遂昌县| 绥芬河市| 界首市| 永新县| 枞阳县|