zoukankan      html  css  js  c++  java
  • Android 蓝牙开发基本流程

    此例子基于 android demo

    对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少     Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发;
        鉴于很多开发人员现在也有蓝牙开发的需求,也为了大家少走些弯路,先将我积攒的一点点在Android蓝牙开发经验与大家分享一下!

       首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限

    <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />

    <uses-permissionandroid:name="android.permission.BLUETOOTH" />


    然后,看下api,Android所有关于蓝牙开发的类都在android.bluetooth包下,如下图,只有8个类

                    1.jpg
    而我们需要用到了就只有几个而已:

        1.BluetoothAdapter 

    顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前,都要不断操作它BluetoothAdapter里的方法很多,常用的有以下几个:

          cancelDiscovery() 根据字面意思,是取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索

          disable()关闭蓝牙

          enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户

    Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

    startActivityForResult(enabler,reCode);//同startActivity(enabler);

          getAddress()获取本地蓝牙地址

          getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter

          getName()获取本地蓝牙名称

          getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备

          getState()获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)

          isDiscovering()判断当前是否正在查找设备,是返回true

          isEnabled()判断蓝牙是否打开,已打开返回true,否则,返回false

         listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步

          startDiscovery()开始搜索,这是搜索的第一步

    2.BluetoothDevice

    看名字就知道,这个类描述了一个蓝牙设备

          createRfcommSocketToServiceRecord(UUIDuuid)根据UUID创建并返回一个BluetoothSocket

    getState() 蓝牙状态这里要说一下,只有在 BluetoothAdapter.STATE_ON 状态下才可以监听,具体可以看andrid api;

    这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket
    这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter

        3.BluetoothServerSocket

    如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,这个类一种只有三个方法两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!


    还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接

          close()这个就不用说了吧,翻译一下——关闭!

     4.BluetoothSocket

      跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到

          close(),关闭

          connect()连接

          getInptuStream()获取输入流

          getOutputStream()获取输出流

          getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备


    1、获取本地蓝牙适配器

          BluetoothAdapter
    mAdapter= BluetoothAdapter.getDefaultAdapter();

     2、打开蓝牙

          if(!mAdapter.isEnabled()){

    //弹出对话框提示用户是后打开

    Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

    startActivityForResult(enabler, REQUEST_ENABLE);

          //不做提示,强行打开

          // mAdapter.enable();

    }

    3、搜索设备
       1)
    刚才说过了mAdapter.startDiscovery()

    是第一步,可以你会发现没有返回的蓝牙设备,怎么知道查找到了呢?向下看,不要急

    2)定义BroadcastReceiver,关于BroadcastReceiver不多讲了,不是今天的讨论内容,代码如下

        BroadcastReceiver mReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                //找到设备
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent
                            .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    
                    if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
    
                        Log.v(TAG, "find device:" + device.getName()
                                + device.getAddress());
                    }
                }
                //搜索完成
                else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
                        .equals(action)) {
                    setTitle("搜索完成");
                    if (mNewDevicesAdapter.getCount() == 0) {
                        Log.v(TAG, "find over");
                    }
                }
            }
        };
      这样,没当查找到新设备或是搜索完成,相应的操作都在上段代码的两个if里执行了,不过前提是你要先注册

    BroadcastReceiver,具体代码如下

        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(mReceiver, filter)<span style="font-family:SimSun;">;</span>

    (这段代码,一般写在onCreate()里..)

      4、建立连接,首先Android sdk(2.0以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接(说的不对请高人指正),服务器端(BluetoothServerSocket)和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接

    1)服务器端:


    //UUID
    格式一般是"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"可到

            //http://www.uuidgenerator.com 申请


    BluetoothServerSocket serverSocket = mAdapter. listenUsingRfcommWithServiceRecord(serverSocketName,UUID);
    serverSocket.accept();


    2)
    客户端:
    //
    还记得我们刚才在BroadcastReceiver获取了BLuetoothDevice么?
    BluetoothSocket clienSocket=dcvice. createRfcommSocketToServiceRecord(UUID);
    clienSocket.connect();


    5
    、数据传递,通过以上操作,就已经建立的BluetoothSocket连接了,数据传递无非是通过流的形式
    1
    )获取流
    inputStream = socket.getInputStream();
    outputStream = socket.getOutputStream();

    2)写出、读入
    这是基础的东西,在这就不多赘述了
    终于写完了,这是我这两天的学习经验,希望对有蓝牙需求的朋友有所帮助!另外,之前我们提过

    android.bluetooth下有8个类,还有4个类没有用到,那4个类里定义的都是常量,我也没用到它们..


       最后把我找到的几个蓝牙的例子附在后面,希望从事软件开发,尤其是Android开发的朋友以后多沟通、多分享!

    补充一下,使设备能够被搜索

    Intent enabler = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

    startActivityForResult(enabler,REQUEST_DISCOVERABLE);


    demo是包括客户端和服务端;分别放到两个手机上就可以通信;大家改改应该就可以用;

    http://download.csdn.net/detail/q610098308/8681065
    这个是官方的demo:
    http://download.csdn.net/detail/q610098308/8628675

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/sharecenter/p/5621081.html
Copyright © 2011-2022 走看看