详细说明文档地址https://www.shanya.world/archives/2fd981ea.html
SerialPort 是一个开源的对 Android 蓝牙串口通信的轻量封装库,轻松解决了构建自己的串口调试APP的复杂程度,让人可以专注追求自己设计,不用考虑蓝牙串口底层的配置。
- 集成搜索Activity,不用自己费力去实现
- 通过回调处理接收数据
- 异步处理发送
- 接收与发送均可使用十六进制和字符串
- 新特性:
- 接收消息通过Service接收
- 新增连接状态时可获取设备名和地址
- 移除扫描状态获取
- 发送类型修改为字符类型时自动取消输入框的十六进制监听
- 修复:
- 连接状态监听的bug
- 接收消息时,内容有缺失的问题
- SearchActivity 权限申请弹窗被覆盖,导致没有获取权限
- SearchActivity 可用设备列表标题显示
- More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'
根目录 build.gradle 加入以下代码:
allprojects {
repositories {
// 省略其代码...
maven { url 'https://jitpack.io' }
}
}
app模块的 build.gradle 加入以下代码即可:
dependencies {
// 省略其代码...
implementation 'com.github.Shanyaliux:SerialPortUtils:V2.0.3'
}
Tips:
以下所有代码块,第一块是Java语法,第二块是Kotlin语法
SerialPort serialPort = SerialPort.Companion.getInstance(this);
val serialPort = SerialPort.getInstance(this)
以上代码创建了一个SerialPort
实例。
serialPort.openSearchPage();
serialPort.openSearchPage()
以上代码打开内部的搜索页面。该页面通过下拉操作进行搜索新设备。如下图所示:
serialPort.doDiscovery();
serialPort.doDiscovery()
以上代码执行搜索设备操作
ArrayList<Device> arrayList = serialPort.getPairedDevicesList();
val arrayList = serialPort.pairedDevicesList
以上代码获取已配对设备列表,其中Device
是一个数据类,包含已配对设备的名字和地址,以下代码说明如何从Device
获取信息
//获取设备名字
String name = device.name
//获取设备地址
String address = device.address
//获取设备名字
val name = device.name
//获取设备地址
val address = device.address
ArrayList<Device> arrayList = serialPort.getUnPairedDevicesList();
val arrayList = serialPort.unPairedDevicesList
//其中device是已连接的设备信息(包含name和address)
serialPort.getConnectedStatus((aBoolean, device) -> {
if (aBoolean) {
//已连接
} else {
//未连接
}
return null;
});
serialPort.getConnectedStatus { status, device ->
if (status) {
//已连接
} else {
//未连接
}
}
以上代码就是获取连接状态
可选参数(默认是 字符类型) | |
---|---|
SerialPort.READ_STRING | 字符类型 |
SerialPort.READ_HEX | 十六进制 |
serialPort.setReceivedDataType(SerialPort.READ_HEX);
serialPort.setReceivedDataType(SerialPort.READ_HEX)
以上代码将接收数据的类型切换为十六进制
可选参数(默认是 字符类型) | |
---|---|
SerialPort.SEND_STRING | 字符类型 |
SerialPort.SEND_HEX | 十六进制 |
serialPort.setSendDataType(SerialPort.SEND_HEX);
serialPort.setSendDataType(SerialPort.SEND_HEX)
以上代码将发送数据的类型切换为十六进制
如果你要发送十六进制的数据类型,需要按一定的要求进行输入。
每一个十六进制需要保持两位,不足两位的需要在前面补0,中间间隔一个空格,比如:A8 0D
或者对输入框添加监听器进行自动限制输入
serialPort.setEditTextHexLimit(editTextSend);
serialPort.setEditTextHexLimit(editTextSend)
以上代码为名为editTextSend
的EditText
对象添加了十六进制监听器
- 发送字符型
//从输入框发送
serialPort.sendData(editTextSend.getText().toString());
//代码发送
serialPort.sendData("Hello World!");
//从输入框发送
serialPort.sendData(editTextTextSend.text.toString()
//代码发送
serialPort.sendData("Hello World!")
- 发送十六进制
//从输入框发送
serialPort.sendData(editTextSend.getText().toString());
//代码发送 0xA5、0x0D
serialPort.sendData("A5 0D");
//从输入框发送
serialPort.sendData(editTextTextSend.text.toString()
//代码发送 0xA5、0x0D
serialPort.sendData("A5 0D")
serialPort.getReceivedData(new Function1<String, Unit>() {
@Override
public Unit invoke(String s) {
// s 就是收到的数据
return null;
}
});
serialPort.getReceivedData{it
// it 就是收到的数据
}