【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式

【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式

本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等 Makers 可以學到在物聯網開發中,一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。

 

文\曹永忠、吳佳駿、許智誠、蔡英德

本篇承接上篇『【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立簡單網頁伺服器』文章(曹永忠, 吳佳駿, 許智誠, & 蔡英德, 2017),進而運用 ARDUINO 乙太網路擴充板建立網際網路通訊能力,並且可以運用通訊能力,建立 Telnet 用戶端程式、簡易型文字瀏覽器等工具程式的撰寫,讓創客神器 Arduino 開發板(曹永忠, 許智誠, & 蔡英德, 2015c)可以成為物聯網開發,具有 TCP/IP 之擷取通訊內容能力之最方便使用的開發版。

Telnet 用戶端程式

首先,組立 W5100 以太網路模組是非常容易的一件事,如下圖所示,只要將 W5100  以太網路模組堆疊到任何 Arduino 開發板之上就可以了。

【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式
圖1. 將 Arduino 開發板與 W5100 以太網路模組堆疊組立

之後,在將組立好的 W5100 以太網路模組,如下圖所示,只要將 USB 線差到 Arduino 開發板,再將 RJ 45的網路線一端插到 W5100 以太網路模組,另一端插到可以上網的集線器(Switch HUB)的任何一個區域網路接口(Lan Port)就可以了。

【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式
圖2. 接上電源與網路線的 W5100 以太網路模組堆疊卡

所以我們如果將具有 TCP/IP 通訊能力的 Arduino 開發板,用於使用 Telnet 通訊能力,在物聯網的網路通訊中,就有機會可以用於更廣泛的工業通訊能力,那無異讓創客神器 Arduino 開發板(曹永忠 et al., 2015c)可以成為物聯網開發中,具有TCP/IP通訊內容能力之強大利器,所以我們先撰寫一個簡單的Telnet 用用戶端系統來驗證這個能力。我們為了讓W5100 以太網路模組堆疊卡變成一台具有 TCP/IP 通訊能力的機器(曹永忠, 許智誠, & 蔡英德, 2015a, 2015b),我們將 Arduino 開發板的驅動程式安裝好之後,我們打開 Arduino 開發板的開發工具:Sketch IDE 整合開發軟體,攥寫一段程式,如下表所示之 Telnet 用戶端程式測試程式。

表1. Telnet 用戶端程式測試程式

Telnet 用戶端程式測試程式(TelnetClient)

/*

  Telnet client

 

 This sketch connects to a a telnet server (http://www.google.com)

 using an Arduino Wiznet Ethernet shield.  You'll need a telnet server

 to test this with.

 Processing's ChatServer example (part of the network library) works well,

 running on port 10002. It can be found as part of the examples

 in the Processing application, available at

 http://processing.org/

 

 Circuit:

 * Ethernet shield attached to pins 10, 11, 12, 13

 

 created 14 Sep 2010

 modified 9 Apr 2012

 by Tom Igoe

 

 */

 

#include <SPI.h>

#include <Ethernet.h>

 

// Enter a MAC address and IP address for your controller below.

// The IP address will be dependent on your local network:

byte mac[] = {

  0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF

};

IPAddress ip(192, 168, 30, 200);

IPAddress dnServer(168, 95, 1, 1);

// the router's gateway address:

IPAddress gateway(192, 168, 30, 254);

// the subnet:

IPAddress subnet(255, 255, 255, 0);

 

 

// Enter the IP address of the server you're connecting to:

IPAddress server(140, 112, 172, 11);

 

// Initialize the Ethernet client library

// with the IP address and port of the server

// that you want to connect to (port 23 is default for telnet;

// if you're using Processing's ChatServer, use  port 10002):

EthernetClient client;

 

void setup() {

  // start the Ethernet connection:

  Ethernet.begin(mac, ip, dnServer, gateway, subnet);

 

  // Open serial communications and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for Leonardo only

  }

 

 

  // give the Ethernet shield a second to initialize:

  delay(1000);

  Serial.println("connecting...");

 

  // if you get a connection, report back via serial:

  if (client.connect(server, 23)) {

    Serial.println("connected");

  }

  else {

    // if you didn't get a connection to the server:

    Serial.println("connection failed");

  }

}

 

void loop()

{

  // if there are incoming bytes available

  // from the server, read them and print them:

  if (client.available()) {

    char c = client.read();

    Serial.print(c);

  }

 

  // as long as there are bytes in the serial queue,

  // read them and send them out the socket if it's open:

  while (Serial.available() > 0) {

    char inChar = Serial.read();

    if (client.connected()) {

      client.print(inChar);

    }

  }

 

  // if the server's disconnected, stop the client:

  if (!client.connected()) {

    Serial.println();

    Serial.println("disconnecting.");

    client.stop();

    // do nothing:

    while (true);

  }

}

 

 

 

程式碼:https://github.com/brucetsao/arduino_RFProgramming

如下圖所示,讀者可以看到本次實驗- Telnet 用戶端程式測試程式結果畫面。

【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式
圖3. Telnet 用戶端程式測試程式結果畫面

文字型 Browser 用戶端程式

如果我們就可以讓 Arduino 開發板累加上 W5100 以太網路模組堆疊卡,讓創客神器 Arduino 開發板(曹永忠 et al., 2015c)成為具有 TCP/IP 通訊能力的 Arduino 開發板,而且在物聯網的網路通訊中,使用 TCP/IP 的通訊能力,來擷取網頁 HTML 的內容,那將會是無比強大的先進功能。所以我們將 Arduino 開發板的驅動程式安裝好之後,我們打開 Arduino 開發板的開發工具:Sketch IDE 整合開發軟體,攥寫一段程式,如下表所示之文字型 Browser 用戶端程式,來驗證這個能力。

表2. 文字型 Browser 用戶端程式

文字型Browser用戶端程式(WebClient)

/*

  Web client

 

 This sketch connects to a website (http://www.google.com)

 using an Arduino Wiznet Ethernet shield.

 

 Circuit:

 * Ethernet shield attached to pins 10, 11, 12, 13

 

 created 18 Dec 2009

 by David A. Mellis

 modified 9 Apr 2012

 by Tom Igoe, based on work by Adrian McEwen

 

 */

 

#include <SPI.h>

#include <Ethernet.h>

 

// Enter a MAC address for your controller below.

// Newer Ethernet shields have a MAC address printed on a sticker on the shield

byte mac[] = {

  0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF

};

IPAddress ip(192, 168, 30, 200);

IPAddress dnServer(168, 95, 1, 1);

// the router's gateway address:

IPAddress gateway(192, 168, 30, 254);

// the subnet:

IPAddress subnet(255, 255, 255, 0);

 

// if you don't want to use DNS (and reduce your sketch size)

// use the numeric IP instead of the name for the server:

//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)

char server[] = "www.google.com";    // name address for Google (using DNS)

 

// Initialize the Ethernet client library

// with the IP address and port of the server

// that you want to connect to (port 80 is default for HTTP):

EthernetClient client;

 

void setup() {

  // Open serial communications and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for Leonardo only

  }

 

  // start the Ethernet connection:

  if (Ethernet.begin(mac) == 0) {

    Serial.println("Failed to configure Ethernet using DHCP");

    // no point in carrying on, so do nothing forevermore:

    // try to congifure using IP address instead of DHCP:

      Ethernet.begin(mac, ip, dnServer, gateway, subnet);

 

  }

  // give the Ethernet shield a second to initialize:

  delay(1000);

  Serial.println("connecting...");

 

  // if you get a connection, report back via serial:

  if (client.connect(server, 80)) {

    Serial.println("connected");

    // Make a HTTP request:

    client.println("GET /search?q=arduino HTTP/1.1");

    client.println("Host: www.google.com");

    client.println("Connection: close");

    client.println();

  }

  else {

    // kf you didn't get a connection to the server:

    Serial.println("connection failed");

  }

}

 

void loop()

{

  // if there are incoming bytes available

  // from the server, read them and print them:

  if (client.available()) {

    char c = client.read();

    Serial.print(c);

  }

 

  // if the server's disconnected, stop the client:

  if (!client.connected()) {

    Serial.println();

    Serial.println("disconnecting.");

    client.stop();

 

    // do nothing forevermore:

    while (true);

  }

}

程式碼:https://github.com/brucetsao/arduino_RFProgramming

如下圖所示,讀者可以看到本次實驗- 文字型 Browser 用戶端程式結果畫面。

【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式
圖4. 文字型 Browser 用戶端程式結果畫面

後續

本篇為『物聯網系統開發系列』系列之運用 ARDUINO 乙太網路擴充板建立用戶端工具程式,主要內容是要讓讀者使用創客神器 Arduino 開發板,透過乙太網路擴充板(Ethernet Shield)的網際網路連線之強大功能,可以讓 Arduino 開發板運用通訊能力,建立 Telnet 用戶端程式、簡易型文字瀏覽器等工具程式,如此一來,讀者可以將這個基礎理念與技術,進階運用到雲端平台的資料交換,或建立網路爬蟲的機制,進而在物聯網開發中,成為一個技術的核心能力’,乃是筆者本篇內容想傳達的創作概念。

筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的物聯網系統開發系列,這四、五年來在物聯網系統開發領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。

後續筆者還會繼續發表『物聯網系統開發系列』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。

敬請期待更多的文章。

作者介紹

曹永忠 (Yung-Chung Tsao) 目前為自由作家暨專業 Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。

Email:prgbruce@gmail.com
Line ID:dr.brucetsao

【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式

作者網站:https://www.cs.pu.edu.tw/~yctsao/
臉書社群(Arduino.Taiwan):https://www.facebook.com/groups/Arduino.Taiwan/
Github 網站:https://github.com/brucetsao/

吳佳駿 (Chia-Chun Wu),國立中興大學資訊科學與工程學系博士,現任教於國立金門大學工業工程與管理學系專任助理教授,目前兼任國立金門大學計算機與網路中心資訊網路組組長,主要研究為軟體工程與應用、行動裝置程式設計、物件導向程式設計、網路程式設計、動態網頁資料庫、資訊安全與管理。

Email: ccwu0918@nqu.edu.tw

 

許智誠 (Chih-Cheng Hsu),美國加州大學洛杉磯分校(UCLA) 資訊工程系博士,曾任職於美國 IBM 等軟體公司多年,現任教於中央大學資訊管理學系專任副教授,主要研究為軟體工程、設計流程與自動化、數位教學、雲端裝置、多層式網頁系統、系統整合。

Email: khsu@mgt.ncu.edu.tw

 

蔡英德 (Yin-Te Tsai),國立清華大學資訊科學系博士,目前是靜宜大學資訊傳播工程學系教授、靜宜大學計算機及通訊中心主任,主要研究為演算法設計與分析、生物資訊、軟體開發、視障輔具設計與開發。

Email:yttsai@pu.edu.tw

參考文獻:

曹永忠, 吳佳駿, 許智誠, & 蔡英德. (2017). 【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立簡單網頁伺服器. 智慧家庭.  Retrieved from http://www.techbang.com/posts/51518-internet-system-using-arduino-ethernet-add-on-board-to-build-a-simple-web-server

曹永忠, 許智誠, & 蔡英德. (2015a). Arduino程式教學(無線通訊篇):Arduino Programming (Wireless Communication) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.

曹永忠, 許智誠, & 蔡英德. (2015b). Arduino编程教学(无线通讯篇):Arduino Programming (Wireless Communication) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.

曹永忠, 許智誠, & 蔡英德. (2015c). 創客神器ARDUINO到底是什麼呢?.   Retrieved from http://makerdiwo.com/archives/1893

 




曹永忠
作者

曹永忠,國立中央大學資訊管理學系博士,目前在暨南大學電機工程學系兼任助理教授與自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計......並持續發表作相關專業著作。

使用 Facebook 留言
發表回應
謹慎發言,尊重彼此。按此展開留言規則