Category Archives: Android

ข้อแตกต่างของการพัฒนา iBeacon บน Android กับ iOS ที่ควรทราบ

บน iOS

  1. iBeacon เป็น service ของ OS ซึ่งทำงานตลอดเวลา นักพัฒนาต้องลงทะเบียน Proximity UUID, Major และ Minor (Major และ Minor สามารถเป็น nil ได้) ที่สนใจไว้ เมื่อ iOS ตรวจพบเจออุปกรณ์ตามเงื่อนไขที่ตั้งไว้ ก็จะแจ้ง App ของเราให้ทราบเพื่อตื่นขึ้นมาทำงานได้
  2. ข้อมูลที่ได้รับจาก service จะทราบเพียง Service UUID ซึ่งจะเปลี่ยนไปแต่ละครั้งที่พบ beacon ตัวนั้น ถ้า beacon ยังอยู่ในระยะ Service UUID จะคงที่ ถ้าห่างไปจนหายแล้วกลับเข้ามาใหม่ Service UUID จะเปลี่ยนไป ค่าที่สามารถรับค่าได้คือ Major, Minor, RSSI ค่าที่ไม่สามารถรู้ได้คือ Proximity UUID และ MAC Address
  3. สามารถโปรแกรมให้ iOS ทำตัวเป็น Broadcaster หรือ Receiver ก็ได้

บน Android

  1. บน Android ไม่มี iBeacon service นักพัฒนาต้องสร้าง service ขึ้นมาเองซึ่งเสี่ยงที่ต้องชนกับ service ของ App อื่นที่อาจจะใช้ Bluetooth LE เพื่อ scan เหมือนกัน ดังนั้นต้องตรวจสอบค่อนข้างละเอียดเพื่อไม่ให้แย่งกันใช้ Hardware ในเวลาเดียวกัน
  2. ข้อมูลที่ได้จากการ scan จะได้ Hardware address (MAC address), RSSI, Device Name และ Scan Record ใน Scan Record เป็นข้อมูลดิบต้องสกัดข้อมูลออกมาเองเพื่อให้ได้ Proximity UUID, Minor และ Major ตามข้อกำหนดของ iBeacon
  3. ณ ปัจจุบัน Android ไม่สามารถทำตัวเป็น Broadcaster ได้ คือจำลองตัวเองเป็นอุปกรณ์ iBeacon เพื่อกระจายสัญญาณไม่ได้ ทำได้แค่ Receiver ซึ่งไม่ใช่ข้อจำกัดทางฮาร์ดแวร์ แต่เป็นที่ API ของ Android เอง ในอนาคตน่าจะสามารถทำได้

เริ่มต้นพัฒนา iBeacon App บน Android

ขั้นตอนแบบคร่าว ๆ

  1. สร้างโปรเจคใหม่ กำหนด Minimum SDK เป็น 18 ขึ้นไป
  2. เพิ่ม
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

    ใน AndroidManifest.xml

  3. หากต้องการให้อุปกรณ์ที่มีคุณบัติ BLE เท่านั้นที่จะติดตั้ง App นี้ได้ ให้ใส่
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

    ในไฟล์ code>AndroidManifest.xml

  4. เตรียมออบเจ็ค BluetoothAdapter
    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
  5. ตรวจสอบว่าบลูทูธเปิดอยู่หรือไม่ หากยังไม่เปิด ให้พาไปเปิด หรือบังคับเปิด
    if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }

    ถ้าบังคับเปิด

    mBluetoothAdapter.enable()
  6. เริ่ม scan โดยใช้ mBluetoothAdapter.startLeScan(mLeScanCallback) ตัวอย่าง
    mBluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi,
                byte[] scanRecord) {
            Log.d(TAG, "Found beacon " + device.getAddress());
       });
  7. ยังไงควรตั้งเวลาหยุด scan ไว้ด้วย เพราะการ scan ตลอดเวลาจะกินแบตมาก การหยุดใช้ mBluetoothAdapter.stopLeScan(mLeScanCallback)

ที่มา: developer.android.com