Bluetooth Fernbedienung

C

CJ0202

Neues Mitglied
0
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

Anhang anzeigen LightCube.txt
 
Du übergibst gar nichts an onClick, dass macht das Framework für dich.
 
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
 
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?
 
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?
 
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.
 
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?
 
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
 
Eine 1 als String ist aber was anderes als eine 1 als int...
 
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!
 
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);

}
}
 
the_alien schrieb:
Eine 1 als String ist aber was anderes als eine 1 als int...

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:
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.
 
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
 
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...
 
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.
 
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:
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.
 
Hallo Leute,

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

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

Danke
 

Ähnliche Themen

S
Antworten
4
Aufrufe
4.468
mblaster4711
mblaster4711
N
Antworten
8
Aufrufe
1.019
NerkJ
N
M
Antworten
11
Aufrufe
2.274
jogimuc
J
Zurück
Oben Unten