bluetooth 클라이언트쪽 스레드 구현

thread 관계도

client thread 생성

device 리스트에서 device가 선택되면 그 정보를 가지고 ClientThread를 시작한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
for (BluetoothDevice device : devices) {
if (device.getName().equals(selectDeivceStr)) {
MainActivity.this.device = device;
showProgressDialgo(device.getName());
if(socket != null){
try {
if (writeThread != null) {
writeHandler.getLooper().quit();
}
socket.close();
} catch (IOException e) {
e.printStackTrace();


ClientThread clientThread = new ClientThread();
clientThread.start();
}
}

class ClientThread extends Thread {
@Override
public void run() {
try {
bluetoothAdapter.cancelDiscovery();
socket = device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();
if (readThread != null) {
readFlag = false;
}
readThread = new ReadThread(socket);
readThread.start();
if (writeThread != null) {
writeHandler.getLooper().quit();
}
writeThread = new WriteThread(socket);
writeThread.start();
socketIsConnected = new SocketIsConnected(socket);
socketIsConnected.start();
isConnected = true;
//최초에 연결 되었다는 신호 보낸다.
isConnectMessage = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}

ClientThread는 UUID 정보를 사용해서 socket을 생성하고 server와 연결한다.

또한 ReadThread와 WriteThread를 생성한다.

ReadThread

ReadThread는 server에서 온 데이터를 읽기 위한 Thread이다.
BufferedInputStream을 사용하고 read()함수로 데이터를 받아온다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class ReadThread extends Thread {
BluetoothSocket socket;
BufferedInputStream in = null;
public ReadThread(BluetoothSocket socket) {
this.socket = socket;
try {
in = new BufferedInputStream(socket.getInputStream());
} catch (Exception e) {
}
}
@Override
public void run() {
while (readFlag) {
try {
byte[] buffer = new byte[1024];
int bytes;
bytes = in.read(buffer);
String readStr = new String(buffer, 0, bytes);
if (readStr.equals("connect..")) {
Message msg1 = new Message();
msg1.what = 40;
mainHandler.sendMessage(msg1);
}
if (readStr.equals("destory..")) {
isConnected = false;
if (socket != null) {
socket.close();
}
readFlag = false;
writeHandler.getLooper().quit();
}
Message message = new Message();
message.what = 100;
message.obj = readStr;
mainHandler.sendMessage(message);
} catch (Exception e) {
readFlag = false;
isConnected = false;
}
}
Message msg = new Message();
msg.what = 20;
mainHandler.sendMessage(msg);
}
}

WriteThread

WriteThread는 서버에 데이터를 보내기 위한 Thread이다.
OutputStream을 사용해 write()함수를 사용 데이터를 송신한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class WriteThread extends Thread {
BluetoothSocket socket = null;
OutputStream out = null;

public WriteThread(BluetoothSocket socket) {
this.socket = socket;
try {
out = socket.getOutputStream();
} catch (Exception e) {
e.printStackTrace();
}
}

@SuppressLint("HandlerLeak")
@Override
public void run() {
if (isConnectMessage) {
try {
out.write(("connect..").getBytes());
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
isConnectMessage = false;
}
Looper.prepare();
writeHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
try {
if(isbyte){
out.write((byte[])msg.obj);
}else {
out.write(((String) msg.obj).getBytes());
}
out.flush();
Message message = new Message();
message.what = 200;
message.obj = msg.obj;
mainHandler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
isConnected = false;
writeHandler.getLooper().quit();
try {
readFlag = false;
} catch (Exception e1) {

}
}
}
};
Looper.loop();
}
}
공유하기