zoukankan      html  css  js  c++  java
  • 蓝牙那些事之基础篇

          好久没有写博客了,这几个月一直在做蓝牙这方面的开发,其实一直就想写了,但是我这个人比较懒,所以到现在才开始写。当初做蓝牙的时候也是一脸茫然,不知道怎么做,不停的找资料,不停的百度、百度,哎,我知道这种方法是最不可取的,因为开发速度很慢,但是没办法,身边没有人做过,只能自己一点一点的去学,像一个无头苍蝇一样,不知道从哪里学起,哎....

    还是从最基础的讲起吧,虽然百度一搜,一大堆,但是每个人有自己的归纳,写写咯..

    先讲BluetoothAdapter这个类

    获取系统默认的蓝牙适配器:

    bluetoothadapter=BluetoothAdapter.getDefaultAdapter();//默认蓝牙设备

    判断设备是否支持蓝牙

     1 if(bluetoothadapter==null){
     2       Utils.getinstance().getStr(context, "不支持蓝牙");
     3 }else{
     4       //判断是否支持蓝牙
     5       if(!bluetoothadapter.isEnabled()){
     6             bluetoothadapter.enable();//直接打开蓝牙
     7        }else{
     8              System.out.println("蓝牙已经打开");
     9        if(Myfinal.btpath!=null&&!Myfinal.btpath.equals("")){
    10              System.out.println("自动连接设备"+Myfinal.btpath);
    11              getClient(null,Myfinal.btpath,1234);//连接蓝牙设备
    12          }
    13     }
    14 }

    这里打开蓝牙有两种方法,一种是有提示用户是否打开蓝牙的,一种是没有提示,直接打开蓝牙,下面这种事有提示框,提示用户打开蓝牙

    //判断是否启用蓝牙
    Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivity(enableIntent);

    使蓝牙可见(可搜索)

    //允许本机的蓝牙被搜索的意图
    Intent discoveryintent = new Intent(bluetoothadapter.ACTION_REQUEST_DISCOVERABLE);
    //设置时间间隔为300s
    discoveryintent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    startActivity(discoveryintent);

    获取蓝牙已配对的设备,此方法类似一个获取系统本地的缓存,只要是配对过的设备,都会保存在本地

     1 //判断设备是否存在(获取已经配对的蓝牙设备)
     2         Set<BluetoothDevice> pairedDevices = bluetoothadapter.getBondedDevices();
     3         if (pairedDevices.size() > 0) {
     4             for (BluetoothDevice device : pairedDevices) {
     5                 //System.out.println("配对的===============设备名称===>>>"+device.getName()+"
    地址====>>>"+device.getAddress()); 
     6                 MyBlueToothDevice bt=new MyBlueToothDevice(0,device.getName(),device.getAddress(),device.getBondState()+"");        
     7                 btlist.add(bt);
     8             }
     9             if(btlist.size()>0){
    10                 handler.sendEmptyMessage(1);
    11             }
    12             //关闭搜索
    13             bluetoothadapter.cancelDiscovery();
    14         }    
    View Code

    这里大家可以自己定义一个对象用于接收到蓝牙的数据,以方便处理数据

    蓝牙搜索:使用的是BluetoothAdapter下面的一个startDiscovery方法,关闭搜索用cancelDiscovery

    注册一个广播

    1 //注册广播接收器
    2 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    3 filter.addAction(BluetoothDevice.ACTION_FOUND);//发现远程设备 
    4 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//本地蓝牙适配器已经开始对远程设备的搜寻过程。 
    5 this.registerReceiver(receiver, filter); // 不要忘了之后解除绑定    

    广播以及处理有相同名称出现,和取消注册广播

     1 //搜索设备(蓝牙)
     2     private final BroadcastReceiver receiver=new BroadcastReceiver() {
     3         @Override
     4         public void onReceive(Context arg0, Intent in) {
     5             
     6             String action=in.getAction();
     7             //发现设备
     8             if(BluetoothDevice.ACTION_FOUND.equals(action)){
     9                 //从intent中获取设备对象
    10                 BluetoothDevice device=in.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    11                 //查找未连接配对的蓝牙
    12                 if(device.getBondState()!=BluetoothDevice.BOND_BONDED){
    13                     System.out.println("蓝牙的地址====>>>>"+device.getAddress()+"=====蓝牙的状态==="+device.getBondState());
    14                     MyBlueToothDevice bt=new MyBlueToothDevice(0,device.getName(),device.getAddress(),device.getBondState()+"");
    15                     btlist.add(bt); 
    16                 }
    17                 short rssi=in.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);
    18                 System.out.println(device.getName()+"=============这里的设备的RSSI类型是==================="+rssi);
    19                 
    20                 //将设备名称和地址放入ArrayAdapter,以便在ListView中显示(将集合中相同的元素去除)
    21                 for (int i = 0; i < btlist.size()-1; i++) {
    22                     for (int j = btlist.size()-1; j > i; j--) {
    23                         if(btlist.get(j).getBpath().equals(btlist.get(i).getBpath())){
    24                             btlist.remove(j);
    25                         }
    26                     }
    27                 }
    28                 System.out.println("已经搜索到的设备的大小是...."+btlist.size());
    29                 if(btlist.size()>0){
    30                     handler.sendEmptyMessage(1);
    31                 }
    32             }else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){    
    33                 System.out.println("搜索完成");
    34             }
    35         }
    36     };
    37     
    38     //解除注册
    39     @Override
    40     protected void onDestroy() {
    41         super.onDestroy();
    42         unregisterReceiver(receiver);
    43         unregisterReceiver(sercherReceiver);
    44     }
    View Code

    权限:

    1    <!-- 蓝牙使用权限 -->
    2     <uses-permission android:name="android.permission.BLUETOOTH"/>
    3     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

    在搜索广播的时候,可以查询到远程设备的蓝牙信号,好像、只能在搜索的时候才能取到蓝牙信号,其他时候取不到。。

    好吧,暂时先写到这里,下次写通讯这块....

  • 相关阅读:
    nop调试-区域路由问题
    nop4.3 用户权限管理
    nop4.3 admin中添加新菜单
    nop 中创建任务(Task)
    SignalR 的应用
    mvc和ef如何连接
    .net中微信、支付宝回调
    C# 中使用Aspose.Words下载文档
    添加 Azure Active Directory 服务,调用方法
    Net Core 5.0 部署IIS错误-500.31-Failed to load ASP.NET Core runtime
  • 原文地址:https://www.cnblogs.com/yrhua/p/bluetooth.html
Copyright © 2011-2022 走看看