Отправить сообщение на мой микроконтроллер, используя язык Netcat - C - PullRequest
2 голосов
/ 10 января 2020

Я много искал и не смог понять, как решить мой вопрос. У меня есть esp8266 12E, настроенный на получение сообщения через TCP / IP и активацию двери, если у отправленного сообщения правильный пароль. У меня есть следующий код:

system ("netcat 192.168.4.1 555");

После выполнения на терминале открыт netcat, но я не могу понять, как позволить моей программе написать пароль автоматически. Попытка:

system ("netcat 192.168.4.1 555");
printf("key");

Не удалось написать что-либо после вызова команды netcat. И после того, как моя программа отправила ключ, необходимо закрыть netcat, как это сделать?

Я надеюсь, что смогу объяснить себя по-английски sh, и был бы рад получить помощь для решения этой простой проблемы.

* Я пишу код, используя linux, и мое приложение будет работать на Raspberry Pi.

Ответы [ 2 ]

1 голос
/ 10 января 2020

popen твой друг. Он похож на system, но возвращает «указатель файла» (в кавычках!), Который вы можете читать / записывать из / в.

Несколько примеров его использования можно найти в Интернете .

Неопробованный псевдо-пример :

fp = popen("nc 192.168.4.1 555", "w");
if (fp == NULL) {
   /* Handle error */
   printf("Couldn't spawn nc\n");
   exit(1);
}
fprintf(fp, "key"); // write to netcat's STDIN
pclose(fp);

В качестве альтернативы вы можете открыть сетевой сокет и читать / записывать данные в сеть самостоятельно: например, http://www.cs.tau.ac.il/~eddiea/samples/IOMultiplexing/TCP-client.c.html

0 голосов
/ 11 января 2020

Спасибо за ответ @wally и комментарий @Stom. Оба позволили мне понять, как работает эта функциональность, и поэтому я смог решить свою проблему. Я столкнулся с слишком большой проблемой, позволяющей моему приложению поддерживать связь с микроконтроллером. Поэтому сейчас я предпочитаю только отправить сообщение и прекратить netcat.

Когда я запускаю приведенный ниже код, я могу отправить только одно сообщение, и мне нужно перезапустить приложение вручную. Но это помогло найти решение.

fp = popen("nc 192.168.4.1 555", "w");
if (fp == NULL) {
   /* Handle error */
   printf("Couldn't spawn nc\n");
   exit(1);
}
fprintf(fp, "key"); // write to netcat's STDIN
pclose(fp);

Код ниже вызывается, когда я нажимаю кнопку «Открыть дверь».

FILE *fp;
  int ch;
  char txt[20];
  int value;
  char comando[] = "";
  int len=0;
  fp = fopen("text.txt", "r");
  if(fp){
    do{
    ch=fgetc(fp);
    txt[len]=ch;
    len++;
  }while(ch !=EOF && ch != '\n');
  fclose(fp);
}
  value = atoi(txt);
  sprintf(comando, "echo %d | timeout 3 nc 192.168.4.1 555",value);
  system(comando);

Файл с паролем открывается, содержимое сохраняется в переменной и отправляется с помощью netcat.

Добавление netcat "timeout 3" ждет 3 секунды перед закрытием соединения. Это позволяет мне снова нажать кнопку и закрыть или открыть дверь, сколько я хочу.

echo %d | timeout 3 nc 192.168.4.1 555

Мне нужно было скопировать содержимое «char txt» в «int value», потому что на терминале вместо записи номера пароля записывалось «cho cho».

...