블루투스 통신, 연결, 스캔, 열기, 방송, 귀속

5974 단어 android
1. 먼저 이 장치의 블루투스 어댑터(블루투스 실례, 주요 조작 대상)를 획득:
            BluetoothAdapter adapter =BluetoothAdapter.getDefaultAdapter();

2. 이 장치가 Bluetooth를 지원하는지 여부, 지원되는 경우 켜져 있는지 여부, 켜져 있지 않은 경우 켜져 있는지 여부를 판단합니다.
    if(adapter!=null){
        if(!adapter.isEnabled()){
             adapter.enable();//           

         }
    }

3. Bluetooth 장치에서 검색 및 검색 기능을 활성화합니다.
    adapter.startDiscovery();//      
    Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    enabler.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//300     
    startActivityForResult(enabler,0);//       

4. Bluetooth 스캔 기능이 켜진 후 장치를 발견하면 브로드캐스트 이벤트(BluetoothDevice.ACTION FOUND)가 트리거됩니다.
    BroadcastReceiver receiver=new BroadcastReceiver(){
        public void onReceive(Context context,Intent intent){
            if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())){
                //          

                  Log.e("Tag", "find device:" + device.getName()
                        + device.getAddress());//              
                BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXIRA_DEVICE);//            

                if(device.getBondState()!=BluetoothDevice.BOND_BONDED){
                    //                ,             

                }else if(device.getBondState()==BluetoothDevice.BOND_BONDED){
                    //                 ,                    

                }   
            }

        }
    }

5. 블루투스 간에 통신이 필요하면 플러그인을 발송한다. 구글은 BluetoothSocket 종류를 제공한다. 블루투스 통신은 서버 측과 클라이언트가 있어야 한다. 블루투스 소켓이 연결될 때 짝짓기를 하지 않고 직접 연결할 수 있다.
*동일한 UUID를 통해 연결:
서버측:
BluetoothServerSocket socket = adapter.listenUsingInsecureRfcommWithServiceRecode("XXXXX",UUID);//            ,    uuid,    BluetoothServerSocket  

BluetoothSocket serverSocket= socket.accept();//      ,          ,          ,                         ,        serverSocket

클라이언트:
//       ,             device  device  
BluetoothSocket clientSocket= device.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));//          UUID          
clientSocket.connect();//    ,           ,          ,               

메시지 수신:
//      ,                   ,                 

//      :

if(serverSocket.isConnected()){//  socket    
    OutputStream op=serverSocket.getOutPutStream();//          
    op.write("hello world".getBytes());//        
}

//       :

//        clientSocket
if(clientSocket.isConnected()){
    InputStream in=clientSocket.getInputStream();//     
    //         
    int len=0;
    byte[] data=new byte[1024];
    while((len=in.read(data))!=-1){
        byte[] b=new byte[len];
        for (int i=0;i

같은 이치로 클라이언트가 내용을 보내면 서버의 수신 내용도 마찬가지다. 만약에 실시간 수신이나 발송이 필요하다면 서브라인에서 순환을 열어 입력 흐름을 끊임없이 얻고 데이터를 끊임없이 읽어야 한다.
6. 블루투스 조립을 진행한다. 스캔이 끝난 장치의 방송에서 새 장치를 발견하고 조립하지 않으면 새 장치의 대상 device를 가져오고 device를 호출한다.createBond();메서드가 쌍을 완성합니다.
/**
 * Start the bonding (pairing) process with the remote device.
 * 

This is an asynchronous call, it will return immediately. Register * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when * the bonding process completes, and its result. *

Android system services will handle the necessary user interactions * to confirm and complete the bonding process. *

Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @return false on immediate error, true if bonding will begin */ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) public boolean createBond() { if (sService == null) { Log.e(TAG, "BT not enabled. Cannot create bond to Remote Device"); return false; } try { return sService.createBond(this, TRANSPORT_AUTO); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; }


원본에서 이 방법은 비동기적이며 오류가 발생하면false로 되돌아오고 그렇지 않으면true로 되돌아오며 귀속 프로세스가 완료되면 ACTIONBOND_STATE_CHANGED라는 방송은 귀속 상태를 감청해야 하기 때문에 이 방송을 등록해야 한다.
BroadcastReceiver BondReceiver=new BroadcastReceiver(){
    public void onReceive(Context context,Intent intent){
        String action =intent.getAction ();
        BluetoothDevice device;
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

        }
        if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){
            //      
                switch(device.getBondState()){
                    case BluetoothDevice.BOND_BONDING://    
                    break;
                    case BluetoothDevice.BOND_BONDED://    
                    break;
                    case BluetoothDevice.BOND_NONE://    
                    break;
            }
        }
    }

}

7. 이미 짝짓기를 했다면 시스템에 이 장치의 맥 주소가 있으면 바로 연결할 수 있다.
BluetoothDevice device=adapter.getRemoteDevice(address);
device.connect();

8. 블루투스 켜기, 끄기, 감청 방송을 켜고 있으면 Bluetooth Device를 터치합니다.ACTION_STATE_CHANGED
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
        BluetoothAdapter.ERROR);
switch (state) {
    case BluetoothAdapter.STATE_OFF:
        Log.d("aaa", "STATE_OFF       ");
        break;
    case BluetoothAdapter.STATE_TURNING_OFF:
        Log.d("aaa", "STATE_TURNING_OFF         ");
        break;
    case BluetoothAdapter.STATE_ON:
        Log.d("aaa", "STATE_ON       ");
        break;
    case BluetoothAdapter.STATE_TURNING_ON:
        Log.d("aaa", "STATE_TURNING_ON         ");
        break;
}

Bluetooth 작업 종료

좋은 웹페이지 즐겨찾기