android蓝牙连接通信的实现
看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧。
首先要知道几个类,BluetoothAdapter,BluetoothGatt,BluetoothDevice,BluetoothCattService,BluetoothCattCharacteristic。
第一个是蓝牙设配器,对蓝牙的操作都需要用到它,很重要,BluetoothGatt作为中央来使用和处理数据,使用时有一个回调方法BluetoothGattCallback返回中央的状态和周边提供的数据,BluetoothCattService作为周边来提供数据;BluetoothGattServerCallback返回周边的状态。BluetoothDevice是蓝牙设备,BluetoothCattCharacteristic是蓝牙设备的特征。
看着有点乱,我们来打个比喻:BluetoothDevice为学校,BluetoothGatt为学校到达某一个班级的通道,BluetoothCattService为学校的某一个班级,BluetoothCattCharacteristic为班级中的某一个学生。那么蓝牙连接通信的过程就是这样,BluetoothAdapter先找到学校(就是连接目的设备),再通过通道找到目标班级,最后从班级中找到目标学生,这个学生就是我们设备之间通信的中介,很重要,学校有唯一的MAC地址,班级有唯一的serviceUUID,学生有唯一的charactersticUUID(相当于学号),所以就是在一所学校找一个学生的问题,好了,应该了解了吧。
下面正是开始
1.加上蓝牙访问权限
2.打开蓝牙,两种方式,一种是询问式,一种是自动式,你百度一下就有很多,很简单,这里就不多说。
3.搜索周边的蓝牙设备
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.startDiscovery();//此过程会发送广播信息,我们在BroadcastReceiver中去接收即可
我这里把能搜索到的设备保存在list列表中,名字也保存在一个列表中,然后再UI界面上的listView中显示出来,就可以看到搜索到了几个蓝牙设备,名字各是什么
4.获取目的设备的MAC地址,因为我们已经搜索到很多设备,所以直接mac = device.getAddress().toString()即获取到设备的MAC地址
5.既然找到了地址,那就可以开始连接了,注意一点,连接的时候一定要先关闭上面的搜索蓝牙功能,直接adapter.cancelDiscovery就可以了
知道了MAC地址,那就可以获取到该MAC地址对应的蓝牙设备mDevice = adapter.getRemoteDevice(mac),这个mDevice就是我们的学校,
学校有了,那就要找到通道,bluetoothGatt = mDevice.connectGatt(this,false,new BluetoothGattCallback() ),bluetoothGatt就是通道,BluetoothGattCallback()是回调类,里面有很多方法,寻找班级和学生就在它的方法里面去实现。
里面有几个比较重要的方法,分别是onConnectionStateChange(),onServiceDiscovered(),onCharacteristicRead(),onCharacteristicChanged(),几个方法之间是独立的,同时又有联系的,过程是这样,连接通道时最先触发的是onConnectionStateChange()方法,在该方法里面启动服务发现后会触发onConnectionStateChange(),此方就是寻找班级和学生的重点方法,在通道通过UUID找到班级,在班级通过UUID找到学生,每个设备有多个班级UUID,每个班级对应多个学生UUID,所以你可以先打印出来这些信息,获取有用的班级UUID和学生UUID,找到了学生,就可以发出通知了,即把学生通知出去,上面说了学生只是一个通信的中介,此时会触发onCharacteristicChanged()方法,在该方法里面就可以获取到设备那边传过来的数据包了,另外onCharacteristicRead()方法被触发的前提是要在onServiceDiscovered()里面执行readCharacteristic()方法,然后就可以在onCharacteristicRead()里面做自己想要的操作了,整个过程就是这样,下面给出这个过程的完整代码:
蓝牙连接通信有两种形式,一种是通过socket的形式,另一种就是我这篇文章写的通过MAC地址来实现的,对于数据包的解析就靠你们自己了,这个需要蓝牙协议的,每个协议都不同,解析的过程也不同,在这里无法讲,主要是对数据包的结构要熟悉,这样的话就基本不成问题了。
好了,第一篇博客就写这么多,谢谢你们的阅读!
关注公众号:小陆小陆认真点 回复“蓝牙”即可立即获得源码,或者评论区留下邮箱,我看到了会发给你^_^
android蓝牙连接通信的实现相关推荐
- Android 蓝牙串口通信工具类 SeriaPortUtil 2.0.+
原文地址:https://www.shanya.world/archives/2fd981ea.html SerialPortUtil 提示 最新版本 3.0.+ 已发布,其对比 2.0.+ 版本,A ...
- android连接蓝牙耳机,蓝牙耳机厂家:Android蓝牙连接的一些心得
蓝牙耳机厂家最近做一个项目,主要是给蓝牙发送指令的,boss要求能够最快速度的搜索到蓝牙,并且发送数据. 刚开始也遇到很多133,各种断开连接的问题.android蓝牙搜索有两种方式,一种startL ...
- android蓝牙连接133问题的解决办法---(连接篇)
上一篇文章介绍了"蓝牙扫描",今天来说一下android蓝牙连接过程中133的问题: 我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率 ...
- Android蓝牙无法通信,android.bluetooth.BluetoothSocket无法连接
我已经尝试了其他评论中的所有建议,但都没有效果,我希望有人能帮助我.我已经为这个问题挣扎了三天了.我确信我的uuid是正确的,并且我知道清单中启用了蓝牙访问. 我正在尝试将我的android应用程序连 ...
- Android 蓝牙连接
一.概述 蓝牙是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.最多可以同时和7个其它蓝牙设备建立连接,进行通信.蓝牙可分为两大类:传统蓝牙(蓝牙3.0规范之前),低功耗 ...
- 关于Android蓝牙串口通信那点破事
Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...
- Android蓝牙连接问题总结
最近开始接触Android的蓝牙设备问题,严格意义上来说,也算是第二次接触蓝牙机制了,之前对于蓝牙设备的整个过程,也不是太了解,只是接触了一些自己需要的部分.而这次应该算是比较深入的了解了蓝牙机制的部 ...
- Android 蓝牙连接(简单简单版)
该博客只是记录,不会详细说明(本人技术有限不会说) 一:声明蓝牙权限和定位权限 <!--蓝牙权限--> <uses-permission android:name="and ...
- android蓝牙连接取消后怎么重新连上,重新启动后接收蓝牙连接更改
我试图与接收器一起检查与不同设备的蓝牙连接,然后将其记录在logcat中.它适用于正常情况,但在重新启动时会失败.重新启动后接收蓝牙连接更改 这是一个正常的工作流程: 手机上 切换蓝牙开/关 重启手机 ...
最新文章
- ZeroMQ接口函数之 :zmq_poll - I/O多路技术
- django--favicon.ico
- 天谕手游与奥特曼联手,玩家看到有多么激动?
- JavaScript可否多线程? 深入理解JavaScript定时机制
- SIP应答消息状态码与功能
- 系统架构设计师 - 软件架构设计 - 架构评估
- jQuery教程04-jQuery_this选择器
- 【Navicat】Navicat数据格式化显示设置
- 马拉松教会我_社区教会了我关于开放组织的知识
- PyPA Packaging Python Projects
- php强大的函数,PHP最强大的随机字符串生成函数
- Hibernate中常见问题 No row with the given identifier exists问题
- 怎么修改地磅服务器的修改记录,地磅无人值守系统软件怎么修改数据
- 【8.16校内测试】【队列】【数学】【网络流/二分图最大匹配】
- docker search oracle,Docker search 命令
- 无线AP和无线路由器区别 wifi热点
- 一文整理总结常见Java后端面试题系列——Spring篇(2022最新版)
- python mysql跨库查询_Python查询mysql库
- java smtp.126.com_java实现邮件发送
- Windows 10 2018年四月更新版官方正式版