Android 手机蓝牙一 (普通蓝牙)

hello,大家好有很久没有更新博客了。想写的东西很多,提起笔又觉得无从下笔。可能这就是菜鸟吧!好了废话不多说,进入正题。
本篇讲的是Android手机蓝牙分为两个部分。(都是用kotlin写的)
1:普通蓝牙(手机对手机之间的通讯)
2:低功耗蓝牙(手机对设备)

普通蓝牙

首先我们用蓝牙的时候需要明白一些步骤或东西
1:两个支持蓝牙模块的手机
2:一个作为服务端,一个作为客户端。(客户端会主动连接服务端;服务端监听有没有客户端连接)
3:根据事先确定好的uuid,服务端以这个uuid创建服务,客户端连接。
4:建立通道成功后,服务端和客户端监听对方发送的数据

ok进入正题

第一步
我们需要获取到手机里面的蓝牙模块

BluetoothAdapter 那么这个类是什么呢?最好的老师就是源码

通过红色框里面的注释已经了解到这个类 是本地设备的蓝牙适配器,可以通过这个类对蓝牙做一些例如:启动,查询绑定等等的骚操作。

我们需要获取这个类

 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()

注意:这是kotlin写法
获取到BluetoothAdapter之后,需要判断一下是否为null,如果是null就代表该手机不支持蓝牙模块,就可以自己关闭了
我们拿到我们需要的东西了,然后我们需要创建服务端和客户端(因为一个手机既是服务端,也是客户端)这里我们用线程各自创建服务端和客户端

第二步

服务端 AcceptThread 作用:开启后等待远程蓝牙的连接(等待客户端连接)

我们需要获取一个 BluetoothServerSocket 来管理我们的连接

注释已经说明了,BluetoothServerSocket 可以监听传入的连接请求,并且他是一个阻塞的

 mBluetoothServerSocket = mBluetoothAdapter!!.listenUsingRfcommWithServiceRecord(BLUE_SOCKET_NAME,BLUE_UUID)            Log.d(NAME,"开始等待蓝牙连接...")            mBluetoothSocket = mBluetoothServerSocket!!.accept()            Log.d(NAME,"远程蓝牙连接成功!!")

listenUsingRfcommWithServiceRecord 这个方法需要说说
创建BluetoothServerSocket有两种方式
1: listenUsingRfcommWithServiceRecord (安全连接)
2: listenUsingInsecureRfcommWithServiceRecord (不安全连接)
两个区别后面括号已经给出了 我们采用第一种
listenUsingRfcommWithServiceRecord有个连个参数 一个name,一个uuid
name:你创建服务的名称
uuid : 这个是你指定的uuid (注意:uuid 必须保持一致 不然是连接不上)

连接成功后 需要通过 BluetoothServerSocket里面getRemoteDevice()这个方法来获取连接成功设备信息

到这里服务端监听客户端的监听已经写好了,是不是很简单呢?

第三步

创建监听 客户端发送过来的数据 ConnectedThread
代码很简单就是把传过来的byte数组转成我们需要的数据

 var buf : ByteArray        var size :Int        var msg : String? = null        while (!isStop){            size = 0            buf = ByteArray(1024)            try {                inputStream = mBluetoothSocket!!.inputStream                Log.d(NAME,"等待数据")                size = inputStream!!.read(buf)                msg = String(buf,0,size)                Log.d(NAME,"读取了一次数据 :"+msg)            }catch (e :IOException){                e.printStackTrace()                isStop = true            }            if(size>0){                //把读取到的数据发送出去                sendMessage(msg!!)            }

可以看到我们通过mBluetoothSocket获取里面传过来的流 读出里面流的信息然后返回我们的ui线程进行数据展示
ok服务端我们已经写完了,接下来就是客户端了。

第四步
我们创建一个客户端 ConnectThread 作用:主动连接服务端开启的服务
在我们创建ConnectThread 之前呢,我们首先需要确定我们的客户端要连接哪个蓝牙的服务呢?这个时候我们需要找到我们想要连接的指定蓝牙的服务才行,否则连接是不成功的。
我们要找到指定的设备需要进行一下的流程:

1:扫描周围可见的蓝牙设备
2:找到指定的蓝牙连接 (这里就是我们创建ConnectThread 的原因)

那么我们需要进行扫描
还记得我们第一步创建得mBluetoothAdapter 这个么?这个就是扫描用到得。

  //如果当前在搜索,就先取消搜索        if (mBluetoothAdapter!!.isDiscovering) {            mBluetoothAdapter!!.cancelDiscovery()        }        //开启搜索        mBluetoothAdapter!!.startDiscovery()

是的你没有看错,就是这几句代码就可以扫描周围得设备了。
那么问题来了,从哪里能知道扫描得结果?(手动滑稽)
想知道扫描结果我们需要注册一个广播。

 mReceiver = object :BroadcastReceiver(){            @SuppressLint("MissingPermission")            override fun onReceive(context: Context?, intent: Intent?) {                when( intent!!.action){                //找到设备                    BluetoothDevice.ACTION_FOUND -> {                        var device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)                        Log.d(NAME,"found device :" +device.name)                    }                //搜索中                    BluetoothAdapter.ACTION_DISCOVERY_STARTED -> {                        Log.d(NAME,"start found device ")                    }                //搜索结束                    BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> {                        Log.d(NAME,"finished found device ")                    }                //蓝牙断开连接                    BluetoothDevice.ACTION_ACL_DISCONNECTED ->{                        mBlueSockt = null                    }                }            }//动态注册广播val filter1 = IntentFilter(BluetoothDevice.ACTION_FOUND)        val filter2 = IntentFilter(                BluetoothAdapter.ACTION_DISCOVERY_STARTED)        val filter3 = IntentFilter(                BluetoothAdapter.ACTION_DISCOVERY_FINISHED)        val filter4 = IntentFilter(                BluetoothDevice.ACTION_ACL_DISCONNECTED)        val filter5 = IntentFilter(                BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)        mContext!!.registerReceiver(mReceiver, filter1)        mContext!!.registerReceiver(mReceiver, filter2)        mContext!!.registerReceiver(mReceiver, filter3)        mContext!!.registerReceiver(mReceiver, filter4)        mContext!!.registerReceiver(mReceiver, filter5)

上面得代码都是一些基本操作,没什么好说。

var device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
通过这个代码我们可以获取到手机扫描到得蓝牙设备

现在创建ConnectThread

mSocket = device!!.createInsecureRfcommSocketToServiceRecord(BLUE_UUID)

mSocket 是BluetoothSocket。
BLUE_UUID 是我们服务端创建服务得时候指定得uuid
这里要说一下
device创建BluetoothSocket有两种方法
1: createInsecureRfcommSocketToServiceRecord (2.3以上)
2: createRfcommSocketToServiceRecord (Android系统2.3及一下)
我们用第一个

获取socket后 我们调用她得 connect方法 就连接成功了

连接成功了以后接下来就是互相发送数据了

发送数据很简单
调用BluetoothSocket 里面getOutputStream()方法获取到输出流

  outputStream = mBluetoothSocket!!.outputStream            outputStream!!.write(buf)

buf 是你传入得byte数组

到这一步都是成功得小伙伴就大功告成了。感谢大家看到这里谢谢大家下篇就是低功耗篇了.

Demo我就不上传csdn 以前设置得免费现在全是要收费了 so你懂得 现在在git上
附上Demo地址

END

更多相关文章

  1. [置顶] AIDL旅行记之AIDL的简单使用
  2. 电脑通过豌豆荚连接手机或者平板不成功,豌豆荚版本6.8.*
  3. [置顶] Android即时通信软件设计(一)(网络通信)
  4. 电脑无法识别MX4和Android手机的问题(windows和mac下亲测)
  5. Android基于蓝牙串口编程实现HC-05通讯
  6. android无法找到连接的设备 ADB占用解决
  7. Android通过代码打开和关闭网络连接
  8. Android客户端移动流量无法登陆OpenFire服务端及长时间无响应登
  9. 纪念一下坑爹的蓝牙扫描枪连接(Android外接输入设备)

随机推荐

  1. Android(安卓)中同一个TextView设置不同
  2. android命令行启动程序
  3. Android(安卓)获取系统程序和应用程序
  4. Android(安卓)屏幕重力感应
  5. Android(安卓)Studio下Jni开发配置
  6. 安卓如何创建右上角点击菜单
  7. Android(安卓)activity 启动模式应用场景
  8. 终止Android中HandlerThread的方法
  9. Android(安卓)JNI用bitmap来实现Imagevie
  10. android使用startActivityForResult回传