Как читать символы из файла fifo с помощью kotlin - PullRequest
0 голосов
/ 14 января 2019

Что я пытаюсь сделать : Я пытаюсь сделать комбинацию между Linux Udev и Kotlin. Точнее, когда я подключу USB к своему ПК, одно из правил udev запустит скрипт, который добавит к файлу FIFO некоторый текст. (Например: добавить, 003,026. Где 003 - номер шины, а 026 - номер устройства). Теперь, на стороне Kotlin, я собираюсь прочитать эту информацию и показать ее на консоли IDE. Все хорошо здесь.

Моя проблема : Когда я получаю только одно событие из-за только одного плагина, все в порядке. Но когда я пытаюсь подключить несколько устройств (нажав кнопку питания на концентраторе с 7 подключенными устройствами), я обычно получаю только 3 устройства на стороне Kotlin. Даже если файл FIFO имеет все значения.

Пример кода Вот моя последняя попытка получить всю информацию

fun main(args: Array<String>) {
    println("Hello, World")
    while(true) {
        println("I had received this: " + readUsbState())
        //println("Am primit inapoi: " + ins.read())
        TimeUnit.SECONDS.sleep(1L)
    }
}

@Throws(FileNotFoundException::class)
private fun readUsbState(): String {
    if (!File("/emy/usb_events").exists()) {
        throw FileNotFoundException("The file /emy/usb_events doesn't exists!")
    }
    val bytes = ByteArrayOutputStream()
    var byteRead = 0
    val bytesArray = ByteArray(1024)
    try {
        FileInputStream("/emy/usb_events").use { inputStream ->
            byteRead = inputStream.read(bytesArray, 0, bytesArray.size)
            if (byteRead >= 0) {
                bytes.write(bytesArray, 0, byteRead)
            }
        }
    } catch (ex: IOException) {
        ex.printStackTrace()
    }
    return bytes.toString()
}

Дополнительные инструкции : Мой файл fifo - "/ emy / usb_events". Этот файл был создан с помощью mkfifo / emy / usb_events

и чтобы тестирующая часть не беспокоилась о правилах udev, вы можете просто сделать echo -e "add, 001,001 \ nadd, 001,002 \ nadd, 001,003 \ n ..." >> / emy / usb_events

1 Ответ

0 голосов
/ 14 января 2019

Я нашел правильный ответ. Проблема заключалась в том, что я закрывал файл FIFO после первого найденного ввода. Приведенный ниже код работает отлично:

fun main(args: Array<String>) {
    println("Hello, World")
    while(true) {
        println("I had received this: " + readUsbState4())
        TimeUnit.SECONDS.sleep(1L)
    }
}

private fun readUsbState4(): String {
    return File("/certus/usb_events").readLines(Charset.defaultCharset()).toString()
}

В списке, который я получаю, у меня может быть несколько частей информации, таких как:

Hello, World
I had received this: [add,046,003,4-Port_USB_2.0_Hub,Generic,]
I had received this: [add,048,003,Android_Phone,FA696BN00557,HTC, add,047,003,4-Port_USB_2.0_Hub,Generic,, add,049,003,DataTraveler_2.0,001BFC31A1C7C161D9C75AED,Kingston]
I had received this: [add,050,003,SAMSUNG_Android,06157df6cc9ac70e,SAMSUNG, add,053,003,SAMSUNG_Android,ce0416046d6a9e3f05,SAMSUNG, add,051,003,Acer_S57,0123456789ABCDEF,MediaTek, add,052,003,ACER_Z160,SKU4HI8L4L99N76H,MediaTek]
I had received this: [remove,048,003]
I had received this: [remove,051,003, remove,052,003, remove,049,003, remove,053,003, remove,050,003]
I had received this: [remove,047,003]
I had received this: [remove,046,003]
...