使用 Netcat 向我的微控制器发送消息 - C 语言

Send a message to my microcontroller using Netcat - C language

我搜索了很多,但无法弄清楚如何解决我的问题。我有一个 esp8266 12E 配置为通过 TCP/IP 接收消息并在发送的消息具有正确的密码时激活一扇门。我有以下代码:

system ("netcat 192.168.4.1 555");

在终端上执行后,netcat 打开了,但我不知道如何让我的程序自动写入密码。尝试过:

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

调用netcat 命令后无法写入内容。我的程序发送密钥后需要关闭netcat,怎么办?

我希望我能用英语解释我自己,并且很高兴得到帮助来解决这个简单的问题。

*我正在使用 linux 编码,我的应用程序将 运行 在 raspberry pi。

popen 是你的朋友。它类似于 system,但是 returns 一个 "file pointer"(引号!),您可以 read/write from/to.

它的几个使用示例can be found online

未经测试的伪示例:

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);

或者您可以打开一个网络套接字并 read/write 自己直接连接到网络:即 http://www.cs.tau.ac.il/~eddiea/samples/IOMultiplexing/TCP-client.c.html

感谢@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);

当我点击 "Open Door" 按钮时调用下面的代码。

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 发送。

添加 "timeout 3" netcat 在关闭连接前等待 3 秒。它允许我再次单击按钮并关闭或打开门多少次我想要。

echo %d | timeout 3 nc 192.168.4.1 555

我需要将"char txt"的内容复制到"int value",因为在终端上不是写密码,而是写"cho cho"。