Andorid BluetoothSocket的工作原理之二

问题点4:原生BT中,客户端(BluetoothSocket)主动发起connect 动作的API call flow

-->执行到BT Service(Bluetooth.apk) 中的getSocketManager;

-->getSocketManagerNative的实现是得到JNI层句柄;

-->执行到JNI层的connectSocket此函数的实现核心是“socketInterface->connect

对应的是 

-->通过btif_sock_get_interface;

所以执行到btsock_connect -->alloc_rfc_slot-->socketpair 建立一个套接字,并返回套接字给Java层;

connect API 中的阻塞实现:waitSocketSignal

-->执行到readAll,这里根据第二个参数设定的长度值进行监听,以便退出while循环;

-->最终通过InputStream(输入字节流)read 方法监听是否收到底层发送的data,来判别当前是否连接上;20Byte 内容是结构体“sock_connect_signal_t”的大小;

 小结:

通过在Android 9原生Source Code 中搜索waitSocketSignal,可以看到在BluetoothSocket.java中的connect 和accept中都在使用;所以不论是客户端还是服务端都使用waitSocketSignal等待20Byte 进行阻塞;同时,在等待20Byte数据前,客户端在执行connect 方法、服务端在执行监听方法bindListen中,先等待固定长度 4Byte int channel = readInt(mSocketIS);(rfc_slot_t 中的“int len)来获得Channel ID(底层发送API是send_app_scn)。

这里需留意的是:send_app_scn是btif_sock_rfc.cc (system\bt\btif\src)中定义的API;

问题点延伸:在原生的l2cap “btif_sock_l2cap.cc (system\bt\btif\src)” 连接中,为何没有看到类似的发送4 Byte Data, Framework层中在调用BluetoothSocketconnect 方法时不会区别当前是连接RFCOMM 还是L2cap 还是SCO

socketconnect时不区分具体连接类型;

 ---L2cap 发送4Byte data API send_app_psm_or_chan_l

---L2cap 发送表示连接上的20Byte data API send_app_connect_signal

 --SCO 发送20Byte data 的是socket_write_and_transfer_fd

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值