USB 연결 및 TTY 연결 드라이버 모듈
https://github.com/mik3y/usb-serial-for-android
https://github.com/cepr/android-serialport-api
를 이용하여 만든 통합 드라이버
/***********************************USB Serial***********************************/
// USB 시리얼 있는지 확인
@JvmStatic fun getUSB(context: Context): UsbSerialDriver? {
(context.getSystemService(USB_SERVICE) as UsbManager).deviceList.values.forEach {
return UsbSerialProber.getDefaultProber().probeDevice(it)
}
return null
}
@JvmStatic fun connectUSB(context: Context): Boolean {
val driver = getUSB(context) ?: return false
// connect driver
usbSerialPort = driver.ports[0]
usbSerialPort?.let {
if (!it.isOpen) {
val usbManager = (context.getSystemService(USB_SERVICE) as UsbManager)
usbConnection = usbManager.openDevice(driver.device)
it.open(usbConnection)
// 통신 설정
it.setParameters(
BaudRate,
UsbSerialPort.DATABITS_8,
UsbSerialPort.STOPBITS_1,
UsbSerialPort.PARITY_NONE
)
}
// read thread 생성
this.connectUSBSerialInOut()
return true
}
return false
}
@JvmStatic fun connectUSBSerialInOut() {
// read thread 생성
usbSerialPort?.let {
if (it.isOpen) {
this.usbJob = GlobalScope.launch(Dispatchers.IO) {
isUSBJobRun.set(true)
serialIOCallback.onReadyRun()
val data = ByteArray(JsonUtils.BUFFER_SIZE)
while (isUSBJobRun.get()) {
try {
val size = it.read(data, DEFAULT_DELAY_TIME.toInt())
if (size > 0) serialIOCallback.onNewData(data.sliceArray(0 until size))
} catch (e: Exception) {
serialIOCallback.onRunError(e)
break
}
}
}
}
}
}
/***********************************USB Serial***********************************/
/***********************************TTY Serial***********************************/
// TTY 시리얼 있는 지 확인
@JvmStatic fun getTTY(name: String): String? {
val entries = this.ttySerialPortFinder.allDevicesPath
val idx = entries.indexOf(name)
return if (idx >= 0) entries[idx] else null
}
//TTY 시리얼 연결
@JvmStatic fun connectTTY(name: String): Boolean {
this.getTTY(name)?.let {
if (it.isEmpty() || BaudRate < 0) throw InvalidParameterException()
this.ttySerialPort = SerialPort(File(it), BaudRate, 0)
// read thread 생성
this.connectTTYSerialInOut()
return true
}
return false
}
@JvmStatic fun connectTTYSerialInOut() {
// read thread 생성
this.ttySerialPort?.let {
this.ttyJob = GlobalScope.launch(Dispatchers.IO) {
isTTYJobRun.set(true)
serialIOCallback.onReadyRun()
val data = ByteArray(JsonUtils.BUFFER_SIZE)
while (isTTYJobRun.get()) {
val ttySerialPortInput = SerialPort(File(ttySerialDeviceName), BaudRate, 0)
try {
val size = ttySerialPortInput.inputStream.read(data)
if (size > 0) serialIOCallback.onNewData(data.sliceArray(0 until size))
} catch (e: Exception) {
serialIOCallback.onRunError(e)
break
} finally {
ttySerialPortInput.inputStream.close()
ttySerialPortInput.close()
}
}
}
}
}
// 통신 데이터 쓰기
@JvmStatic fun writeTTY () {
this.ttySerialPort?.let {
try {
it.outputStream.write(Data)
it.outputStream.flush()
} catch (e: Exception) {
serialIOCallback.onRunError(e)
}
}
}
/***********************************TTY Serial***********************************/
/***********************************Default Serial***********************************/
// Serial 통신 callback init
private var serialIOCallback = object : SerialInputOutputListener {
// 통신 준비 완료
override fun onReadyRun() {
}
// 받은 데이터
override fun onNewData(byteArray: ByteArray?) {
}
// 통신 에러 발생
override fun onRunError(e: Exception?) {
e?.printStackTrace()
}
}
@JvmStatic fun disconnectSerialInOut() {
// usb serial in/out release
this.isUSBJobRun.set(false)
this.usbJob?.cancel()
this.usbJob = null
// tty serial in/out release
this.isTTYJobRun.set(false)
this.ttyJob?.cancel()
this.ttyJob = null
this.ttySerialPort?.outputStream?.close()
}
@JvmStatic fun disconnect() {
this.disconnectSerialInOut()
// usb serial release
try {
usbSerialPort?.close()
} catch (ignored: IOException) {
} finally {
usbSerialPort = null
}
// tty serial release
this.ttySerialPort?.close()
this.ttySerialPort = null
}
// 통신 데이터 쓰기
@JvmStatic fun writeUSB () {
this.usbSerialPort?.let {
if (it.isOpen)
try {
it.write(usbSendData, DEFAULT_DELAY_TIME.toInt())
} catch (e: Exception) {
serialIOCallback.onRunError(e)
}
}
}
/***********************************Default Serial***********************************/
Project build.gradle
repositories {
maven { url "https://jitpack.io" }
}
Application build.gradle
dependencies {
implementation 'com.github.astroluj:android_serialdriver:1.0.12'
}
https://github.com/mik3y/usb-serial-for-android
https://github.com/cepr/android-serialport-api
License :
Apache 2.0 License
License :
MIT License