蓝牙接收数据包流程
//底层数据包接收的源头 大约在此处
//再上去就是 监控 fd的守护进程了
void H4Protocol::OnDataReady( int fd )
hci_packetizer_.OnDataReady(fd, hci_packet_type_);
void HciPacketizer::OnDataReady( int fd, HciPacketType packet_type )
{
//ALOGE( "HciPacketizer::OnDataReady state_ = %x", state_ );
switch (state_) {
case HCI_PREAMBLE: {
//ALOGE( "bytes_read_ = %x", bytes_read_ );
ssize_t bytes_read = TEMP_FAILURE_RETRY(
read(fd, preamble_ + bytes_read_,
preamble_size_for_type[packet_type] - bytes_read_));
if (bytes_read == 0) {
// This is only expected if the UART got closed when shutting down.
ALOGE("%s: Unexpected EOF reading the header!", __func__);
sleep(5); // Expect to be shut down within 5 seconds.
return;
}
if (bytes_read < 0) {
LOG_ALWAYS_FATAL("%s: Read header error: %s", __func__,
strerror(errno));
}
//ALOGE( "bytes_read = %x", bytes_read );
bytes_read_ += bytes_read;
//ALOGE( "bytes_read_ = %x", bytes_read_ );
if (bytes_read_ == preamble_size_for_type[packet_type]) {
size_t packet_length = HciGetPacketLengthForType(packet_type, preamble_);
packet_.resize(preamble_size_for_type[packet_type] + packet_length);
memcpy(packet_.data(), preamble_, preamble_size_for_type[packet_type]);
bytes_remaining_ = packet_length;
state_ = HCI_PAYLOAD;
bytes_read_ = 0;
}
break;
}
case HCI_PAYLOAD: {
ssize_t bytes_read = TEMP_FAILURE_RETRY(read(
fd,
packet_.data() + preamble_size_for_type[packet_type] + bytes_read_,
bytes_remaining_));
if (bytes_read == 0) {
&

本文详细解析了蓝牙设备如何通过HCI协议接收来自串口的数据包,涉及关键点如预览和payload阶段的处理,以及用户态回调函数的工作流程。重点在于数据包从底层驱动到应用层回调的传递路径。
最低0.47元/天 解锁文章
533





