Android Beacon 开发(IBeacon)

iBeacon是苹果公司2013年9月发布的移动设备用OS(ios7)上配备的新功能。其主要的工作方式就是:配备有低功耗蓝牙

(BLE)通信功能的设备使用BLE技术向周围发送自己特有的ID。

这个网址对iBeacon进行了基本介绍,建议大家去阅读一下:http://www.beaconsandwich.com/what-is-ibeacon.html

在2015年,谷歌发布Eddystone,它其实类似于iBeacon。

对于这两者的主要区别,大家可以浏览这个网址的内容:https://www.zhihu.com/question/32708729

本文的demo开发是基于github上的一个开源项目Altbeacon:https://github.com/AltBeacon/android-beacon-library

Aitebeacon官方网站:http://altbeacon.github.io/android-beacon-library/

本文参照了:http://blog.csdn.net/wjskeepmaking/article/details/52067585

本文代码已上传至CSDN:http://download.csdn.net/download/eueheuen/10212291

1,创建工程之后,在buid.gradle中导入AltBeacon Library:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    //noinspection GradleDynamicVersion
    implementation 'org.altbeacon:android-beacon-library:2+'
}

2,创建一个Application,这个Application需要实现一个接口:BootstrapNotifier:

public class MyApp extends Application implements BootstrapNotifier {
    private RegionBootstrap regionBootstrap;
    private BackgroundPowerSaver backgroundPowerSaver;
    @Override
    public void onCreate() {
        super.onCreate();

        BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().clear();
        beaconManager.getBeaconParsers().add(new BeaconParser()
                .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
        Region region = new Region("all-region-beacon",null,null,null);
        regionBootstrap = new RegionBootstrap(this,region);
        backgroundPowerSaver = new BackgroundPowerSaver(this);

    }

    @Override
    public void didEnterRegion(Region region) {

    }

    @Override
    public void didExitRegion(Region region) {

    }

    @Override
    public void didDetermineStateForRegion(int i, Region region) {

    }
}

3,添加相关权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

4,创建Service:

public class BeaconService extends Service implements BeaconConsumer, RangeNotifier {

    //单位:毫秒
    //后台扫描
    private static final long DEFAULT_BACKGROUND_SCAN_PERIOD = 1000L;
    private static final long DEFAULT_BACKGROUND_BETWEEN_SCAN_PERIOD = 0L;

    //前台扫描
    private static final long DEFAULT_SCAN_PERIOD = 1000L;
    private static final long DEFAULT_BETWEEN_SCAN_PERIOD = 500L;

    private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
    private MyBR myBR;

    public BeaconService() {

    }

    @Override
    public void onCreate() {
        super.onCreate();
        initBeacon();
        beaconManager.bind(this);

        myBR = new MyBR();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("");
        registerReceiver(myBR,intentFilter);

    }

    private void initBeacon() {
        //设置前台扫描时长
        beaconManager.setForegroundScanPeriod(DEFAULT_SCAN_PERIOD);
        //设置前台扫描间隔
        beaconManager.setForegroundBetweenScanPeriod(DEFAULT_BETWEEN_SCAN_PERIOD);
        //设置每个蓝牙LE扫描周期的持续时间(以毫秒为单位)以查找信标。
        // 此函数用于设置调用bind(org.altbeacon.beacon.BeaconConsumer)之前的时间段或在背景/前景之间切换的时间段。
        // 要使其在已经运行的扫描(在下一个周期开始时)生效,请调用updateScanPeriods()
        //设置后台扫描时长
        beaconManager.setBackgroundScanPeriod(DEFAULT_BACKGROUND_SCAN_PERIOD);

        //当没有测距/监控客户端位于前台时,设置每个蓝牙LE扫描周期之间不扫描的时间(以毫秒为单位)
        //设置后台扫描间隔
        beaconManager.setBackgroundBetweenScanPeriod(DEFAULT_BACKGROUND_BETWEEN_SCAN_PERIOD);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (beaconManager != null){
            beaconManager.removeRangeNotifier(this);
        }
        if (myBR!= null){
            unregisterReceiver(myBR);
            Toast.makeText(this,"完犊子了",Toast.LENGTH_SHORT).show();
            Log.d("MyBeaconNum","完犊子了");
        }

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onBeaconServiceConnect() {

        Region region = new Region("all-region-beacon", null, null, null);
        beaconManager.addRangeNotifier(this);
        try {
            beaconManager.startRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
        List<Beacon> beacons = new ArrayList<>();
        for (Beacon beacon : collection) {
            beacons.add(beacon);
        }

        Log.d("MyBeaconNum",beacons.size()+"");

        Intent intent = new Intent(MainActivity.BEACON_ACTION);
        intent.putParcelableArrayListExtra("beacon", (ArrayList<? extends Parcelable>) beacons);//因为Beacon继承了Parcelable,
        sendBroadcast(intent);
    }

    class MyBR extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            stopSelf();
        }
    }
}

5,不要忘记在Manifest中注册Service:

<service
    android:name=".BeaconService"
    android:enabled="true"
    android:exported="true"
    tools:replace="android:exported"
    android:isolatedProcess="false"
    android:label="beacon" >
</service>

6,MainActivity:

public class MainActivity extends AppCompatActivity {
    private BeaconBroadcastReceiver beaconBroadcastReceiver;
    private static final String TAG = "MyTAG";
    public static final String BEACON_ACTION = "com.example.lenovo.mybeaconlib";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        beaconBroadcastReceiver = new BeaconBroadcastReceiver();
        Intent intent = new Intent(MainActivity.this, BeaconService.class);
        startService(intent);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //停止服务
        Intent intent=new Intent("PleaseStopService");
        sendBroadcast(intent);

        if (beaconBroadcastReceiver != null){
            try{
                unregisterReceiver(beaconBroadcastReceiver);
            }catch (Throwable ignored){
                
            }
           
        }

    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(beaconBroadcastReceiver, getBeaconIntentFilter());
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (beaconBroadcastReceiver != null){
            unregisterReceiver(beaconBroadcastReceiver);
        }

    }

    class BeaconBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BEACON_ACTION.equals(action)) {
                List<Beacon> beacons = intent.getParcelableArrayListExtra("beacon");
                Log.i(TAG, "onReceive: "+ beacons.size());
                for (Beacon beacon : beacons){

                    //获取 uuid,major,minor
                    String uuid = String.valueOf(beacon.getId1());
                    String major = String.valueOf(beacon.getId2());
                    String mMinor = String.valueOf(beacon.getId3());
                    int minor = Integer.parseInt(mMinor);

                    String text = "uuid: " + beacon.getServiceUuid() + "\r\n" +
                            "dis: " + beacon.getDistance() + "m" + "\r\n" +
                            "BluetoothName: " + beacon.getBluetoothName() + "\r\n" +
                            "BluetoothAddress: " +  beacon.getBluetoothAddress() + "\r\n" +
                            "ParserIdentifier(分析器标识符): " +  beacon.getParserIdentifier() + "\r\n" +
                            "BeaconTypeCode: " +  beacon.getBeaconTypeCode() + "\r\n" +
                            "Rssi: " +  beacon.getRssi() + "\r\n" +
                            "RunningAverageRssi:"+beacon.getRunningAverageRssi() + "\r\n" +
                            "TxPower: " +  beacon.getTxPower() + "\r\n" +
                            "ExtraDataFields:"+beacon.getExtraDataFields() +"\r\n" +
                            "DataFields:"+beacon.getDataFields()+"\r\n" +
                            "BeaconToString:"+beacon.toString();

                    Log.i(TAG, "onReceive: "+ text);

                }
                Log.i(TAG, "onReceive: "+ "**********************************");
            }
        }
    }

    IntentFilter getBeaconIntentFilter() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BEACON_ACTION);
        return intentFilter;
    }

}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值