Asmax 1004G - snmp, mrtg

Adam Dudzik | Hardware, Linux | 27 lipca 2010

W przypadku poprzedniego routera, zbieranie statystyk dotyczacych jakości linii telefonicznej (stosunek sygnału do szumu oraz tłumienie) zrealizowałem poprzez symulowanie przeglądarki komputerowej: zalogowanie sie skryptem na stronę, pobranie jej zawartości, przegrepowanie w poszukiwaniu interesujących wartości.

Na szczęście Asmax 1004G wprowadza normalność w tym temacie i interesujące wartości moge sobie po prostu pobrać za pomocą SNMP i wyświetlić za pomocą MRTG. Poniżej wycinek z konfiga mrtg.

Title[adslsnr]: SNR i ATTN download
YLegend[adslsnr]: db
MaxBytes[adslsnr]: 5000
Options[adslsnr]: growright, gauge
Target[adslsnr]:1.3.6.1.2.1.10.94.1.1.3.1.4.2&1.3.6.1.2.1.10.94.1.1.3.1.5.2:public@192.168.2.1
PageTop[adslsnr]: <h1>SNR i ATTN download</h1>

 

Wartości zwracane są w liczbach całkowitych zatem zainteresowani powinni dodać parametr Factor.

Dla uploadu konfig wygląda tak:

Title[adslsnrup]: SNR i ATTN upload
YLegend[adslsnrup]: db
MaxBytes[adslsnrup]: 5000
Options[adslsnrup]: growright, gauge
Target[adslsnrup]:1.3.6.1.2.1.10.94.1.1.2.1.4.2&1.3.6.1.2.1.10.94.1.1.2.1.5.2:public@192.168.2.1
PageTop[adslsnrup]:
<h1>SNR i ATTN upload</h1>

Asmax 1004G - resetowanie połączenia

Adam Dudzik | Hardware, Linux | 25 lipca 2010

W przypadku mojego poprzedniego routera ADSL (Linksys AG241) konieczne było symulowanie przeglądarki komputerowej i akcji użytkownika - router ten nie posiadał opcji dostępu poprzez telnet lub ssh.

Zrealizowalem to skryptem nastepujacej treści:

#!/usr/bin/perl -w

use strict;
use warnings;
use LWP;
use HTTP::Request::Common;

our $ua = LWP::UserAgent->new;

$ua->request(POST 'http://haslo:login@192.168.2.1/apply.cgi',
[submit_button => 'Status_Router', submit_type => 'disconnect',
change_action => 'gozila_cgi', wan_proto => 'pppoe']);

sleep 5;

$ua->request(POST 'http://haslo:login@192.168.2.1/apply.cgi',
[submit_button => 'Status_Router', submit_type => 'connect',
change_action => 'gozila_cgi', wan_proto => 'pppoe']);

Aktualnie korzystam z routera Asmax 1004g (mówi się że darowanemu koniowi nie zagląda się w zęby ale ten router to całkiem dobry sprzęt - dzięki Netio :)) i na szczęście umożliwia on zarządzanie poprzez telnet lub ssh.

Wykorzystując to pierwsze cały wyżej cytowany skrypt zmiescił się w jednej linijce :)

#!/bin/bash
(sleep 2; echo login; sleep 2; echo haslo; sleep 2; echo "adsl connection --up"; sleep 50) | telnet 192.168.2.1

W ten sam sposób można resetować wiekszość (wszystkie?) routery oparte o chipsety Broadcom i udostepniające zarządzanie poprzez telnet.

Referenced package not found File: Device Connectivity Component

Adam Dudzik | .NET Compact Framework, Urządzenia mobilne | 1 czerwca 2010

Rozwiązanie problemu zawartego w tytule:)

Wystarczy zamknąć Visual Studio i wejść do:

C:\Documents and Settings\<uzytkownik> \Ustawienia lokalne\Dane Aplikacji\Microsoft\

zmienić nazwę katalogu CoreCon i ponownie uruchomićVS.

Zdalny dostęp do ekranu urządzenia przenośnego (ciąg dalszy)

Adam Dudzik | .NET Compact Framework, Informatyka, Urządzenia mobilne | 31 marca 2010

W nawiązaniu do wpisu Zdalny dostęp do ekranu urządzenia przenośnego podaje kolejną aplikację umożliwiająca wygodniejsze operacje na ekranie terminala mobilnego. Jest to dość stary (ostatnia wersja z 2001/11/27) już rCe dostępny wraz z innymi aplikacjami pod tym adresem.  Freeware.

Jak uzyskać kontrastowe tło?

Adam Dudzik | .NET Framework, Informatyka | 23 lutego 2010

Proste i skuteczne:


private static Color GetContrastColor(Color c)
{
	return (c.GetBrightness() > 0.4) ? Color.Black : Color.White;
}

Ukrycie paska postępu - WebBrowser, CF2.0

Adam Dudzik | .NET Compact Framework, Informatyka, Urządzenia mobilne | 1 stycznia 2010

Niejako uzupełniając zagadnienie poruszone w wpisie Blokada ContextMenu na komponencie WebBrowser chcę Wam przedstawić sposób ukrycia paska postępu ładowania strony. Pojawia się on zawsze w dolnej części komponentu WebBrowser i czasami może być denerwujący :).

Całość zagadnienia sprowadza się do wywołania funkcji DestroyWindow z biblioteki coredll.dll .

Kod wygląda następująco (podobnie jak poprzednio tworze własną kontrolkę dziedzicząc po WebBrowser - wydaje mi sie to najprostszym rozwiązaniem)

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Dudzik.Helpers
{
    public class WebBrowserExt : System.Windows.Forms.WebBrowser
    {
        private IntPtr child, pieHtml;

        [DllImport("coredll")]
        extern static IntPtr GetCapture();

        [DllImport("coredll.dll", EntryPoint = "GetWindow")]
        private static extern IntPtr GetWindow(IntPtr handleWindow, int cmd);

        [DllImport("coredll.dll")]
        private static extern bool DestroyWindow(IntPtr hwnd);  

        protected override void OnHandleCreated(EventArgs e)
        {
            IntPtr webHandle = GetHWND(this);
            child = GetWindow(webHandle, 5);
            pieHtml = GetWindow(child, 5); //MSPIE Status

            DestroyWindow(pieHtml);

            base.OnHandleCreated(e);
        }

        private IntPtr GetHWND(Control ctl)
        {
            ctl.Capture = true;
            IntPtr hWnd = GetCapture();
            ctl.Capture = false;
            return hWnd;
        }
    }
}

Oczywiście nic nie stoi na przeszkodzie by połączyć to z ukrywaniem ContextMenu. Uzyskany kod powinien  wyglądać następująco

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Dudzik.Helpers
{
    public class WebBrowserExt : System.Windows.Forms.WebBrowser
    {
        private IntPtr child, pieHtml;
        private static WndProcDelegate newWndProc;
        private static IntPtr oldWndProc = IntPtr.Zero, oldSipProc = IntPtr.Zero;

        internal const int GWL_WNDPROC = -4;
        internal const int WM_LBUTTONUP = 0x0202;

        [DllImport("coredll")]
        extern static IntPtr GetCapture();

        [DllImport("coredll.dll", EntryPoint = "GetWindow")]
        private static extern IntPtr GetWindow(IntPtr handleWindow, int cmd);

        [DllImport("coredll.dll", EntryPoint = "GetWindowLong")]
        private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport("coredll.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);

        [DllImport("coredll.dll")]
        private static extern int PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        [DllImport("coredll.dll")]
        private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("coredll.dll")]
        private static extern bool DestroyWindow(IntPtr hwnd);  

        delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

        protected override void OnHandleCreated(EventArgs e)
        {
            IntPtr webHandle = GetHWND(this);
            child = GetWindow(webHandle, 5);
            pieHtml = GetWindow(child, 5); //MSPIE Status
            child = GetWindow(pieHtml, 2); //PIEHTML

            newWndProc = new WndProcDelegate(WndProc);
            oldWndProc = GetWindowLong(child, GWL_WNDPROC);
            int success = SetWindowLong(child, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));

            DestroyWindow(pieHtml);

            base.OnHandleCreated(e);
        }

        private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
        {
            if (msg == 0x0020)
            {
                PostMessage(this.Handle, WM_LBUTTONUP, 0, 0);
                return IntPtr.Zero;
            }

            return CallWindowProc(oldWndProc, child, msg, wParam, lParam);
        }

        private IntPtr GetHWND(Control ctl)
        {
            ctl.Capture = true;
            IntPtr hWnd = GetCapture();
            ctl.Capture = false;
            return hWnd;
        }
    }
}

Blokada ContextMenu na komponencie WebBrowser

Adam Dudzik | .NET Compact Framework, Informatyka, Urządzenia mobilne | 19 grudnia 2009

Jeśli używacie kontrolki WebBrowser z Compact Frameworka 2.0 zapewne spotkaliście się z ContextMenu pojawiającym sie za każdym razem gdy przytrzymacie zbyt długo rysik (zdarzenie Tap&Hold). Moim zdaniem jest to dość uciążliwe, w pewnych przypadkach pojawiające się ContextMenu jest wysoce niepożądane. Jako że potrzeba matką wynalazków postanowiłem sam zmierzyć sie z tematem i potyczka ta została zakończona sukcesem :)

 

Całość zagadnienia sprowadziła się do wpięcia w procedurę obsługi okna. Na początek gotowy kod.

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Dudzik.Helpers
{
    public class WebBrowserExt : System.Windows.Forms.WebBrowser
    {
        private IntPtr child;
        private static WndProcDelegate newWndProc;
        private static IntPtr oldWndProc = IntPtr.Zero, oldSipProc = IntPtr.Zero;

        internal const int GWL_WNDPROC = -4;
        internal const int WM_LBUTTONUP = 0x0202;

        [DllImport("coredll")]
        extern static IntPtr GetCapture();

        [DllImport("coredll.dll", EntryPoint = "GetWindow")]
        private static extern IntPtr GetWindow(IntPtr handleWindow, int cmd);

        [DllImport("coredll.dll", EntryPoint = "GetWindowLong")]
        private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport("coredll.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);

        [DllImport("coredll.dll")]
        private static extern int PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        [DllImport("coredll.dll")]
        private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

        protected override void OnHandleCreated(EventArgs e)
        {
            IntPtr webHandle = GetHWND(this);
            child = GetWindow(webHandle, 5);
            child = GetWindow(child, 5);
            child = GetWindow(child, 2);

            newWndProc = new WndProcDelegate(WndProc);
            oldWndProc = GetWindowLong(child, GWL_WNDPROC);
            int success = SetWindowLong(child, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));

            base.OnHandleCreated(e);
        }

        private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
        {
            if (msg == 0x0020)
            {
                PostMessage(this.Handle, WM_LBUTTONUP, 0, 0);
                return IntPtr.Zero;
            }

            return CallWindowProc(oldWndProc, child, msg, wParam, lParam);
        }

        private IntPtr GetHWND(Control ctl)
        {
            ctl.Capture = true;
            IntPtr hWnd = GetCapture();
            ctl.Capture = false;
            return hWnd;
        }
    }
}

Proponuje również utworzyć odpowiedni plik xmta. Pozwoli on na bezproblemowe użycie kontrolki w Design Mode. Poniżej najprostsza zawartość pliku xmta.

<?xml version="1.0" encoding="utf-16"?>
<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
  <Class Name="Dudzik.Helpers.WebBrowserExt">
    <DesktopCompatible>true</DesktopCompatible>
    <Property Name="Size">
      <DefaultValue>
        <Type>
          System.Drawing.Size, System.Drawing, Version=2.0.0.0,
          Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
        </Type>
        <Value>
          240; 100
        </Value>
      </DefaultValue>
    </Property>
  </Class>
</Classes>

Uruchomienie WebMethod z komputera innego niż lokalny.

Adam Dudzik | .NET Framework, Informatyka | 19 grudnia 2009

Formularz testowy jest dostępny tylko dla żądań z komputera lokalnego.” - taka informacja wita nas w sytuacji gdy chcemy uruchomić metodę usługi Web z komputera innego niż tego na którym usługa jest udostępniona. Pomijając fakt że ograniczenie takie ma jakiś sens - bezpieczeństwo i inne takie, to w sytuacji gdy wiemy czego chcemy i wiemy co robimy możemy to udogodnienie włączyć następującym wpisem:

<webServices>
  <protocols>
    <add name="HttpPost" />
    <add name="HttpGet" />
  </protocols>
</webServices>

umieszczonym w pliku config.web w sekcji system.web

Oracle Sql Developer a nie działający Backspace

Adam Dudzik | Informatyka, SQL | 17 grudnia 2009

Tak sie ostatnio złożyło ze musialem sie zająć bazą danych Oracle. Jednym z narzędzi edycyjnych jest Oracle SQL Developer - pomimo pewnych upierdliwości :) całkiem wygodny. I tak nam sie fajnie pracowało do czasu gdy pewnego dnia klawisz Backspace odmówił współpracy w oknach edycyjnych.Rozwiązaniem okazało się wykonanie następujących czynności:

Tools->Preferences->pozycja Accelerators->klawisz Load Preset

i wybieramy pozycję Default

:)

Microsoft SQL Server Express a brak Profilera

Adam Dudzik | MSSQL | 10 września 2008

W wersji Express silnika MS SQL nie ma możliwości skorzystania z profilera. Można jednak skorzystać z opensourcowego narzędzia dostępnego pod tym adresem:

 http://sqlprofiler.googlepages.com/

Dalej »

Polski Wordpress
Oparte na WordPress | Theme by Roy Tanck. Tłumaczenia dokonał azWeb dla Polski support WordPress