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