1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Bluetooth Fernbedienung

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von CJ0202, 05.01.2011.

  1. CJ0202, 05.01.2011 #1
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Hallo Leute!

    Ich steh seit Tagen vor einem Problem und bekomm es einfach nicht auf die Reihe.

    Ich möchte ein App programmieren, dass via Bluetooth als Fernbedienung zur Farbsteuerung eines LED- Cubes dient.

    Der ganze grafische Teil war nicht so das Problem...

    BLUETOOTH:

    Das Manifest.xml steht. Alles für Bluetooth eingebunden.
    BluetoothChatService.java vom Sample BluetoothChat übernommen.
    DeviceListActivity.java von Sample BluetoothChat übernommen.

    Mein Problem:

    Ich habe 12 Buttons.
    Bei jedem Button soll ein anderer Wert über Bluetooth an den Empfänger geschickt werden (Dort werden dann entsprechend Programme aufgerufen)

    z.b. für PlayButton

    Was muss ich onClick als Parameter eintragen, um über OutStream einen Wert zu senden?

    mPlayButton = (Button) findViewById(R.id.btnplay);
    mPlayButton.setOnClickListener(new OnClickListener()
    {
    public void onClick(View v)
    {

    }

    Hoffe es kann mir jemand helfen

    Lg. Chris

    Fernbedienung.JPG

    Den Anhang LightCube.txt betrachten
     
  2. the_alien, 05.01.2011 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Du übergibst gar nichts an onClick, dass macht das Framework für dich.
     
  3. CJ0202, 05.01.2011 #3
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Mhm... ich will ja auch nix an onclick übergeben...

    Nur möchte ich, dass wenn auf den Button Play geklickt wird, dass über Bluetooth der Wert=1 an den Empfänger geschickt wird.

    um den Button Play abzufragen --> der onClickListener

    Und ab da steh ich an... wass muss ich nun als nächstes wo machen?

    Danke für deine Antwort
     
  4. the_alien, 05.01.2011 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Was genau ist das Problem? Das du nicht weißt was der LightCube genau erwartet? Wie es gesendet werden soll? Gibt es eine Referenz für den betreffenden Würfel?
     
  5. CJ0202, 05.01.2011 #5
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Mein Problem ist, ich weiß das beim LightCube der Wert 1 ankommen soll, hab aber keine Ahnung, wie ich das im Code umsetze!

    Das ist mein erstes App das ich programmiere (kleiner Teil meiner Diplomarbeit), und anscheinend fehlt mir da das Verständnis zu.

    Wenn ich den onClickListener setzte, dann muss ich ihm doch dort auch sagen, was bei einem Click gemacht werden soll?! Oder?

    Nur, wie sage ich im Code, dass der Wert 1 über Bluetooth gesendet werden soll?
     
  6. the_alien, 05.01.2011 #6
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Wert 1 als was? String? Integer? 16bit? 32bit?... ;)

    Im Prinzip musst du nur write(int oneByte) vom OutputStream nutzen und dort die 1 übergeben. Dazu kannst du ja einfach eine neue Methode im Service machen.
    Ich würde aber, wenn du den Code abgeben musst, nicht die OpenSource Samples nehmen, oder nur Teile wiederverwenden.
     
  7. CJ0202, 06.01.2011 #7
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Also anscheinend liegt mein Problem getbyte() und write().
    Da ich einen Integer Wert einlesen möchte, und diese Methoden aber für String Werte gedacht sind.

    Habe nun versucht, das ganze über intValue() zu machen, aber da bekomme ich immer eine Fehlermeldung:

    "Cannot invoke intValue() on the primitive type int"

    Kann mir da jemand weiter helfen?
     
  8. LucianTheDark, 06.01.2011 #8
    LucianTheDark

    LucianTheDark Gewerbliches Mitglied

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    06.01.2011
    Hallo CJ0202,

    wenn ich das richtige verstehe bisher und mir deinen Code anschaue willst du wissen was du in der onClick Methode machen musst um den Button der geklickt wurde abzuarbeiten.

    Code:
    public void onClick(View v)
                {
                    this.sendData(INTEGER.toString(1)); 
                    finish();
                }
    
    So Kannst du einen Integer wert als String sauber übermitteln

    Ansonsten stellt sich mir die Frage ob du die Signatur der Methode nicht einfach ändern kannst da sie ja nicht überschrieben wird:

    Code:
    private void sendData(int data) {}
    
    Grüße
     
  9. the_alien, 06.01.2011 #9
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Eine 1 als String ist aber was anderes als eine 1 als int...
     
  10. CJ0202, 06.01.2011 #10
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Genau das ist ja mein Problem. Die 1 als String übermitteln, dazu müsste ich im Code nix ändern. Aber wenn ich die 1 als int übermitteln möchte schon!
     
  11. CJ0202, 06.01.2011 #11
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Wenn ich das wie folgt versuche, bekomme ich die Fehlermeldung (rot):

    The method write(int[]) in the type BluetoothChatService is not applicable for the arguments (int)



    mPlayButton = (Button) findViewById(R.id.btnplay);
    mPlayButton.setOnClickListener(new OnClickListener()
    {
    public void onClick(View v)
    {

    int message = 1;
    sendData(message);


    }
    });

    private void sendData(int message)
    {
    // Check that we're actually connected before trying anything
    if (mChatService.getState() != BluetoothChatService.STATE_CONNECTED)
    {
    Toast.makeText(this, R.string.not_connected, Toast.LENGTH_SHORT).show();
    return;
    }
    // Check that there's actually something to send
    if (message > 0)
    {
    // Get the message bytes and tell the BluetoothChatService to write
    mChatService.write(message);

    // Reset out string buffer to zero and clear the edit text field
    mOutStringBuffer.setLength(0);

    }
    }
     
  12. LucianTheDark, 06.01.2011 #12
    LucianTheDark

    LucianTheDark Gewerbliches Mitglied

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    06.01.2011
    Wieso sollte eine 1 als String was anderes sein als eine 1 als Int.
    Nehmen wir doch mal folgenden Code

    Code:
    Log.d("Integer.toString()", Integer.toString(1));
    Log.d("String 1", "1");
    Log.d("ByteFromInteger",Byte.valueOf(Integer.toString(1)).toString());
    Log.d("ByteFromString",Byte.valueOf("1").toString());
    
    Dann erhalten wir doch erstmal generell die gleiche Ausgabe:

    Code:
    01-06 13:17:59.706: DEBUG/Integer.toString()(343): 1
    01-06 13:17:59.706: DEBUG/String 1(343): 1
    01-06 13:17:59.717: DEBUG/ByteFromInteger(343): 1
    01-06 13:17:59.717: DEBUG/ByteFromString(343): 1
    
    So kann mann dann auch mit

    Code:
    this.sendData(INTEGER.toString(1)); 
    
    Die Daten als String versenden obwohl man ja einen Integer genommen hat.

    Das andere problem was du beschreibst liegt dann an folgendem:

    Alt:
    Code:
     byte[] send = data.getBytes();
     mChatService.write(send);
    
    Neu:
    Code:
    if (message > 0) 
            {
                // Get the message bytes and tell the BluetoothChatService to write
     [COLOR=Red] mChatService.write(message);[/COLOR]
    
    Du hast das Umwandeln in ein ByteArray gleich mitgelöscht das darfst du natürlich nicht machen.


    Wenn dann müsstest du das in
    Code:
    
    int data = 1;
    String binaryString = Integer.toBinaryString(data);
    [COLOR=Red]mChatService.write([/COLOR]binaryString.getBytes()[COLOR=Red]);[/COLOR]
    
    
    umwandeln.

    Das Problem ist das du aber weiter unten im Code

    Code:
    
    private TextView.OnEditorActionListener mWriteListener =
            new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
                // If the action is a key-up event on the return key, send the message
                if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) {
                    [COLOR=Red]String message = view.getText().toString();[/COLOR]
                    sendData(message);
                }
                if(D) Log.i(TAG, "END onEditorAction");
                return true;
            }
        };
    
    
    Irgendeinen String aus einer Textbox ausliest und den an sendData übergibst dann kannst du den Methoden Kopf auch nicht in int umwandeln oder musst eben hier schon in (int) parsen.


    Grüße Marcel
     
    Zuletzt bearbeitet: 06.01.2011
  13. CJ0202, 06.01.2011 #13
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Ja das stimmt das ich das gelöscht habe, aus dem Grund, dass ich der Variable message den Type int zugewiesen habe. Somit kann ich die Methode getBytes() nicht mehr verwenden, da diese nur für Strings funktionieren.

    Das Problem ist, das ich dieses App als Fernbedienung für einen LightCube verwenden muss. Dass heißt, ich hab auf der Empfängerseite den Bluetoothadapter und dahinter einen ATMEL Microcontroller. Um dort so wenig wie möglich Codezeilen zu haben, möchte ich das ganze als Integer übermitteln- und dass funktioniert soweit ich gelesen habe, mit dem Befehl oneByte() im Outputstream.
     
  14. LucianTheDark, 06.01.2011 #14
    LucianTheDark

    LucianTheDark Gewerbliches Mitglied

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    06.01.2011
    Hallo CJ0202,

    wenn ich an meinen ersten Post denke dann sehe ich es so.
    (Code auf Anfang zurückgestellt) und dann folgendes gemacht:

    Code:
    public void onClick(View v)
                {
                    this.sendData(INTEGER.toString(1));  
                    finish();
                }
    
    sendData muss dann wieder so aussehen:
    
    private void sendData(String data) 
    
    Generell wirst du keinen INT wert als 1 übertragen bekommen sondern den wert als Byte und zwar so viele wie benötigt werden.

    Bsp:

    Code:
            int data = 20;
            String binaryString = Integer.toString(data);
            byte[] byteArray = binaryString.getBytes();
                for (int i = 0; i < byteArray.length; i++) {
                    Log.d("bytes aus nem int an stelle " + i, byteArray[i] + "");
                }
    
            byte[] byteArrayString = "20".getBytes();
                for (int i = 0; i < byteArrayString.length; i++) {
                   Log.d("bytes aus nem int an stelle " + i, byteArrayString[i] + "");
                }
    
    Ausgabe:
    
    01-06 13:51:55.687: DEBUG/bytes aus nem int an stelle 0(563): 50
    01-06 13:51:55.687: DEBUG/bytes aus nem int an stelle 1(563): 48
    01-06 13:51:55.707: DEBUG/bytes aus nem int an stelle 0(563): 50
    01-06 13:51:55.707: DEBUG/bytes aus nem int an stelle 1(563): 48
    
    Wie man sieht werden für den INT wert 20 in den vorhandenem Byte Array die zahlen 50, 48 abgelegt und diese würdest du an deinen Microcontroller gesendet bekommen.

    Grüße Marcel
     
  15. the_alien, 06.01.2011 #15
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Lieber Marcel, mit deinem letzten Beitrag hast du dir doch selber erklärt warum eine 1 als Int nicht gleich einer 1 als String ist...
     
  16. CJ0202, 13.01.2011 #16
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    So gute Neuigkeiten, das Senden von Daten funktioniert bereits.

    Nun stehe ich vor dem nächsten Problem.

    Bei einem längeren Tastendruck soll, je nachdem wie lange der Butten gedrückt wird, ein Wert gesendet werden, allerdings in Echtzeit.

    Warum? Ganz einfach, ich möchte damit eine LED dimmen.

    Hat jeamand eine Ahnung, wie ich das hinbekomme?

    Danke im Vorraus.
     
  17. AtzeDePeng, 14.01.2011 #17
    AtzeDePeng

    AtzeDePeng Android-Hilfe.de Mitglied

    Beiträge:
    80
    Erhaltene Danke:
    12
    Registriert seit:
    11.12.2009
    Probier es doch einfach mit:

    bei onLongClick einen Timer zu starten, in dem du dann was auch immer machst.. (*zaunfahl MotionEvent.ACTION_UP)

    Axo es gibt übrigens eine echt gute Reference zum SDK wo man genau sowas nachlesen kann. *fg
     
    Zuletzt bearbeitet: 14.01.2011
  18. CJ0202, 14.01.2011 #18
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Danke für die Antwort,

    Das ganze mit einem Timer zu machen war mir klar.
    Allerdings habe ich dabei das Problem, dass die Daten erst gesendet werden, wenn der ich den Button wieder loslasse.

    Somit kann ich aber das dimmen einer LED nich realisieren.

    Ich müsste alle 5 - 10ms die Daten senden.

    Das ist das Problem, dass ich lösen muss.
     
  19. CJ0202, 01.02.2011 #19
    CJ0202

    CJ0202 Threadstarter Neuer Benutzer

    Beiträge:
    15
    Erhaltene Danke:
    0
    Registriert seit:
    06.09.2010
    Hallo Leute,

    So, wieder mal ne Frage zu meinem kleinen Projekt...

    Wie kann ich am besten einen Timer realisieren?
    Bitte um Beispielcode.

    Danke
     

Diese Seite empfehlen