Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: [vyreseno] ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY  (Přečteno 3681 krát)

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Zdravim
Rad bych poprosil o pomoc nekoho kdo rozumi programovani, ja jsem bohuzel co se programovani tyce (JEVA) zatim bouhzel tezky zacatecnik.

Muj problem je ze jsem si udelal nasledujici gadget : http://blog.rhysgoodwin.com/hardware/print-server-power-control-hack/ a pod windows me to chodi krasne, ten clovek pro to dokonce i napsal docela dobrou aplikaci  s GUI. Ale ted bych tohle zarizeni potreboval rozchodit pod Linuxem a nejlepe prevest to do JAVY. Jedna se o kod ktery je dole na strance :
Citace
As for the software here is simple c#.net class. Say you wanted to turn on pins 2, 4 and 6. Combine the pin values

Pin2=1
Pin3=2
Pin4=4
Pin5=8
Pin6=16
Pin7=32
Pin8=64
Pin9=128

Required value to tun on pins 2, 4 and 6 is 1+4+16=21

Call the output method specifying the port as ipaddress:port and the output value:

(Most print servers use tcp port 9100, multi port JetDirects use 9100 for port one, 9101 for port two etc)
Kód: [Vybrat]
IpPortAccess.Output(192.168.1.10:9100,21);

using System.Net;
using System.Net.Sockets;
using System;
using System.Collections.Generic;
using System.Text;

namespace PowerControl
{
class IpPortAccess
    {
        public static void Output(string port,int value)
        {
            string[] ipport = port.Split(new char[] { ':' });
            string _ip = ipport[0];
            int _port = Convert.ToInt32(ipport[1]);
            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            soc.Connect(_ip,_port);
            byte[] sendData = new byte[1];
            sendData[0] = Convert.ToByte(value);
            soc.Send(sendData);
            soc.Close();
        }
    }
}

Bud ten kod upravit pro JAVU a nebo zkompilovat pro Linux. Pro prvni jsem hledal nejaky parser a nasel http://grammatica.percederberg.net/ ale tam zatim taky nejak vazne porozumeni.
Budu moc rad za kazdou pomoc, diky K
« Poslední změna: 21 Září 2010, 16:36:24 od karlitos »
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

mka

  • Závislák
  • ***
  • Příspěvků: 1907
  • Chybovat je moje.
    • Příložany Cé Zet
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #1 kdy: 30 Srpna 2010, 13:14:13 »
Na C# je v Ubuntu MonoDevelop. Zkus, osobně to nepoužívám.

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #2 kdy: 30 Srpna 2010, 13:29:25 »
Hm ... zasadni problem je ze jsem se zatim TROCHU zabyval javou ale C# mi nic nerika. Ale zkusit to muzu, takze nainstalovat Monodevelop, naiportovat tenhle kod, stisknout kompilovat ...  ???

EDIT :

Neee, dobre, sedim si na vedeni, tohle je jenom trida kteoru muze vyuzivat nejaky kod. Otevrel jsem si v Monu novy soubor C# -> Generell, vlozil tam ten kod, ulozil jako IPPortAcess.cs, stisknul kompilovat :
Kód: [Vybrat]
/home/karlitos/Desktop/IpPortAccess.cs(13,13): Error CS0246: The type or namespace name `Socket' could not be found. Are you missing a using directive or an assembly reference? (CS0246) (IpPortAccess)Fajn a i kdyz se mi to zkompiluje jak z toho udelam alespon aplikaci pro prikazovou radku ?
« Poslední změna: 30 Srpna 2010, 13:40:09 od karlitos »
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

mka

  • Závislák
  • ***
  • Příspěvků: 1907
  • Chybovat je moje.
    • Příložany Cé Zet
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #3 kdy: 30 Srpna 2010, 13:36:40 »
Hm ... zasadni problem je ze jsem se zatim TROCHU zabyval javou ale C# mi nic nerika. Ale zkusit to muzu, takze nainstalovat Monodevelop, naiportovat tenhle kod, stisknout kompilovat ...  ???

Aha... Z předmětu vlákna jsem usuzoval, že ten C# fragment je tvoje dílko a že tudíž v C# běžně pracuješ... :-)

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #4 kdy: 30 Srpna 2010, 13:44:18 »
Nene, ale uz jsem trochu pokrocil s tim parserem Grammatica, sec nikoliv s uspechem :
Kód: [Vybrat]
java -jar lib/grammatica-1.5.jar /home/karlitos/Desktop/IpPortAccess.cs --parse test.java
Error: in /home/karlitos/Desktop/IpPortAccess.cs: line 2:
    unexpected token "using" <IDENTIFIER>, expected one of "%header%",
    or "%tokens%"

using System;
^
Ale aspon mam co googlit  ;)
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #5 kdy: 30 Srpna 2010, 14:04:29 »
Tak uz jsem pokrocil si v hrani si s Mono, vytvoril jsem si projekt, v nem tridu, pridal reference ... no a ted to rve ze nemam main tridu ... a sem v kyblu, protoze ted uz potrebuju vlastni kod kterej tuhle tridu pouzije, vezme si hodnoty ze vstupu z prikazovy radky, zavola tu tridu, preda ji hodnoty ... jeste tak v JAVE bych to dal.
A proc mi ten kram vytvari .exe soubor  ???
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

mka

  • Závislák
  • ***
  • Příspěvků: 1907
  • Chybovat je moje.
    • Příložany Cé Zet
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #6 kdy: 30 Srpna 2010, 14:41:14 »
No, já už ti s tím dál nepomohu, jak jsem se již zmínil, o MonoDevelopu vím jen to, že existuje. Předpokládal bych, že snad umí kompilovat spustitelné soubory i pro Linux; ale fakt nevím, snad někdo další...
Jinak, pokud bys to chtěl celé převést pod Linux, musel bys najít linuxové ekvivalenty příslušných tříd/metod...
Další (provizorní) možnost by byla spouštět tu původní widloidní aplikaci pod Wine.

stana1234

  • Návštěvník
  • Příspěvků: 12
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #7 kdy: 03 Září 2010, 23:29:13 »
Ahoj, já bych tu třídu napsal v Javě asi takhle:
Kód: [Vybrat]
package javaapplication13;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author stana
 */
public class IpPortAcess
{

    public static void Output(String port, int value)
    {
        String ipport[] = port.split(":");
        String _ip = ipport[0];
        int _port = Integer.valueOf(ipport[1]);
        PrintWriter out = null;
        try
        {
            Socket socket = new Socket(_ip, _port);
            out = new PrintWriter(socket.getOutputStream(), true);
            out.print(value);
            out.close();
            socket.close();
        }
        catch (UnknownHostException ex)
        {
            Logger.getLogger(IpPortAcess.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (IOException ex)
        {
            Logger.getLogger(IpPortAcess.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}
ale není to otestované:)

Sixkillers

  • Návštěvník
  • Příspěvků: 4
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #8 kdy: 04 Září 2010, 14:24:52 »
Zdravím.

Netuším jestli to ještě k něčemu bude, ale přidám postup jak na to v C#. V MonoDevelopu si vytvoříš novou sestavu jako projekt pro konzoli. Třidu Main.cs nahradíš svým kódem, který jsem upravil, aby šel lépe použít v terminálu:

Kód: [Vybrat]
using System;
using System.Net;
using System.Net.Sockets;


namespace Relatko
{
class MainClass
{
public static void Main (string[] args)
{
try
{
if(args.Length != 2)
{
Console.WriteLine ("Syntax: IP:port value");
return;
}

if(args[0].IndexOf(":") == - 1)
{
Console.WriteLine ("Syntax: IP:port value");
return;
}

                        string[] ipport = args[0].Split(':');

IPAddress ip;
ushort port;
byte[] data = new byte[1];

try
{
ip = IPAddress.Parse(ipport[0]);
}
catch(FormatException)
{
Console.WriteLine ("IP address is not valid");
return;
}

try
{
port = Convert.ToUInt16(ipport[1]);
}
catch
{
Console.WriteLine ("Port number is not valid");
return;
}

try
{
data[0] = Convert.ToByte(args[1]);
}
catch
{
Console.WriteLine ("Value is not valid");
return;
}

using(Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
soc.NoDelay = true;

soc.Connect(ip, port);
soc.Send(data);

soc.Shutdown(SocketShutdown.Both);
}
}
catch(Exception e)
{
Console.WriteLine("Unhandled exception:");
Console.WriteLine(e.ToString());
}
}
}
}

Pak už stačí sestavit projekt (F7) a v složce bin najdeš aplikaci. Pak ji v terminálu můžeš normálně spouštět:
Kód: [Vybrat]
$: tvojeAplikace.exe ip:port hodnota
Jinak Mono tam cpe přípony exe, protože ty binárky lze rovnou spustit na Windows pod .NETem. Pokud by si potřeboval s něčím v C# pomoct tak mi klidně napiš.


karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #9 kdy: 17 Září 2010, 18:00:37 »
MOC MOC DEKUJU jsem ani necekal ze mi nekdo odpovi#
sic je tu problem :
Kód: [Vybrat]
Projects/ipRelay/ipRelay/bin/Debug/ipRelay.exe 192.168.178.1:9100 4
Unhandled exception:
System.Net.Sockets.SocketException: Connection refused
  at System.Net.Sockets.Socket.Connect (System.Net.EndPoint remote_end) [0x00000]
  at System.Net.Sockets.Socket.Connect (System.Net.IPAddress address, Int32 port) [0x00000]
  at Relatko.MainClass.Main (System.String[] args) [0x00000]

Ale dival jsem se na ten kod a celkem ho probral. Zkusim najit odpovidajici tridy v JAVE, pak budu moc navic odinstalovat mono.
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

Sixkillers

  • Návštěvník
  • Příspěvků: 4
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #10 kdy: 18 Září 2010, 18:14:45 »
Výjimka "Connection refused" znamená, že připojení na daný port bylo odmítnuto, protože na něm pravděpodobně neběží žádné aplikace. Zkus na ten port zaklepat pomocí nmapu, abys veděl zda opravdu ten server je dostupný:

Kód: [Vybrat]
$ sudo apt-get install nmap
a pak

Kód: [Vybrat]
$ nmap -sT -PN -p 9100 192.168.178.1

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #11 kdy: 18 Září 2010, 19:03:47 »
Aha no parada, priznam se ze jsem proste zkusil jestli to neco udela aniz by bylo zarizeni pripojene  :-[ No ale zkusim to a dam vedet, musim nejdriv prenastavit IP na tom printserveru a prdnout to do site a dam vedet.
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #12 kdy: 19 Září 2010, 19:58:49 »
Tak moc dekuju fungue, i kdyz zatims spis jako "proof of concept". Forwardnul jsem sice porty 9000-9100 na tu IP toho printserveru, ale program nebere domenu ani vnejsi IP - to bude chtit jeste vyzkoumat.
« Poslední změna: 21 Září 2010, 00:54:02 od karlitos »
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

Sixkillers

  • Návštěvník
  • Příspěvků: 4
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #13 kdy: 20 Září 2010, 22:17:52 »
Tak funguje nebo nefunguje?  :)

Nmap hlásí open port na tom ipku? A ten program v C# odešle data bez problému?

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #14 kdy: 20 Září 2010, 23:47:59 »
Program funguje jako hodinky uvnitr site, data posilam na 9100. Tak sem porty 9000-9100 forwardnul ale kdyz zadam moji verejnou IP tak se to nespoji. Muzu se jeste podivat tim Nmapem.
Funguje to krasne, zadny ruchy, relatka otevru nebo zavru ale pak zustanou jak jsou.

Ale pracuju - analogicky s tim co jste mi tu uz poradili na verzi pro JAVU, aspon sem se dokopal k tomu se s tim zabejvat.

EDIT :

Takze tady je co mi napsal nmap :
Kód: [Vybrat]
nmap -sT -PN -p 9100 lenis.homelinux.net

Starting Nmap 5.00 ( http://nmap.org ) at 2010-09-21 01:04 CEST
Interesting ports on e178075184.adsl.alicedsl.de (85.178.75.184):
PORT     STATE  SERVICE
9100/tcp closed jetdirect
Pritom jsem to ted kontroloval a porty 9000-9200 jsou otevreny na tu adresu toho Printserveru  ???

Jinak v JAVE jsem se dohrabal tohoto :
Kód: [Vybrat]
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ipRelay {

/**
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException {
if (args.length != 2)
{
System.err.println ("Invalid paramaters : syntax ip:port value");
System.exit(1);
}

if (args[0].indexOf(":") == -1)
{
System.err.println ("No portnumber found : syntax ip:port value");
System.exit(1);
}

String[] inputParam = args[0].split(":");

if (inputParam.length != 2)
{
System.err.println ("Invalid paramaters : syntax ip:port value");
System.exit(1);
}

InetAddress ip = InetAddress.getByName(inputParam[0]) ;
short port = Short.parseShort(inputParam[1]) ;
byte value = Byte.parseByte(args[1]) ;
short timeout = 1000 ;
try
        {
Socket socket = new Socket(ip, port);

for(int count = 0; count < 5; count++)
      {
      System.out.println("Connection attempt nr. " +count);
      if(ip.isReachable(timeout))      
      {
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.print(value);
            out.close();
            socket.close();
      }
        }
        }

catch (UnknownHostException ex)
        {
            Logger.getLogger(ipRelay.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (IOException ex)
        {
            Logger.getLogger(ipRelay.class.getName()).log(Level.SEVERE, null, ex);
        }

}

}
a svete div se, kdyz jsem zadal
Kód: [Vybrat]
java ipRelay 192.168.178.13:9100 8 udelalo to CVAK - no uplny druhy vanoce.
Teda ma to dve musky, z nichz jedna je trochu masarka.
1. hazi mi to :
Kód: [Vybrat]
Connection attempt nr. 0
Connection attempt nr. 1
21.09.2010 01:11:09 ipRelay main
SCHWERWIEGEND: null
java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Socket.java:846)
at ipRelay.main(ipRelay.java:49)
Hm, vzdycky mu trva dva pokusy nez ty data posle. A pak to s tim socket.close  ???
2. Ta masarka je, ze to spina blby rele, budu to studovat zitra.

Sakrys kdybych vedel jak to rozbehat prez inet tak tam prdnu Webku at si taky hrajete  ;D
« Poslední změna: 21 Září 2010, 01:13:03 od karlitos »
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re: ovladani rele pomoci printserveru - prevedeni kodu pro C# do JAVY
« Odpověď #15 kdy: 21 Září 2010, 13:46:20 »
Zak programek sem trochu vylepsil takze prvni dve musky jsou poresene, ale stale spina spatna rele a navic moc nefunguje to. ze se zkusi 5-krat pripojit a kdyz to nejde vypise ze host je nedostupny
Kód: [Vybrat]
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ipRelay {

EDIT :
Nasel jsem krasnou metodu [b]sendUrgentData(value)[/b] kterou vola primo objekt [i]socket[/i] - usetri to tri radky kodu, jednu promennou a HLAVNE : [i]funguje to jak ma[/i] - tedy spina ty spravna rele.
Takze tady je konecny kod :
[code]
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ipRelay {

/**
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException {
if (args.length != 2)
{
System.err.println ("Invalid paramaters : syntax ip:port value");
System.exit(1);
}

if (args[0].indexOf(":") == -1)
{
System.err.println ("No portnumber found : syntax ip:port value");
System.exit(1);
}

String[] inputParam = args[0].split(":");

if (inputParam.length != 2)
{
System.err.println ("Invalid paramaters : syntax ip:port value");
System.exit(1);
}

InetAddress ip = InetAddress.getByName(inputParam[0]) ;
short port = Short.parseShort(inputParam[1]) ;
int value = Integer.parseInt(args[1]) ;
short timeout = 1000 ;
try
{
Socket socket = new Socket(ip, port);

short count = 1 ;
boolean send = false ;
while ( count <= 5 && !send )
{
System.out.println("Connection attempt nr. " + count);
if(ip.isReachable(timeout))      
{
System.out.println("Sending " + value +" to : " + ip + " on port " + port);
socket.sendUrgentData(value) ;
socket.close();
send = true ;
}
count++ ;
if (count == 6 ){
System.out.println("Host unreachable");
}
}
}

catch (UnknownHostException ex)
{
Logger.getLogger(ipRelay.class.getName()).log(Level.SEVERE, null, ex);
}
catch (IOException ex)
{
Logger.getLogger(ipRelay.class.getName()).log(Level.SEVERE, null, ex);
}

}

}
EDIT :
Nasel jsem krasnou metodu sendUrgentData(value) kterou vola primo objekt socket - usetri to tri radky kodu, jednu promennou a HLAVNE : funguje to jak ma - tedy spina ty spravna rele.
Takze tady je konecny kod :
Kód: [Vybrat]
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class ipRelay {

/**
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException {
if (args.length != 2)
{
System.err.println ("Invalid paramaters : syntax ip:port value");
System.exit(1);
}

if (args[0].indexOf(":") == -1)
{
System.err.println ("No portnumber found : syntax ip:port value");
System.exit(1);
}

String[] inputParam = args[0].split(":");

if (inputParam.length != 2)
{
System.err.println ("Invalid paramaters : syntax ip:port value");
System.exit(1);
}

InetAddress ip = InetAddress.getByName(inputParam[0]) ;
short port = Short.parseShort(inputParam[1]) ;
int value = Integer.parseInt(args[1]) ;
short timeout = 1000 ;
try
{
Socket socket = new Socket(ip, port);

short count = 1 ;
boolean send = false ;
while ( count <= 5 && !send )
{
System.out.println("Connection attempt nr. " + count);
if(ip.isReachable(timeout))      
{
System.out.println("Sending " + value +" to : " + ip + " on port " + port);
socket.sendUrgentData(value) ;
socket.close();
send = true ;
}
count++ ;
if (count == 6 ){
System.out.println("Host unreachable");
}
}
}

catch (UnknownHostException ex)
{
Logger.getLogger(ipRelay.class.getName()).log(Level.SEVERE, null, ex);
}
catch (IOException ex)
{
Logger.getLogger(ipRelay.class.getName()).log(Level.SEVERE, null, ex);
}

}

}


a znacim jako vyresene. Zbytek si uz muzu nejak dopytlikovat sam, myslim ze to uz je obecnejsiho charakteru ana to sou knizky. Ale diky vsem, dobre ste me navedli a ja mazu MONO muhehe  :)[/code]
« Poslední změna: 21 Září 2010, 23:55:10 od karlitos »
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

 

Provoz zaštiťuje spolek OpenAlt.