2017-05-22 22 views
-1

私はブルートゥースRFCOMM経由で他のデバイスと接続する必要があるプロジェクトで作業しています。私はいくつかのコード(主にYouTubeのMitch Tabianチュートリアルに基づいています)を書きました、そして私は立ち往生しています。アンドロイドアプリでブルートゥースrfcomm経由でデータを送受信できない

ラップトップに接続できますが、データを送受信できません。私は私のコードを見て、間違った

セカンド活動

package com.example.mgr; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.content.LocalBroadcastManager; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.nio.charset.Charset; 
import java.util.ArrayList; 
import java.util.UUID; 

public class pulpit2kod extends AppCompatActivity { 
    private static final String TAG = "pulpit2kod"; 
    BluetoothAdapter mBluetoothAdapter; 
    private Spinner spinnerlist; 
    private ArrayList<String> mDeviceList = new ArrayList<>(); 
    private ArrayList<BluetoothDevice> bttDeviceList = new ArrayList<>(); 
    private ImageView btton; 
    private ImageView bttoff; 
    BluetoothDevice mBTDevice; 
    Button btconnect; 
    Button btsearch; 
    Button btgoto1screen; 
    Button btONOFF; 
    Button btvisibility; 
    Button btsend; 
    Button btpair; 
    EditText etsend; 
    BluetoothConnectionService mBluetoothConnection; 
    private static final UUID MY_UUID_INSECURE = UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");//{0000110e-0000-1000-8000-00805f9b34fb} 

    StringBuilder messages; 
    TextView etreceive; 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.pulpit2); 
     spinnerlist = (Spinner) findViewById(R.id.spinner); 
     Log.d(TAG, "onCreate: Starting"); 
     btconnect = (Button) findViewById(R.id.polacz); 
     btsearch = (Button) findViewById(R.id.search) ; 
     btgoto1screen = (Button) findViewById(R.id.goto1screen); 
     btONOFF = (Button) findViewById(R.id.ONOFF); 
     btvisibility = (Button) findViewById(R.id.widocznosc); 
     btsend = (Button) findViewById(R.id.btsend); 
     btpair = (Button) findViewById(R.id.pair); 
     btton = (ImageView) findViewById(R.id.btton); 
     bttoff = (ImageView) findViewById(R.id.bttoff); 
     etsend = (EditText) findViewById(R.id.etsend); 
     etreceive = (TextView) findViewById(R.id.etreceive); 
     messages = new StringBuilder(); 

     LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver4, new IntentFilter("incomingMessage")); 
     //-------------------BT ON logo --------------------------------------------------------------- 
     int logobtton = getResources().getIdentifier("@drawable/btton", null, this.getPackageName()); 
     btton.setImageResource(logobtton); 
     //-------------------BT OFF logo -------------------------------------------------------------- 
     int logobttoff = getResources().getIdentifier("@drawable/bttoff", null, this.getPackageName()); 
     bttoff.setImageResource(logobttoff); 
     //---------------------lista position click-------------------------------- 
     spinnerlist.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, final int position, long id) { 
       btpair.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); 
         registerReceiver(mBroadcastReceiver3,filter); 
         if (Build.VERSION.SDK_INT>Build.VERSION_CODES.JELLY_BEAN_MR2){ 
          bttDeviceList.get(position).createBond(); 
          mBTDevice = bttDeviceList.get(position); 
          mBluetoothConnection = new BluetoothConnectionService(pulpit2kod.this); 

         } 
        } 
       }); 

      } 
      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       Toast.makeText(pulpit2kod.this,"Wybierz pozycję, aby polaczyc", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     btconnect.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startConnection(); 
      } 
     }); 
     btsend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      byte [] bytes = etsend.getText().toString().getBytes(Charset.defaultCharset()); 
       mBluetoothConnection.write(bytes); 
       etsend.setText(""); 
      } 
     }); 

     //---------------------BT wyszikiwanie przycisk----------------------------- 
     btsearch.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      wyszukiwanie(); 
      } 

     }); 
     //---------------------BT widocznosc przycisk------------------------------- 
     btvisibility.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "onCreate: discoverability bt"); 
       widocznosc(); 
      } 
     }); 

     //----------------------bluetooth przycisk---------------------------------- 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     btONOFF.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "onClick: enabling/disabling bt"); 
       enabledDisableBT(); 
       }}); 

     //--------------------- przycisk powrot do glownego menu---------------------- 
     btgoto1screen.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "onClick: Powrot do menu"); 
       Intent intent = new Intent(pulpit2kod.this, MainActivity.class); 
       startActivity(intent); 
      } 
     }); 
    logobt(); 

    } 

    public void startConnection(){ 

     startBTConnection(mBTDevice,MY_UUID_INSECURE); 
    } 

    public void startBTConnection(BluetoothDevice device, UUID uuid){ 
     Log.d(TAG, "startBTConnection: Initializing RFCOM Bluetooth Connection."); 

     mBluetoothConnection.startClient(device,uuid); 
    } 

    private void logobt() { 
     if (!mBluetoothAdapter.isEnabled()){ 
      bttoff.setVisibility(View.VISIBLE); 
      btton.setVisibility(View.INVISIBLE); 
     } 
     if (mBluetoothAdapter.isEnabled()){ 
      bttoff.setVisibility(View.INVISIBLE); 
      btton.setVisibility(View.VISIBLE); 
     } 
    } 

    private void wyszukiwanie() { 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     mBluetoothAdapter.startDiscovery(); 
     if (mBluetoothAdapter.isDiscovering()){ 
      mBluetoothAdapter.cancelDiscovery(); 
      mBluetoothAdapter.startDiscovery(); 
     } 
     if (!mBluetoothAdapter.isDiscovering()) { 
      mBluetoothAdapter.startDiscovery(); 
      } 
     bttDeviceList.clear(); 
     mDeviceList.clear(); 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     registerReceiver(mReceiver,filter); 

     } 

    //------------------------- metoda widocznosc ---------------------------------------- 
    private void widocznosc() { 
     Log.d(TAG, "widocznosc: Making device discoverable for 120 seconds"); 
     Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
     startActivity(discoverableIntent); 
     IntentFilter intentFilter = new IntentFilter(mBluetoothAdapter.ACTION_SCAN_MODE_CHANGED); 
     registerReceiver(mBroadcastReceiver2,intentFilter); 
    } 




    //-------------------------kompatybilność z BT i ON/OFF------------------------------------- 
    private void enabledDisableBT() { 
     if(mBluetoothAdapter ==null){ 
      Log.d(TAG, "enabledDisableBT: BT not supported"); 
     } 
     if(!mBluetoothAdapter.isEnabled()){ 
      Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivity(enableBTIntent); 
      IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
      registerReceiver(mBroadcastReceiver1, BTIntent); 
      bttDeviceList.clear(); 
      mDeviceList.clear(); 
      spinnerlist.setAdapter(null); 
      btton.setVisibility(View.VISIBLE); 
      bttoff.setVisibility(View.INVISIBLE); 
     } 
     if(mBluetoothAdapter.isEnabled()){ 
      mBluetoothAdapter.disable(); 
      IntentFilter BTInent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
      registerReceiver(mBroadcastReceiver1, BTInent); 
      bttoff.setVisibility(View.VISIBLE); 
      btton.setVisibility(View.INVISIBLE); 
      } 
     } 




    //---------------------------------------------------------------------------------------------- 
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 

     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       bttDeviceList.add(device); 
       mDeviceList.add(device.getName()+": "+device.getAddress()); 
       Log.d(TAG, "onReceive: Dodano"+device.getName()+": "+device.getAddress()); 
       spinnerlist.setAdapter(new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item,mDeviceList)); 
       } 
      } 
    }; 
    //---------------------------stan BT------------------------------------------------------- 
    private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      final String action = intent.getAction(); 
      if (action.equals(mBluetoothAdapter.ACTION_STATE_CHANGED)){ 
       final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,mBluetoothAdapter.ERROR); 
       switch (state){ 
        case BluetoothAdapter.STATE_OFF: 
         Log.d(TAG, "onReceive: STATE OFF"); 
         Toast.makeText(pulpit2kod.this ,"Turned off",Toast.LENGTH_SHORT).show(); 
         break; 
        case BluetoothAdapter.STATE_TURNING_OFF: 
         Log.d(TAG, "onReceive: STATE TURNING OFF"); 
         Toast.makeText(pulpit2kod.this ,"Turning off",Toast.LENGTH_SHORT).show(); 
         break; 
        case BluetoothAdapter.STATE_TURNING_ON: 
         Log.d(TAG, "onReceive:STATE TURNING ON"); 
         Toast.makeText(pulpit2kod.this ,"Turning on",Toast.LENGTH_SHORT).show(); 
         break; 
        case BluetoothAdapter.STATE_ON: 
         Log.d(TAG, "onReceive: STATE ON"); 
         Toast.makeText(pulpit2kod.this ,"Turned on",Toast.LENGTH_SHORT).show(); 
         break; 

       } 
      } 
     } 
    }; 

    private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      final String action = intent.getAction(); 
      if (action.equals(mBluetoothAdapter.ACTION_SCAN_MODE_CHANGED)){ 
       int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,mBluetoothAdapter.ERROR); 
       switch (mode){ 
        case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE: 
         Log.d(TAG, "onReceive: Discoverability Enabled"); 
         break; 
        case BluetoothAdapter.SCAN_MODE_CONNECTABLE: 
         Log.d(TAG, "onReceive: Discoverability Disabled. Able to recieve connections"); 
         break; 
        case BluetoothAdapter.SCAN_MODE_NONE: 
         Log.d(TAG, "onReceive:Discoverability Disabled. Not able to recieve connections"); 
         break; 
        case BluetoothAdapter.STATE_CONNECTING: 
         Log.d(TAG, "onReceive: Connecting"); 
         break; 
        case BluetoothAdapter.STATE_CONNECTED: 
         Log.d(TAG, "onReceive: Connected"); 
         break; 

       } 
      } 
     } 
    }; 
    private final BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      final String action = intent.getAction(); 
      if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)){ 
       BluetoothDevice mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       if (mDevice.getBondState()==BluetoothDevice.BOND_BONDED){ 
        Toast.makeText(pulpit2kod.this,"Bonded",Toast.LENGTH_SHORT).show(); 
        mBTDevice = mDevice; 

       } 
       if (mDevice.getBondState()==BluetoothDevice.BOND_BONDING){ 
        Toast.makeText(pulpit2kod.this,"Bonding",Toast.LENGTH_SHORT).show(); 
       } 
       if (mDevice.getBondState()==BluetoothDevice.BOND_NONE){ 
        Toast.makeText(pulpit2kod.this,"Not bonded",Toast.LENGTH_SHORT).show(); 

       } 
      } 
     } 
    }; 
    BroadcastReceiver mBroadcastReceiver4 = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String text = intent.getStringExtra("theMessage"); 
      messages.append(text +"\n"); 
      etreceive.setText(messages); 
     } 
    }; 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(mBroadcastReceiver1); 
     unregisterReceiver(mBroadcastReceiver2); 
     unregisterReceiver(mBroadcastReceiver3); 
     unregisterReceiver(mBroadcastReceiver4); 
     unregisterReceiver(mReceiver); 
    }} 

がBluetoothConnectionServiceでどの部分を私に教えて君たちを求めています

package com.example.mgr; 


import android.app.ProgressDialog; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothServerSocket; 
import android.bluetooth.BluetoothSocket; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v4.content.LocalBroadcastManager; 
import android.util.Log; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.nio.charset.Charset; 
import java.util.UUID; 

/** 
* Created by User on 12/21/2016. 
*/ 

public class BluetoothConnectionService { 
    private static final String TAG = "BluetoothConnectionServ"; 

    private static final String appName = "MYAPP"; 

    private static final UUID MY_UUID_INSECURE = 
      UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 

    private final BluetoothAdapter mBluetoothAdapter; 
    Context mContext; 

    private AcceptThread mInsecureAcceptThread; 

    private ConnectThread mConnectThread; 
    private BluetoothDevice mmDevice; 
    private UUID deviceUUID; 
    ProgressDialog mProgressDialog; 

    private ConnectedThread mConnectedThread; 

    public BluetoothConnectionService(Context context) { 
     mContext = context; 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     start(); 
    } 


    /** 
    * This thread runs while listening for incoming connections. It behaves 
    * like a server-side client. It runs until a connection is accepted 
    * (or until cancelled). 
    */ 
    private class AcceptThread extends Thread { 

     // lokalny serwer 
     private final BluetoothServerSocket mmServerSocket; 

     public AcceptThread(){ 
      BluetoothServerSocket tmp = null; 

      // nasluchiwanie 
      try{ 
       tmp = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(appName, MY_UUID_INSECURE); 

       Log.d(TAG, "AcceptThread: Setting up Server using: " + MY_UUID_INSECURE); 
      }catch (IOException e){ 
       Log.e(TAG, "AcceptThread: IOException: " + e.getMessage()); 
      } 

      mmServerSocket = tmp; 
     } 

     public void run(){ 
      Log.d(TAG, "run: AcceptThread Running."); 

      BluetoothSocket socket = null; 

      try{ 
       Log.d(TAG, "run: RFCOM server socket start....."); 

       socket = mmServerSocket.accept(); 

       Log.d(TAG, "run: RFCOM server socket accepted connection."); 

      }catch (IOException e){ 
       Log.e(TAG, "AcceptThread: IOException: " + e.getMessage()); 
      } 

      if(socket != null){ 
       connected(socket,mmDevice); 
      } 

      Log.i(TAG, "END mAcceptThread "); 
     } 

     public void cancel() { 
      Log.d(TAG, "cancel: Canceling AcceptThread."); 
      try { 
       mmServerSocket.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "cancel: Close of AcceptThread ServerSocket failed. " + e.getMessage()); 
      } 
     } 

    } 

    private class ConnectThread extends Thread { 
     private BluetoothSocket mmSocket; 

     public ConnectThread(BluetoothDevice device, UUID uuid) { 
      Log.d(TAG, "ConnectThread: started."); 
      mmDevice = device; 
      deviceUUID = uuid; 
     } 

     public void run(){ 
      BluetoothSocket tmp = null; 
      Log.i(TAG, "RUN mConnectThread "); 

      // Get a BluetoothSocket for a connection with the 
      // given BluetoothDevice 
      try { 
       Log.d(TAG, "ConnectThread: Trying to create InsecureRfcommSocket using UUID: " 
         +MY_UUID_INSECURE); 
       tmp = mmDevice.createRfcommSocketToServiceRecord(deviceUUID); 
      } catch (IOException e) { 
       Log.e(TAG, "ConnectThread: Could not create InsecureRfcommSocket " + e.getMessage()); 
      } 

      mmSocket = tmp; 

      mBluetoothAdapter.cancelDiscovery(); 


      try { 
       mmSocket.connect(); 

       Log.d(TAG, "run: ConnectThread connected."); 
      } catch (IOException e) { 
       try { 
        mmSocket.close(); 
        Log.d(TAG, "run: Closed Socket."); 
       } catch (IOException e1) { 
        Log.e(TAG, "mConnectThread: run: Unable to close connection in socket " + e1.getMessage()); 
       } 
       Log.d(TAG, "run: ConnectThread: Could not connect to UUID: " + MY_UUID_INSECURE); 
      } 

      connected(mmSocket,mmDevice); 
     } 
     public void cancel() { 
      try { 
       Log.d(TAG, "cancel: Closing Client Socket."); 
       mmSocket.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "cancel: close() of mmSocket in Connectthread failed. " + e.getMessage()); 
      } 
     } 
    } 

    public synchronized void start() { 
     Log.d(TAG, "start"); 

     if (mConnectThread != null) { 
      mConnectThread.cancel(); 
      mConnectThread = null; 
     } 
     if (mInsecureAcceptThread == null) { 
      mInsecureAcceptThread = new AcceptThread(); 
      mInsecureAcceptThread.start(); 
     } 
    } 


    public void startClient(BluetoothDevice device,UUID uuid){ 
     Log.d(TAG, "startClient: Started."); 

     mProgressDialog = ProgressDialog.show(mContext,"Connecting Bluetooth" 
       ,"Please Wait...",true); 

     mConnectThread = new ConnectThread(device, uuid); 
     mConnectThread.start(); 
    } 

    private class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket) { 
      Log.d(TAG, "ConnectedThread: Starting."); 

      mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      try{ 
       mProgressDialog.dismiss(); 
      }catch (NullPointerException e){ 
       e.printStackTrace(); 
      } 


      try { 
       tmpIn = mmSocket.getInputStream(); 
       tmpOut = mmSocket.getOutputStream(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

     public void run(){ 
      byte[] buffer = new byte[1024]; 

      int bytes; 

      while (true) { 
       try { 
        bytes = mmInStream.read(buffer); 

        String incomingMessage = new String(buffer, 0, bytes); 

        Intent IncomingMessageIntent = new Intent("incomingMessage"); 
        IncomingMessageIntent.putExtra("theMessage",incomingMessage); 
        LocalBroadcastManager.getInstance(mContext).sendBroadcast(IncomingMessageIntent); 
       } catch (IOException e) { 
        Log.e(TAG, "write: Error reading Input Stream. " + e.getMessage()); 
        break; 
       } 
      } 
     } 


     public void write(byte[] bytes) { 
      String text = new String(bytes, Charset.defaultCharset()); 
      Log.d(TAG, "write: Writing to outputstream: " + text); 
      try { 
       mmOutStream.write(bytes); 
      } catch (IOException e) { 
       Log.e(TAG, "write: Error writing to output stream. " + e.getMessage()); 
      } 
     } 

     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 

    private void connected(BluetoothSocket mmSocket, BluetoothDevice mmDevice) { 
     Log.d(TAG, "connected: Starting."); 

     // Start the thread to manage the connection and perform transmissions 
     mConnectedThread = new ConnectedThread(mmSocket); 
     mConnectedThread.start(); 
    } 

    /** 
    * Write to the ConnectedThread in an unsynchronized manner 
    * 
    * @param out The bytes to write 
    * @see ConnectedThread#write(byte[]) 
    */ 
    public void write(byte[] out) { 
     // Create temporary object 
     ConnectedThread r; 

     // Synchronize a copy of the ConnectedThread 
     Log.d(TAG, "write: Write Called."); 
     //perform the write 
     mConnectedThread.write(out); 
    } 

} 
+1

質問にlogcatログを追加してください –

答えて

0

あなたのコードはBluetoothChatに基づいているように見えますサンプルを送信しようとすると、コードが正しくまたは完全に間違っている可能性があります。

ラップトップにテキストを送信しようとすると、rfcomm接続にWindowsアプリケーション(UWP、.NET、Win32、MFC、何でも使用したい)を作成する必要があります。

ファイルを送信しようとすると、2つのオプションがあります。

  • OBEX経由でラップトップに送信すると、Windowsプログラムを作成する必要はありません。
  • RFCOMM経由でファイルを送信する場合は、Windowsプログラムを作成し、モバイルソフトウェアとPCソフトウェアの両方でファイルを送受信するための独自の実装を行う必要があります。

カスタムデータを送信しようとすると、Windowsアプリケーションを作成する必要があります(UWP、使用したいものは何でも、.NET、Win32の、MFC、)RFCOMM接続用。

関連する問題