0

わかりました、もう一度試してみます。

ubuntu にデバイス sdptool があり、デバイスから次のように述べられています。

# sdptool browse  C0:1B:DC:1F:E2:F1
Browsing C0:1B:DC:1F:E2:F1 ...
Service Name: OBEX Object Push
Service RecHandle: 0x10000
Service Class ID List:
 "OBEX Object Push" (0x1105)
Protocol Descriptor List:
 "L2CAP" (0x0100)   
 "RFCOMM" (0x0003)
 Channel: 9 
 "OBEX" (0x0008)
Profile Descriptor List:
 "OBEX Object Push" (0x1105)
  Version: 0x0100

おわかりのように、デバイスは RFCOMM プロトコルと、ファイル転送用の OBEX をサポートしています。ユーザーの操作がないためだけに、安全でないRFCOMMチャネルを介してこのデバイスに接続しようとするAndroidアプリの簡単なコードがあります。このデバイスに接続したいので、接続にデバイスの mac-address を使用しています。ソケットの準備ができていると、logcat はそう言っています。

しかし、私はエラーしか出ません:

Connection refused

Java コードの mac-address は、上記のリストとは異なることに注意してください。

だからここに私のコードがあります:

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class SimpleConnectAndroidActivity extends Activity {

final static String toast = "IAM HERE"; 

final static String TAG ="SimpleConnect";
UUID MY_UUID;

BluetoothDevice bd;
BluetoothAdapter ba;

Button connectButton;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    //MY_UUID = new UUID(0x0100 , 0x1000);
    // MY_UUID = UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812");

    connectButton = (Button)findViewById(R.id.button1);
    connectButton.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {


            BluetoothSocket tmp = null; 

                BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:1B:DC:0F:EC:7E");
                Method m = null;

                try {
                    m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                try {
                    tmp = (BluetoothSocket) m.invoke(device, 1);
                } catch (IllegalArgumentException e) {

                    Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show();

                } catch (IllegalAccessException e) {

                    Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show();

                    e.printStackTrace();

                } catch (InvocationTargetException e) {

                    Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show();

                    e.printStackTrace();
                }

                try {
                    tmp.connect();
                } catch (IOException e) {

                    Toast.makeText(getApplicationContext(), "Exception: " + e.getMessage(), Toast.LENGTH_LONG).show();

                    try {
                        tmp.close();
                    } catch (IOException e1) {

                        Toast.makeText(getApplicationContext(), "Socket closed!" + e.getMessage(), Toast.LENGTH_LONG).show();
                    } 


                }
                boolean con = tmp.isConnected();

                if(con)
                    Toast.makeText(getApplicationContext(), "Connection was made!", Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(getApplicationContext(), "Connection was not made!", Toast.LENGTH_LONG).show();

            }
    });  
}

}

ペアリングを解除して再度ペアリングすることで機能するはずのいくつかの場所を読みましたが、これで問題は解決しません。

4

1 に答える 1

2

さて、あなたの質問は1か月以上前のものですが、まだ答えを探している場合は、ここに答えがあります:

sdptool は、RFCOMM チャネルが 9 であることを示していますが、コードには次のものがあります。

tmp = (BluetoothSocket) m.invoke(device, 1);

最後の引数として 1 の代わりに、9 を試してください (それが機能しない場合は、2 から 15 などの他の整数を試してください)。

この回答も確認してください。

スタックに関するこの質問には多くのバリエーションがあるようですが、「標準」の推奨コード (つまり、「メソッド m」を定義して呼び出す行で変更された Bluetooth チャット サンプル) についてはあまり理解されていません。私はこれに苦労した人々の一人です。携帯電話を MacBook に接続しようとしたところ、上記のコード行で 5 を使用する必要があることに気付くまで、「接続が拒否されました」というメッセージが表示されました。

于 2012-08-24T16:09:04.830 に答える