Я разрабатываю приложение для macOS, в котором мне нужно подключиться с помощью telnet к устройству и отправить ему команды.
(Кстати, я подключаюсь к Roku)
Это насколько я понял
func telnet(to host: String, port: String) {
let process = Process()
let pipe = Pipe()
process.executableURL = URL(fileURLWithPath: "/usr/local/bin/telnet")
process.arguments = [host, port]
process.standardOutput = pipe
do {
try process.run()
} catch {
return
}
let resultData = pipe.fileHandleForReading.readDataToEndOfFile()
let result = String (data: resultData, encoding: .utf8) ?? ""
print(result)
}
telnet(to: "10.0.1.11", port: "8080")
Проблема в том, что процесс сразу закрывается. Мне нужно оставить процесс открытым и как-то отправить команды на устройство, а затем закрыть соединение.
Итак, это мои вопросы:
@DavidBerry standardInput, кажется, именно то, что мне нужно, у вас есть примеры того, как его использовать? Я ничего не могу найти в Интернете.
Вы также захотите создать для него трубу. Вы будете писать в один канал (standardInput) для отправки данных в дочернюю программу и читать данные из второго канала (standardOutput) для чтения данных из дочерней программы. Но, как указывает @duskwuff, лучше всего, вероятно, просто полностью избегать telnet, если нет веской причины для его использования.





Лучше всего избегать использования Process и устанавливать сетевое соединение непосредственно из вашего приложения. (Это также освободит вас от вашей зависимости от /usr/local/bin/telnet, которой нет в чистой установке macOS.)
Модуль SwiftSocket выглядит как отличный способ сделать это. «Пример клиентского сокета» в документации, кажется, отвечает на большинство ваших вопросов.
Спасибо, вы указали мне правильное направление. У меня уже был модуль BlueSocket в моем проекте, так что я в конечном итоге использовал его.
Возможно, вам также потребуется настроить дескрипторы standardInput и standardError.