精华内容
下载资源
问答
  • 下面小编就为大家分享一篇android获取附近蓝牙设备并计算距离的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • android获取附近蓝牙设备并计算距离

    千次阅读 2018-01-19 15:59:47
    // 获取本地蓝牙适配器 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 判断是否支持蓝牙,并确认打开该功能。 // 判断手机是否支持蓝牙 if (mBluetoothAdapter == null) { Toast.makeText...

    需要用到本地蓝牙适配器

     // 获取本地蓝牙适配器
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    

    判断是否支持蓝牙,并确认打开该功能。

      // 判断手机是否支持蓝牙
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
            finish();
        }
    
        // 判断是否打开蓝牙
        if (!mBluetoothAdapter.isEnabled()) {
            // 弹出对话框提示用户是后打开
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, 1);
            // 不做提示,强行打开
            // mBluetoothAdapter.enable();
        }else {
            // 不做提示,强行打开
             mBluetoothAdapter.enable();
        }
    

    获取手机已经配对的蓝牙设备

    // 获取已经配对的设备
        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
                .getBondedDevices();
    
        // 判断是否有配对过的设备
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                // 遍历
                mDevicesList.add(device.getAddress());
                tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");
            }
        }
    

    注册异步搜索蓝牙设备的广播

    // 找到设备的广播
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    // 注册广播
    registerReceiver(receiver, filter);
    // 搜索完成的广播
    filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    // 注册广播
    registerReceiver(receiver, filter);
    

    搜索蓝牙的方法

      private void scanBluth() {
    // 设置进度条
    setProgressBarIndeterminateVisibility(true);
    setTitle("正在搜索...");
    // 判断是否在搜索,如果在搜索,就取消搜索
    if (mBluetoothAdapter.isDiscovering()) {
    mBluetoothAdapter.cancelDiscovery();
    }
    // 开始搜索
    mBluetoothAdapter.startDiscovery();
    }
    

    广播接收器

     private final BroadcastReceiver receiver = new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 收到的广播类型
            String action = intent.getAction();
            // 发现设备的广播
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // 从intent中获取设备
                BluetoothDevice device = intent
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                String aa = tvDevices.getText().toString() + "";
                if (aa.contains(device.getAddress())) {
                    return;
                } else {
                    // 判断是否配对过
                    if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                        // 添加到列表
                        short rssi = intent.getExtras().getShort(
                                BluetoothDevice.EXTRA_RSSI);
                        int iRssi = abs(rssi);
     // 将蓝牙信号强度换算为距离
                        double power = (iRssi - 59) / 25.0;
                        String mm = new Formatter().format("%.2f", pow(10, power)).toString();
                        tvDevices.append(device.getName() + ":"
                                + device.getAddress() + " :" + mm + "m" + "\n");
                    }else {
    
                    }
                }
                // 搜索完成
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
                    .equals(action)) {
                // 关闭进度条
                setProgressBarIndeterminateVisibility(true);
                setTitle("搜索完成!");
                mBLHandler.sendEmptyMessageDelayed(1, 1000);
            }
        }
    };
    

    代码里我添加了循环扫描的Handler

        // 用于循环扫描蓝牙的hangdler
    Handler mBLHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    scanBluth();
    
                    break;
                default:
                    break;
            }
        }
    };
    

    项目里用到前期写的一个权限管理器,具体去前边看,地址:

    http://blog.csdn.net/tangyayong/article/details/79093210

    用到的权限为

    //所有手机需要的权限,蓝牙功能才能正常使用
     <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    //部分手机(如小米等)需要将下面两个权限添加进去,蓝牙功能才能正常使用
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
    展开全文
  • 蓝牙室内定位技术是利用在室内安装的若干个蓝牙局域网接入点,把网络维持成基于多用户的基础网络连接模式,并保证蓝牙局域网接入点始终是这个微网的主设备,然后通过测量信号强度对新加入的盲节点进行三角定位。...

    蓝牙室内定位技术是利用在室内安装的若干个蓝牙局域网接入点,把网络维持成基于多用户的基础网络连接模式,并保证蓝牙局域网接入点始终是这个微网的主设备,然后通过测量信号强度对新加入的盲节点进行三角定位。

    88de47563add79ef80fa54adb234faee.png

    目前蓝牙 iBeacon 定位的方式主要有两种:基于 RSSI(接收信号强度指示)和基于定位指纹,或者两者结合。

    基于距离最大的问题在于,室内环境复杂,而蓝牙作为2.4GHZ高频信号,会受到很大的干扰。加上室内的各种反射折射,手机所获取的 RSSI 值并没有太大的参考价值;而与此同时,为了提高定位精度,就不得不对 RSSI 值进行多次获取来平滑结果,这就意味着时延的增加。而基于定位指纹的最大问题在于,前期获取指纹数据的人力成本和时间成本非常高,数据库维护困难。而且如果商场增添了新的基站,或者进行了其他改造,原始的指纹数据可能就不再适用。所以,如何在定位精度、延时和成本之间进行权衡和取舍,就成了蓝牙定位的核心的问题。

    市场上主流的蓝牙定位精度是70%的地段在2米以内,部分公司可以做到90%的地段在2米以内。目前市场上主流的蓝牙定位技术都是基于三角定位算法,通过手机获取周围蓝牙基站的信号强度,再通过其他的一些辅助方法比如加权平均算法,时间加权算法,惯性导航算法,卡尔曼滤波算法,高斯滤波算法等来计算出当前位置。

    eadcf63638dfd0ec5362c2ffd12b2a3f.png

    优势:设备体积小、短距离、低功耗,容易集成在手机等移动设备中;

    缺点:蓝牙传输不受视距的影响,但对于复杂的空间环境,蓝牙系统的稳定性稍差,受噪声信号干扰大且在于蓝牙器件和设备的价格比较昂贵;

    适用:蓝牙室内定位主要应用于对人的小范围定位,例如单层大厅或商店。

    95e9f3396360f49141ad4a0bac3c6b3f.png
    展开全文
  • android 蓝牙 获取蓝牙地址名字

    千次阅读 2018-03-15 10:47:35
    蓝牙是一种支持设备之间短距离通讯的无限电技术(电话,笔记本,耳机)BluetoothAdapter 本地蓝牙适配器首先需要添加蓝牙权限:&lt;uses-permission android:name="android.permission.BLUETOOTH"/&...

    大笑蓝牙是一种支持设备之间短距离通讯的无限电技术(电话,笔记本,耳机)

    BluetoothAdapter 本地蓝牙适配器

    首先需要添加蓝牙权限:

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    然后再acitivity
    //获取本地蓝牙的适配器
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    //判断蓝牙功能是否存在
    if (mBluetoothAdapter == null) {
    showToest("该设备不支持蓝牙");
    return;
    }
    //获取名字 MAC地址
    String name = mBluetoothAdapter.getName();
    String address = mBluetoothAdapter.getAddress();
    Log.i(TAG, "蓝牙名: "+name+"mac地址:"+address);
    //获取蓝牙的状态
    int state = mBluetoothAdapter.getState();
    switch (state){
    case BluetoothAdapter.STATE_ON:
    showToest("蓝牙已经打开");
    Log.i(TAG, "蓝牙已经打开 ");
    break;
    case BluetoothAdapter.STATE_OFF:
    showToest("蓝牙已经关闭");
    Log.i(TAG, "蓝牙已经关闭 ");
    break;
    case BluetoothAdapter.STATE_TURNING_OFF:
    showToest("蓝牙正在关闭");
    Log.i(TAG, "蓝牙正在关闭 ");
    break;
    case BluetoothAdapter.STATE_TURNING_ON:
    showToest("蓝牙正在打开");
    Log.i(TAG, "蓝牙正在打开 ");
    break;
    default:
    break;
    }
    //判断蓝牙是否已经打开
    if (mBluetoothAdapter.isEnabled()){
    showToest("蓝牙已经处于打开状态");
    //关闭蓝牙
    Boolean isClose=mBluetoothAdapter.disable();
    Log.i(TAG, "蓝牙是否关闭"+isClose);
    }else{
    // Boolean isopen = mBluetoothAdapter.enable();
    // showToest("蓝牙的状态"+isopen);
    //调用系统API打开
    Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(intent,RESULE_OPEN);
    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(RESULE_OPEN==0x01){
             if(resultCode==RESULT_CANCELED){
                 showToest("请求失败");
             }else{
                 showToest("请求成功...");
             }
        }
    }
    
    public void  showToest(String mgs){
        Toast.makeText(MainActivity.this,mgs,Toast.LENGTH_LONG).show();
    }

    展开全文
  • 无非是两个:一个是利用bluetoothgatt来实现蓝牙设备连接时调用getBluetoothrssi来获取,还有一个是在广播处发现蓝牙设备时可以获取rssi。但是对于持续获取的问题依然没有得到解决,对于一个设备的连续获取。我也想...
  • 蓝牙名字和地址蓝牙设备作为一种短距离无线连接的载体,由于其体积小、操作方便等优点,在耳机、车载和电脑键鼠等应用方面被越来越多的消费者所青睐,渐渐走入大众视野中。作为蓝牙设备的使用者,我们的第一想法往往...

    蓝牙名字和地址

    蓝牙设备作为一种短距离无线连接的载体,由于其体积小、操作方便等优点,在耳机、车载和电脑键鼠等应用方面被越来越多的消费者所青睐,渐渐走入大众视野中。

    b179ce135cb3a0d0465a6afe7e789abf.png

    作为蓝牙设备的使用者,我们的第一想法往往是这个蓝牙设备的名字是什么,这样才知道去连接哪个蓝牙设备,而一个蓝牙名字又对应着全球唯一的蓝牙地址,这其实才是蓝牙设备的关键。本篇文章我们就来聊聊蓝牙名字和地址的这些事。

    • 蓝牙名字:蓝牙设备的名称,代表这个蓝牙设备,类似于我们的姓名
    • 蓝牙地址:一组由48位(6字节)二进制表示的数据,是蓝牙设备的唯一标识。每一个蓝牙设备的地址都是不一致的(就好比世上没有两片相同的落叶),类似于我们的基因
    094784965b8b97643d1cdbc4e6493424.png

    所以市面上众多的蓝牙设备尽管名字是有可能相同的,但蓝牙地址基本上是不一致的。但也有另外,因为从上图可以知道LAP部分虽然有24位二进制来进行分配,但如果这家厂商的设备数量太多,超过了2的24次方(哈哈,概率极小),就会出现蓝牙地址重复的现象。

    现在我们大概了解了蓝牙Name和Address的关系,那在安卓源码中我们一般是如何获取这两个值的呢?这就随我接着往下看。

    获取这两个值需要分情况来讨论,因为蓝牙设备首次开机和重启开机的获取流程有差异,所以接下来分别作出分析。

    1、首次开机(fastboot刷机完成后首次开机)

    这种情况下,应用获取到蓝牙名字和地址一般是从蓝牙协议栈bluedroid获取来的,详情可以参照如下时序图来分析:

    4e7fcf8b83011ec8fb2133d5c41c12b2.png

    从上图可以明显得知,底层bluedroid上报的蓝牙名字和地址最终都会存储于全局变量Settings的xml文件中:/data/system/users/0/settings_secure.xml,索引名分别为 bluetooth_name bluetooth_address

    第三方应用通过蓝牙适配器BluetoothAdapter对外提供的接口getName()和getAddress()就可以获取到存储于BluetoothManagerService中的蓝牙名字和地址。

    但是这里还有如下几个问题需要解决:

    问题1:首次开机,上述时序图中BluetoothManagerService.handleOnBootPhase()的处理中为什么是打开蓝牙的操作而不是主动去获取蓝牙的Name和Address ?

    解答:系统开机会根据关机前的蓝牙状态来决定开机后是否自动打开蓝牙。

    但是重新刷机后的首次开机会根据配置文件的值来决定是否默认打开蓝牙。

    配置文件路径:frameworks/base/packages/SettingsProvider/res/values/defaults.xml

    该文件中的 name="def_bluetooth_on" 的值会在刷机后的首次开机创建安卓数据库时写入Setting中的settings_global.xml文件中,索引值为 name="bluetooth_on"。

    执行写入数据的处理函数为:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java中的loadBooleanSetting(stmt,Settings.Global.BLUETOOTH_ON,R.bool.def_bluetooth_on)。

    其他情况下的系统重启后,根据settings_global.xml文件中存储的关机前的蓝牙状态来做处理。

    因此刷完系统首次开机后,程序会根据配置文件中的默认值来决定是否打开蓝牙,如果默认不打开蓝牙,则程序也会主动读取Name和Address,这个操作其实是bind蓝牙服务及初始化底层的蓝牙模块,等获取到这两个值后再执行unbind蓝牙服务的动作。

    问题2:蓝牙名字的原始定义在哪?

    解答:上面时序图中获取到的蓝牙名字也只是从蓝牙协议栈的内存里获取到的值,那这个值是从哪儿来的呢?

    分析协议栈的代码,有这几个地方可以获取到Name

    • 步骤A:cfg2prop()->btif_config_get_str()查找/data/misc/bluedroid/bt_config.conf文件中[Adapter]是否包含Name,该文件是协议栈初始化时创建的,保存相关变量
    • 步骤B:如果步骤A没有获取到Name,则从btif_dm_get_adapter_property()->btif_get_default_local_name()中获取到宏定义的变量BTM_DEF_LOCAL_NAME的值作为蓝牙名字,该宏定义的路径为:devicegenericcommonbluetoothbdroid_buildcfg.h

    所以获取蓝牙名字的流程图大概如下所示:

    f722ea324ab930e3bd74c7c2a2288914.png

    问题3:蓝牙地址从哪儿获取的?

    解答:类似于蓝牙名字是从协议栈相关的配置文件中获取的,蓝牙地址则是从蓝牙芯片获取上来的。

    btif_storage_get_adapter_property( )函数中通过接口 controller_get_interface()->get_address()获取地址值。

    而controller.c中的address赋值于:

    5ad44ecc9be3684624486cc2cea0ec32.png

    HCI交互为:

    131a6e9a4cce0e719bff622337cd2452.png

    第三方应用需要获取蓝牙地址的话,该应用除了"LOCAL_MAC_ADDRESS"的权限外,还需具备系统权限,否则获取到的地址为默认的错误值:"02:00:00:00:00:00"

    2、重启开机

    从以上分析可以知道,系统重启前会将蓝牙状态、名字和地址等参数存储于Setting的xml文件中,所以系统重启后,会首先从这些xml文件中读取参数,进而BluetoothManagerService在初始化时就已经获取了这些参数值。

    现在我们已经分析完成了两种场景下的蓝牙名字和地址的获取流程,至此安卓系统中的蓝牙Name和Adress就会一直存储于Settings的xml文件中。

    使用蓝牙设备过程中,蓝牙地址一经固件写入基本上是不可更改的。但蓝牙名字却是可以修改的,第三方应用使用BluetoothAdapter对外提供的接口setName()将新名字写入蓝牙协议栈,存储于bt_config.conf中,这样保证后续主动读取名字时先读取出更改后的名字。同时协议栈也会将最新的Name上报给服务层,通过广播通知BluetoothManagerService更改Settings中的Name值。

    好了,本篇的蓝牙名字和地址的分析就到这里,感兴趣的小伙伴欢迎私信留言一起讨论。

    展开全文
  • 我想获取RSSI来计算大概距离。** **另外下面这些网上搜到的代码我试过了也没用** /*------------------------------------------------------------------------------*/ > 要拿到蓝牙信号指示...
  • Android 蓝牙

    2014-02-27 14:34:34
    从查找蓝牙设备到能够相互通信要经过几个基本步骤(本机做为服务器): 1.设置权限 在manifest中配置   2.启动蓝牙 首先要查看本机是否支持蓝牙,获取BluetoothAdapter蓝牙适配器对象 ...
  • 蓝牙的使用

    2018-04-12 14:10:58
    安卓上的蓝牙 一种是传统蓝牙 搜索 ...缺点就是因为是依据ios系统 所以安卓系统的api不是很多 苹果上可以一次直接获取满足条件的所有蓝牙设备 并且可以获取信号量级 距离等大概数据 而安卓系统则只能获得基本数据...
  • 蓝牙是一种支持设备间近距离传输数据的无线电技术,支持有蓝牙功能的设备一般有:手机,笔记本电脑,无线蓝牙耳机等。 该小例子就要是获取手机蓝牙基本信息及打开关闭蓝牙操作。 public class MainActivity extends ...
  • iOS蓝牙原生封装,助力智能硬件开发

    千次阅读 热门讨论 2017-09-18 16:31:40
    引导语 前言 系统蓝牙状态监听 蓝牙搜索 蓝牙设备的连接 ...获取蓝牙设备距离 其他 结束语 引导语 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能...
  • Android蓝牙操作

    2014-03-17 12:55:32
    从查找蓝牙设备到能够相互通信要经过几个基本步骤(本机做为服务器): 1.设置权限 在manifest中配置 Xml代码 2.启动蓝牙 首先要查看本机是否支持蓝牙,获取BluetoothAdapter蓝牙适配器...
  • 一、代入 Bluetooth是一种无线标准技术,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波);是目前使用最广泛的无线通讯协议,近距离无线通讯...设置/获取蓝牙
  • 蓝牙是一种支持设备间近距离传输数据的无线电技术,支持有蓝牙功能的设备一般有:手机,笔记本电脑,无线蓝牙耳机等。 该小例子就要是获取手机蓝牙基本信息及打开关闭蓝牙操作。
  • Android Bluetooth蓝牙基本操作

    千次阅读 2017-04-13 13:40:44
    从查找蓝牙设备到能够相互通信要经过几个基本步骤(本机做为服务器):  1.设置权限  在manifest中配置  2.启动蓝牙  首先要查看本机是否支持蓝牙,获取BluetoothAdapter蓝牙适配器对象...
  • 蓝牙是一种支持设备间近距离传输数据的无线电技术,支持有蓝牙功能的设备一般有:手机,笔记本电脑,无线蓝牙耳机等。 该小例子就要是获取手机蓝牙基本信息及打开关闭蓝牙操作。 public class MainActivity ...
  • 蓝牙是一种支持设备间短距离通信的无线电技术。 支持移动电话、笔记本电脑、无线耳机、智能小车等设备之间进行信息的交换。 Android支持的蓝牙协议栈。 BluetoothAdapter类。 权限。 蓝牙模块的Mac地址获取
  • 关于蓝牙这一模块,确实是有一定难度的,如果想做得好做得智能点,就必须要下一番功夫...手机与蓝牙设备距离 界面如下: 蓝牙初始化 /** * 初始化蓝牙(onshow调用) */ bleInit: function () { let that = this
  • 一,Ble 4.0简介低功耗蓝牙,低成本、短距离、可互操作的鲁棒性无线技术,从...二,APIBluetoothAdapter 蓝牙适配器,通过它来获取蓝牙地址、蓝牙名字、绑定设备、扫描模式、蓝牙状态等参数(后面代码有详细说明) B
  • Android Studio实现蓝牙聊天通讯我的项目项目源码程序截图开发流程创建项目通信原理Android Studio近距离通信:Bluetooth蓝牙工作流程蓝牙通信API代码阶段蓝牙通信添加权限查找设备获取查找结果设备绑定官方文档参考...
  • 1、设置模块:主要包括蓝牙打开与关闭,设备的连接与断开,设置电场报警值和现场检测距离等。 2、红外模块:主要以动画的形式来显示红外测量的距离。 3、超声模块:主要以动画的形式模拟超声波,同时以动画的形式...
  • 蓝牙在日常生活中广泛使用的一项技术,小程序给了我们前端工程师一个控制蓝牙的方法,带上你的设备,来看看怎么控制你的蓝牙设备吧。 1. 背景介绍 蓝牙是爱立信公司创立的一种无线技术标准,为短距离的硬件设备...
  • 蓝牙 Beacon 是建立在低功耗蓝牙协议基础上的一种广播协议,同时它也是拥有这个协议的一款低功耗蓝牙设备(从机),但是它不能和任何低功耗蓝牙主机进行连接,借此向周围进行连续性广播。 1、作用 蓝牙 Beacon 是一...
  • 距离传感器: ...(获取当前设备,并且将当前设备的proximityMonitoringEnabled属性值设置为YES) 第二步:监听传感器的变化;(利用通知,当距离传感器前方有物体接近时会发送一个通知,离开时也会
  • 主要包括Android开发技术基础、获取并编译源码、Android技术核心框架分析、Android传感器系统分析、使用地图定位、光线传感器详解、接近警报传感器详解、磁场传感器详解、加速度传感器详解、方向传感器详解、陀螺仪...
  • 2021-04-01

    2021-04-01 13:11:12
    (4)扫描附近的蓝牙设备:展现在listView中 (5)获得已经配对的设备:展现在listView中 3.广播 (1)发送方:手机内部发送系统广播 (2)接收方:注册+解除注册+定义接受者类 4.数据的传输:两个手机发送数据 socket ...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
关键字:

获取蓝牙设备距离