SerialPortUtil 3.0.+

介绍

SerialPortUtil 简介

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

3.0.0 开始新增链式调用,更新大量API,并上传至Jcenter,让使用变得更加简单。

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

特性

  • 内部集成的搜索页面
  • 自动重连上一次连接的设备
  • 可自行选择发送接收的数据格式

最新版本 V3.0.0-beta3

  • V3.0.0-beta3 新特性
  1. 新增16进制字符串自动转换成普通字符串
  2. 新增可传入自定义搜索页面的功能
  • V3.0.0-beta0 新特性:
  1. 链式调用
  2. API更新,详情见下方使用说明
  3. 上传至Jcenter,优化引用
  4. 新增Debug模式
  5. 新增自动重连功能
  6. 删除对输入框的监听
  7. 支持 Android5.0 及以上
  • 修复:
  1. 修复多Activity跳转报错的问题
  2. 修复进入搜索页面返回后权限申请对话框不消失的问题

开始

安装

gradle

  • 添加JitPack 仓库到你的配置文件
  • 根目录下的 build.gradle加入以下代码:
allprojects {
    repositories {
        //...
        maven { url 'https://jitpack.io' }
    }
}
  • 添加依赖
  • app模块的 build.gradle 加入以下代码即可:
  • Github 仓库
dependencies {
	        implementation 'com.github.Shanyaliux:SerialPortSample:3.0.0-beta3'
	}
  • 国内仓库
dependencies {
	        implementation 'com.gitee.Shanya:SerialPortSample:3.0.0-beta3'
	}

使用

以下所有代码块,第一块是Kotlin,第二块是Java

快速上手

val serialPort = SerialPortBuilder
    //是否开启Debug模式(Debug模式在Logcat打印一些信息,便于调试)
    .isDebug(true) 
    //是否开启自动连接
    .autoConnect(true)
	//设置接收数据格式(SerialPort.READ_HEX 为十六进制,SerialPort.READ_STRING 为字符串)
	.setReadDataType(SerialPort.READ_HEX)
	//设置接收数据格式(SerialPort.SEND_HEX 为十六进制,SerialPort.SEND_STRING 为字符串)
	.setSendDataType(SerialPort.SEND_HEX)
    //设置接收 消息监听
    .setReceivedDataListener {
        Log.d("SerialPortDebug", "received: ${it}")
    }
    //设置连接状态监听 (status 为连接状态,device 为当前连接设备)
    .setConnectStatusCallback { status, device ->  
        if (status) {
        	Log.d("SerialPortDebug", "连接: ${device.address}")
        } else {
        	Log.d("SerialPortDebug", "断开")
        }
    }
    //创建实例(需要传入上下文)
    .build(this)
SerialPort serialPort = SerialPortBuilder.INSTANCE
    //是否开启Debug模式(Debug模式在Logcat打印一些信息,便于调试)
    .isDebug(true)
    //是否开启自动连接
    .autoConnect(true)
    //设置接收数据格式(SerialPort.READ_HEX 为十六进制,SerialPort.READ_STRING 为字符串)
	.setReadDataType(SerialPort.READ_HEX)
	//设置接收数据格式(SerialPort.SEND_HEX 为十六进制,SerialPort.SEND_STRING 为字符串)
	.setSendDataType(SerialPort.SEND_HEX)
    //设置接收 消息监听
    .setReceivedDataListener(new Function1<String, Unit>() {
        @Override
        public Unit invoke(String s) {
            return null;
        }
    })
    //设置连接状态监听 (status 为连接状态,device 为当前连接设备)
    .setConnectStatusCallback(new Function2<Boolean, Device, Unit>() {
        @Override
        public Unit invoke(Boolean aBoolean, Device device) {
            return null;
        }
    })
    //创建实例(需要传入上下文)
    .build(this);

以上仅是获取了 SerialPort 的实例,想要开始使用 SerialPort 请先连接设备。方法如下:

连接设备

  • 使用内部集成的搜索页面进行连接
serialPort.openDiscoveryActivity()
serialPort.openDiscoveryActivity();

打开页面点击需要连接的设备即可

  • 自行使用设备地址进行连接
serialPort.connectDevice("98:D3:32:21:67:D0")
serialPort.connectDevice("98:D3:32:21:67:D0");

自行使用设备地址连接的设备名称为空。

断开连接

serialPort.disconnect()
serialPort.disconnect();

设置接收数据格式

可选参数(默认是 字符类型)

SerialPort.READ_STRING

字符类型

SerialPort.READ_HEX

十六进制

serialPort.setReadDataType(SerialPort.READ_HEX)
serialPort.setReadDataType(SerialPort.READ_HEX);

设置发送数据类型

可选参数(默认是 字符类型)

SerialPort.SEND_STRING

字符类型

SerialPort.SEND_HEX

十六进制

serialPort.setSendDataType(SerialPort.SEND_HEX)
serialPort.setSendDataType(SerialPort.SEND_HEX);

发送数据

serialPort.sendData("hello")
serialPort.sendData("hello");

如果发送数据格式设置为16进制,输入的数据需要为偶数,只有一位的数据需要在前面补0。

例如:0x0A 需要写成 0A,serialPort.sendData("0A")

接收消息监听

serialPort.setReceivedDataListener { it
    // it即为接收数据
    Log.d("SerialPortDebug", "received: ${it}")
}
serialPort.setReceivedDataListener(new Function1<String, Unit>() {
    @Override
    public Unit invoke(String s) {
        return null;
    }
});

接收数据回调如果在多个地方调用,仅最后一个生效。

连接状态监听

serialPort.setConnectStatusCallback { status, device ->  
    if (status) {
        Log.d("SerialPortDebug", "连接: ${device.address}")
    } else {
        Log.d("SerialPortDebug", "断开")
    }
}
serialPort.setConnectStatusCallback(new Function2<Boolean, Device, Unit>() {
    @Override
    public Unit invoke(Boolean aBoolean, Device device) {
        return null;
    }
})

连接状态回调如果在多个地方调用,仅最后一个生效。

十六进制字符串转换成字符串

需使用 3.0.0-beta2 版本及以上

此时的接收数据格式为十六进制

  • 调用方法转换
serialPort.hexStringToString(hexString)
serialPort.hexStringToString(hexString);
  • 自动转换(初始化的时候打开标志位即可)
val serialPort = SerialPortBuilder
                .autoHexStringToString(true)
                .build(this)
SerialPort serialPort = SerialPortBuilder.INSTANCE
    			.autoHexStringToString(true)
                .build(this);

自定义搜索页面

需使用 3.0.0-beta3 版本及以上

serialPort.openDiscoveryActivity(Intent(this,DiscoveryActivity::class.java))
serialPort.openDiscoveryActivity(new Intent(this, DiscoveryActivity.class));

搜索设备

需使用 3.0.0-beta3 版本及以上

serialPort.doDiscovery(this)
serialPort.doDiscovery(this);