我进行了很多搜索,但无法弄清楚如何解决我的问题。我有一个esp8266 12E配置为通过TCP / IP接收消息,并在发送的消息具有正确密码的情况下激活门。我有以下代码:
system ("netcat 192.168.4.1 555");
在终端netcat上执行后,打开了,但是我不知道如何让我的程序自动写密码。尝试过:
system ("netcat 192.168.4.1 555");
printf("key");
调用netcat命令后无法写东西。在我的程序发送密钥后,需要关闭netcat,该怎么做?
我希望我能用英语解释自己,很高兴获得帮助来解决这个简单的问题。
*我正在使用linux进行编码,我的应用程序将在树莓派上运行。
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
感谢@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发送。
添加“超时3” netcat等待3秒,然后关闭连接。它允许我再次单击该按钮,然后关闭或打开门多少次。
echo %d | timeout 3 nc 192.168.4.1 555
我需要将“ char txt”的内容复制到“ int值”,因为在终端上不是写密码,而是在写“ cho cho”。