Facebook RSS Feed
 
.NET Micro Framework: Netduino: Ethernet ile RSS Okumak
Tarih: 16.11.2013, Platform: .NET MF 4.2, IDE: Visual Studio 2012, Level: 200

RSS; blog yazıları, haberler ve diğer güncellemelerin hızlı paylaşımını sağlayan bir XML dosyasıdır. Haber kaynağı, güncelleme oluşumunda RSS dosyasını günceller ve okuyucu yazılım periyodik aralıklarla bu dosyayı denetler. Bu sayede kullanıcı birçok kaynaktaki gelişmelerden haberdar olur. Örneğimizde haber okuyucu bir program üzerinde duracağız.

İnternet'ten RSS içeriğinin indirilmesi için 3. parti WebClient sınıfını kullanacağız. WebClient sınıfı, indirdiği RSS dosyasını string olarak XML okuyucuya iletecek. XML okuyucu tarafından bölümlere ayrılan RSS dosyası debug mesajı olarak Visual Studio'ya iletilecek. Uygulama modifiye edilerek bu veriler istenilen amaçla kullanılabilir.

Uygulama Kodları

Visual Studio'dan yeni bir Micro Framework Console Application oluşturup aşağıdaki referansları projemize ekleyelim:

- System.dll: WebClient sınıfının socket'lere erişmesi için.
- System.IO.dll: Memory Stream oluşturmak için.
- System.Xml.dll: XML verisini okumak için.
- System.Http.dll: İnternet'e erişim için.
- Microsoft.SPOT.Graphics.dll: WebClient sınıfının çalışması için gerekli.

Bir sonraki aşamada WebClient.cs sınıfını projeye ekleyeceğiz. Bu sınıf ile uygulamamız İnternet'e bağlanıp RSS dosyasını indirecek.

[C#] WebClient.cs

using System;
using System.Text;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;

namespace MFRSSIleHaberOkumak
{
    public class WebClient
    {

        public WebClient(String server, Int32 port)
        {
            this._server = server;
            this._port = port;
        }

        public enum ContentType
        {
            Text,
            Image
        }

        public enum HttpVersion
        {
            V_10,
            V_11
        }

        String _server;
        Int32 _port;

        public object GetContent(String request, ContentType type, HttpVersion version)
        {
            const Int32 c_microsecondsPerSecond = 1000000;

            // Create a socket connection to the specified server and port.
            using (Socket serverSocket = ConnectSocket(_server, _port))
            {
                // Send request to the server.
                Byte[] bytesToSend = Encoding.UTF8.GetBytes
        ("GET " + request + " HTTP/1." +
                    (version == HttpVersion.V_10 ? "0" : "1") + "\r\n" +
                    "Host: " + _server + "\r\n" +
                    "Connection: Close\r\n\r\n");
                serverSocket.Send(bytesToSend, bytesToSend.Length, 0);

                // Reusable buffer for receiving chunks of the document.
                Byte[] buf = new Byte[1024];
                Byte[] imgData = null;


                // Wait up to 30 seconds for initial data to be available
                // Will throw exception if connection closed with no data sent
                DateTime timeoutAt = DateTime.Now.AddSeconds(30);
                while (serverSocket.Available == 0 && DateTime.Now < timeoutAt)
                {
                    System.Threading.Thread.Sleep(100);
                }

                string header = String.Empty;
                string page = String.Empty;

                bool bHeaderReceived = false;
                int offset = 0;
                int size = 1;
                int index = 0;

                // Poll for data until 30 second time out - 
                // Returns true for data and connection closed
                while (serverSocket.Poll(30 * c_microsecondsPerSecond,
            SelectMode.SelectRead))
                {
                    // If 0 bytes in buffer, then connection is closed, 
                    // or we have timed out
                    if (serverSocket.Available == 0)
                        break;

                    // Zero all bytes in the re-usable buffer
                    Array.Clear(buf, 0, size);

                    // Read a buffer-sized HTML chunk
                    Int32 bytesRead = serverSocket.Receive
            (buf, offset, size, SocketFlags.None);

                    // If 0 bytes in buffer, then connection is closed
                    if (bytesRead == 0)
                        break;

                    if (bHeaderReceived == false)
                    {
                        header = header + new String(Encoding.UTF8.GetChars(buf));
                        if (buf[0] == '\n' && header.IndexOf("\r\n\r\n") > 0)
                        {
                            bHeaderReceived = true;
                            size = buf.Length;
                            //Debug.Print(header);

                            if (type == ContentType.Image)
                            {

                                string tag = "Content-Length:";
                                int lenIndex = header.IndexOf(tag);

                                if (lenIndex > 0)
                                {
                                    int len = Int32.Parse(
                                                header.Substring(
                                                    lenIndex + tag.Length,
                                                    header.IndexOf("\r\n",
                          lenIndex) - lenIndex - tag.Length));

                                    //Debug.Print("len = " + len.ToString());
                                    imgData = new byte[len];
                                }
                            }
                        }
                    }
                    else
                    {
                        switch (type)
                        {
                            case ContentType.Text:
                                page = page + new String(Encoding.UTF8.GetChars(buf));
                                break;
                            case ContentType.Image:
                                Array.Copy(buf, 0, imgData, index, bytesRead);
                                index += bytesRead;
                                break;
                        }
                    }
                }

                return type == ContentType.Text ?
                    (object)page :
                    (object)new Bitmap(imgData, Bitmap.BitmapImageType.Gif);
            }
        }

        Socket ConnectSocket(String server, Int32 port)
        {
            // Get server's IP address.
            IPHostEntry hostEntry = Dns.GetHostEntry(server);

            // Create socket and connect to the server's IP address and port
            Socket socket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(new IPEndPoint(hostEntry.AddressList[0], port));

            return socket;
        }
    }
}

[C#] Program.cs

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Threading;
using Microsoft.SPOT;
 
namespace MFRSSIleHaberOkumak
{
    public class Program
    {
        public static void Main()
        {
            //80. Porttan CNN Türk web sitesine bağlanacak bir Web Client instance'ı oluşturalım:
            WebClient web = new WebClient("www.cnnturk.com", 80);
 
            //Web Client'ın döndürdüğü XML verisini byte'lara ayırarak memory stream'e gönderelim:
            MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes( //XML'i byte'lara böl
                (string)web.GetContent("/servisler/rss/24/formula1.xml", //RSS kaynağının web adresi
                WebClient.ContentType.Text, WebClient.HttpVersion.V_11)));
 
            //Oluşturduğumuz memory stream'i okuyacak bir XML Reader oluşturalım:
            XmlReader xmlReader = XmlReader.Create(memoryStream);
 
            while (!xmlReader.EOF) //XML'in sonuna kadar
            {
                xmlReader.Read(); //XML'in bir satırını oku
                switch (xmlReader.NodeType) //Node türüne göre karar ver
                {
                    case XmlNodeType.XmlDeclaration: //XML Decleration ise
                        Debug.Print(xmlReader.Name);
                        break;
                    case XmlNodeType.Text: //XML Değeri ise
                        Debug.Print(xmlReader.Value);
                        break;
                    default:
                        break;
                }
            }
 
            xmlReader.Close(); //XML Reader'i kapatalım.
 
            Thread.Sleep(Timeout.Infinite);
        }
    }
}

Uygulamayı çalıştırdığınızda simulatör, web client aracılığıyla İnternet'e bağlanıp RSS dosyasını indirecek ve XML Reader ile bu dosya işlenecek. Haber kaynağını Immediate Window'da göreceksiniz.


Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 1950

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi