由于工作需要,硬件设备这边需要软件的支持。因此,用到BLE蓝牙相关的功能,为了快捷开发
在大佬 陈利建 — github FastBle
基础上做了一些功能修改以及数据处理
首先说一下我的项目需求:
- 扫描外围设备,可正常连接
- 让设备与客户端app处于一直连接的状态,除非人为断开连接等不可控因素
- 可支持多设备连接,并且获取数据(这里多设备连接,没有用gitHub上面的,这里自己做的处理)
- 只要设备和客户端处于连接状态,硬件发送数据,客户端就展示数据
- 对于数据处理页面,在输入框那里自己做了一些数据模糊处理,以及不区分大小写
- 可读取设备发送的最近一次数据并展示
- 读取的数据展示原始数据,并进行解析(数据存储到手机内存中,可随时查看数据情况)
![](https://img-blog.csdnimg.cn/e3775b3483d04e86a42d7811d63ea499.jpg)
App详情:
![](https://img-blog.csdnimg.cn/1c2a3ce8335844bf8f517fd3185aef67.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_10,text_Q1NETiBA5ouJ6I6r5biF,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/4557c1a3daa4446a9a79ecfd70feaf79.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ouJ6I6r5biF,size_20,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/f3876d6e534c44fa8ff6498575f3dbb7.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ouJ6I6r5biF,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/f8400944c76344c7b63af0b0ce653653.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ouJ6I6r5biF,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20acda35da1a46219ebc0bec392da8ae.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ouJ6I6r5biF,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/66aec3f713844c0ab8c5c60c22d2ea4a.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ouJ6I6r5biF,size_20,color_FFFFFF,t_70,g_se,x_16)
对于App研发的具体流程:
- 对其框架进行全局初始化以及配置
/**
1. @author Martin-harry
2. @date 2021/7/13
3. @address
4. @Desc BlueTooth全局配置
*/
public class BlueTooth extends Application {
@Override
public void onCreate() {
super.onCreate();
init();
}
private void init() {
//初始化及配置
BleManager.getInstance().init(this);
BleManager.getInstance()
.enableLog(true)
.setReConnectCount(1, 5000)
.setOperateTimeout(5000);
/*BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
.setServiceUuids(null)
.setDeviceName(false, null) // 只扫描指定广播名的设备,可选g
.setAutoConnect(true) // 连接时的autoConnect参数,可选,默认false
.setScanTimeOut(10000) // 扫描超时时间,可选,默认10秒
.build();
BleManager.getInstance().initScanRule(scanRuleConfig);*/
}
}
-
扫描外围设备
-
找到需要配对的设备,并进行连接
-
前面都是比较简单的部分,难点主要在于数据处理
1.把需要连接处理的设备单独封装
2.输入框的处理
(1)设置输入框,并且对其数据进行监听处理
监听这里应用的是TextWatcher()
(2)对输入框UUID进行模糊、大小写处理
关于EditText大小写处理:Java equalsIgnoreCase() 方法模糊处理:
工具类详情:https://download.csdn.net/download/chen_md/21105756
(3)用户第一次进入数据处理活动页需要对输入框进行操作;第二次进入时无需输入,自动记录上次用户填写的数据
这里可以参考我写的这篇文章:android EditText和SharedPreferences保存数据之项目实战3.接收设备发送过来的数据(notify打开通知)
4.获取最近的一次数据(write给设备发送指令,并接收数据)
发送数据 —> 头字节 + 命令码 + 尾字节(异或校验)
结尾有做蓝牙的码农欢迎骚扰共同交流、学习!