Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+
阅读原文时间:2023年07月12日阅读:1

建议使用4.+版本,避免一些不必要的bug。4.+版本文档地址:https://www.cnblogs.com/shanya/articles/16062256.html

SerialPortUtil 3.0.+

SerialPortUtil 简介

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

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

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

特性

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

QQ技术交流群

最新版本 V3.0.0-beta3

  • V3.0.0-beta3 新特性

  • V3.0.0-beta0 新特性:

  • 修复:

开源仓库地址

GitHub仓库

Gitee仓库

安装

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);

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器