1

こんにちは、Bluetooth と NFC を使用して 2 つの Android 電話アプリケーションを接続したいと考えています。

現在、あるデバイスから別のデバイスに NFC 経由で UUID と MAC を送信しています。問題は、ソケットを開くときに次のエラーが発生することです: java.io.IOException: Service discovery failed

アプリケーションのクライアント側:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bluerec);



    JSONObject oneObject = null;

    //NFC
    Intent intent = getIntent();

    Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

    NdefMessage message = (NdefMessage)messages[0];
    NdefRecord record = message.getRecords()[0];

    payload = new String(record.getPayload());
    String add = null;    
    String uuid = null;

    try {
           oneObject = new JSONObject(payload);
           add = oneObject.getString("MAC");
           uuid = oneObject.getString("UUID");   
    } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    TextView textView = (TextView) findViewById(R.id.textView);
    textView.setText(payload);

    UUID uuid2 = UUID.fromString(uuid);

    BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();   
    this.bluetooth = bluetooth;

    BluetoothDevice device = bluetooth.getRemoteDevice(add);
    connectToServerSocket(device, uuid2 );  
}

 private void connectToServerSocket(BluetoothDevice device, UUID uuid) {
      try{
        BluetoothSocket clientSocket = device.createRfcommSocketToServiceRecord(uuid);

        // Block until server connection accepted.
        clientSocket.connect();

        // Start listening for messages.
        StringBuilder incoming = new StringBuilder();
        listenForMessages(clientSocket, incoming);

        // Add a reference to the socket used to send messages.
        transferSocket = clientSocket;

      } catch (IOException e) {
        Log.e("BLUETOOTH", "Blueooth client I/O Exception", e);
      }
    }

そしてサーバー側では:

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

    //Bluetooth


    //NFC
    jsonObj = getMacAddress();
    payload = jsonObj.toString();

    nfcAdapter = NfcAdapter.getDefaultAdapter(this);

    String mimeType = "application/com.example.cpayvendingcomm";
    byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
    NdefMessage nfcMessage = new NdefMessage(
        new NdefRecord[] 
        {
            // Create the NFC payload.
            new NdefRecord(
            NdefRecord.TNF_MIME_MEDIA,
            mimeBytes,
            new byte[0],
            payload.getBytes()),
            // Add the AAR (Android Application Record)
            //NdefRecord.createApplicationRecord("com.paad.nfcbeam")
        });

    nfcAdapter.setNdefPushMessage(nfcMessage, this);

    initBluetooth();

}

 private static final int ENABLE_BLUETOOTH = 1;

 private void initBluetooth() {
      if (!bluetooth.isEnabled()) { 
        // Bluetooth isn't enabled, prompt the user to turn it on.
        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(intent, ENABLE_BLUETOOTH);
      } else {
        // Bluetooth is enabled, initialize the UI.
        initBluetoothUI();
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();   
        this.bluetooth = bluetooth;
        startServerSocket(bluetooth);
      }

 }

 private void initBluetoothUI() {
    // TODO Auto-generated method stub

}

private ArrayList<BluetoothDevice> deviceList = 
          new ArrayList<BluetoothDevice>();

 BroadcastReceiver discoveryResult = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        String remoteDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);

        BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

        deviceList.add(remoteDevice);

        Log.d(TAG, "Discovered " + remoteDeviceName);
      }
    };

    private BluetoothSocket transferSocket;

    private UUID startServerSocket(BluetoothAdapter bluetooth) {
        UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c545");
        String name = "bluetoothserver";

        try {
          final BluetoothServerSocket btserver = 
            bluetooth.listenUsingRfcommWithServiceRecord(name, uuid);

          Thread acceptThread = new Thread(new Runnable() {
            public void run() {
              try {
                // Block until client connection established.
                BluetoothSocket serverSocket = btserver.accept();
                // Start listening for messages.
                StringBuilder incoming = new StringBuilder();
                listenForMessages(serverSocket, incoming);
                // Add a reference to the socket used to send messages.
                transferSocket = serverSocket;
              } catch (IOException e) {
                Log.e("BLUETOOTH", "Server connection IO Exception", e);
              }
            }
          });
          acceptThread.start();
        } catch (IOException e) {
          Log.e("BLUETOOTH", "Socket listener IO Exception", e);
        }
        return uuid;
      }





    // Listener for messages
    private boolean listening = false;

    private void listenForMessages(BluetoothSocket socket, StringBuilder incoming) {
      listening = true;

      int bufferSize = 1024;
      byte[] buffer = new byte[bufferSize];

      try {
        InputStream instream = socket.getInputStream();
        int bytesRead = -1;

        while (listening) {
          bytesRead = instream.read(buffer);
          if (bytesRead != -1) {
            String result = "";
            while ((bytesRead == bufferSize) &&
                   (buffer[bufferSize-1] != 0)){
              result = result + new String(buffer, 0, bytesRead - 1);
              bytesRead = instream.read(buffer);
            }
            result = result + new String(buffer, 0, bytesRead - 1);
            incoming.append(result);
          }
          socket.close();
        }
      } catch (IOException e) {
        Log.e(TAG, "Message received failed.", e);
      }
      finally {
      }
    }
4

1 に答える 1

1

Bluetooth アドレスを渡すことは、Bluetooth デバイスを事前にペアリングせずに接続していることを前提としています。2 つのデバイスをペアリングするかどうかに応じて、次の 2 つの方法で実装できます。

  1. ペアリングなし。Android で安全でないサーバー接続を作成する方法で説明されているように、クライアントではcreateInsecureRfcommSocketToServiceRecord()なく使用します。サーバーで使用 します。createRfcommSocketToServiceRecord()listenUsingInsecureRfcommWithServiceRecord()

  2. NFC 経由で OOB を渡すセキュア シンプル ペアリングとのペアリング。それは、あなたが求めているものを超えた、より複雑なプロセスです。

于 2013-10-07T13:44:24.787 に答える