主要介紹下用Linux ubuntu虛擬機外接我們的藍牙擴展版跑藍牙協議棧的初始化以及搜索演示
本專欄文章我們會以連載的方式持續更新,本專欄計劃更新內容如下:

第一篇:藍牙綜合介紹 ,主要介紹藍牙的一些概念,產生背景,發展軌跡,市面藍牙介紹,以及藍牙開發板介紹。
第二篇:Transport層介紹,主要介紹藍牙協議棧跟藍牙芯片之前的硬件傳輸協議,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:傳統藍牙controller介紹,主要介紹傳統藍牙芯片的介紹,包括射頻層(RF),基帶層(baseband),鏈路管理層(LMP)等
第四篇:傳統藍牙host介紹,主要介紹傳統藍牙的協議棧,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的協議吧。
第五篇:低功耗藍牙controller介紹,主要介紹低功耗藍牙芯片,包括物理層(PHY),鏈路層(LL)
第六篇:低功耗藍牙host介紹,低功耗藍牙協議棧的介紹,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:藍牙芯片介紹,主要介紹一些藍牙芯片的初始化流程,基于HCI vendor command的擴展
第八篇:附錄,主要介紹以上常用名詞的介紹以及一些特殊流程的介紹等。
另外,開發板如下所示,對于想學習藍牙協議棧的最好人手一套。以便更好的學習藍牙協議棧,相信我,學完這一套視頻你將擁有修改任何協議棧的能力(比如Linux下的bluez,Android下的bluedroid)。

-------------------------------------------------------------------------------------------------------------------------
CSDN學院鏈接(進入選擇你想要學習的課程):
藍牙交流扣扣群:970324688
Github代碼:
入手開發板:
藍牙學習目錄:
--------------------------------------------------------------------------------------------------------------------------
使用步驟操作如下:!!!!!!!!!!!!!!!!!!!!
步驟 1)準備好代碼,從github下載下來最新的代碼(在上面有):
步驟 2)連接好硬件

需要找一個帶流控的串口板來接線,接線是:
VCC 5V供電,GND接到GND,TX接到TX,RX接到RX,CTS接到CTS,RTS接到RTS
可能你會問為啥TX是接TX,RX接RX,CTS接CTS,RTS接RTS,而不是TX接RX,RX接TX,CTS接RTS,RTS接CTS
步驟 3)把代碼放到ubuntu主機主機上,打開Linux工程
1-BLUETOOTH\project\ubuntu_csr8x11_bt,然后直接make編譯,他會編譯出來一個bt_demo
步驟 4)把硬件插入到ubuntu,改下ttyUSB0的權限(sudo chmod 777 /dev/ttyUSB0)(否則不能通信)
步驟 5)執行./bt_demo等初始化通過后,然后敲BT_INQUIRY來搜索就行了
步驟1)實現串口監測
void stdin_process_init()
{
pthread_t thread_stdin_id;
pthread_create(&thread_stdin_id, NULL, stdin_process_thread, NULL);
}
void *stdin_process_thread(void *data)
{
while(1)
{
fd_set read_fd;
int result = 0;
/* monitor uart rx */
FD_ZERO (&read_fd);
FD_SET (0, &read_fd);
if ((result = select (1, &read_fd, NULL, NULL, NULL)) == -1)
{
printf("ERROR:file[%s],function[%s],line[%d] select fail\n",__FILE__,__FUNCTION__,__LINE__);
}
if(result > 0 && FD_ISSET ( 0, &read_fd))
{
memset(stdin_buf,0,STDIN_BUF_SIZE);
int read_result = read(0,stdin_buf,STDIN_BUF_SIZE);
stdin_recv_len = read_result;
//printf("--------1---------len %d\n",read_result);
//bt_hex_dump(stdin_buf,read_result);
//printf("--------2----------\n");
}
}
}
大概原理就是先創建一個thread,然后一直監聽stdin,也就是fd 0,監聽到有輸入,然后就把他放在stdin_buf
步驟 2)stdin buffer的解析
void stdin_process_run()
{
if(stdin_recv_len != 0)
{
shell_parse(stdin_buf);
stdin_recv_len = 0;
}
}
uint8_t shell_parse(uint8_t *shell_string)
{
....
if(strncmp(BT_INQUIRY_CMD,(const char*)shell_string,strlen(BT_INQUIRY_CMD)) == 0)
{
printf("SHELL:operate bt inquiry\n");
bt_start_inquiry(0x30,HCI_INQUIRY_MAX_DEV);
return 0;
}
}
然后這樣就實現了AT跟協議棧的對接