首页 文章

使用Arduino和ENC28J60以太网LAN网络模块发送HTTP POST请求

提问于
浏览
5

我刚刚在Ebay上购买了新的ENC28J60以太网LAN网络模块,我想将此模块的POST数据发送到指定的网址,例如 . www.mydomain.com/example.php

我重新阅读了谷歌的一些例子,但我能看到的只是arduino盾牌的例子,而不是我的模块 . 有了这个模块,我正在使用以下库:

"etherShield.h"
"ETHER_28J60.h"

我想将一个/两个指定的POSTS(变量)发送到php公式,但我不知道如何做到这一点 .

5 回答

  • 1

    首先,您需要安装以下库:https://github.com/jcw/ethercard

    用6个引脚将模块连接到arduino:

    • ENC SO - > Arduino引脚12

    • ENC SI - > Arduino引脚11

    • ENC SCK - > Arduino引脚13

    • ENC CS - > Arduino引脚8

    • ENC VCC - > Arduino 3V3引脚

    • ENC GND - > Arduino Gnd引脚

    然后使用以下代码:

    #include <EtherCard.h>
    
    // your variable
    
    #define PATH    "example.php"
    #define VARIABLE    "test"
    
    // ethernet interface mac address, must be unique on the LAN
    byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    
    char website[] PROGMEM = "www.mydomain.com";
    
    byte Ethernet::buffer[700];
    uint32_t timer;
    Stash stash;
    
    void setup () {
      Serial.begin(57600);
      Serial.println("\n[webClient]");
    
      if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
        Serial.println( "Failed to access Ethernet controller");
      if (!ether.dhcpSetup())
        Serial.println("DHCP failed");
    
      ether.printIp("IP:  ", ether.myip);
      ether.printIp("GW:  ", ether.gwip);  
      ether.printIp("DNS: ", ether.dnsip);  
    
      if (!ether.dnsLookup(website))
        Serial.println("DNS failed");
    
      ether.printIp("SRV: ", ether.hisip);
    }
    
    void loop () {
      ether.packetLoop(ether.packetReceive());
    
      if (millis() > timer) {
        timer = millis() + 10000;
    
        byte sd = stash.create();
        stash.print("variable=");
        stash.print(VARIABLE);
        stash.print("&action=Submit");
        stash.save();
    
        // generate the header with payload - note that the stash size is used,
        // and that a "stash descriptor" is passed in as argument using "$H"
        Stash::prepare(PSTR("POST http://$F/$F.csv HTTP/1.0" "\r\n"
                    "Host: $F" "\r\n"
                    "Content-Length: $D" "\r\n"
                    "Content-Type: application/x-www-form-urlencoded" "\r\n"
                    "\r\n"
                    "$H"),
        website, PSTR(PATH), website, stash.size(), sd);
    
        // send the packet - this also releases all stash buffers once done
        ether.tcpSend();
      }
    }
    
  • 6

    您可能想要尝试这个与库存Ethernet-lib完全兼容的库:

    https://github.com/ntruchsess/arduino_uip

    来自Arduino-IDE以太网的示例通过在[arduino-dir] / libraries / UIPEthernet中安装此lib来打开标准以太网示例(例如:examples-> Ethernet-> WebServer)并将“Ethenet.h”替换为“ UIPEthernet.h” .

  • 1

    关于netheads回答,我在服务器端收到POST数据时遇到问题 . 它正在接收 Headers 信息,我无法使用$ _POST或任何其他方式访问帖子数据 . 我发现指定内容类型解决了这个问题 . 只需更改HTTP标头部分,如下所示:

    Stash::prepare(PSTR("POST http://$F/$F.csv HTTP/1.0" "\r\n"
                        "Host: $F" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "Content-Type: application/x-www-form-urlencoded" "\r\n"
                        "\r\n"
                        "$H"),
            website, PSTR(PATH), website, stash.size(), sd);
    
  • 1

    Arduino v1.6.12

    #include <EtherCard.h>
    
    // your variable
    
    #define PATH    "example.php"
    #define VARIABLE    "test"
    
    // ethernet interface mac address, must be unique on the LAN
    byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    
    const char website[] PROGMEM = "www.google.com";
    
    byte Ethernet::buffer[700];
    uint32_t timer;
    Stash stash;
    
    void setup () {
      Serial.begin(57600);
      Serial.println("\n[webClient]");
    
      if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
        Serial.println( "Failed to access Ethernet controller");
      if (!ether.dhcpSetup())
        Serial.println("DHCP failed");
    
      ether.printIp("IP:  ", ether.myip);
      ether.printIp("GW:  ", ether.gwip);  
      ether.printIp("DNS: ", ether.dnsip);  
    
      if (!ether.dnsLookup(website))
        Serial.println("DNS failed");
    
      ether.printIp("SRV: ", ether.hisip);
    }
    
    void loop () {
      ether.packetLoop(ether.packetReceive());
    
      if (millis() > timer) {
        timer = millis() + 10000;
    
        byte sd = stash.create();
        stash.print("variable=");
        stash.print(VARIABLE);
        stash.print("&action=Submit");
        stash.save();
    
        // generate the header with payload - note that the stash size is used,
        // and that a "stash descriptor" is passed in as argument using "$H"
        Stash::prepare(PSTR("POST http://$F/$F.csv HTTP/1.0" "\r\n"
                            "Host: $F" "\r\n"
                            "Content-Length: $D" "\r\n"
                            "\r\n"
                            "$H"),
                website, PSTR(PATH), website, stash.size(), sd);
    
        // send the packet - this also releases all stash buffers once done
        ether.tcpSend();
      }
    }
    
  • 1

    如果有人想要调用API,则需要在请求中删除.csv,如下所示:

    byte sd = stash.create();
        stash.print("variable="); //change this to your post variable
        stash.print(VARIABLE);
        stash.print("&action=Submit");
        stash.save();
    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    //remove the .csv
    Stash::prepare(PSTR("POST http://$F/$F HTTP/1.0" "\r\n"
                "Host: $F" "\r\n"
                "Content-Length: $D" "\r\n"
                "Content-Type: application/x-www-form-urlencoded" "\r\n"
                "\r\n"
                "$H"),
    website, PSTR(PATH), website, stash.size(), sd);
    

    其他信息,如果您使用本地服务器进行测试,则可以查看Wampp或Xampp Server的访问日志,以了解您的请求已到达服务器的天气 .

    并在此行中使用const:

    char const website[] PROGMEM = "www.mydomain.com";
    

相关问题