Я не могу запускать команды оболочки в 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.

Есть идеи?

, 👍0

Обсуждение

и Serial вообще что-то печатает? примеры для Yun имеют SerialUSB для последовательного монитора. https://github.com/arduino-libraries/Bridge/blob/master/examples/Process/Process.ino. и я бы добавил параметры с двумя addParameter, @Juraj

Вообще ничего. Я пробовал этот пример давно, но он не работал, @BrainTrance


1 ответ


Лучший ответ:

0

В вашей программе есть несколько ошибок, некоторые более очевидны, чем другие.

Во-первых, вы должны поместить каждый параметр в команду оболочки в отдельном вызове 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