SerialPortUtil

提示

最新版本 3.0.+ 已发布,其对比 2.0.+ 版本,API有了很大改动,且修复了很多bug,并带来一些新的特性,优化使用步骤。强烈建议切换至 3.0.+ 版本。

介绍

SerialPortUtil 简介

SerialPort 是一个开源的对 Android 蓝牙串口通信的轻量封装库,轻松解决了构建自己的串口调试APP的复杂程度,让人可以专注追求自己设计,不用考虑蓝牙串口底层的配置。

  • 集成搜索Activity,不用自己费力去实现
  • 通过回调处理接收数据
  • 异步处理发送
  • 接收与发送均可使用十六进制和字符串

特性

最新版本 V2.0.3

  • 新特性:
  1. 接收消息通过Service接收
  2. 新增连接状态时可获取设备名和地址
  3. 移除扫描状态获取
  4. 发送类型修改为字符类型时自动取消输入框的十六进制监听
  • 修复:
  1. 连接状态监听的bug
  2. 接收消息时,内容有缺失的问题
  3. SearchActivity 权限申请弹窗被覆盖,导致没有获取权限
  4. SearchActivity 可用设备列表标题显示
  5. More than one file was found with OS independent path ‘META-INF/library_release.kotlin_module’

开源仓库地址

Github仓库

Demo例程源码

开始

安装

Gradle

根目录 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 = 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)

以上代码为名为editTextSendEditText对象添加了十六进制监听器

发送数据

  • 发送字符型
//从输入框发送
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 就是收到的数据
}