前篇文章<a href="https://www.techbang.com/posts/53504-internet-systems-development-using-the-telnet-communications-development-chat-room">【物聯網系統開發】使用TELNET通訊開發聊天室</a>(曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德, 2017c)一文中,我們使用網路上最通用的Telnet通訊協定,來開發一個簡單的聊天室,讓讀者了解簡單的通訊原理(曹永忠 et al., 2017c; 曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德, 2017d, 2017e; 曹永忠, 許智誠, &amp; 蔡英德, 2015i, 2015j)。<p>文\曹永忠、吳佳駿、許智誠、蔡英德</p>
<p>由於一般聊天室都是多人可以共同聊天,所以本文希望透過多人分享網路的機制,來改寫為多人聊天室的功能(曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德, 2017a, 2017b; 曹永忠, 許智誠, &amp; 蔡英德, 2015a, 2015b, 2015c, 2015d, 2015e, 2015f, 2015g, 2015h),其經驗與相關技術可以讓讀者可以在物聯網應用方面作為一個技術參考。</p>
<p>本系列希望貢獻筆者一些經驗,讓非資訊、電機、電子等Makers可以學到在物聯網開發中,一些程式開發的技巧、原理、法則與穩固的技術,因本系列文章主要讀者為初學者,內容程度為基礎入門程度,深入之處不足,但請高手們給筆者賜教,也請讀者關注本系列。</p>
<h3>Telnet簡單多人版聊天室</h3>
<p>首先,組立W5100 以太網路模組是非常容易的一件事,如下圖所示,只要將W5100 以太網路模組堆疊到任何 Arduino 開發板之上就可以了。</p>
<p style="text-align: center;"><img style="display: inline-block;" src="https://cdn2-techbang.pixfs.net/system/images/413134/original/adaaee96b69e156ba627b903ecfe4fca.jpg?1506412481" width="600" /><label class="figuresaid" style="width: 600px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>圖 1 將Arduino開發板與W5100 以太網路模組堆疊組立</label></p>
<p>之後,在將組立好的W5100 以太網路模組,如下圖所示,只要將USB線差到Arduino開發板,再將RJ 45的網路線一端插到W5100 以太網路模組,另一端插到可以上網的集線器(Switch HUB)的任何一個區域網路接口(Lan Port)就可以了。</p>
<p style="text-align: center;"><img style="display: inline-block;" src="https://cdn0-techbang.pixfs.net/system/images/413135/original/c27b1f513e5148db999773d6fc34d250.jpg?1506412481" width="600" /><label class="figuresaid" style="width: 600px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>圖 2接上電源與網路線的W5100 以太網路模組堆疊卡</label></p>
<p style="text-align: left;">我們遵照前幾章所述,將 Arduino 開發板的驅動程式安裝好之後,我們打開 Arduino 開發板的開發工具:Sketch IDE 整合開發軟體,攥寫一段程式,如下表所示之 Telnet 簡單聊天室測試程式,我們就可以讓W5100 以太網路模組堆疊卡變成一台簡易的 Telnet 簡單多人版聊天室運作了。</p>
<h3 style="text-align: left;">表 1 Telnet簡單多人版聊天室測試程式</h3>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="558">
<p>Telnet簡單多人版聊天室測試程式(AdvancedChatServer)</p>
</td>
</tr>
<tr>
<td valign="top" width="558">
<p>/*</p>
<p>&nbsp;Chat&nbsp; Server</p>
<p>&nbsp;</p>
<p>&nbsp;A simple server that distributes any incoming messages to all</p>
<p>&nbsp;connected clients.&nbsp; To use telnet to&nbsp; your device's IP address and type.</p>
<p>&nbsp;You can see the client's input in the serial monitor as well.</p>
<p>&nbsp;Using an Arduino Wiznet Ethernet shield.</p>
<p>&nbsp;</p>
<p>&nbsp;Circuit:</p>
<p>&nbsp;* Ethernet shield attached to pins 10, 11, 12, 13</p>
<p>&nbsp;* Analog inputs attached to pins A0 through A5 (optional)</p>
<p>&nbsp;</p>
<p>&nbsp;created 18 Dec 2009</p>
<p>&nbsp;by David A. Mellis</p>
<p>&nbsp;modified 9 Apr 2012</p>
<p>&nbsp;by Tom Igoe</p>
<p>&nbsp;</p>
<p>&nbsp;*/</p>
<p>&nbsp;</p>
<p>#include &lt;SPI.h&gt;</p>
<p>#include &lt;Ethernet.h&gt;</p>
<p>&nbsp;</p>
<p>// Enter a MAC address for your controller below.</p>
<p>// Newer Ethernet shields have a MAC address printed on a sticker on the shield</p>
<p>byte mac[] = {</p>
<p>&nbsp; 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF</p>
<p>};</p>
<p>IPAddress ip(192, 168, 30, 200);</p>
<p>IPAddress dnServer(168, 95, 1, 1);</p>
<p>// the router's gateway address:</p>
<p>IPAddress gateway(192, 168, 30, 254);</p>
<p>// the subnet:</p>
<p>IPAddress subnet(255, 255, 255, 0);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>// telnet defaults to port 23</p>
<p>EthernetServer server(23);</p>
<p>boolean alreadyConnected = false; // whether or not the client was connected previously</p>
<p>&nbsp;</p>
<p>void setup() {</p>
<p>&nbsp; // initialize the ethernet device</p>
<p>&nbsp; Ethernet.begin(mac, ip, gateway, subnet);</p>
<p>&nbsp; // start listening for clients</p>
<p>&nbsp; server.begin();</p>
<p>&nbsp; // Open serial communications and wait for port to open:</p>
<p>&nbsp; Serial.begin(9600);</p>
<p>&nbsp; while (!Serial) {</p>
<p>&nbsp;&nbsp;&nbsp; ; // wait for serial port to connect. Needed for Leonardo only</p>
<p>&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp; Serial.print("Chat server address:");</p>
<p>&nbsp; Serial.println(Ethernet.localIP());</p>
<p>}</p>
<p>&nbsp;</p>
<p>void loop() {</p>
<p>&nbsp; // wait for a new client:</p>
<p>&nbsp; EthernetClient client = server.available();</p>
<p>&nbsp;</p>
<p>&nbsp; // when the client sends the first byte, say hello:</p>
<p>&nbsp; if (client) {</p>
<p>&nbsp;&nbsp;&nbsp; if (!alreadyConnected) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // clead out the input buffer:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.flush();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("We have a new client");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.println("Hello, client!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alreadyConnected = true;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; if (client.available() &gt; 0) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // read the bytes incoming from the client:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char thisChar = client.read();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // echo the bytes back to the client:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server.write(thisChar);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // echo the bytes to the server as well:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.write(thisChar);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: left;">&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="558">
<p>/*</p>
<p>&nbsp;Chat&nbsp; Server</p>
<p>&nbsp;</p>
<p>&nbsp;A simple server that distributes any incoming messages to all</p>
<p>&nbsp;connected clients.&nbsp; To use telnet to&nbsp; your device's IP address and type.</p>
<p>&nbsp;You can see the client's input in the serial monitor as well.</p>
<p>&nbsp;Using an Arduino Wiznet Ethernet shield.</p>
<p>&nbsp;</p>
<p>&nbsp;Circuit:</p>
<p>&nbsp;* Ethernet shield attached to pins 10, 11, 12, 13</p>
<p>&nbsp;* Analog inputs attached to pins A0 through A5 (optional)</p>
<p>&nbsp;</p>
<p>&nbsp;created 18 Dec 2009</p>
<p>&nbsp;by David A. Mellis</p>
<p>&nbsp;modified 9 Apr 2012</p>
<p>&nbsp;by Tom Igoe</p>
<p>&nbsp;</p>
<p>&nbsp;*/</p>
<p>&nbsp;</p>
<p>#include &lt;SPI.h&gt;</p>
<p>#include &lt;Ethernet.h&gt;</p>
<p>&nbsp;</p>
<p>// Enter a MAC address for your controller below.</p>
<p>// Newer Ethernet shields have a MAC address printed on a sticker on the shield</p>
<p>byte mac[] = {</p>
<p>&nbsp; 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF</p>
<p>};</p>
<p>IPAddress ip(192, 168, 30, 200);</p>
<p>IPAddress dnServer(168, 95, 1, 1);</p>
<p>// the router's gateway address:</p>
<p>IPAddress gateway(192, 168, 30, 254);</p>
<p>// the subnet:</p>
<p>IPAddress subnet(255, 255, 255, 0);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>// telnet defaults to port 23</p>
<p>EthernetServer server(23);</p>
<p>boolean alreadyConnected = false; // whether or not the client was connected previously</p>
<p>&nbsp;</p>
<p>void setup() {</p>
<p>&nbsp; // initialize the ethernet device</p>
<p>&nbsp; Ethernet.begin(mac, ip, gateway, subnet);</p>
<p>&nbsp; // start listening for clients</p>
<p>&nbsp; server.begin();</p>
<p>&nbsp; // Open serial communications and wait for port to open:</p>
<p>&nbsp; Serial.begin(9600);</p>
<p>&nbsp; while (!Serial) {</p>
<p>&nbsp;&nbsp;&nbsp; ; // wait for serial port to connect. Needed for Leonardo only</p>
<p>&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp; Serial.print("Chat server address:");</p>
<p>&nbsp; Serial.println(Ethernet.localIP());</p>
<p>}</p>
<p>&nbsp;</p>
<p>void loop() {</p>
<p>&nbsp; // wait for a new client:</p>
<p>&nbsp; EthernetClient client = server.available();</p>
<p>&nbsp;</p>
<p>&nbsp; // when the client sends the first byte, say hello:</p>
<p>&nbsp; if (client) {</p>
<p>&nbsp;&nbsp;&nbsp; if (!alreadyConnected) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // clead out the input buffer:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.flush();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.println("We have a new client");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.println("Hello, client!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alreadyConnected = true;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; if (client.available() &gt; 0) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // read the bytes incoming from the client:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char thisChar = client.read();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // echo the bytes back to the client:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server.write(thisChar);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // echo the bytes to the server as well:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Serial.write(thisChar);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: left;" align="right">原始碼網址:<a href="https://github.com/brucetsao/arduino_RFProgramming">https://github.com/brucetsao/arduino_RFProgramming</a></p>
<p>如下圖所示,讀者可以看到本次實驗- Telnet 簡單多人版聊天室,我們使用 Putty 通訊軟體,預備進行連線的畫面。</p>
<p style="text-align: center;"><img style="display: inline-block;" src="https://cdn2-techbang.pixfs.net/system/images/413136/original/8d0a0db964e7f92f5815ef4c7b6d2c05.jpg?1506412843" /><label class="figuresaid" style="width: 600px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>圖 3 Telnet 簡單聊天室多人版預備進行連線的畫面</label></p>
<p>如下圖所示,讀者可以看到本次實驗- Telnet 簡單聊天室,我們使用Putty通訊軟體,第一位Telnet簡單聊天室多人版連線中的畫面。</p>
<p style="text-align: center;"><img style="display: inline-block;" src="https://cdn2-techbang.pixfs.net/system/images/413137/original/ab5faeaec7db9c8920e435b15899d99f.jpg?1506412844" /><label class="figuresaid" style="width: 600px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>圖 4第一位 Telnet 簡單聊天室多人版連線中的畫面</label></p>
<p>如下圖所示,讀者可以看到本次實驗- Telnet 簡單聊天室多人版,我們使用 Putty 通訊軟體,第二位 Telnet 簡單聊天室多人版進行的畫面。</p>
<p style="text-align: center;"><img style="display: inline-block;" src="https://cdn1-techbang.pixfs.net/system/images/413138/original/444b298a65dbd77f8a24bbde7c6dc87c.jpg?1506412844" width="600" /><label class="figuresaid" style="width: 600px; display: block; text-align: left; color: #555; line-height: 22px; padding: 0 3px 22px 3px; border-bottom: 2px solid #f0f0f0; margin: -5px auto 1rem auto;"><span style="color: #2382c5; padding-right: 5px;"> ▲ </span>圖 5第二位 Telnet 簡單聊天室多人版進行的畫面</label></p>
<h3>後續</h3>
<p>本篇為『物聯網系統開發系列』系列之使用使用TELNET通訊開發多人聊天室,主要內容是要讓讀者使用創客神器 Arduino 開發板,透過乙太網路擴充板(Ethernet Shield)的網際網路多人連線之強大功能,透過讓 Arduino 開發板開發簡單的聊天室,讓讀者可以學習多人 TCP/IP 通訊的簡單用法,進而將這個基礎理念與技術,進階運用到雲端平台中互傳資訊的機制,進而在物聯網開發中,成為一個技術的核心能力,乃是筆者本篇內容想傳達的創作概念。</p>
<p>筆者本系列是針對非資訊、電機、電子等 Makers 攥寫的物聯網系統開發系列,這五、六年來在物聯網系統開發領域寫書、發表文章、辦展、授課,常遇到許多學子訓練不足,以交作業的心態來學習,並沒有把程式底子打好。</p>
<p>後續筆者還會繼續發表『物聯網系統開發系列』系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。</p>
<p>敬請期待更多的文章。</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="553">
<p>曹永忠 (Yung-Chung Tsao)&nbsp;,目前為自由作家暨專業Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。</p>
<p>Email:<a href="mailto:[email protected]">[email protected]</a></p>
<p>Line ID:dr.brucetsao</p>
<p><img style="border-width: 1px; border-image-width: initial; outline-width: 0px; height: 230px;" src="https://cdn0-techbang.pixfs.net/system/images/409732/original/fd0a2d8a3b552df2a19fe4c2a24bb7f8.jpeg?1503977477" alt="" width="235" height="230" data-original="/system/images/409732/original/fd0a2d8a3b552df2a19fe4c2a24bb7f8.jpeg?1503977477" /></p>
<p>作者網站:<a href="https://www.cs.pu.edu.tw/~yctsao/">https://www.cs.pu.edu.tw/~yctsao/</a></p>
<p><img style="border-width: 1px; border-image-width: initial; outline-width: 0px;" src="https://www.techbang.com/assets/lazyload/loading-c32ba3ae840262c3f6cef650de095256.gif" data-original="file:///C:\Users\PCHOME~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" />臉書社群(Arduino.Taiwan):<a href="https://www.facebook.com/groups/Arduino.Taiwan/">https://www.facebook.com/groups/Arduino.Taiwan/</a></p>
<p>Github網站:<a href="https://github.com/brucetsao/">https://github.com/brucetsao/</a></p>
<p>吳佳駿 (Chia-Chun Wu),國立中興大學資訊科學與工程學系博士,現任教於國立金門大學工業工程與管理學系專任助理教授,目前兼任國立金門大學計算機與網路中心資訊網路組組長,主要研究為軟體工程與應用、行動裝置程式設計、物件導向程式設計、網路程式設計、動態網頁資料庫、資訊安全與管理。</p>
<p>Email:&nbsp;<a href="mailto:[email protected]">[email protected]</a></p>
<p>許智誠 (Chih-Cheng Hsu),美國加州大學洛杉磯分校(UCLA) 資訊工程系博士,曾任職於美國IBM等軟體公司多年,現任教於中央大學資訊管理學系專任副教授,主要研究為軟體工程、設計流程與自動化、數位教學、雲端裝置、多層式網頁系統、系統整合。</p>
<p>Email:&nbsp;<a href="mailto:[email protected]">[email protected]</a></p>
<p>蔡英德 (Yin-Te Tsai),國立清華大學資訊科學系博士,目前是靜宜大學資訊傳播工程學系教授、靜宜大學計算機及通訊中心主任,主要研究為演算法設計與分析、生物資訊、軟體開發、視障輔具設計與開發。</p>
<p>Email:<a href="mailto:[email protected]">[email protected]</a></p>
</td>
</tr>
</tbody>
</table>
<blockquote>
<p>參考文獻:</p>
<p>曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2017a). <em>Ameba</em><em>程式設計(</em><em>物聯網基礎篇):An Introduction to Internet of Thing by Using Ameba RTL8195AM</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p>曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2017b). <em>Ameba</em><em>程序设计(</em><em>物联网基础篇):An Introduction to Internet of Thing by Using Ameba RTL8195AM</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p>曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2017c). 【物聯網系統開發】使用TELNET通訊開發聊天室. <em>智慧家庭.</em>&nbsp; Retrieved 2017/9/1, from https://<a href="http://www.techbang.com/posts/53504-internet-systems-development-using-the-telnet-communications-development-chat-room">www.techbang.com/posts/53504-internet-systems-development-using-the-telnet-communications-development-chat-room</a></p>
<p>曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2017d). 【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立用戶端工具程式. <em>智慧家庭.</em>&nbsp; Retrieved 2017/6/22, from <a href="http://www.techbang.com/posts/52039-internet-system-development-established-client-tools-using-arduino-ethernet-add-on-board-procedures">http://www.techbang.com/posts/52039-internet-system-development-established-client-tools-using-arduino-ethernet-add-on-board-procedures</a></p>
<p>曹永忠, 吳佳駿, 許智誠, &amp; 蔡英德. (2017e). 【物聯網系統開發】運用 ARDUINO 乙太網路擴充板建立簡單網頁伺服器. <em>智慧家庭.</em>&nbsp; Retrieved 2017/6/4, from <a href="http://www.techbang.com/posts/51518-internet-system-using-arduino-ethernet-add-on-board-to-build-a-simple-web-server">http://www.techbang.com/posts/51518-internet-system-using-arduino-ethernet-add-on-board-to-build-a-simple-web-server</a></p>
<p>曹永忠, 許智誠, &amp; 蔡英德. (2015a). <em>86Duino</em><em>程式教學(</em><em>網路通訊篇):86duino Programming (Networking Communication)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p>曹永忠, 許智誠, &amp; 蔡英德. (2015b). <em>86Duino</em><em>编程教学(</em><em>无线通讯篇):86duino Programming (Networking Communication)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p>曹永忠, 許智誠, &amp; 蔡英德. (2015c). <em>Arduino</em><em>云 </em><em>物联网系统开发(</em><em>入门篇):Using Arduino Yun to Develop an Application for Internet of Things (Basic Introduction)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
<p>曹永忠, 許智誠, &amp; 蔡英德. (2015d). <em>Arduino</em><em>程式教學(</em><em>常用模組篇):Arduino Programming (37 Sensor Modules)</em> (初版 ed.). 台湾、彰化: 渥玛数位有限公司.</p>
<p>曹永忠, 許智誠, &amp; 蔡英德. (2015e). <em>Arduino</em><em>程式教學(</em><em>無線通訊篇):Arduino Programming (Wireless Communication)</em> (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.</p>
</blockquote><a href="http://www.facebook.com/TKbang">加入T客邦Facebook粉絲團</a><img src="http://feeds.feedburner.com/~r/techbang/~4/oKamtYI1OlE" height="1" width="1" alt=""/>