Pokazywanie postów oznaczonych etykietą C#. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą C#. Pokaż wszystkie posty

poniedziałek, 14 lipca 2014

Wake On Lan (WOL) - Lokalne włączanie komputerów

Wake On Lan to metoda włączania komputerów poprzez sieć lokalną (LAN).
Polega ona na wysłaniu Magic Packet do karty sieciowej, która przesyła informację do płyty głównej o potrzebie załączenia się. Jeżeli chodzi o laptopy to ta funkcja również jest dostępna tylko musi mieć zewnętrzne źródło zasilania, na baterii funkcja WOL nie działa.

Chcąc załączyć komputer, musimy znać jego MAC adres karty sieciowej.

Z programistycznego punktu widzenia, potrzebujemy napisać program, który będzie wyśle najpierw 0xFFFFFFFFFFFF, a następnie 16x Mac adres - na podany mac adres.

Dla design'u aplikacji wystarczy TextBox i Button.

Tworzymy event dla przycisku:
private void button1_Click_1(object sender, EventArgs e)
{
    try
    {
        SendMagicPacket(textBox1.Text);
        MessageBox.Show("Packet Sent to " + textBox1.Text);
    }
    catch (Exception ex) { MessageBox.Show("Error:\n\n" + ex.Message, "Error"); }
}

Przycisk jest już gotowy, pozostała tylko funkcjonalność:
public static void SendMagicPacket(string macAddress)
{
    if (!Test(macAddress))
        throw new ArgumentException("Niepoprawny MAC adres", "macAddress", null);

    byte[] mac = ConvToByte(macAddress);
    WakePC(mac);
}

Musimy też sprawdzić czy wprowadzony mac adres jest poprawny, jak widać powyżej jest funkcja Test().
public static bool Test(string macAddress)
{
    var valid_chars = "0123456789ABCDEFabcdef";
    if (string.IsNullOrEmpty(macAddress)) return false;
    if (macAddress.Length != 12) return false;
    foreach (var c in macAddress)
    {
        if (valid_chars.IndexOf(c) < 0) { return false; }
    }
    return true;
}
Gdy nasz Mac adres jest poprawny, to rozkładamy go na bajty funkcja ConvToByte():
public static byte[] ConvToByte(string macAddress)
{
    byte[] mac = new byte[6];
    if (!Test(macAddress))
        throw new ArgumentException("Niepoprawny MAC adres", "macAddress", null);

    for (var i = 0; i < 6; i++)
    {
        var t = macAddress.Substring((i * 2), 2);
        mac[i] = Convert.ToByte(t, 16);
    }
    return mac;
}
Ostatnim krokiem będzie wysłanie, przed chwilą otrzymanych bajtów, do karty sieciowej, ale przed tym jeszcze sprawdzenie czy nasze bajty zostały poprawnie przekonwertowane.
public static bool TestByteArray(byte[] macAddress)
{
    if (macAddress == null) return false;
    if (macAddress.Length != 6) return false;
    return true;
}
public static void WakePC(byte[] macAddress)
{
    if (!TestByteArray(macAddress))
        throw new ArgumentException("Niepoprawny MAC adres", "macAddress", null);

    using (UdpClient client = new UdpClient())
    {
        client.Connect(IPAddress.Broadcast, 40000);
        byte[] packet = new byte[17 * 6];
        for (int i = 0; i < 6; i++) { packet[i] = 0xFF; }
        for (int i = 1; i <= 16; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                packet[i * 6 + j] = macAddress[j];
            }
        }
        client.Send(packet, packet.Length);
    }
}
Poniżej obrazek jak aplikacja wygląda i jak powinno się wpisywać Mac adres :)



Enjoy !

poniedziałek, 5 maja 2014

WPF Canvas - Hexstring to image

Jak odczytać obrazek zapisany na przykład w MSSQL?
Można na dwa sposoby.

Pierwszy sposób polega na skopiowaniu z bazy hex stringu i wstawienie go do DrawImage(), który później za pomocą HexStringToBytes() jest konwertowany do byte[].

public void DrawImage(string hexvalue)
{
    canvas1.Children.Clear();
    byte[] byBitmap = HexStringToBytes(hexvalue);

Drugim sposobem jest połączenie się do bazy MSSQL z poziomu programu i wykonanie odpowiednich zapytań, aby odnieść się do komórki z naszym obrazkiem, tzw. Binary Data.
Tutaj już nie korzystamy z HexStringToBytes(), tylko po odpowiednim zapytaniu odwołujemy się do kolumny "pic", gdzie jest zapisany obrazek.

public void DrawImage()
{
    //Połączenie z bazą + zapytanie
    canvas1.Children.Clear();
    byte[] byBitmap = (byte[])result["pic"];


Poniższy przykład przedstawia narysowanie obrazku w canvas z hexstringu.

public void DrawImage(string hexvalue)
{
    canvas1.Children.Clear();
    byte[] byBitmap = HexStringToBytes(hexvalue);
    var Bitmap = ImageFromBuffer(byBitmap);

    Image NewImg = new Image();
            
    double maxX = canvas1.Width = Bitmap.Width;
    double maxY = canvas1.Height = Bitmap.Height;

    NewImg = new Image();
    NewImg.Source = Bitmap;
    NewImg.Width = Bitmap.Width;
    NewImg.Height = Bitmap.Height;
    Canvas.SetLeft(NewImg, 0);
    Canvas.SetTop(NewImg, 0);
    canvas1.Children.Add(NewImg);
}

public BitmapImage ImageFromBuffer(Byte[] bytes)
{
    MemoryStream stream = new MemoryStream(bytes);
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.StreamSource = stream;
    image.EndInit();
    return image;
}

byte[] HexStringToBytes(string hex)
{
    return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}