Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+
建议使用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 新特性
- 新增16进制字符串自动转换成普通字符串
- 新增可传入自定义搜索页面的功能
V3.0.0-beta0 新特性:
- 链式调用
- API更新,详情见下方使用说明
- 上传至Jcenter,优化引用
- 新增Debug模式
- 新增自动重连功能
- 删除对输入框的监听
- 支持 Android5.0 及以上
修复:
- 修复多Activity跳转报错的问题
- 修复进入搜索页面返回后权限申请对话框不消失的问题
开源仓库地址
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);
Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+的更多相关文章
- Android Studio 的蓝牙串口通信(附Demo源码下载)
根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...
- BluetoothChat用于蓝牙串口通信的修改方法
本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...
- Android蓝牙串口通讯【转】
本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- Android开源项目大全 - 工具类
主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...
- wemall app商城源码android开发MD5加密工具类
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...
- Android弹出Toast工具类总结
Android弹出Toast工具类总结,包括系统自带的,也包括自定义的. public class ToastUtil { public ToastUtil() { } public static T ...
- Android 中替代 sharedpreferences 工具类的实现
Android 中替代 sharedpreferences 工具类的实现 背景 想必大家一定用过 sharedpreferences 吧!就我个人而言,特别讨厌每次 put 完数据还要 commit. ...
- Https通信工具类
记录一个在微信开发中用到的https通信工具类,以后会用到的. 用于https通信的证书信任管理器 import java.security.cert.CertificateException; im ...
随机推荐
- 【Vulnhub练习】Billu_b0x
靶机说明 虚拟机难度中等,使用ubuntu(32位),其他软件包有: PHP apache MySQL 目标 Boot to root:从Web应用程序进入虚拟机,并获得root权限. 运行环境 靶机 ...
- noi.ac 字符串游戏
题面 Zhangzj和Owaski在玩一个游戏.最开始有一个空的01串,Zhangzj和Owaski轮流进行操作,Zhangzj先走.每次进行操作的人可以在串上任意位置加一个新的字符,由于串是01串, ...
- vivo 商品中台的可视化微前端实践
一.背景 在电商领域内,商品是一个重要组成部分,与其对应的商品管理系统,则负责商品的新建.编辑.复制等功能.随着商品管理系统的成熟稳定和业务上的扩展需求,催化出了商品中台的诞生.它可以将现有商品功能最 ...
- Ajax的核心的对象是什么?
Ajax的核心对象是XMLXMLHttpRequest 对象. XMLHttpRequest提供不重新加载页面的情况下更新网页,在页面加载后在客户端向服务器请求数据,在页面加载后在服务器端接受数据,在 ...
- Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?
1.ZooKeeper保证的是CP,Eureka保证的是AP ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka各个节点是平等关系,只要有一台Eureka ...
- Linux用户身份与文件权限学习笔记
用户身份 管理员UID为0:系统的管理员用户 系统用户UID为1~999:服务程序会有独立的系统用户负责运行:防止被黑客入侵进行提权,并有效控制被破坏的范围 普通用户UID从1000开始:是由管理员创 ...
- 专家PID
前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...
- numpy入门—Numpy的核心array对象以及创建array的方法
Numpy的核心array对象以及创建array的方法 array对象的背景: Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组: Python的Li ...
- 数字电路的多路复用(MUX)
学习文章:https://mp.weixin.qq.com/s/1pfLfvkAPyhEMLvfnyDy0g 最基本--2选1的MUX结构: 可以看作是:assign Y=S?B:A; 下面使用MUX ...
- 记录axios高效率并发的方法
// 首先我的请求是统一管理 方便创建拦截器 export function login(parameter) { return axios({ url: api.Login, ...