使用 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"。
我搜索了很多,但无法弄清楚如何解决我的问题。我有一个 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"。