问题点7:原生BluetoothSocket在BlueDroid中,接收java 层通过“app_fd” 发送,底层通过“fd”接收的核心
---底层轮询是在API sock_poll_thread中完成,然后交给API process_data_sock处理;
这里需要注意的是结构体“pollfd”尤其注意events的设置,如果设置不正确,会导致poll 无法捕抓到相关事件触发;
目前Source Code 中通过:
btsock_thread_add_fd-->add_poll-->set_poll 中的flag栏位进行设置;
在方法process_data_sock中需要理解的是remove_poll ,
如清理SOCK_THREAD_FD_RD,其会在监测数据后先清理pollfd中的写入标志位,使得poll 暂时停止检测fd;
-->此时调用“if (flags) ts[h].callback(pfds[i].fd, type, flags, user_id);”读取当前数据,如callback 方法是:btsock_signaled;
-->把数据通过RFCOMM channel 发送给Remote device;
-->当RFCOMM channel 反馈data 写出完成后,触发方法rfcomm_cback(event值为33:BTA_JV_RFCOMM_WRITE_EVT);
-->在函数on_rfc_write_done中重新添加pollfd中的标志位的写入标志位,使得poll 可以再次从此fd读取数据;
小结:目前推测此方法是为了避开在RFCOMM channel 写出过程中再次从socket中收到从“app_fd”发出的data。