Android 블 루 투 스 채 팅 기능 구현

블 루 투 스,현재 가장 유행 하 는 스마트 기기 가 데 이 터 를 전송 하 는 방식 중 하나 로 핸드폰 app 과 스마트 장 비 를 연결 하여 기기 의 측정 데 이 터 를 얻 을 수 있다.우리 생활 에서 흔히 볼 수 있 는 것 은 블 루 투 스 스마트 팔찌,블 루 투 스 전자 저울,블 루 투 스 심전도 측정 장비 등 이다.
이 편 은 전편 의 결말 에 이 어 휴대 전화 간 에 어떻게 블 루 투 스 를 통 해 문자 채 팅 을 할 수 있 는 지 살 펴 보 겠 습 니 다.
먼저 위의 demo 를 붙 입 니 다.

그림 의 두 목록 중 하 나 를 클릭 하면 다음 코드 를 실행 합 니 다.

mBtAdapter.cancelDiscovery();
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
Intent intent = new Intent();
intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
setResult(Activity.RESULT_OK, intent);
finish();
이 블 루 투 스 메 신 저 는 마지막 으로 이 루어 진 효 과 는 다음 과 같 습 니 다.

채 팅 메 인 화면 으로 돌아 갑 니 다:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
 LogUtils.getInstance().e(getClass(), "onActivityResult " + resultCode);
 switch (requestCode) {
 case REQUEST_CONNECT_DEVICE:
 //  DeviceListActivity          
 if (resultCode == Activity.RESULT_OK) {
 //      MAC  
 String address = data.getExtras().getString(
 DeviceListActivity.EXTRA_DEVICE_ADDRESS);
 //       
 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
 //       
 mChatService.connect(device);
 }
 break;
 case REQUEST_ENABLE_BT:
 //         
 if (resultCode == Activity.RESULT_OK) {
 //     
 setupChat();
 } else {
 LogUtils.getInstance().e(getClass(), "     ");
 Toast.makeText(this, R.string.bt_not_enabled_leaving,
 Toast.LENGTH_SHORT).show();
 finish();
 }
 }
}
여기 서 저 는 BluetoothChatService 류 의 연결 절 차 를 중점적으로 소개 하 겠 습 니 다.
블 루 투 스 채 팅 은 두 핸드폰 간 에 통신 을 하 는 것 이기 때문에 그들 은 서로 호스트 와 종 기 를 위해 주요 한 사고 와 절 차 는 다음 과 같다.
1.블 루 투 스 를 연결 하기 위해 소켓 을 가 져 오기;
2.블 루 투 스 가 들 어 오 는 연결 을 감청 하기 위해 스 레 드 를 열 고 연결 이 받 아들 여지 면 세 번 째 스 레 드 를 열 어 들 어 오 는 모든 데 이 터 를 처리 합 니 다.

public synchronized void connect(BluetoothDevice device) {
 if (mState == STATE_CONNECTING) {
 if (mConnectThread != null) {
 mConnectThread.cancel();
 mConnectThread = null;
 }
 }
 if (mConnectedThread != null) {
 mConnectedThread.cancel();
 mConnectedThread = null;
 }
 mConnectThread = new ConnectThread(device);
 mConnectThread.start();
 setState(STATE_CONNECTING);
}
스 레 드 를 열 어 연결 하 다.

/**
 * @description:      
 * @author:zzq
 * @time: 2016-8-6   1:18:41
 */
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
 public ConnectThread(BluetoothDevice device) {
 mmDevice = device;
 BluetoothSocket tmp = null;
 try {
 tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(), "socket    :" + e);
 }
 mmSocket = tmp;
 }
 public void run() {
 LogUtils.getInstance().e(getClass(), "  mConnectThread");
 setName("ConnectThread");
 // mAdapter.cancelDiscovery();
 try {
 mmSocket.connect();
 } catch (IOException e) {
 //     ,  ui
 connectionFailed();
 try {
 mmSocket.close();
 } catch (IOException e2) {
 LogUtils.getInstance().e(getClass(), "      " + e2);
 }
 //         
 startChat();
 return;
 }
 synchronized (BluetoothChatService.this) {
 mConnectThread = null;
 }
 connected(mmSocket, mmDevice);
 }
 public void cancel() {
 try {
 mmSocket.close();
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(), "      " + e);
 }
 }
}

/**
 *        
 */
private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;
 public AcceptThread() {
 BluetoothServerSocket tmp = null;
 try {
 tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(), "--  socket  :" + e);
 }
 mmServerSocket = tmp;
 }

 public void run() {
 setName("AcceptThread");
 BluetoothSocket socket = null;
 while (mState != STATE_CONNECTED) {
 LogUtils.getInstance().e(getClass(), "----accept-     -");
 try {
 socket = mmServerSocket.accept();
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(), "accept()   " + e);
 break;
 }
//        
 if (socket != null) {
 synchronized (BluetoothChatService.this) {
 switch (mState) {
 case STATE_LISTEN:
 case STATE_CONNECTING:
 //       
 connected(socket, socket.getRemoteDevice());
 break;
 case STATE_NONE:
 case STATE_CONNECTED:
 //           
 try {
 socket.close();
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(),"        " + e);
 }
 break;

 }
 }
 }
}
 LogUtils.getInstance().e(getClass(), "  mAcceptThread");
}

 public void cancel() {
 LogUtils.getInstance().e(getClass(), "   " + this);
 try {
 mmServerSocket.close();
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(), "    " + e);
 }
 }
}
/**
 *                      
 */
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
 public ConnectedThread(BluetoothSocket socket) {
 mmSocket = socket;
 InputStream tmpIn = null;
 OutputStream tmpOut = null;
 //   BluetoothSocket      
 try {
 tmpIn = socket.getInputStream();
 tmpOut = socket.getOutputStream();
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(),"temp sockets not created" + e);
 }
 mmInStream = tmpIn;
 mmOutStream = tmpOut;
 }
 public void run() {
 int bytes;
 String str1 = "";
 //       
 while (true) {
 try {
 byte[] buffer = new byte[256];
 bytes = mmInStream.read(buffer);
 String readStr = new String(buffer, 0, bytes);//             
 String str = bytes2HexString(buffer).replaceAll("00", "").trim();
 if (bytes > 0) {//             
  mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_READ, bytes, -1,buffer).sendToTarget();
 } else {
  LogUtils.getInstance().e(getClass(),"disconnected");
 connectionLost();
 if (mState != STATE_NONE) {
 LogUtils.getInstance().e(getClass(), "disconnected");
startChat();
 }
 break;
 }
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(), "disconnected" + e);
 connectionLost();
 if (mState != STATE_NONE) {
 //               
 startChat();
 }
 break;
 }
 }
}
/**
 *   OutStream  
 * 
 * @param buffer
 *      
 */
public void write(byte[] buffer) {
 try {
 mmOutStream.write(buffer);
 //      UI
 mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_WRITE, -1,-1, buffer).sendToTarget();

 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(),
"Exception during write:" + e);
 }

 }
public void cancel() {
 try {
 mmSocket.close();
 } catch (IOException e) {
 LogUtils.getInstance().e(getClass(),"close() of connect socket failed:" + e);
 }
 }
 }

대략적인 절 차 는 위의 세 개의 라인 에서 보 여 준 것 이다.물론 구체 적 인 상황 은 프로젝트 에 따라,예 를 들 어 블 루 투 스 프로 토 콜 이 프로 토 콜 정의 에 따라 해석 하 는 방식 이다.
코드 에 연 결 된 블 루 투 스 연결 상태의 변화 에 사용 되 는 handle 은 상 태 를 activity 에 직접 보 내 activity 업 데 이 트 를 알 립 니 다.

 /**
 *     ,  Activity
 */
private void connectionFailed() {
 setState(STATE_LISTEN);
 Message msg = mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_TOAST);
 Bundle bundle = new Bundle();
 bundle.putString(BluetoothChatActivity.TOAST, "      ");
 msg.setData(bundle);
 mHandler.sendMessage(msg);
}
/**
 *       ,  Activity
 */
private void connectionLost() {
 Message msg = mHandler.obtainMessage(BluetoothChatActivity.MESSAGE_TOAST);
 Bundle bundle = new Bundle();
 bundle.putString(BluetoothChatActivity.TOAST, "      ");
 msg.setData(bundle);
 mHandler.sendMessage(msg);
}
보 내기 단 추 를 누 르 면 텍스트 입력 상자 의 텍스트 를 보 내 는 방법:

private void sendMessage(String message) {
 if (mChatService.getState() != BluetoothChatService.STATE_CONNECTED) {
 Toast.makeText(this, R.string.not_connected,Toast.LENGTH_SHORT).show();
 return;
}
 if (message.length() > 0) {
 byte[] send = message.getBytes();
 mChatService.write(send);
 }
}
//  BluetoothChatService   write      
public void write(byte[] out) {
 ConnectedThread r;
 synchronized (this) {
 if (mState != STATE_CONNECTED)
 return;
 r = mConnectedThread;
 }
 r.write(out);
}
이렇게 블 루 투 스 채 팅 의 절 차 는 바로 이 렇 습 니 다.채 팅 을 종료 할 때 모든 스 레 드 를 중단 합 니 다.

public synchronized void stop() {
 LogUtils.getInstance().e(getClass(), "---stop()");
 setState(STATE_NONE);
 if (mConnectThread != null) {
 mConnectThread.cancel();
 mConnectThread = null;
}
 if (mConnectedThread != null) {
 mConnectedThread.cancel();
 mConnectedThread = null;
}
 if (mAcceptThread != null) {
 mAcceptThread.cancel();
 mAcceptThread = null;
 }
}
이 글 을 보고 안 드 로 이 드 블 루 투 스에 서 연결 하 는 것 은 문제 가 크 지 않 을 것 이 라 고 믿 습 니 다(spp 프로 토 콜).
원본 주소:소스 코드 확인 시 켜 주세요.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기