零. 概述
主要介紹下用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學院鏈接(進入選擇你想要學習的課程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144
藍牙交流扣扣群:970324688
Github代碼:https://github.com/sj15712795029/bluetooth_stack
入手開發板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708
藍牙學習目錄:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900
--------------------------------------------------------------------------------------------------------------------------
演示視頻點擊我(!!!!!!!!!!!!!!!!)
二. ubuntu虛擬機 藍牙協議堆疊封裝使用AT command實作搜索
使用步驟操作如下:(Linux ubuntu虛擬機外接藍牙擴展點擊鏈接)!!!!!!!!!!!!!!!!!!!!
步驟 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跟協議堆疊的對接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/19267.html
標籤:其他
上一篇:鴻蒙OS代碼正式開源
