BT OPP
- 蓝牙接收文件相关线程的启动
- 蓝牙共享连接线程
共享文件时,蓝牙服务端首先要接收远程设备的连接,此线程即为ObexServerSockets。启动时序图如下:
startAccept的作用是初始化一个接收线程,接收来自client的连接请求。
建立mRfcommThread和mL2capThread线程的原因:不同机器传输数据的方式不同,即有的client使用的是Rfcomm,有的单独使用的是L2cap。
-
- Client事件监听线程
处理对服务器发出的请求,并将它们转发给相应的事件侦听器。而共享文件时监听的事件类型为:OBEX_OPCODE_PUT/OBEX_OPCODE_PUT_FINAL
OBEX_OPCODE_PUT:开始接收到接收最后一包之前收到的事件的都是此事件
OBEX_OPCODE_PUT_FINAL:当是最后一包时收到的事件,表示此文件接收完成。
- 接收文件处理流程
2.1 接收文件时序图
接收文件时序图
2.2 接收文件代码详解
2.2.1 服务端Socket监听的开启
BluetoothOppService
1.当蓝牙状态切换至STATE_ON,开启监听
private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
case BluetoothAdapter.STATE_ON:
if (V) {
Log.v(TAG, "Bluetooth state changed: STATE_ON");
}
startListener();
}
}
2.发送START_LISTENER消息
private void startListener() {
if (!mListenStarted) {
if (mAdapter.isEnabled()) {
if (V) {
Log.v(TAG, "Starting RfcommListener");
}
mHandler.sendMessage(mHandler.obtainMessage(START_LISTENER));
mListenStarted = true;
}
}
}
3.START_LISTENER消息处理,若是蓝牙已经开启,则开启Socket监听
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case START_LISTENER:
if (mAdapter.isEnabled()) {
startSocketListener();
}
break;
4.开启Socket监听
private void startSocketListener() {
if (D) {
Log.d(TAG, "start Socket Listeners");
}
stopListeners();