16

Androidフォン(samsung galaxy s2)からLinuxを実行しているPCのPythonスクリプトに「helloWorld」(単なる文字列)を送信しようとしています。しかし、私はそれを機能させることができません。以下は、Android アプリ (クライアント) と Python スクリプト (サーバー) のコードです。Bluetooth は PC と電話で正常に動作しています (たとえば、電話から BT 経由で写真を送信できます)。btSocket.connect(); を呼び出すと、以下のJavaコードでは、接続できません。serverSocket のポートを指定したので、接続先のポートを指定する必要がありますか? どんな助けでも大歓迎です。

public class BlueTooth_testActivity extends Activity {
    TextView header;
    Button discoverDevicesBtn;
    Button sendMsgBtn;
    Button closeBtn;
    EditText sendTxt;
    BluetoothAdapter btAdapter;
    BluetoothSocket btSocket;
    private static String btAdress = "00:10:60:D1:95:CD";
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private OutputStream out;
    public BluetoothDevice device;
    private Boolean CONNECTED = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //init layout parameters        
        header = (TextView) findViewById(R.id.text1);
        discoverDevicesBtn = (Button) findViewById(R.id.discBtn);
        sendMsgBtn = (Button) findViewById(R.id.sendButton);
        closeBtn = (Button) findViewById(R.id.closeButton);
        sendTxt = (EditText) findViewById(R.id.editText1);
        discoverDevicesBtn.setOnClickListener(discoverDeviceListener);
        sendMsgBtn.setOnClickListener(sendMsgListener);
        closeBtn.setOnClickListener(closeBtnListener);
        //init bluetooth
        btAdapter = BluetoothAdapter.getDefaultAdapter();
        if (btAdapter.isEnabled()) {
            Toast.makeText(this, "Bluetooth state:" + btAdapter.getState() + " Ok!", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "Bluetooth state:" + btAdapter.getState() + " Not ok!", Toast.LENGTH_LONG).show();
        }

    }

    private Button.OnClickListener discoverDeviceListener = new Button.OnClickListener() {@Override
        public void onClick(View v) {
            if (!CONNECTED) {
                device = btAdapter.getRemoteDevice(btAdress);
                header.append("\nRemote device: " + device.getName());
                try {
                    btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
                } catch (Exception e) {
                                    }
                header.append("\n createRfcommsockettoservice! ");
                btAdapter.cancelDiscovery();
                try {
                    btSocket.connect();
                    CONNECTED = true;
                    header.append("\n btSocket Created!");
                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(), "Could not connect to socket", Toast.LENGTH_LONG);
                    try {
                        btSocket.close();
                    } catch (Exception b) {}
                }
            }

        }
    };


    private Button.OnClickListener sendMsgListener = new Button.OnClickListener() {@Override
        public void onClick(View v) {
            if (CONNECTED) {
                try {
                    out = btSocket.getOutputStream();
                    String msg = sendTxt.getText().toString();
                    byte[] msgBffr = msg.getBytes();
                    out.write(msgBffr);
                    Toast.makeText(getApplicationContext(), "Message sent", Toast.LENGTH_LONG).show();
                } catch (Exception a) {
                    Toast.makeText(getApplicationContext(), "Could not send msg", Toast.LENGTH_LONG).show();
                }
            } else {
                Toast.makeText(getApplicationContext(), "cant send msg, not connected", Toast.LENGTH_LONG).show();
            }

        }
    };


}  

(問題は接続設定のどこかにあるため、残りのJavaコードを含めるのは面倒でした)

import bluetooth

name="bt_server"
target_name="siggen"
uuid="00001101-0000-1000-8000-00805F9B34FB"

def runServer():
serverSocket=bluetooth.BluetoothSocket(bluetooth.RFCOMM )
    port=bluetooth.PORT_ANY
    serverSocket.bind(("",port))
    print "Listening for connections on port: ", port   
    serverSocket.listen(1)
    port=serverSocket.getsockname()[1]
    inputSocket, address=serverSocket.accept()
    print "Got connection with" , address
    data=inputSocket.recv("1024")
    print "received [%s] \n " % data    
    inputSocket.close()
    serverSocket.close()  

runServer()  

.

4

3 に答える 3

1

すでに投稿された推奨事項に従って、コードを期待どおりに機能させることができた方法は次のとおりです。

   

import bluetooth
    
    name="bt_server"
    target_name="test"
    # some random uuid, generated by https://www.famkruithof.net/uuid/uuidgen
    uuid="0fee0450-e95f-11e5-a837-0800200c9a66"
    
    def runServer():
        # you had indentation problems on this line:
        serverSocket=bluetooth.BluetoothSocket(bluetooth.RFCOMM )
        port=bluetooth.PORT_ANY
        serverSocket.bind(("",port))
        print "Listening for connections on port: ", port   

        # wait for a message to be sent to this socket only once
        serverSocket.listen(1)
        port=serverSocket.getsockname()[1]
    
        # you were 90% there, just needed to use the pyBluez command:
        bluetooth.advertise_service( serverSocket, "SampleServer",
                           service_id = uuid,
                           service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ],
                           profiles = [ bluetooth.SERIAL_PORT_PROFILE ] 
                            )
    
        inputSocket, address=serverSocket.accept()
        print "Got connection with" , address
        data=inputSocket.recv(1024)
        print "received [%s] \n " % data    
        inputSocket.close()
        serverSocket.close()  
    
    runServer()  

コマンド ラインから実行すると、メッセージが Bluetooth 経由で送信されるまでコードは永久に待機します。したがって、そのコードが実行されている状態で、Bluetooth 経由で Android デバイスを接続し、開発中の Android アプリ メソッドまたは次のような方法で (上記と同じ uuid を参照して) デバイスにデータを送信させるだけです。 gist (私が使用したもの): https://gist.github.com/tito/7432757

于 2016-03-13T22:03:28.437 に答える
1

サーバーピース

Pythonに関しては私の深さから外れていますが、あなたのPythonスニペットはどこにもuuidを使用していないようです。たとえば、pybluez リポジトリには、 呼び出し時に uuid を使用する サンプル サーバーadvertise_serviceがありますが、これはスニペットにはないようです。同様のことを行う場合、スニピットは次のようになります。

import bluetooth

name="bt_server"
target_name="siggen"
uuid="00001101-0000-1000-8000-00805F9B34FB"

def runServer():
serverSocket=bluetooth.BluetoothSocket(bluetooth.RFCOMM )
    port=bluetooth.PORT_ANY
    serverSocket.bind(("",port))
    print "Listening for connections on port: ", port   
    serverSocket.listen(1)
    port=serverSocket.getsockname()[1]

    #the missing piece
    advertise_service( server_sock, "SampleServer",
                       service_id = uuid,
                       service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ],
                       profiles = [ bluetooth.SERIAL_PORT_PROFILE ] 
                        )

    inputSocket, address=serverSocket.accept()
    print "Got connection with" , address
    data=inputSocket.recv("1024")
    print "received [%s] \n " % data    
    inputSocket.close()
    serverSocket.close()  

runServer()  

クライアント

BluetoothDevice.createRfcommSocketToServiceRecord() は、「安全な通信ソケット」を作成するためのものです。これはあなたのサーバーがしていることですか?そうでない場合、おそらく BluetoothDevice.createInsecureRfcommSocketToServiceRecord() が適切な呼び出しでしょうか?

于 2013-01-25T10:18:55.167 に答える
1

ポートを指定する必要はありません。最初に開いている RFComm チャネルに接続するだけです。私が作成した Bluetooth アプリでわかったことの 1 つは、それを自分の電話で動作させるには、アプリで接続しようとする前に、サーバーが実行されているコンピューターに手動で接続する必要があるということです。つまりSettings -> Wireless/Networks -> Bluetooth Settings -> <Find/Pair to Computer>、システム トレイに通知が表示されるまで、すべての手順を実行します。次に、アプリを介してソケット接続を確立しようとすると、機能します。タブレットではなく携帯電話でこれらのフープをジャンプするだけでよいので、これは奇妙だと思います。デバイスに依存する可能性があります。

また、別の で接続を行いたいと思うでしょうThread

于 2012-06-27T22:27:04.127 に答える