Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] odbieranie danych z MIDletu
Forum PHP.pl > Forum > Przedszkole
johnyjj2
Witam!

Chciałbym stworzyć w Javie aplikację na telefon komórkowy, która komunikowała by się z użytkownikiem poprzez komendy i klawisze, na podstawie tej komunikacji tworzyła mały plik tekstowy z danymi i wysyłała go na serwer.

Ze strony komórki pomyślałem o httpconnection: http://java.sun.com/docs/books/tutorial/ne...ingWriting.html

Pozostaje jednak kwestia, jak odbierać te dane na serwerze. Czy mógłbym prosić o jakieś wskazówki?

Z góry dzięki,
pozdrawiam:)!
erix
A nie możesz zwykłym POST? http://www.java2s.com/Code/Java/J2ME/Sampl...TfromMIDlet.htm

httpConnection (AFAIK) działa na takiej zasadzie, co np. cURL (w dużym uproszczeniu), więc odbierasz te dane tak, jak by to wysyłała zwykła przeglądarka.
johnyjj2
Dzięki wielkie smile.gif. Chyba rzeczywiście zrobię to zwykłym POST, przejrzałem kod z tego linku, który zamieściłeś i wkrótce przetestuję go w Wireless Toolkit, potem na swojej komórce.

Mam doświadczenie w programowaniu tylko w C++ i Visual Basicu. Czy mógłbyś mi podać link do jakiegoś tutoriala jak "odbierać te dane tak, jakby to wysyłała zwykła przeglądarka"? Zainstalowałem GlassFisha (po prostu ktoś mi zasugerował, żebym zainstalował na nim Jersey i stworzył servleta), ale to pewnie nie jest zbyt dobre rozwiązanie i go odinstaluję, a potem zainstaluję Apache'a. Niemniej jednak nie bardzo wiem, jak się zabrać za taki kod odbierający dane, a podejrzewam, że jest to prosta sprawa. I tak się muszę prędzej czy później nauczyć PHP-a :-).

Pozdrawiam:)!
erix
No bo to prosta sprawa, która jest opisana w praktycznie każdym kursie PHP. ;P
johnyjj2
Dzięki:)

Porównałem kod z linku, który podałeś z tym http://www.xyzws.com/Javafaq/how-to-use-ht...-web-server/139 i generalnie:
1) nie wiem, dlaczego os.flush() miałby być ryzykowny
2) co on właściwie za response czyta, skoro wysyłam dane przy pomocy POST, a nie czytam z serwera
3) po co linijka "BufferedReader rd = new BufferedReader(nwe InputSreamerReader(is));" w kodzie z xyzws.com
4) czy setRequestPropery "User-Agent" oraz "Content-Length" są konieczne

Znalazłem w jakiejś książce "wyslij.php - kod PHP odbierający pliki wysłane przez formularz HTML", wkrótce to przeczytam. Zakładam, że odbiera się z MIDletu podobnie jak wysłane przez formularz.

Miałbym też pytanie z trochę innej beczki - czy mógłbyś zasugerować od czego zacząć, jeśli chciałbym w MIDlecie na komórce zainicjować połączenie głosowe z serwerem - tzn. żeby użytkownik komórki uruchamiał MIDlet, wybierał opcję "rozpocznij połączenie", komórka rozpoczynała połączenie głosowe z serwerem i przesyłała dane mówione przez użytkownika w formie pliku dźwiękowego na serwer, a serwer w czasie rzeczywistym na podstawie analizy mowy przy użyciu open-source'owego projektu rozpoznawania mowy Sphinx4 wysyłał w pliku tekstowym rozpoznaną mowę? Myślałem o użyciu GSM/GPRS w celu wysłania dźwięku na serwer. Generalnie to moje pytanie dotyczy: 1) jak wysłać dane głosowe na serwer, 2) jak równocześnie otrzymywać dane w postaci plików tekstowych z serwera (z lekkim opóźnieniem, rzecz jasna)?

Pozdrawiam:)

DODANE 27-09-2009

Dzięki, Erix, za Twoje odpowiedzi :-).

OK, ponowię swoje pytanie, ale tym razem je streszczę + umieszczę kod obu plików :-).

Otóż chciałbym wysłać mały plik tekstowy z MIDletu na komórce przy użyciu httpconnection na serwer, gdzie jest skrypt PHP.

Gdyby to było wysłane z przeglądarki w PHP na serwer w PHP to kod wysyłający byłby taki:
Kod
<input name="usersfile" type="file">

zaś odbierający taki:
Kod
&usersfile = $HTTP_POST_FILES['usersfile']['tmp_name'];


W wypadku MIDletu i PHP, wysyłający jest taki:
Kod
HttpConnection conn = null;
String url = "http://87.205.xx.xx/datareceiver.php";

i odbierający jest taki:
Kod
&usersfile = $HTTP_POST_FILES['!!!!!HERE!!!!!']['tmp_name'];


W tym drugim wypadku po prostu nie wiem, co wpisać w miejsce "!!!!!HERE!!!!!".

Zakładam, że ten skrypt PHP na serwerze jest wykonywany za każdym razem, gdy wywołam funkcję "wyślij" na MIDlecie, która łączy się z http://87.205.xx.xx/datareceiver.php.

Drugie pytanko - wydaje mi sie, że dużo prostsze :-). Nie wiem, po co te całe znaczniki html, body itd., skoro ja nie chcę żadnego tekstu na serwerze wywoływać przy pomocy przeglądarki. Jak zrobić tak, żeby skrypt po prostu się wykonał i wyłączył na serwerze, zapisał coś tam do bazy danych i tyle, niczego nie wyświetlał mi w przeglądarce?

A tutaj kod wysyłającego MIDletu:

Kod
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class myMidletSendData extends MIDlet
{
    //W tej zmiennej zapiszę obiekt pobrany metodą Display.getDisplay()
    private Display display;    
    
    //Wewnętrzna klasa Ekran rozszerzająca klasą Canvas
    private class Ekran extends Canvas implements CommandListener
    {
        String label = "Tekst domyślny";//tekst do wypisania na ekranie
        int ScreenWidth, ScreenHeight;  //szerokość i długość ekranu
        Command opcjawyjscie = new Command("Wyjście", Command.EXIT, 1);

        //Konstruktor wewnętrznej klasy Ekran
        public Ekran(String inparam)
        {
            //
            label = inparam;
            //Pobieram wysokość i szerokość dostępnego ekranu:
            ScreenWidth = getWidth();
            ScreenHeight = getHeight();
            //Dodaję komendę:
            addCommand(opcjawyjscie);
            setCommandListener(this);
        }
        
        public void commandAction(Command c, Displayable d)
        {
            if (c == opcjawyjscie)
            {
                destroyApp(true);
                notifyDestroyed();
            }
        }


        /** W matodzie paint() definiujemy wygląd elementu
        */        
        protected void paint(Graphics g)
        {
            //Namalowanie tła:
            g.setColor(0xffffff); //zmiana aktualnego koloru
            //Namalowanie wypełnionego aktualnym kolorem prostokąta:
            g.fillRect(0, 0, ScreenWidth, ScreenHeight);    
            //Współrzędne w rogach ekranu:
            g.setColor(0x000000);
            g.drawString("(0,0)", 0, 0, g.TOP|g.LEFT);
            g.drawString("(" + ScreenWidth + "," + ScreenHeight
                + ")", ScreenWidth, ScreenHeight, g.BOTTOM|g.RIGHT);
            //Tekst na środku ekranu:
            g.setColor(0x770000);
            g.drawString(label, ScreenWidth/2, ScreenHeight/2,
            g.HCENTER|g.TOP);
        }
    }

    public myMidletSendData() //konstruktor MIDlet-u
    {
        try {
            sendTextFile("123456789012 234567890123 end");
        }
        catch (IOException e) {
            System.out.println("IOException " + e.toString());
        }
    }

    public void startApp() {
        display = Display.getDisplay(this);
        display.setCurrent(new Ekran("Witaj w aplikacji!"));
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void sendTextFile(String name) throws IOException
    {
        System.out.println("Wywolano sendTextFile");


        HttpConnection conn = null;
        String url = "http://87.205.18.184/datareceiver.php";
        String agent = "Profile/MIDP-1.0 Configuration/CLDC-1.0";
        String rawData = "vagons=" + name;
        String type = "application/x-www-form-urlencoded";

        //String encodedData = encode( rawData ); // user-supplied
        String encodedData = rawData; //z powodu bledu kompilacji nie bede
        //kodowal rawData - kodowanie rzekomo potrzebne z powodu typu x-www-form-urlencoded
    
        try {
            conn = (HttpConnection) Connector.open( url );
            conn.setRequestMethod( HttpConnection.POST );
            conn.setRequestProperty( "User-Agent", agent );
            conn.setRequestProperty( "Content-Type", type );
            conn.setRequestProperty( "Content-Length", "encodedData.length()" );
            //http://forum.vingrad.ru/act-Print/client/html/f-114/t-185266.html <- wziac w cudzyslow
    
            getConnectionInformation(conn); //pozniej mozna usunac to
            //wywolanie jak i sama funkcje getConnectionInformation
    
            OutputStream os = conn.openOutputStream();
            os.write( encodedData.getBytes() );
        
            int rc = conn.getResponseCode();
            // ... process it
            //System.out.println("ResponseCode " + rc.toString());
            //powyzej wyskakiwal blad: int cannot be dereferenced
            System.out.println("ResponseCode " + rc);

        }
        catch( IOException e ) {
            // handle the error here
            System.out.println("IOException " + e.toString());
        }
        //wyrzucilem finally bo bylo za duzo bledow kompilacji w zwiazku z is oraz conn


    }

    /***  After setup, attributes of the HttpConnection object can be retrived using
        various get methods.
    ***/
    void getConnectionInformation(HttpConnection hc) {
        System.out.println("POCZATEK GET CONNECTION INFORMATION");
        System.out.println("Request Method for this connection is " + hc.getRequestMethod());
        System.out.println("URL in this connection is " + hc.getURL());
        System.out.println("Protocol for this connection is " + hc.getProtocol()); // It better be HTTP:)
        System.out.println("This object is connected to " + hc.getHost() + " host");
        System.out.println("HTTP Port in use is " + hc.getPort());
        System.out.println("Query parameter in this request are  " + hc.getQuery());
        System.out.println("KONIEC GET CONNECTION INFORMATION");
    }
}


i odbierającego PHP:

Kod
//datareceiver.php:

<html>
<head>
    <title> Wysylanie... </title>
</head>
<body>
<h1>Wysylanie pliku...</h1>
<?php

$plikuzytkownika = $HTTP_POST_FILES['plikuzytkownika']['tmp_name'];
$plikuzytkownika_name = $HTTP_POST_FILES['plikuzytkownika']['name'];
$plikuzytkownika_size = $HTTP_POST_FILES['plikuzytkownika']['size'];
$plikuzytkownika_type = $HTTP_POST_FILES['plikuzytkownika']['type'];
$plikuzytkownika_error = $HTTP_POST_FILES['plikuzytkownika']['error'];

if ($plikuzytkownika_error > 0)
{
    echo 'Problem: ';
    switch ($plikuzytkownika_error)
    {
        case 1: echo 'Rozmiar pliku przekroczyl wartosc upload_max_filesize'; break;
        case 2: echo 'Rozmiar pliku przekroczyl wartosc max_file_size'; break;
        case 3: echo 'Plik wyslany tylko czesciowo'; break;
        case 4: echo 'Nie wyslano zadnego pliku'; break;
    }
    exit;
}

if ($plikuzytkownika_type != application/x-www-form-urlencoded)
{
    echo 'Problem: plik nie jest odpowiedniego typu';
    exit;
}

$lokalizacja = '/wyslane/'.$plikuzytkownika_name;

if (is_uploaded_file($plikuzytkownika))
{
    if (!move_uploaded_file($plikuzytkownika, $lokalizacja))
    {
        echo 'Problem: Plik nie moze byc skopiowany do katalogu';
        exit;
    }
}
else
{
    echo 'Problem: mozliwy atak podczas wysylania pliku. Nazwa pliku: '.$plikuzytkownika_name;
    exit;
}

echo 'Plik wyslany<br /><br />';

$wp = fopen($lokalizacja, 'r');
$zawartosc = fread($wp, filesize($lokalizacja));
fclose($wp);

echo 'Podglad zawartosci wyslanego pliku:<br /><hr />';
echo $zawartosc;
echo '<br /><hr />';

?>
</body>
</html>


Pozdrawiam :-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.