2023年3月3日 星期五

實作 Ethernet Shield 網路通訊

本實作介紹如何使用 Arduino Ethernet Shield W5100 乙太網路擴充板,指定相關網路參數例如MAC、IP位址等,以WEB SERVER的方式讓透過網路擴充板成為簡易的網路伺服器。

Ethernet Shield(W5100) 是把 TCP/IP Protocols (TCP, UDP, ICMP, IPv4 ARP, IGMP, PPPoE, Ethernet) 直接燒至硬體電路上,只要使用 Ethernet Library 便可以輕易完成連至網際網路的動作。本實作使用副廠的 Arduino Ethernet Shield W5100 乙太網路擴充板,相容於原廠的乙太網路擴充板,價格相對便宜。


Ethernet Shield 擴充板在使用時就直接插在 Arduino UNO即可。


Ethernet Shield狀態指示燈 (LEDs)功能如下:
* PWR: 表示 Arduino 控制板和 Ethernet Shield 已經上電
* LINK: 網路指示燈,當燈號閃爍時代表正在傳送或接收資料
* FULLD: 代表網路連線是全雙工
* 100M: 表示網路是 100 MB/s (相對於 10 Mb/s)
* RX: 接收資料時閃爍
* TX: 傳送資料時閃爍
* COLL: 閃爍時代表網路上發生封包碰撞的情形 (network collisions are detected)


#include <SPI.h>
#include <Ethernet.h>
 
// 設定MAC地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// 設定IP地址
IPAddress ip(192, 168, 0, 97);
//設定DNS
//IPAddress dnServer(168, 95, 1, 1);
// 設定閘道
IPAddress gateway(192, 168, 0, 1);
// 設定遮罩
IPAddress subnet(255, 255, 255, 0);
// 初始化Ethernet程式庫,HTTP默認端口為80
EthernetServer server(80);
 
void setup() {
// 初始化串口通訊
  Serial.begin(9600);
 
  // 開始ethernet連接,並作為服務器初始化
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
  Serial.print( "server is at " );
  Serial.println(Ethernet.localIP());
}
 
void loop() {
  // 監聽客戶端傳來的數據
  EthernetClient client = server.available();
  //如果有新連線請求
  if (client) {
    Serial.println( "new client" );
    // 只要通訊連線中.....
    while (client.connected()) {
      //確認客戶端有發出請求
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
          client.println( "HTTP/1.1 200 OK" );
          client.println( "Content-Type: text/html" );
          client.println( "Connection: close" );
          client.println();
          client.println( "<!DOCTYPE HTML>" );
          client.println( "<html><head>" );
          client.println( "<meta charset=\"utf-8\" />" );
          client.println( "<title>Arduino 通訊</title>" );
          client.println( "</head><body>" );
          client.println( "<h1>通訊成功</h1>" );
          client.println( "</body></html>" );
          
          break ;
        }
    }
    // 等待瀏覽器接收資料
    delay(1);
    // 斷開連接
    client.stop();
    Serial.println( "client disonnected" );
  }
}

Ethernet.begin() 詳細用法請參考這裡。