最近在做android 蓝牙Beacon开发,记录一下一些个人心得:
1.蓝牙Beacon主要的应用场景:
(1)用于室内定导航,如大型超市、博物馆、机场、校园等;
(2)信息推送(商场活动、景区游览、博物馆展品信息);
(3)和微信摇一摇结合,摇互动、摇签到、摇导航等。

2.蓝牙beacon广播包广播出来的信息包括4个方面:
(1)蓝牙beacon的MAC地址(广播包来自于哪一个 MAC 地址的从机设备);
(2)蓝牙beacon的信号强度RSSI值(扫描者在搜索到此Beacon时的信号强度);
(3)还有广播出来的数据包的内容,该数据包内容最多可以包含 31 个字节的内容(超出会广播失败);
(4)蓝牙beacon的UUID(服务ID,也可以携带数据包内容);

3.android设备硬件要求:
支持蓝牙BLE功能
//判断手机是否支持BLE
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Log.i(TAG, "支持BLE");
} else {
    Log.i(TAG, "不支持BLE");
}

4.权限要求:

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

5.判断是否授权定位权限:
这里我使用的权限库是:  implementation 'pub.devrel:easypermissions:1.1.0',实现方法不再赘述。
(1)首先检查权限:

private String[] perms = { Manifest.permission.ACCESS_FINE_LOCATION};
    private static final int REQUEST_CODE = 0x01;
    private void checkPerms() {
        if(Build.VERSION.SDK_INT>=23){
            if(EasyPermissions.hasPermissions(MainActivity.this,perms)){
                sendBeacon();
            }else {
                EasyPermissions.requestPermissions(MainActivity.this,"需开启定位权限",REQUEST_CODE,perms);
            }
        }else {
            sendBeacon();
        }
    }

(2)打开蓝牙:

private BluetoothLeAdvertiser mBluetoothLeAdvertiser;
    private BluetoothAdapter bluetoothAdapter;
    private void sendBeacon(){
        BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
        bluetoothAdapter = bluetoothManager.getAdapter();
        //实际项目需监听蓝牙已开启,再执行后续操作,本demo不做详细阐述,只提供思路
        if(bluetoothAdapter.isEnabled()){  // 判断蓝牙是否可用
            bluetoothAdapter.enable();  // 打开蓝牙
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mBluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser();
                    startAdvertising();
                }
            },2000);
        }
    }

6.设置广播:
先来了解一下AdvertiseSettings,它主要是设置广播模式,用来控制广播性能及延迟。

6.1 setAdvertiseMode(设置频率):
ADVERTISE_MODE_LOW_LATENCY 100ms (低延迟)
ADVERTISE_MODE_BALANCED  250ms   (平衡模式)
ADVERTISE_MODE_LOW_POWER 1s      (低功耗)

6.2 setTxPowerLevel(设置广播发送功率,由高到低):
ADVERTISE_TX_POWER_HIGH = 3;
ADVERTISE_TX_POWER_MEDIUM = 2;
ADVERTISE_TX_POWER_LOW = 1;
ADVERTISE_TX_POWER_ULTRA_LOW = 0;

6.3 setConnectable(设置广播类型是否可连接)
true:可连接
false:不可连接

6.4 setTimeout(设置广播超时时间):
int型,不得超过180000毫秒;如果设置值为0将禁用时间限制,一直广播;

private AdvertiseSettings buildAdvertiseSettings() {
        AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
        settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
        settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
        settingsBuilder.setConnectable(false); // 一般设置不可连接,可根据实际场景设置
        settingsBuilder.setTimeout(0);
        return settingsBuilder.build();
    }

7.设置UUID及数据包:
AdvertiseData方法介绍:
addServiceUuid(ParcelUuid serviceUuid): // 添加服务UUID,也可以通过多次add的方式来组自定义数据包
addServiceData(ParcelUuid serviceDataUuid, byte[] serviceData):  // 添加服务UUID及自定义数据包
addManufacturerData(int manufacturerId, byte[] manufacturerSpecificData):   // 添加制造商特定UUID及自定义数据包
setIncludeTxPowerLevel(boolean includeTxPowerLevel):  // 发送数据包中是否应包括发射功率电平
setIncludeDeviceName(boolean includeDeviceName):       // 是否包含设备名称,尽量不要设置为true,否则会导致可携带的自定义数据包大大减小;
这里几种发送数据包的方式type不同,具体可在接收数据包中查看。

private final static String Service_UUID = "00001234-0000-1000-8000-00805F9B34FB";
    // 发送自定义数据包
    private AdvertiseData buildAdvertiseData() {
        AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
      //  dataBuilder.setIncludeDeviceName(true);

dataBuilder.addServiceUuid(ParcelUuid.fromString(Service_UUID));

return dataBuilder.build();
    }

8.蓝牙Beacon广播结果回调
这里说一下返回的常见的几种errorCode:

public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;   // 常见错误,广播的数据包太大,无法启动广播,检查一下是否有设置dataBuilder.setIncludeDeviceName(true);如果有,改为false;如果未设置,那就是数据包超出了最大长度。
    public static final int ADVERTISE_FAILED_TOO_MANY_ADVERTISERS = 2;// 没有可用的广播实例
    public static final int ADVERTISE_FAILED_ALREADY_STARTED = 3; //广播已经开始,无法开始广播
    public static final int ADVERTISE_FAILED_INTERNAL_ERROR = 4;  // 由于内部错误,操作失败
    public static final int ADVERTISE_FAILED_FEATURE_UNSUPPORTED = 5; //该平台不支持此功能
    个人在实际开发的过程中,还遇到过errorCode=7的情况,而出现这种情况是由于sendDatas中的数据包太短,仅供参考。

public class MyAdvertiseCallback extends AdvertiseCallback {

private String TAG = getClass().getName();
        @Override
        public void onStartFailure(int errorCode) {
            super.onStartFailure(errorCode);
            Log.i(TAG, "AdvertiseCallback onStartFailure");
        }

@Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);
            Log.i(TAG, "AdvertiseCallback onStartSuccess");
        }
    }

9.开始蓝牙广播

private void startAdvertising() {
        if (mAdvertiseCallback == null) {
            AdvertiseSettings settings = buildAdvertiseSettings();
            AdvertiseData data = buildAdvertiseData();
            mAdvertiseCallback = new MyAdvertiseCallback();
            if (mBluetoothLeAdvertiser != null) {
                if(mAdvertiseCallback != null){
                    mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);  //  如果之前未停止广播,先停止广播
                }
                mBluetoothLeAdvertiser.startAdvertising(settings, data, mAdvertiseCallback);
            }
        }
    }

10.停止广播:

if (mBluetoothLeAdvertiser != null) {
            mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);
    }

这里推荐一款软件-- nRF Connect ,可以接收到蓝牙Beacon包,以验证自己发的包数据。
    
以上即为本人在开发蓝牙Beacon的一些心得,如有不足之处,欢迎指导~

android 蓝牙Beacon开发相关推荐

  1. Android 蓝牙通信开发

    Android 蓝牙通信开发 Receiver的设置 一.Receiver1(蓝牙状态的改变通过广播接收) 二.Receiver2(蓝牙搜索到设备.绑定设备(配对)通过广播接收) 服务端代码 客户端代 ...

  2. Android 蓝牙BLE开发详解

    Android 蓝牙BLE开发详解 由于年初接手了个有关蓝牙BLE的项目,开始了对蓝牙ble的学习,经过长时间的慢慢学习(学得太慢,太拖了),终于了解了该怎么写蓝牙BLE,现在就给大家分享一下. 一. ...

  3. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  4. Android蓝牙BLE开发

    最近正在研究Android的蓝牙BLE开发学习,以下是自己做的个人总结 1.1何为BLE? 首先得说明什么是低功耗蓝牙BLE,BLE的全称为Bluetooth low energy(或称Blooth ...

  5. Android蓝牙手柄开发

    手柄相应的按键 摇杆监听(已连接状态) 通过google找到官方示例https://developer.android.com/training/game-controllers/controller ...

  6. Android 蓝牙Hid开发

    原文地址: https://blog.csdn.net/VNanyesheshou/article/details/61914974 Demo下载:http://www.demodashi.com/d ...

  7. Android蓝牙BLE开发(一)-基本原理

    公司有需求要做蓝牙BLE传输,经查阅后发现关于BLE开发的知识还真不多.对于BLE开发的同学来说,我的建议是先快速了解一下BLE的基本原理,磨刀不误砍柴工. 什么是BLE BLE全称Bluetooth ...

  8. android蓝牙通讯方法,Android蓝牙通信开发教程(详解版)

    Android 系统提供蓝牙 API 包 android.bluetooth,允许手机设备通过蓝牙与其他设备进行无线连接. Android 的蓝牙 API 可提供以下功能: 需要说明的是,Androi ...

  9. Android 蓝牙游戏开发(一)

    蓝牙4.0 据说是超低功耗,随之而来的是智能手表.手环.同屏对战塔防等.咱也了解了解相关的技术,做技术储备.今天需要总结的是蓝牙聊天的例子,例子来源于Android的官网.我们把关键的技术理一下. 关 ...

  10. android 蓝牙控制开发,Android开发工控软件--蓝牙控制

    最近一直在忙Android的工控软件设计,写一点心得,希望对这方面开发的有一点带你帮助. 1)从蓝牙接收了数据又如何保存? 之前没有想过接收的数据如何保存,就简单的用一个字节数组进行保存,后来处理数据 ...

最新文章

  1. unique_ptr使用介绍
  2. 关于Ehcache缓存中timeToLiveSeconds和timeToIdleSeconds
  3. 【win10】局域网内两台win10共享文件夹
  4. idea设置自动清除不需要的import包,自动清除导包
  5. jquey的parent()和parents()的区别
  6. java 学习案例之英汉字典
  7. 提示illegal reference to data member'CPMAgentManageDlg::m_matrixMatrixSt'in a static member function
  8. 所有子模块都要执行的checkstyle检查
  9. SQL Sverver 2000 管理安全性
  10. MPI集群安装、MPI安装
  11. matlab 创建同型矩阵_以经典同型样式创建新地图
  12. 动态壁纸html怎么设置方法,动态壁纸怎么设置
  13. OpenWrt固件刷入及相关实验
  14. 计算pi小数点后10000位
  15. python给成绩表加上姓名列_Python Pandas 基本操作教学之成绩表
  16. sql server 添加表注释、字段注释
  17. 内忧外患中,黄章的梦想机难救魅族一世
  18. 【C++入门】函数重载,引用,内联函数......
  19. mac版phpstorm中文切换为英文
  20. 解决windows10右下脚工具栏图标显示不正常问题

热门文章

  1. 【一句日历】2019年8月
  2. 分享到QQ好友 申请腾讯开放平台审核与认证
  3. 基于双向 GRU 的文本分类 Python 算法实战
  4. 2017杭州云栖大会精华PPT
  5. 医学图像分析的发展历史
  6. UE4天气效果加白天黑夜的平滑过度切换
  7. 武汉星起航跨境电商——亚马逊日本站JCT政策将实现改革
  8. bootstrap-select 的多选+模糊查询下拉框详解
  9. HTML打开eml文件,eml文件怎么打开?.eml是什么格式文件?
  10. weblogic安装与配置注意事项