Android 블 루 투 스 클 라 이언 트 와 서버 측 통신 예시 구현

1.먼저 설명:블 루 투 스 통신 은 반드시 핸드폰 으로 테스트 해 야 합 니 다.avd 에 관련 하드웨어 가 없 기 때문에 잘못 보고 할 수 있 습 니 다!
자,마지막 효과 도 를 보 세 요.
这里写图片描述   这里写图片描述
2.개술:
1.블 루 투 스 지원 여부 판단

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter == null) {
  //the device doesn't support bluetooth
} else {
  //the device support bluetooth
}
2.지원 하면 블 루 투 스 켜 기

if(!bluetoothAdapter.isEnable()) {
  Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  startActivityForResult(enableIntent,REQUEST_ENABLE_BT);
}
3.블 루 투 스 오픈 상태 감시

BroadcastReceiver bluetoothState = new BroadcastReceiver() {
  public void onReceive(Context context, Intent intent) {
  String stateExtra = BluetoothAdapter.EXTRA_STATE;
    int state = intent.getIntExtra(stateExtra, -1);
    switch(state) {
  case BluetoothAdapter.STATE_TURNING_ON:
    break;
  case BluetoothAdapter.STATE_ON:
    break;
  case BluetoothAdapter.STATE_TURNING_OFF:
    break;
  case BluetoothAdapter.STATE_OFF:
    break;
  }
  }
}

 
registerReceiver(bluetoothState,new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
4.로 컬 장 치 를 설정 하면 다른 장치 에서 검색 할 수 있 습 니 다.

Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(discoveryIntent,REQUEST_DISCOVERY);

BroadcastReceiver discovery = new BroadcastReceiver() {
  @Override
  public void onRecevie(Content context, Intent intent) {
    String scanMode = BluetoothAdapter.EXTRA_SCAN_MODE;
    String preScanMode = BluetoothAdapter.EXTRA_PREVIOUS_SCAN_MODE;
    int mode = intent.getIntExtra(scanMode);
  }
}

registerReceiver(discovery,new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
5.검색 장치
bluetoothAdapter.startDiscovery()검색 시작 하기;
bluetoothAdapter.cancelDiscovery()검색 을 중지 합 니 다.
장 치 를 발견 하면 시스템 에서 ACTION 을 보 냅 니 다.FOUND 방송 소식,이 소식 을 받 은 BroadcastReceiver 를 실현 할 수 있 습 니 다.

BroadcastReceiver deviceFound = new BroadcastReceiver() {
  @Override
  public void onReceiver(Content content, Intent intent) {
    String remoteDeviceName = intent.getStringExtra(BluetoothAdapter.EXTRA_NAME);
    BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothAdapter.EXTRA_DEVICE);
  }
}
registerReceiver(deviceFound, new IntentFilter(BluetoothAdapter.ACTION_FOUND);

6.연결 장치
두 개의 블 루 투 스 장 치 를 연결 하려 면 각각 서버 엔 드(BluetoothServerSocket)와 클 라 이언 트(BluetoothSocket)를 실현 해 야 합 니 다.이 점 은 J2SE 와 같 습 니 다.
ServerSocket 과 Socket 은 매우 유사 하 다.
BluetoothServerSocket 은 서버 에서 호출 방법 accept()를 감청 합 니 다.클 라 이언 트 요청 이 있 을 때 accept()방법 은 BluetoothSocket 으로 되 돌아 갑 니 다.클 라 이언 트 가 받 으 면 양쪽 에서 통신 할 수 있 습 니 다.InputStream 과 OutputStream 을 통 해 데이터 전송 을 실현 합 니 다.
accept 방법 은 차단 되 어 있 기 때문에 UI 스 레 드 에 넣 을 수 없습니다.BluetoothServerSocket 과 BluetoothSocket 을 사용 할 때 각각 새 스 레 드 에 넣 습 니 다.
3.어떻게 실현 합 니까?
다음은 개발 중의 몇 가지 관건 적 인 절차 이다.
1)블 루 투 스 먼저 오픈
2)사용 가능 한 장치 검색
3)블 루 투 스 소켓 을 만 들 고 입 출력 흐름 가 져 오기
4)데이터 읽 기와 쓰기
5)연결 을 끊 고 블 루 투 스 닫 기
1.페이지 전환 이 있 기 때문에 여 기 는 TabHost 를 사 용 했 지만 원래 의 효과 가 좋 지 않 고 애니메이션 이 없어 서 복사 할 수 밖 에 없 었 습 니 다.

/**
 *        TabHost
 * 
 * @Project App_Bluetooth
 * @Package com.android.bluetooth
 * @author chenlin
 * @version 1.0
 * @Date 2013 6 2 
 * @Note TODO
 */
public class AnimationTabHost extends TabHost {

  private int mCurrentTabID = 0;//   tabId
  private final long mDuration = 400;//    

  public AnimationTabHost(Context context) {
    this(context, null);
  }

  public AnimationTabHost(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  /**
   *     
   */
  @Override
  public void setCurrentTab(int index) {
    //     
    if (index > mCurrentTabID) {
      TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
          -1.0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
      translateAnimation.setDuration(mDuration);
      getCurrentView().startAnimation(translateAnimation);
      //    
    } else if (index < mCurrentTabID) {
      TranslateAnimation translateAnimation = new TranslateAnimation(
          Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f, Animation.RELATIVE_TO_SELF, 0f,
          Animation.RELATIVE_TO_SELF, 0f);
      translateAnimation.setDuration(mDuration);
      getCurrentView().startAnimation(translateAnimation);
    } 

    super.setCurrentTab(index);

    //-----    ------------------------------
    if (index > mCurrentTabID) {
      TranslateAnimation translateAnimation = new TranslateAnimation( //
          Animation.RELATIVE_TO_PARENT, 1.0f,// RELATIVE_TO_SELF
          Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 0f);
      translateAnimation.setDuration(mDuration);
      getCurrentView().startAnimation(translateAnimation);
    } else if (index < mCurrentTabID) {
      TranslateAnimation translateAnimation = new TranslateAnimation(
          Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 0f,
          Animation.RELATIVE_TO_PARENT, 0f);
      translateAnimation.setDuration(mDuration);
      getCurrentView().startAnimation(translateAnimation);
    }
    mCurrentTabID = index;
  }
}

2.홈 페이지 를 만 들 고 복사 한 TabHost 를 사용 하여 미 끄 러 지 는 방법,상태 에 따라 세 가지 상태 가 있 습 니 다.

/**
 *   
 * 
 * @Project App_Bluetooth
 * @Package com.android.bluetooth
 * @author chenlin
 * @version 1.0
 * @Date 2013 6 2 
 */
@SuppressWarnings("deprecation")
public class BluetoothActivity extends TabActivity {
  static AnimationTabHost mTabHost;//  tabhost
  static String BlueToothAddress;//    
  static Type mType = Type.NONE;//  
  static boolean isOpen = false;

  //  :
  enum Type {
    NONE, SERVICE, CILENT
  };

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

    initTab();
  }

  private void initTab() {
    //   
    mTabHost = (AnimationTabHost) getTabHost();
    //  tab
    mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator("    ", getResources().getDrawable(android.R.drawable.ic_menu_add))
        .setContent(new Intent(this, DeviceActivity.class)));
    mTabHost.addTab(mTabHost.newTabSpec("Tab2").setIndicator("    ", getResources().getDrawable(android.R.drawable.ic_menu_add))
        .setContent(new Intent(this, ChatActivity.class)));
    //    
    mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
      public void onTabChanged(String tabId) {
        if (tabId.equals("Tab1")) {
          //TODO
        }
      }
    });
    //      tabhost  
    mTabHost.setCurrentTab(0);
  }

  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Toast.makeText(this, "address:", Toast.LENGTH_SHORT).show();
  }

}

3.홈 페이지 가 생기 면 각각 두 개의 목록 페이지 를 실현 합 니 다.하 나 는 장치 페이지 DeviceActivity.Java 를 찾 는 것 이 고 다른 하 나 는 세 션 페이지 ChatActivity.java 입 니 다.
1)장치 페이지 DeviceActivity.java

/**
 *        
 * @Project  App_Bluetooth
 * @Package  com.android.bluetooth
 * @author   chenlin
 * @version  1.0
 * @Date    2013 6 2 
 * @Note    TODO
 */
public class DeviceActivity extends Activity {
  private ListView mListView;
  //  
  private ArrayList<DeviceBean> mDatas;
  private Button mBtnSearch, mBtnService;
  private ChatListAdapter mAdapter;
  //     
  private BluetoothAdapter mBtAdapter;


  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.devices);
    initDatas();
    initViews();
    registerBroadcast();
    init();
  }

  private void initDatas() {
    mDatas = new ArrayList<DeviceBean>();
    mAdapter = new ChatListAdapter(this, mDatas);
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
  }

  /**
   *          
   */
  private void init() {
    Log.i("tag", "mBtAdapter=="+ mBtAdapter);
    //              
    Set<BluetoothDevice> deviceSet = mBtAdapter.getBondedDevices();
    if (deviceSet.size() > 0) {
      for (BluetoothDevice device : deviceSet) {
        mDatas.add(new DeviceBean(device.getName() + "
" + device.getAddress(), true)); mAdapter.notifyDataSetChanged(); mListView.setSelection(mDatas.size() - 1); } } else { mDatas.add(new DeviceBean(" ", true)); mAdapter.notifyDataSetChanged(); mListView.setSelection(mDatas.size() - 1); } } /** * */ private void registerBroadcast() { // IntentFilter discoveryFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND); this.registerReceiver(mReceiver, discoveryFilter); // IntentFilter foundFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); this.registerReceiver(mReceiver, foundFilter); } /** * */ private void initViews() { mListView = (ListView) findViewById(R.id.list); mListView.setAdapter(mAdapter); mListView.setFastScrollEnabled(true); mListView.setOnItemClickListener(mDeviceClickListener); mBtnSearch = (Button) findViewById(R.id.start_seach); mBtnSearch.setOnClickListener(mSearchListener); mBtnService = (Button) findViewById(R.id.start_service); mBtnService.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { BluetoothActivity.mType = Type.SERVICE; BluetoothActivity.mTabHost.setCurrentTab(1); } }); } /** * */ private OnClickListener mSearchListener = new OnClickListener() { @Override public void onClick(View arg0) { if (mBtAdapter.isDiscovering()) { mBtAdapter.cancelDiscovery(); mBtnSearch.setText(" "); } else { mDatas.clear(); mAdapter.notifyDataSetChanged(); init(); /* */ mBtAdapter.startDiscovery(); mBtnSearch.setText("ֹͣ "); } } }; /** * */ private OnItemClickListener mDeviceClickListener = new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { DeviceBean bean = mDatas.get(position); String info = bean.message; String address = info.substring(info.length() - 17); BluetoothActivity.BlueToothAddress = address; AlertDialog.Builder stopDialog = new AlertDialog.Builder(DeviceActivity.this); stopDialog.setTitle(" ");// stopDialog.setMessage(bean.message); stopDialog.setPositiveButton(" ", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mBtAdapter.cancelDiscovery(); mBtnSearch.setText(" "); BluetoothActivity.mType = Type.CILENT; BluetoothActivity.mTabHost.setCurrentTab(1); dialog.cancel(); } }); stopDialog.setNegativeButton(" ", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { BluetoothActivity.BlueToothAddress = null; dialog.cancel(); } }); stopDialog.show(); } }; /** * */ 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); // if (device.getBondState() != BluetoothDevice.BOND_BONDED) { mDatas.add(new DeviceBean(device.getName() + "
" + device.getAddress(), false)); mAdapter.notifyDataSetChanged(); mListView.setSelection(mDatas.size() - 1); } // } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); if (mListView.getCount() == 0) { mDatas.add(new DeviceBean("û ", false)); mAdapter.notifyDataSetChanged(); mListView.setSelection(mDatas.size() - 1); } mBtnSearch.setText(" "); } } }; @Override public void onStart() { super.onStart(); if (!mBtAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, 3); } } @Override protected void onDestroy() { super.onDestroy(); if (mBtAdapter != null) { mBtAdapter.cancelDiscovery(); } this.unregisterReceiver(mReceiver); } }
2)세 션 페이지 ChatActivity.java

/**
 *     
 * 
 * @Project App_Bluetooth
 * @Package com.android.bluetooth
 * @author chenlin
 * @version 1.0
 * @Date 2013 3 2 
 * @Note TODO
 */
public class ChatActivity extends Activity implements OnItemClickListener, OnClickListener {
  private static final int STATUS_CONNECT = 0x11;

  private ListView mListView;
  private ArrayList<DeviceBean> mDatas;
  private Button mBtnSend;//     
  private Button mBtnDisconn;//     
  private EditText mEtMsg;
  private DeviceListAdapter mAdapter;

  /*     ,         */
  public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";
  public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";
  public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";
  public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";

  //      socket
  private BluetoothServerSocket mServerSocket;
  //      socket
  private BluetoothSocket mSocket;
  //   
  private BluetoothDevice mDevice;
  private BluetoothAdapter mBluetoothAdapter;

  // --   -----------------
  private ServerThread mServerThread;
  private ClientThread mClientThread;
  private ReadThread mReadThread;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat);
    initDatas();
    initViews();
    initEvents();
  }

  private void initEvents() {
    mListView.setOnItemClickListener(this);

    //     
    mBtnSend.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View arg0) {
        String text = mEtMsg.getText().toString();
        if (!TextUtils.isEmpty(text)) {
          //     
          sendMessageHandle(text);

          mEtMsg.setText("");
          mEtMsg.clearFocus();
          //      
          InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
          manager.hideSoftInputFromWindow(mEtMsg.getWindowToken(), 0);
        } else
          Toast.makeText(ChatActivity.this, "        !", Toast.LENGTH_SHORT).show();
      }
    });

    //     
    mBtnDisconn.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
        if (BluetoothActivity.mType == Type.CILENT) {
          shutdownClient();
        } else if (BluetoothActivity.mType == Type.SERVICE) {
          shutdownServer();
        }
        BluetoothActivity.isOpen = false;
        BluetoothActivity.mType = Type.NONE;
        Toast.makeText(ChatActivity.this, "     !", Toast.LENGTH_SHORT).show();
      }
    });
  }

  private void initViews() {
    mListView = (ListView) findViewById(R.id.list);
    mListView.setAdapter(mAdapter);
    mListView.setFastScrollEnabled(true);

    mEtMsg = (EditText) findViewById(R.id.MessageText);
    mEtMsg.clearFocus();

    mBtnSend = (Button) findViewById(R.id.btn_msg_send);
    mBtnDisconn = (Button) findViewById(R.id.btn_disconnect);
  }

  private void initDatas() {
    mDatas = new ArrayList<DeviceBean>();
    mAdapter = new DeviceListAdapter(this, mDatas);
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  }

  /**
   *     
   */
  private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      String info = (String) msg.obj;
      switch (msg.what) {
      case STATUS_CONNECT:
        Toast.makeText(ChatActivity.this, info, 0).show();
        break;
      }

      if (msg.what == 1) {
        mDatas.add(new DeviceBean(info, true));
        mAdapter.notifyDataSetChanged();
        mListView.setSelection(mDatas.size() - 1);
      }else {
        mDatas.add(new DeviceBean(info, false));
        mAdapter.notifyDataSetChanged();
        mListView.setSelection(mDatas.size() - 1);
      }
    }

  };

  @Override
  public void onResume() {
    super.onResume();
    if (BluetoothActivity.isOpen) {
      Toast.makeText(this, "      ,    。        ,    ", Toast.LENGTH_SHORT).show();
      return;
    }
    if (BluetoothActivity.mType == Type.CILENT) {
      String address = BluetoothActivity.BlueToothAddress;
      if (!"".equals(address)) {
        mDevice = mBluetoothAdapter.getRemoteDevice(address);
        mClientThread = new ClientThread();
        mClientThread.start();
        BluetoothActivity.isOpen = true;
      } else {
        Toast.makeText(this, "address is null !", Toast.LENGTH_SHORT).show();
      }
    } else if (BluetoothActivity.mType == Type.SERVICE) {
      mServerThread = new ServerThread();
      mServerThread.start();
      BluetoothActivity.isOpen = true;
    }
  }

  //      
  private class ClientThread extends Thread {
    public void run() {
      try {
        mSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
        Message msg = new Message();
        msg.obj = "   ,       :" + BluetoothActivity.BlueToothAddress;
        msg.what = STATUS_CONNECT;
        mHandler.sendMessage(msg);

        mSocket.connect();

        msg = new Message();
        msg.obj = "        !      。";
        msg.what = STATUS_CONNECT;
        mHandler.sendMessage(msg);
        //       
        mReadThread = new ReadThread();
        mReadThread.start();
      } catch (IOException e) {
        Message msg = new Message();
        msg.obj = "       !         。";
        msg.what = STATUS_CONNECT;
        mHandler.sendMessage(msg);
      }
    }
  };

  //      
  private class ServerThread extends Thread {
    public void run() {
      try {
        //               :     、UUID
        mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
            UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

        Message msg = new Message();
        msg.obj = "   ,          ...";
        msg.what = STATUS_CONNECT;
        mHandler.sendMessage(msg);

        /*            */
        mSocket = mServerSocket.accept();

        msg = new Message();
        msg.obj = "        !      。";
        msg.what = STATUS_CONNECT;
        mHandler.sendMessage(msg);
        //       
        mReadThread = new ReadThread();
        mReadThread.start();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  };

  /*       */
  private void shutdownServer() {
    new Thread() {
      public void run() {
        if (mServerThread != null) {
          mServerThread.interrupt();
          mServerThread = null;
        }
        if (mReadThread != null) {
          mReadThread.interrupt();
          mReadThread = null;
        }
        try {
          if (mSocket != null) {
            mSocket.close();
            mSocket = null;
          }
          if (mServerSocket != null) {
            mServerSocket.close();
            mServerSocket = null;
          }
        } catch (IOException e) {
          Log.e("server", "mserverSocket.close()", e);
        }
      };
    }.start();
  }

  /* ͣ        */
  private void shutdownClient() {
    new Thread() {
      public void run() {
        if (mClientThread != null) {
          mClientThread.interrupt();
          mClientThread = null;
        }
        if (mReadThread != null) {
          mReadThread.interrupt();
          mReadThread = null;
        }
        if (mSocket != null) {
          try {
            mSocket.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
          mSocket = null;
        }
      };
    }.start();
  }

  //     
  private void sendMessageHandle(String msg) {
    if (mSocket == null) {
      Toast.makeText(this, "    ", Toast.LENGTH_SHORT).show();
      return;
    }
    try {
      OutputStream os = mSocket.getOutputStream();
      os.write(msg.getBytes());

      mDatas.add(new DeviceBean(msg, false));
      mAdapter.notifyDataSetChanged();
      mListView.setSelection(mDatas.size() - 1);

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

  }

  //     
  private class ReadThread extends Thread {
    public void run() {
      byte[] buffer = new byte[1024];
      int bytes;
      InputStream is = null;
      try {
        is = mSocket.getInputStream();
        while (true) {
          if ((bytes = is.read(buffer)) > 0) {
            byte[] buf_data = new byte[bytes];
            for (int i = 0; i < bytes; i++) {
              buf_data[i] = buffer[i];
            }
            String s = new String(buf_data);
            Message msg = new Message();
            msg.obj = s;
            msg.what = 1;
            mHandler.sendMessage(msg);
          }
        }
      } catch (IOException e1) {
        e1.printStackTrace();
      } finally {
        try {
          is.close();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }

    }
  }

  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  }

  @Override
  public void onClick(View view) {
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (BluetoothActivity.mType == Type.CILENT) {
      shutdownClient();
    } else if (BluetoothActivity.mType == Type.SERVICE) {
      shutdownServer();
    }
    BluetoothActivity.isOpen = false;
    BluetoothActivity.mType = Type.NONE;
  }

}

3.관련 코드 다운로드
demo 다운로드:http://xiazai.jb51.net/201701/yuanma/App_BlueTooth_jb51.rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기