Я не могу запускать команды оболочки в Linux через скетч AVR (Arduino Yun)
Я немного запутался с некоторыми методами Process.h. Я пытаюсь запустить команду "nc 192.168.1.15 9911" к процессору Linux через скетч. Соответствующий прослушиватель netcat ожидает на другом компьютере. Arduino Yun находится в одной сети с компьютером через WiFi.
Когда я выполняю эту команду через SSH-соединение на Arduino Yun, она работает нормально, но я не могу понять, как это делается через скетч.
Это мой код:
#include <Process.h>
Process p;
void setup() {
Bridge.begin();
Serial.begin(9600);
delay(2000);
p.begin("nc");
p.addParameter("192.168.1.15 9911");
p.run();
// пока (!p.running()) {};
}
void loop() {
if (p.available() > 0) {
Serial.println("test");
}
}
Похоже, этот код не работает, функция p.available() выполняется, даже если я отправляю пакеты данных. Я также попробовал p.runShellCommand("nc 192.168.1.15 9911"); безуспешно.
Похоже, команды никогда не попадают в командную строку Linux.
Есть идеи?
@BrainTrance, 👍0
Обсуждение1 ответ
Лучший ответ:
В вашей программе есть несколько ошибок, некоторые более очевидны, чем другие.
Во-первых, вы должны поместить каждый параметр в команду оболочки в отдельном вызове addParameter()
. В противном случае он обрабатывает все параметры как один параметр и пытается соединить вас с адресом 192.168.1.15 9911
вместо порта 9911 с адресом 192.168.1.15.
Во-вторых, вы должны использовать runAsynchronously()
вместо run()
, иначе ваш скетч заблокируется в этой точке, пока nc
не завершится. Если этого никогда не произойдет, ваш скетч никогда не дойдет до точки, где он сможет считать данные.
Вот вариант вашего скетча, который мне подходит:
#include <Process.h>
Process p;
void setup() {
Bridge.begin();
Console.begin();
p.begin("nc");
p.addParameter("192.168.1.15");
p.addParameter("9911");
p.runAsynchronously();
}
void loop() {
static uint32_t ts = millis();
if (millis() - ts > 1000) {
Console.println(millis());
ts = millis();
}
if (p.running()) {
while (p.available()) {
Console.write(p.read());
}
} else {
Console.println("Restarting process");
delay(100);
p.begin("nc");
p.addParameter("192.168.1.15");
p.addParameter("9911");
p.runAsynchronously();
}
}
Он также повторно запускает nc
, если / когда завершается. Также есть "сердцебиение" печать millis(), чтобы вы могли видеть, что скетч работает. Для вывода он использует консоль, а не последовательный порт, поэтому SSH подключается к Yun и telnet localhost 6571
для просмотра вывода.
Хотя сейчас мне не нужно реализовывать приведенный выше код, потому что все изменилось, ваш ответ решает текущий вопрос. Спасибо., @BrainTrance
- Как получить уникальный идентификатор для всех плат Arduino?
- Как сделать повторитель Wi-Fi на Arduino?
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Как запустить TCP-сервер сокетов на Arduino Uno WiFi?
- Отключение Arduino при загрузке
- Как отправить символы в SoftwareSerial Arduino с помощью командной строки Linux без хвоста -f?
- Как создать сервер сокетов Arduino для получения сообщений
- "/dev/ttyACM0": отказано в разрешении " в Ubuntu 18.04
и
Serial
вообще что-то печатает? примеры для Yun имеют SerialUSB для последовательного монитора. https://github.com/arduino-libraries/Bridge/blob/master/examples/Process/Process.ino. и я бы добавил параметры с двумя addParameter, @JurajВообще ничего. Я пробовал этот пример давно, но он не работал, @BrainTrance