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