精华内容
下载资源
问答
  • (1)设备不支持蓝牙4.0及以上协议 (2)设备已经被另一个主机设备连接上了 (3)设备已经被另一个主机设备绑定上了 (4)没有打开蓝牙功能/不支持蓝牙功能/驱动有问题 (5)没有授权App使用蓝牙/没有授权App使用...

    有以下几种可能情况之一:
    (1)设备不支持蓝牙4.0及以上协议
    (2)设备已经被另一个主机设备连接上了
    (3)设备已经被另一个主机设备绑定上了
    (4)没有打开蓝牙功能/不支持蓝牙功能/驱动有问题
    (5)没有授权App使用蓝牙/没有授权App使用定位服务
    (6)手机/设备出Bug

    展开全文
  • 蓝牙设备

    2015-11-25 14:57:57
    蓝牙是啥就不再说了,因为肯定解释不清楚蓝牙是啥,有兴趣请移步... 通常情况下,我们对蓝牙操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备数据传输。  1、打开

    蓝牙是啥我就不再说了,因为我肯定解释不清楚蓝牙是啥,有兴趣请移步至百度百科

      在开始前我们需要准备好一部手机而不是模拟器,且手机已经打开调试模式并连接到电脑上。文中的本地设备均指我们自己的手机,而远程设备则是指其他的设备(电脑、其他手机或者其他)。

      通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙、搜索周边设备、能被周边设备所发现、获取配对设备、蓝牙设备间的数据传输。

      1、打开蓝牙(当然首先要确保你的手机是有蓝牙设备的)

      蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备。

    • BluetoothAdapter——本地设备,对蓝牙操作首先就需要有一个BluetoothAdapter实例。常用的几个方法如下:
      •   cancelDiscovery()——取消本地蓝牙设备的搜索操作,如果本地设备正在进行搜索,那么调用该方法后将停止搜索操作。
      •   Disable()——关闭蓝牙设备。
      •   Enable()——打开蓝牙设备。相信大家都有过打开蓝牙的经历,一般情况下都会弹出一个窗口,说正在请求打开蓝牙设备,你是不是允许云云。
      •   getAddress()——获取蓝牙设备的MAC地址。
      •   GetDefaultAdapter()——获取本地的蓝牙设备
      •   getName()——获取本地蓝牙的名称
      •   getRemoteDevice(String address)——根据远程设备的MAC地址来获取远程设备
      •   startDiscovery()——蓝牙设备开始搜索周边设备
    • BuletoothDevice——远程设备。

        它所包含的方法和BluetoothAdapter一样,不再累述。

    View Code

      2、搜索周边设备

      对于Android查找发现蓝牙设备使用BluetoothAdapter类的startDiscovery()方法就可以执行一个异步方式获取周边的蓝牙设备,因为是一个异步的方法所以我们不需要考虑线程被阻塞问题,整个过程大约需要12秒时间,这时我们可以注册一个 BroadcastReceiver 对象来接收查找到的蓝牙设备信息,我们通过Filter来过滤ACTION_FOUND这个 Intent动作以获取每个远程设备的详细信息,通过Intent字段EXTRA_DEVICE 和 EXTRA_CLASS可以获得包含了每个BluetoothDevice 对象和对象的该设备类型 BluetoothClass。

      实现一个自己的BroadCastReceiver类,并注册这个类。

    View Code
    View Code

      因为在注册一个Receiver后,程序并不知道该何时去回收它,所以需要我们自己重写Activity类的onDestroy()方法。

    View Code

      3、被周边设备所发现  

      如果需要用户确认操作,不需要获取底层蓝牙服务实例,可以通过一个Intent来传递ACTION_REQUEST_DISCOVERABLE参数, 这里通过startActivity来请求开启。

    View Code

      4、配对

      配对操作呢,一般都是发现设备后,由我们人工来进行选择后系统自动去配对。我们可以通过下面的方法来获得配对的设备:

    View Code

      5、数据交换  

      在看过前面的启动、发现/搜索、配对这些操作后,下面来说说数据传输的问题。

      在Android系统中,蓝牙设备间的数据传输问题和我们在PC上的网络编程颇为类似,有一端作为Server端监听Client端的连接请求,在二者建立了连接后,就可以使用普通的数据传输方式进行数据交换操作了。在这个过程中,我需要使用到BluetoothServerSocket和BluetoothSocket两个类来建立Server端和Client端,还需要使用到一些关于流(Stream)的知识。

    • BluetoothServerSocket——服务端(监听端、监听器、接受请求的一端)
      • Accept()——阻塞宿主线程,直至收到客户端请求。返回BluetoothSocket对象。由于这个
      • Accept(int timeout)——阻塞宿主线程,直至收到客户端请求或等待时间超过timeout。返回BluetoothSocket对象。
      • Close()——关闭BluetoothServerSocket监听器。

      可以看到,Accept方法是一个阻塞方法,所以在进行开发的时候,一般都需要用到多线程的知识。JAVA的多线程知识,可以在JAVA的JDK帮助文档中查看,就单纯的应用来说还是比较简单的。

    • BluetoothSocket——客户端(请求端)
      • Close()——关闭BluetoothSocket请求端。
      • Connect()——主动向服务端(监听端)发起连接请求。

      在了解了这两个类后,可以着手来建立我们自己的Server端和Client端了。

      如果一个设备需要和两个或多个设备连接时,就需要作为一个server来传输,服务器端套接字在接受(accepted) 一个客户发来的BluetoothSocket连接请求时作出相应的响应。服务器socket将监听进入的连接请求,一旦连接被接受,将产生一个BluetoothSocket。

    • 创建一个Server

      使用BluetoothAdapter类的listenUsingRfcommWithServiceRecord方法来新建一个ServerSocket。在listenUsingRfcommWithServiceRecord中有一个参数叫做UUID,UUID(Universally Unique Identifier)是一个128位的字符串ID,被用于唯一标识我们的蓝牙服务。你可以使用web上的任何一款UUID产生器为你的程序获取一个UUID,然后使用fromString(String)初始化一个UUID。

      使用ServerSocket实例的accept方法进行监听,当监听到带有我们初始化的UUID参数的连接请求后作出响应,连接成功后返回一个BluetoothSocket对象。连接完成后,调用close方法关闭该Socket监听。

    View Code
    • 创建一个Client

      创建一个Client端,首先需要我们使用BluetoothDevice的实例的createRfcommSocketToServiceRecord方法来创建一个BluetoothSocket实例。在创建的时候,需要给createRfcommSocketToServiceRecord方法传入我们服务端的UUID值。然后使用BluetoothSocket实例的Connect方法对Server端进行连接请求,当连接成功后,Client端和Server端的传输通道就被打开。最后在连接完成后使用该实例的close方法来关闭这个连接。

    View Code

      getInputStream()——获得一个可读的流,该流在连接不成功的情况下依旧可以获得,但是对其操作的话就会报IOException的异常。需要从外部获取的数据都从该流中获取。

      getOutputStrem()——获得一个可写的流,该流在连接不成功的情况下依旧可以获得,但是对其操作的话就会报IOException的异常。需要往外部传输的数据都可以写到该流中传输出去。

      数据传输的大致流程如下:

      • 首先,分别通过getInputStream()和getOutputStream()获得管理数据传输的InputStream和OutputStream。
      • 然后,开辟一个线程专门用于数据的读或写。这是非常重要的,因为read(byte[])和write(byte[])方法都是阻塞调用。read(byte[])从输入流(InputStream)中读取数据。write(byte[])将数据写入到OutputStream流中去,这个方法一般不会阻塞,但当远程设备的中间缓冲区已满而对方没有及时地调用read(byte[])时将会一直阻塞。所以,新开辟的线程中的主循环将一直用于从InputStream中读取数据。

      还要补充一点,由于蓝牙设备是系统设备,所以需要有相应的权限支持。在AndroidManifest.xml文件中添加上权限。

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

    三、总结

      在这个笔记中将了下蓝牙的一些简单的操作,包括蓝牙的开启、搜索、配对等操作,同时还有数据的传输问题,关于数据的传输的相关操作最重要的其实是多线程的操作和数据流的操作,所以对这两点不熟悉的同学可以去看看java的JDK帮助文档。在下节中,将会将一些WIFI的操作,因为WIFI内容不是很多,所以还将附加上一些Android网络编程方面的内容。

     


    作者:Libo@Deng 
    出处:http://www.cnblogs.com/cxcco/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
    我的微博: 新浪微博

    展开全文
  • Android蓝牙设备的检测

    千次阅读 2015-10-27 15:56:22
    搜了很多资料,都不满足我的功能要求。最后,还是在Android developer官网上找到了解决方案。当时在官网搜索Bluetooth关键字,发现了BluetoothDevice类,通过阅读SDK文档,了解此类的用途,类方法的功能,终于解决了...

    Android蓝牙设备的检测

            最近,在项目工作中,遇到一个与蓝牙设备相关的问题,需要在特定情况下,检测手机是否有接入其他蓝牙设备。搜了很多资料,都不满足我的功能要求。最后,还是在Android developer官网上找到了解决方案。当时在官网搜索Bluetooth关键字,发现了BluetoothDevice类,通过阅读SDK文档,了解此类的用途,类方法的功能,终于解决了蓝牙设备的检测问题。

    1. BluetoothDevice和BluetoothAdapter

            BluetoothDevice代表一个远程的蓝牙设备,可以通过它与设备建立连接,获取相关信息,包括设备名称、设备地址和绑定状态。

            BluetoothAdapter则表示一个本地的蓝牙适配器,可以通过它实现一些基本的蓝牙相关任务:初始化蓝牙检测,查找绑定设备,初始化蓝牙设备对象等。例如,使用BluetoothAdapter.getRemoteDevice(String address)来获取指定硬件地址的BluetoothDevice对象。

    2. 检测蓝牙设备

    项目遇到的功能要求是,检测当前的蓝牙设备连接情况,下面是简单的测试代码。

    package com.dale.bluetoothtest;
    
    import java.util.List;
    import android.os.Bundle;
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothProfile;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
        
        Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            button = (Button) findViewById(R.id.bn);        
            button.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                	/*
                	 * 获取默认的蓝牙适配器
                	 */
                    BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
                    /*
                     * 获取与profile关联的profile代理,并实现BluetoothProfile.ServiceListener监听的两个方法
                     * 从而实现设备检测功能
                     */
                    ba.getProfileProxy(MainActivity.this, new BluetoothProfile.ServiceListener() {
                        
                        @Override
                        public void onServiceDisconnected(int profile) {
                            System.out.println("onServiceDisconnected");
                        }
                        
                        @Override
                        public void onServiceConnected(int profile, BluetoothProfile proxy) {
                            System.out.println("onServiceConnected");
                            List<BluetoothDevice> devices = proxy.getConnectedDevices();
                            for(BluetoothDevice d : devices) {
                                String name = d.getName();
                                System.out.println("connected name = "+name);
                            }
                        }
                    }, 4);  //4即 BluetoothProfile.INPUT_DEVICE的值,, 因为 是@hide状态,故此处只能显示写为对应的整型
                }
            });
            
        }
    
    }
    
            界面很简单,仅一个Button,用于触发检测动作,在此不贴布局代码。

            当点击检测后,首先获取到一个默认蓝牙适配器,然后调用getProfileProxy,并实现第二个接口类型参数。getProfileProxy原型如下:   

            public boolean getProfileProxy(Context context, BluetoothProfile.ServiceListener listener, int profile)
            参数说明:
    •   listener:代理连接状态监听,包括两个回调,onServiceConnected和onServiceDisconnected
    •   profile:类型,可能为BluetoothProfile.HEALTH, BluetoothProfile.HEADSET, BluetoothProfile.A2DP, BluetoothProfile.GATT, 或者BluetoothProfile.GATT_SERVER. 还有INPUT_DEVICE, PAN等等,但均为@hide状态,无法调用。

            比较重要的是onServiceConnected(int profile, BluetoothProfile proxy),当代理对象成功连接时,将会回调,并传入类型profile和代理对象。由于项目关注的是输入类型的蓝牙设备(测试时使用的是蓝牙键盘),故第三个参数profile设为BluetoothProfile.INPUT_DEVICE,但是因为它为@hide,故直接写为对应整型值,为4。

            onServiceConnected内部,代理对象调用getConnectedDevices方法,获取当前所有已连接的设备,然后输出设备名,用蓝牙键盘测试结果如下:

    10-27 17:02:52.743 I/System.out( 8375): onServiceConnected
    10-27 17:02:52.753 I/System.out( 8375): connected name = Bluetooth Keyboard
    
            至此,成功检测到了蓝牙键盘。

    展开全文
  • 正在尝试编写Power Shell脚本,该脚本将在一定间隔(15秒)内检查已配对的蓝牙设备的连接状态,如果发现该设备超出范围,则将锁定用户系统。 尝试过的内容:在以下代码中,无法弄清楚如何列出...
  • 如何测试蓝牙设备的延时

    千次阅读 2020-12-14 12:38:45
    蓝牙设备的延时准确测量很复杂,但是这里有个小工具,自己动手就可以做,数据一出胜过嘴炮。 1.首先去下载安装superpowered latency ...比如我的老一加升级到9以后稍微丢人。 不过貌似比某大厂还是好点 3.连

    蓝牙设备的延时准确测量很复杂,但是这里有个小工具,自己动手就可以做,数据一出胜过嘴炮。

    1.首先去下载安装superpowered latency

    ios,安卓版的都有。

    Test iOS and Android Audio Latency with Superpowered Latency Test App​superpowered.com图标

    2.断开蓝牙设备,先测试自己手机系统的声音处理延时。

    点蓝色按钮就好。比如我的老一加升级到9以后稍微丢人。

    不过貌似比某大厂还是好点

    3.连上蓝牙设备。

    先在设置里把通话关闭,一定要做。

    然后把音频调到最大声,把耳机放在手机的通话孔旁边,重复2的测试。

    用3减掉2,再除2大约就是你设备的延时了。

    这个软件的原理是软件发出信号,再用mic接受耳机传过来的信号,扣除os处理信号的时间,那就是蓝牙设备的延时了。但其实这不合理,因为耳机发出声频信号,到耳机的动圈产生音频,再音频再传递到mic都要点时间。简单的除2肯定不对,但是我对比了2款在rtings有参考值的数据,发现不除2差了很远,除2大概少个5%左右。比如mdr1000x,除2是145ms左右,rtings的专业测试是156ms。如果按300ms算,我的耳朵不相信,这个延时会太高了,300ms已经能产生视频的不同步效果了。你自己可以决定是否修正吧。

    我测试了一下手上的5,6个蓝牙设备。

    aptX普遍在150ms左右,ldac大约200ms。

    所以如果玩音游,基本上android手机走蓝牙暂时没啥指望了,等aptX LL的版本吧。

    展开全文
  • 前几天我的电脑自带的蓝牙图标不见了,然后在设备管理器里看到在不停的刷新,一会儿有蓝牙设备一会儿又没了。 然后网络上搜到了终极解决方案,原文找不到了,在这里记录一下: 关机后拔掉电脑上的电源接头(如果是...
  • CoreBluetooth做蓝牙外设连接,实现APP获取连接的设备数据,使用真机测试,使用蓝牙耳机和小米手机测试都搜索不到。能够搜索到其它,但是并不是需要的设备,并且并不知道这两个是不是真。为什么?![图片...
  • 如果本地的蓝牙设备可以被附近的其它蓝牙设备发现,可以使用下面的方法,代码中有注释。 当然需要你的蓝牙设备设置一下,可以被附近的蓝牙设备检测到(一般为2分钟) 在设置-蓝牙中-选中可检测性复选框。我的数据时...
  • 如何使用windows蓝牙api搜索蓝牙设备可参考我的另外一篇文章
  • 项目中有获取连接蓝牙设备电量的小需求,查找了一些资料,发现谷歌在Android8.0推出了一个getBatteryLevel的api,用来获取蓝牙设备电量百分比的方法。 但在我的项目中android10生产环境,这个方法在Bluetoothdevice...
  • Android接收蓝牙扫描枪Demo(蓝牙扫描设备 [注:本内容来自网络,在此分享仅为帮助有需要网友,如果侵犯了您权利,麻烦联系会第一时间删除,谢谢您。]
  • 想做一个小程序,手机蓝牙连接其他蓝牙设备的,现在做到将附近的蓝牙设备找到并显示。后面就不会做了,求指导
  • OpenHaystack OpenHaystack是一个框架,可通过Apple庞大的Find My网络跟踪个人蓝牙设备。 使用它来创建自己的Tracki。OpenHaystack OpenHaystack...系统要求安装用法Apple的“查找我的网络”如何工作? 配对失物招领处
  • 即使配对的蓝牙设备与计算机断开连接,这也会自动重新连接配对的蓝牙设备,并保持连接状态。 制作此工具的动机 在Raspberry Pi的Ubuntu上使用此工具,并将Raspberry Pi用作蓝牙音频接收器和混音器。 即使什么...
  • 有位朋友说,做个appdemo,来和他的蓝牙模块进行交互。发现对蓝牙真的是连冰山一角都还没了解完。说说都遇到了什么问题吧。 1.两个手机都打开蓝牙,如果离开设置蓝牙界面,难么你会发现你们都搜索不到彼此的...
  • 蓝牙开发,非越狱设备,是无法直接获得mac地址的, 而取mac地址都是为了唯一标识一个东西,苹果的蓝牙开发是靠啥唯一标识一个蓝牙设备呢?如何用代码获取呢? 亲。。。敢问你解决了么?  也遇到这个问题了。用...
  • Alfred插件,允许连接/断开与配对的蓝牙设备的连接 要求 阿尔弗雷德3 动力单元 Python 2+ 安装 下载最新版本 双击以添加到Alfred 用法 切换蓝牙设备 bt [alias | device name] 设置别名以便于访问 完整语法 btset...
  • 注意了:我用的蓝牙设备-智能小车上安装的是串口蓝牙模块的型号是HC-05,所以我的串口蓝牙遥控器编写的程序里面写死了适配蓝牙的名字和密码,买家根据自己的情况来修改了。 下面是串口调试截图: 按照图上的配置信息...
  • 定义mReceiver,在这里面编写显示未匹配的蓝牙设备的代码 2.在onCreate里面,编写显示已经匹配过的蓝牙设备的代码 3.在onCreate里面,注册mReceiver 看代码: package com.example.bluetoothtest; import java....
  • 我的OnCreate我正在做IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);registerReceiver(MydeviceReceiver, filter);...
  • 之前写代码中都没有实现蓝牙连接多个设备,由于时间原因没有进行更改。iOS端实现 蓝牙多个连接确实比安卓方便,本身利用官方Demo就可以实现多台连接,只不过自己利用view加以区分就可以。到此蓝牙4.0...
  • 关于安卓6.0无法查找蓝牙设备的问题 原文地址:这里写链接内容 最近碰到一个蓝牙问题,在自己手机上无法查找蓝牙,但是可以获得已配对设备,换了一台手机发现可以查找蓝牙了。经检查发现是android 版本问题...
  • 很感谢我的一个哥们帮我组建了单片机和蓝牙设备硬件方面的东西,服务器那边也是他写的,灰常感谢...在上次的博客中写的手机设备向蓝牙设备中发送消息,代码很乱不是很容易整理,这次我会把源码的地址放到文末,大家...
  • 之前是使用TICC2541,在PC端编程发送TI提供GAP命令来使芯片接收器与蓝牙设备通信,现在想要改为体积很小CSR8510,但是找不到这样资料,求可以使CSR8510与蓝牙设备通信命令资料
  • 写在前面:近几年蓝牙发展迅速,蓝牙IC每年的出货量高达数亿颗,无论我们身处任何地方,周围都可能同时存在着很多种蓝牙设备。那么蓝牙主机如何能在众多的蓝牙广播信号中,与我们期望的从机,自动建立蓝牙连接呢?...
  • 本插件支持androd同时连接多个蓝牙 设备,支持同时通信,例子在examples中,设备我在index.js里面写死了,为了便于调试,下载下来时候稍微改一下, onDeviceList: function(devices) { var deviceList=document....
  • 注:"fd_501_car".equals(android.os.Build.CUSTOM_FEATURE):这个是自己添加的一个变量,可用宏控实现 packages/apps/Settings/src/... 这个类用是设置里面扫描到的蓝牙设备列表,可以在 public

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,678
精华内容 671
关键字:

我的蓝牙设备