OrangePi Zero ile .NET kullanımı ve PC ile haberleşmesi

Başlatan tunayk, 12 Ocak 2018, 22:46:43

tunayk

Benim gibi linuxa yabancı olupda linux tabanlı kartlar ile çalışmak isteyenler vardır diye paylaşmak faydalı olur diye düşündüm. Uzun zamandır linux tabanlı kartlar ile bildiğimiz tarafta nasıl çalışırım diye düşünüp duruyordum.  Bir süre önce aldığım OrangePi Zero ile biraz uğraşıp çalışır hale getirmeye çalışmıştım ama sisteme yabancı olunca bi mesafe alamamıştım. Açıkçası linux konsolunda dir komutunun karşılığı nedir ondan bile haberim yok idi. Sağolsun google amca da birkaç arama ile epey yol aldık.

Windowsta herşey görsel olunca, insan epey bi zorlanıyor. VNC server ile görsellik elde edilebilir belki ama sınırlı bir kullanım sunuyor.  En sonunda doğru ayarlar ile sistemi çalıştırabildim.  Sonrasında sisteme mono runtime kurdum ve test programını çalıştırınca havaya zıplayasım geldi. :)
Bunca zamandır bu kartların nimetlerinden faydalanamadım diye hayıflandım.

Uzun lafın kısası, mono çalışınca zaten geriye pek bişey kalmadı. Hemen bir deneme uygulaması yapayım dedim. En azından işimize yarayacak bazı temel görevler güzelce çalışıyor.  Program bir deneme olup sadece işlevlerin testi yapılmıştır. Normal bir uygulamada bu kısımların düzgünce yazılması gereklidir.

İşlem sıralaması olarak şunları sayabilirim.
1-Armbian Ubuntu Server işletim sistemi sd karta yazılıp sistem çalıştırıldı  (https://www.armbian.com/orange-pi-zero/, https://docs.armbian.com/User-Guide_Getting-Started/)
2-Kart USB üzerinden PC ye bağlandı. Hem enerji aldı hem de sanal seri port oluştu.
3-Putty programı ile sanal seri porttan kartın konsoluna bağlanıldı (http://www.putty.org/)
4-İlk kullanıcı tanımları vb. yapıldı
5-"nano /etc/network/interfaces" komutu çalıştırıldı. Bunu ilk kez çalıştırdığımda boş bir text dosyası açıyor. Bu dosyaya aşağıdaki kodları yazıp kaydettim
# All interfaces are handled by network-manager, use nmtui or nmcli on
# server/headless images or the "Network Manager" GUI on desktop images
# The loopback network interface

auto lo
iface lo inet loopback

# The primary network interface
# allow-hotplug eth0
# iface eth0 inet dhcp

auto wlan0
iface wlan0 inet dhcp
wpa-ssid Xperia  #wifi ağım
wpa-psk qwertqwert  #wifi şifrem

# Static IP address
allow-hotplug eth0
auto eth0      
iface eth0 inet dhcp  #static ethernet portuna sabit IP için dhcp yerine static yazılacak ve aşağıdaki #ler kalkacak
#address 192.168.1.241    
#netmask 255.255.255.0
#gateway 192.168.1.1

# end ###


6- konsolda "nano /etc/wpa_supplicant/wpa_supplicant.conf" komutu çalıştırıldı. İlk olarak boş bir text dosyası açıldı. içinde aşağıdakileri yazıp kaydettim.  Aşağıdaki kısımda görüleceği üzere yine benim wifi ayarlarım yazıldı

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="Xperia"
        key_mgmt=WPA-PSK
        psk="qwertqwert"
}


7- Bu işlemlerden sonra konsolda "sudo reboot" komutu yazarak sistemi yeniden başlattım. Enerjiyi kesip verdim. Ne hikmetse bu işlemlerden sonra sistemin açılması 2-3dk sürmeye başladı.
8- Artık wifi bağlantısı çalışmaya başlayınca, konsoldan aşağıdaki komutları çalıştırdım. Bunlar ile internetten update işlemleri yapıldı.
"sudo apt-get update", bundan sonra işlemlerin tamamlanmasını bekleyin
"sudo apt-get upgrade", bu komut yerine başka bir öneride bulundu onu çalıştırdım.
8.5- USB disklerin otomatik tanınması için internette birkaç komut buldum .
biri "sudo apt-get intall usbmount" ve sonrasında diğeri "sudo apt-get intall pmount"
sonra "sudo apt-get install udisks"
daha sonra  "mount -t auto /dev/sdb1 /mnt && ls /mnt"
9-bunlardan sonra "sudo apt-get install mono-runtime" komutunu çalıştırdım ve mono yüklendi.
10- Sıra geldi test işlemlerine :)
11- Visual Studio da C# ile .NET 4.0 için "Test" adında bir consol projesi açtım. Aşağıdaki kodları derleyince "Test.exe" isimli dosya oluştu.
12-En zoru da bu oldu. Test.exe dosyasını usb flash'a attım karta taktım ama bu dosyayı nasıl bulacağım dedim kaldım. :) Bu konsol MS-DOS değilki "dir" yazdıkça her tarafa gidelim.  sonunda araya araya dir yerine "ls -laRh" ile dosya listelemeyi, "cd" ile klasör değiştirmeyi öğrendik. En son olarak da USB flash diskimizin "/media/usb" dizininde bulunduğunu öğrendik. Sonrasında "ls /media/usb" yazıp da Test.exe dosyasını bulunca, tamam oğlum oldu bu iş dedim.
13- Son olarak "mono /media/usb/Test.exe" yazıp programı çalıştırdım.

Yukarıda verdiğim linux komutlarının uygulama sırası, kullanım detayları vb. konularda bilgim sıfır. Tamamen nette gördüğüm şeylerin denenmesinden ibaret. O yüzden bilinçli yaptığım bişey değil. Linux bilen arkadaşlara garip gelebilir.
Test programı, konsoldan tuş okur. Eğer tuş basılmış ise, entera basılmasını bekler. Sonra gelen datayı okur. Gelen text içinde tanıdığı komutlar varsa bunları ayrıştırıp komutu yerine getirir.

Test.exe nin Program.cs kodu
using System;
using System.Net;
using System.IO;


namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Running on {0}", Environment.OSVersion);
            bool devam= true;
            Console.WriteLine("Geçerli komutlar: start <IP Adress>| stop | dir <dizin> | ping <IP Adress>|sil");
            Console.WriteLine("Komut Yazın.");
            System.Net.Sockets.TcpListener lst = new System.Net.Sockets.TcpListener(IPAddress.Parse("192.168.1.21"), 23456);
            System.Net.Sockets.TcpClient cli = new System.Net.Sockets.TcpClient();
            System.Net.Sockets.NetworkStream ns= null;
            bool ServerAktif = false;

            while (devam) 
            {

                string s = "";
                if(Console.KeyAvailable)
                {

                    s = Console.ReadLine();
                
                }
                else
                {
                    System.Threading.Thread.Sleep(2000);
                    Console.Clear();
                    Console.WriteLine("Halen komut girmediniz !");
                }
                


                if (s.Contains("exit")) devam = false;
                else if (s.Contains("sil"))
                {
                    try
                    {
                        Console.Clear();
                    }
                    catch (Exception ex) { Console.Write(ex.ToString() + Environment.NewLine); }

                }
                else if(s.Contains("ping"))
                {
                    try
                    {
                        string res = s.Remove(0,5);
                        Console.Write("Ping to:"+res + Environment.NewLine);
                        System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
                        if (p.Send(IPAddress.Parse(res)).Status == System.Net.NetworkInformation.IPStatus.Success)
                        { Console.Write("Ping Ok" + Environment.NewLine); }
                        else
                        { Console.Write("Ping Nok" + Environment.NewLine); }

                    }
                    catch (Exception ex){Console.Write(ex.ToString() + Environment.NewLine);}
                
                }
                else if (s.Contains("start"))
                {
                    try
                    {
                        if (lst != null) { lst.Stop();}
                        if (s.Length > 12)
                        {
                            string res = s.Remove(0, 6);
                            lst = new System.Net.Sockets.TcpListener(IPAddress.Parse(res), 23456);
                        }
                        else { lst = new System.Net.Sockets.TcpListener(IPAddress.Parse("127.0.0.1"), 23456); }                       
                        lst.Start(1);
                        Console.Write("Server Başladı" + Environment.NewLine);
                        ServerAktif = true;

                    }
                    catch (Exception ex) { Console.Write(ex.ToString() + Environment.NewLine); }

                }
                else if (s.Contains("stop"))
                {
                    try
                    {

                        if (ns != null) ns.Close();
                        if (cli != null) cli.Close();
                        lst.Stop();
                        Console.Write("Server durdu" + Environment.NewLine);

                    }
                    catch (Exception ex) { Console.Write(ex.ToString() + Environment.NewLine); }

                }
                else if (s.Contains("dir"))
                {
                    try
                    {
                        string data = Directory.GetCurrentDirectory();
                        if(s.Length>4)
                        {
                            data = s.Remove(0, 4);
                            string[] list = Directory.GetDirectories(data);
                            if (list != null)
                            {
                                for (int i = 0; i < list.Length; i++)
                                {
                                    Console.Write(list[i] + Environment.NewLine);
                                }
                            }
                        
                        }
                        else 
                        {
                            
                            string[] list = Directory.GetDirectories(data);
                            if (list.Length >0) 
                            {
                                for (int i = 0; i < list.Length; i++)
                                {
                                    Console.Write(list[i] + Environment.NewLine);                                     
                                }                                
                            }
                            else Console.Write(data + " alt dizin içermiyor" + Environment.NewLine);                                     
                        
                        }
                        
                    }
                    catch (Exception ex) { Console.Write(ex.ToString() + Environment.NewLine); }

                }
                else 
                {
                    Console.Write(s + Environment.NewLine);
                    
                }
                try
                {
                    if (lst != null && ServerAktif)
                    {
                        
                        if (lst.Pending())
                        {
                            cli = lst.AcceptTcpClient();
                            ns = cli.GetStream();

                        }
                        if (cli != null)
                        {
                            if (cli.Available > 0 && ns!=null)
                            {
                                byte[] data = new byte[cli.Available];
                                ns.Read(data, 0, cli.Available);
                                Console.Write("Alınan: " + System.Text.ASCIIEncoding.ASCII.GetString(data) + Environment.NewLine);
                                ns.Write(data, 0, data.Length);
                            }

                        }
                    }
                    

                }
                catch (Exception ex)
                {
                    string str = ex.ToString();
                    ServerAktif = false;
                    Console.Write(str + Environment.NewLine);
                    Console.Write("Server yeniden başlatılmalı" + Environment.NewLine); 
                    
                }
                
                
            
            }
            
            
        }
    }
}

Faydalı olması dileğiyle.





muhendisbey

Sorum şu: projeyi cihaz üzerinde mi derlemek gerekiyor yoksa PC'de derlenmiş program da çalışıyor mu?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

tunayk

Normalde projeyi PC tarafında derleyip, cihazda sadece çalıştırıyorum.  Eğer cihaz tarafında da derleme ihtiyacı varsa, bu durumda Gtk#, Xamarin gibi linux C# compilerlardan birini cihaza yüklemek gerekli sanırım.

muhendisbey

PC'de derlerken özel bir işlem yapıyor musunuz işlemci seçimi vs. Yoksa x86 deyip o şekilde mi?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

tunayk

Özel bişey yapmadım. .NET4.0 için consol uygulaması oluşturdum okadar. Direk çalıştı.