글
오늘은 Bluetooth 서버 클라이언트 연동에 대해서 알아본다.
bluetooth 서버 클라이언트 연동은 bluetooth chat service에 그 연동부분이 완벽하게 구현이 되어 있기 때문에
1. 어느 부분이 서버 역할을 하고, 어느 부분이 클라이언트 역할을 하는지
2. bluetooth 연동설정의 순서 등을 알아 보기로 한다.
자세한 내용은 아래를 참고하면 된다.
http://developer.android.com/guide/topics/connectivity/bluetooth.html
위의 URL 보다 블루투스에 대해서 자세하게 나온곳은 없는 것 같다. 가장 완벽하다. 그런데 영어다.
그래서 아래와 같이 설명하도록 한다.
먼저 여기서 알아 볼 내용은
클라이언트에서 메시지를 보내면, 서버에서 클라이언트에서 받은 메시지를 출력하는 것이다.
이렇게 하기 위해서
1. 연결가능한 블루투스를 찾는다. -> discovery 라고 한다.
2. 연결 가능한 블루투스를 paring 한다. -> 메시지를 보내려면 paring이 되어 있어야 한다.
3. 클라이언트에서 메시지를 전송한다.
4. 서버에서 메시지를 출력한다.
이다.
먼저 연결 가능한 블루투스를 찾는 방법을 알아 보자.
1. 블루투스아답터를 통하여 블루투스를 지원하는지 확인한다.
// Get local Bluetooth adapter
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// If the adapter is null, then Bluetooth is not supported
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
// finish();
return;
}
블루투스를 지원하지 않는다면 당연히 다음 조건을 실행할 이유가 없다.
2. 블루투스가 꺼져있다면, 실행시킨다. 실행은 유저가 직접 on버튼을 눌러야만 한다. 시스템적으로 불가능하다.
Intent 전송
if (!mBluetoothAdapter.isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
// Otherwise, setup the chat session
}
Intent 받음
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Logger.print("onActivityResult " + resultCode);
switch (requestCode) {
case REQUEST_ENABLE_BT:
// When the request to enable Bluetooth returns
if (resultCode == Activity.RESULT_OK) {
}
- 연결 가능한 블루투스 찾기 : discovery
1. 브로트 캐스트 등록
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
registerReceiver(mBTDiscoveryReceiver, filter);
2. 리시버 받아서 리스트에 등록
//Broadcast Receiver
private final BroadcastReceiver mBTDiscoveryReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
if (state == BluetoothAdapter.STATE_ON) {
Logger.print("Enabled : Enabled");
}
}
else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
Logger.print("action : " + action);
showProgressDialog();
}
else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String deviceName = device.getName();
String deviceAddress = device.getAddress();
Logger.print("deviceName : " + deviceName);
Logger.print("deviceAddress : " + deviceAddress);
boolean isDuplicate = false;
for(DeviceData deviceData : mInfoList) {
if(deviceData.getAddress().equals(deviceAddress)) {
isDuplicate = true;
}
}
if(!isDuplicate) {
DeviceData data = new DeviceData();
data.setName(deviceName);
data.setAddress(deviceAddress);
data.setDevice(device);
mInfoList.add(data);
// mAdapter.notifyDataSetChanged();
}
}
else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) /* Action Discovery Finish */
{
Logger.print("action : " + action);
dismissProgressDialog();
mAdapter.notifyDataSetChanged();
}
}
};
3. request pairing
private void pairDevice(BluetoothDevice device) {
try {
Method method = device.getClass().getMethod("createBond", (Class[]) null);
method.invoke(device, (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
}
<=> unpair
private void unpairDevice(BluetoothDevice device) {
try {
Method method = device.getClass().getMethod("removeBond", (Class[]) null);
method.invoke(device, (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
}
- 페어링된 블루투스 찾기
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices != null && pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
String deviceName = device.getName();
String deviceAddress = device.getAddress();
Logger.print("deviceName : " + deviceName);
Logger.print("deviceAddress : " + deviceAddress);
boolean isDuplicate = false;
for(DeviceData deviceData : mInfoList) {
if(deviceData.getAddress().equals(deviceAddress)) {
isDuplicate = true;
}
}
if(!isDuplicate) {
DeviceData data = new DeviceData();
data.setName(deviceName);
data.setAddress(deviceAddress);
mInfoList.add(data);
mAdapter.notifyDataSetChanged();
}
}
}
위에서 duplicate 체크한이유는, 같은 블루투스 리스트를 찾는 경우 발생(브로드 캐스트 리시버라서 그런것 같다)
위와 같이 하면 블루투스 페어링까지는 끝냈다. 다음 블로그에서 클라이언트 데이타 전송을 계속 이어 나가도록 하겠다.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 개발하다보면 xml 파일 열때마다 parseSdkContent ~~ 이런 에러가 날때 대처법 (0) | 2014.12.03 |
---|---|
fragment life cycle (0) | 2014.11.28 |
이클립스 안드로이드 프로젝트에서 jsdt code compleletion(assist) 사용하기 (1) | 2014.11.17 |
안드로이드 파일 디렉토리 권한 (0) | 2014.11.04 |
Bluetooth - client (0) | 2014.10.28 |
RECENT COMMENT