问题点7: Android Bluetooth OPP sever创建socket Server从启动监听到被连接的过程;
---基于OPP 文档,Client端主动发送object,而Server端被动接收object,且Server端不能主动连接,只能被连接;以上特性决定了OPP Server需要等待被连接;
当前Android Bluetooth 中OPP基于socket实现,其核心实现是ObexServerSockets, 具体作为socket Server等待监听的实现是startSocketListener 中的
“ObexServerSockets.createInsecure(this)”;
-->ObexServerSockets.createInsecure(this), 返回ObexServerSockets对象;
-->执行到类ObexServerSockets中的 create方法:
这里同时创建RFCOMM和L2CAP的socket channel,当创建成功时,将执行
“new ObexServerSockets(validator, rfcommSocket, l2capSocket);”并启动accept;
其中“validator”的作用是记录了上层的callback接口,以方便当socket被连接时,可以执行上层的callback 如“BluetoothOppService的onConnect”告知实际连接结果;
Note:注意与BluetoothOppObexServerSession中的onConnect区别:
BluetoothOppService的onConnect:是在socket被连接上时触发;
BluetoothOppObexServerSession中的onConnect:是在OPP 被连接上后,通过Obex opcode 为“ObexHelper.OBEX_OPCODE_CONNECT”时触发;---在“ServerSession.java
(frameworks\base\obex\javax\obex)”中;
-->执行到startAccept,分别创建rfcomm和l2cap的线程进行监听;
-->当被连接时,将执行BluetoothOppService的onConnect被执行;
若异常则对应执行“ObexServerSockets.this.onAcceptFailed();”
-->BluetoothOppService的onConnect中将发出
Message“MSG_INCOMING_BTOPP_CONNECTION” 通知OPP被连接上;
-->执行case MSG_INCOMING_BTOPP_CONNECTION,
正常将执行到“createServerSession”
-->执行到“createServerSession”,
这里创建了一个“BluetoothOppObexServerSession” 对象进行新链路的管理,并通过preStart和Obex类ServerSession关联起来(Note : ServerSession.java在framework层的obex文件夹中);
-->执行BluetoothOppObexServerSession的方法preStart,创建新的ServerSession 类;
ServerSession是Obex类;
所以至此,OPP Server被连接时建立的链路,交给了Obex 类ServerSession进行数据解析接收并解析;
问题点8:OPP Server 收到OBEX_OPCODE_CONNECT如何处理;
---由上一个问题点得知:当OPP Server被连接上时,其最终交给了ServerSession进行read的阻塞监听动作;
所以当OPP Server 收到data时,首先被触发的将是ServerSession的“public void run() {”;
-->如收到OBEX_OPCODE_CONNECT(0x80时);
-->执行到handleConnectRequest;
最终通过:mOutput.write(sendData); 和mOutput.flush(); 回应response;
Note:ServerSession中还有标准的发送response API “sendResponse”