Android 레거시 블루투스 통신

6473 단어
통신은 두 장치에 세워진 것으로 그 중 하나는 서비스 측이고 하나는 클라이언트이다.
서비스 측의 주요 임무는 연결을 기다리고 클라이언트가 주동적으로 연결을 시작하는 것이다
다음은 서비스 측의 과정을 말씀드리겠습니다.
블루투스 통신의 uid는 고정되어 있습니다
private static final UUID MY_UUID =
        UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        register();//        
        //       
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter != null) {//             
            if (!mBluetoothAdapter.enable()) {
                mBluetoothAdapter.enable();//    
            } else {
                mBluetoothAdapter.startDiscovery();//    
            }
        }
   private void register() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//       
        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);//         
        filter.addAction(BluetoothDevice.ACTION_FOUND);//       
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//           
        filter.addAction("android.bluetooth.device.action.PAIRING_REQUEST");//       
        registerReceiver(mBroadcastReceiver, filter);
    }

다음은 라디오 수신류의 조작을 보도록 하겠습니다.
 protected BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            //       
            BluetoothDevice bluetoothDevice = intent
                    .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
                int state = bluetoothDevice.getBondState();
                switch (state) {
                    case BluetoothDevice.BOND_BONDED:
                        Log.e("ida", "    ");
                        connect();//       
                        break;
                    case BluetoothDevice.BOND_BONDING:
                        Log.e("ida", "BOND_BONDING    ");
                        break;
                    case BluetoothDevice.BOND_NONE:
                        break;
                }
            }
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                LogUtils.d(bluetoothDevice.getName() + "---" + bluetoothDevice.getAddress());
                if (bluetoothDevice.getName() != null) {
                    if (bluetoothDevice.getName().equals("  ")) {
                        bluetoothDevice.createBond();
                    }
                }

            }
            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
                int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
                switch (blueState) {
                    case BluetoothAdapter.STATE_TURNING_ON:
                        break;
                    case BluetoothAdapter.STATE_ON:
                        mBluetoothAdapter.startDiscovery();
                        Log.e("dalai", "       ");
                        //startScanning();
                        break;
                    case BluetoothAdapter.STATE_TURNING_OFF:
                        break;
                    case BluetoothAdapter.STATE_OFF:
                        break;
                }
            }
            if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                LogUtils.d(action);
                mBluetoothAdapter.cancelDiscovery();
            }
            if (action.equals("android.bluetooth.device.action.PAIRING_REQUEST")) {//         , pin      ,           
                LogUtils.d("       ");

                //   bluetoothDevice.setPairingConfirmation(true);//    
                //  bluetoothDevice.setPin("0000".getBytes());


            }


        }


    };
    private void connect() {
        try {
            btServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("BluetoothChat", MY_UUID);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            bluetoothSocket = btServerSocket.accept();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (bluetoothSocket != null) {
            try {
                InputStream inputStream = bluetoothSocket.getInputStream();
                OutputStream outputStream = bluetoothSocket.getOutputStream();
                byte[] bytes = new byte[4];
                inputStream.read(bytes);
                String str = new String(bytes, "utf-8");
                inputStream.close();
                btServerSocket.close();
                Log.e("ida", "this is read---" + str);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

다음은 클라이언트의 코드를 보겠습니다.
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        Set bondedDevices = mBluetoothAdapter.getBondedDevices();
        for (BluetoothDevice device : bondedDevices) {
            if (device.getName().equals("BleServer")) {
                address = device.getAddress();
            }
        }
        if (address != null) {
            device = mBluetoothAdapter.getRemoteDevice(address);
            try {
                BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID);
                if (socket != null) {
                    socket.connect();
                    if (socket.isConnected()) {
                        Log.e("ida", "    ");
                        OutputStream osm = socket.getOutputStream();
                        osm.write("1234".getBytes());
                        osm.close();//    
                        socket.close();

                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

이렇게 하면 통신할 수 있다. 실제 응용에서 서비스 측은 일반적으로 서비스에서 완성해야 하고 입력 출력 흐름과 socket 연결을 제때에 닫아야 한다.
양호한 코드 규범도 매우 중요하다

좋은 웹페이지 즐겨찾기