来自Arduino以太网和wget的数据,而不是python

时间:2018-02-13 01:07:56

标签: python arduino client-server wget

Arduino通过以太网提供数据的主题似乎已在以下几个方面进行了讨论:

1)Arduino ethernet communication

2)Dumping data over ethernet with an arduino client / python server

我最喜欢的方式是第一篇文章中提到的Arduino WebClient选项:

https://www.arduino.cc/en/Tutorial/WebClient

第二篇文章涉及一些Python(2.7),但似乎并没有解决问题。我也想知道wget是否更容易。

如果您有一个Arduino充当提供信息的简单服务器:

/*
Simply put out data as a server
*/

#include <SPI.h>
#include <Ethernet.h>

unsigned long current_time;
unsigned long old_time;

// Ethernet stuff
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0x12, 0x34
};

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
boolean notYetConnected;

// IP Address is set here
IPAddress ip(192, 168, 3, 50);

void setup()
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
{
  int i;

  Serial.begin(9600);

  // Ethernet option

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("# For Ethernet connection, server is at ");
  Serial.println(Ethernet.localIP());
  Serial.print("# \n");

}


void loop()
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
{

  int i;

  current_time = millis();

  // dump data every 100 ms
  if ((current_time - old_time) > 100)
  {

    // data from sensor spoofed here
    int datavalue = random(0, 100);

    Serial.print(current_time);
    Serial.print(",");

    Serial.print(datavalue);
    Serial.print("\n");

    server.print(current_time);
    server.print(",");
    server.print(datavalue);
    server.print("\n");


    // get delta time
    old_time = current_time;
  }
}

...您可以使用'wget 192.168.3.50'来获取转储到文件的数据(默认为index.html)。

这不是典型的客户端/服务器,程序要求提供信息,然后返回;服务器只是转储数据,你可以将网络浏览器指向IP地址,或者,如上所示,使用wget。

当您设置并忘记'wget命令时,数据记录得非常好。我只做了1.75+小时的测试,得到了60K +线(每100毫秒一次),系统正常工作。

我注意到如果我停止'wget'命令并重新启动它,几次之后,wget进程会挂起,我必须重置我的Arduino。

完整的客户端 - 服务器程序似乎是一种更好的方式:

https://giovanniorgantini.wordpress.com/2015/03/14/getting-data-over-the-internet-with-arduino/

...我现在正在研究这个问题(原来的客户端在C中,如果有人可以指向一个简单的python-Arduino程序,否则,我会看一个简单的python客户端),但是想知道:

1)为什么停止'wget'(control-C)会导致重启wget进程时出现问题,系统会挂起:

  

user @ machine:$ wget 192.168.3.50   --2018-02-12 19:58:54-- http://192.168.3.50/连接到192.168.3.50:80 ......

停止数据流的一个原因是您停止测试,或者以编程方式启动另一个数据文件。

2)是否可以解析wget输出,以便数据可以每N个数据点或N秒保存在文件中?

客户端 - 服务器方法似乎是要走的路,但上面的例子似乎只能使用Web浏览器或单个命令行函数。对于某些应用程序,这似乎更容易使用。

这是一个简单的应用程序,仅用于从一组传感器转储数据。

在我的研究中,我也见过UDP客户端服务器:

http://www.toptechboy.com/tutorial/python-with-arduino-lesson-16-simple-client-server-configuration-over-ethernet/

不知道是否有一种首选方式。

1 个答案:

答案 0 :(得分:0)

如果你在没有特定客户端的网络上扔东西,我认为UDP可能是更好的选择。

至于限制文件大小,我建议使用logrotate,如此答案所示 - https://unix.stackexchange.com/questions/17209/how-to-limit-log-file-size-using