【问题标题】:Send a message to my microcontroller using Netcat - C language使用 Netcat - C 语言向我的微控制器发送消息
【发布时间】:2020-01-10 13:22:06
【问题描述】:

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

system ("netcat 192.168.4.1 555");

在终端上执行后 netcat 是打开的,但我无法弄清楚如何让我的程序自动写入密码。试过了:

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

调用 netcat 命令后无法写东西。而我的程序发送key之后需要关闭netcat,怎么办?

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

*我正在使用 linux 进行编码,我的应用程序将在树莓派上运行。

【问题讨论】:

  • 我不确定我是否正确理解了您的问题,但您可以使用echo 命令直接将您的消息发送给netcat:system("echo \"key\" | netcat 192.168.4.1 555")
  • 嗨@Storm,感谢您的评论。我正在考虑让用户点击“连接”按钮并保持与门的连接,然后当有人到达时,当微控制器收到我的应用消息时,门会自动打开。
  • 那么您最好在代码中实现自己的 TCP 客户端,而不是尝试将其全部通过管道传递给 netcat。
  • 尝试添加选项-q 0以强制netcat在传输结束后关闭
  • @Storm ,了解。我已经尝试过你之前所说的。 [code]system("echo \"key\" | netcat 192.168.4.1 555")[/code] 即使这样,netcat在发送消息后仍然打开,无法终止程序。

标签: c linux tcp esp8266 netcat


【解决方案1】:

popen 是你的朋友。它类似于system,但返回一个“文件指针”(用引号括起来!),您可以从中读取/写入。

它的几个使用示例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);

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

【讨论】:

    【解决方案2】:

    感谢@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 发送。

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

    echo %d | timeout 3 nc 192.168.4.1 555
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      相关资源
      最近更新 更多