国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android檢測IBeacon熱點的方法

2019-10-21 21:36:30
字體:
來源:轉載
供稿:網友

IBeacon是BLE的一種,搜索iBeacon基站關鍵在于設備掃描到的scanRecord數組,識別是否有下面加粗斜體的02 15這兩個數字。如果有,搜索到的藍牙設備就是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 

下面分步驟來實現檢測IBeacon熱點。

一、獲得手機藍牙控制權限

在manifest 文件中寫上:

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

二、檢測手機是否支持藍牙,并獲取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;    }

三、實現LeScanCallback回調接口 

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

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

四、處理掃描到的參數的方法

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;  }  /**   * 將掃描到的信息傳入這個方法   * 該方法會判斷掃描到的設備是不是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();  }}

五、開啟藍牙

mBluetoothAdapter.enable();

六、開始掃描

mBluetoothAdapter.startLeScan(mLeScanCallback);

代碼改自鏈接地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新巴尔虎右旗| 大方县| 临桂县| 辉县市| 昭通市| 霸州市| 巩留县| 阳谷县| 太谷县| 寿宁县| 大足县| 汽车| 孟村| 大名县| 石楼县| 西藏| 泽州县| 伊春市| 抚松县| 龙口市| 来安县| 饶河县| 奈曼旗| 廉江市| 张家川| 关岭| 红安县| 石家庄市| 平顶山市| 视频| 丰城市| 岳普湖县| 吉林市| 牡丹江市| 梅州市| 凤凰县| 苍梧县| 玛纳斯县| 旅游| 古交市| 旅游|