Giter Club home page Giter Club logo

sj15712795029 / bluetooth_stack Goto Github PK

View Code? Open in Web Editor NEW
310.0 19.0 143.0 44.54 MB

这是一个开源的双模蓝牙协议栈(bluetooth.stack)(btstack),可以运行在STM32,Linux.,包含HCI,L2CAP,SDP,RFCOMM,HFP,SPP,A2DP,AVRCP,AVDTP,AVCTP,OBEX,PBAP等协议,后续会继续维护,以达到商用的目的

C 98.82% HTML 0.74% Assembly 0.28% Batchfile 0.01% Makefile 0.01% C# 0.14% CSS 0.01% Python 0.01%
pbap avrcp l2cap hfp a2dp spp obex hci sdp rfcomm

bluetooth_stack's Introduction

蓝牙协议栈 Bluetooth stack (English)

这是一个包含传统蓝牙跟低功耗蓝牙的协议栈,属于超轻量级蓝牙协议栈,用作学习蓝牙协议栈的人使用

CSR8311 CYW54591 BCM43430A
(AP6212A)
BCM4345C5
(AP6256)
STM32F103 × × ×
STM32F407 × × ×
STM32F412 × × ×
STM32H750 × × ×
Linux
Windows × × × ×
购买连接: 购买开发板连接(点击我) 暂未上线 暂未上线 暂未上线

源码目录结构

目录文件夹 子目录文件夹 说明
board stm32f10x STM32F103板载外设驱动
stm32f407 STM32F407板载外设驱动
stm32f412 STM32F412板载外设驱动
bsp cortex-m3 Cortex M3 Driver库(M3默认用标准库)
cortex-m4 Cortex M4 Driver库(M3默认用HAL库)
component bluetooth 蓝牙协议栈源码
cjson json源码(目前用于跟上位机交互)
fs file system文件系统,目前用于管理spi flash
memory_manager 内存管理,目前用于管理STM32F407的SRAM
ringbuffer 环形数组,用于蓝牙接收串口数据
mcu_bt_tool PC上位机,用于控制STM32开发板,以及接受STM32的状态回传
project stm32f10x_bb_bt STM32F103裸机(BB:bare board)蓝牙工程
stm32f407_bb_bt STM32F407裸机(BB:bare board)蓝牙工程
stm32f412_bb_bt STM32F412裸机(BB:bare board)蓝牙工程
stm32h750_bb_bt STM32H750裸机(BB:bare board)蓝牙工程
linux_bt Linux 蓝牙工程
windows_bt Windows蓝牙工程
python_tool convert_binayr_file_to_array.py 把二进制文档转换为数据的python工具
corvert_opcode_to_ogf_ocf.py 把HCI opcode转换为OGF,OCF

工程使用方式

通用

在bt_config.h中配置你想要的功能,比如debug/profile enable/paring mode/chipset select/spec profile config...

STM32下使用

前提条件:1)Keil安装 2)STM32F1/STM32F4对应的pack包 3)Download工具(我们选择的是ST-LINK)

打开工程project下的对应的stm32f10x_bb_bt/stm32f10x_bb_bt/stm32f412_bb_bt直接编译下载即可

Linux下使用

前提条件:

1)安装alsa工具:sudo apt install alsa

1)USB转UART工具(H4 transport需要硬件流控)并且接线正确,根据丝印TX接TX,RX接RX,CTS接CTS,RTS接RTS,VCC5V,GND

2)一般需要给串口权限,比如sudo chmod 777 /dev/ttyUSB0(如果不是这个路径要修改code)

打开工程project下的linux_bt make一下,生成bt_demo后直接运行即可

交流社区:

1. CSDN技术文章专栏(点击我)

2. 论坛(点击我)

视频教程:

CSDN学院教程-蓝牙协议栈教程(点击我)

平台介绍:

目前我们的蓝牙协议栈可以在STM32F103以及在Linux跑起来,蓝牙芯片是CSR8311,支持
PROTOCOL:HCI L2CAP RFCOMM SDP AVDTP AVCTP ATT SMP
PROFILE: HFP A2DP AVRCP PBAP SPP GATT
希望会有更多的人来加入进来一起协作开发profile以及蓝牙芯片的工作。

蓝牙协议栈架构:

bluetooth_stack's People

Contributors

guangliangliao avatar ryze-wang avatar sj15712795029 avatar winmin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bluetooth_stack's Issues

btrfcomm.c文件 ctrl字段解析分支问题

btrfcomm.c 文件
rfcomm_input函数
1328行与1342行 对rfcommhdr.ctrl分支判断相同问题。
if(rfcommhdr.ctrl == RFCOMM_UIH)
{
if(pcb->cn == 0)
{
if(fcs != pcb->uih0_in_fcs) /* Check against the precalculated fcs /
{
//if(fcs8_crc_check(p, RFCOMM_UIHCRC_CHECK_LEN, fcs) != 0) {
/
Packet discarded due to failing frame check sequence /
BT_RFCOMM_TRACE_DEBUG("rfcomm_input: UIH packet discarded due to failing frame check sequence\n");
bt_pbuf_free(p);
return BT_ERR_OK;
}
}
}
else if(rfcommhdr.ctrl == RFCOMM_UIH)
{
if(fcs != pcb->uih_in_fcs) /
Check against the precalculated fcs /
{
//if(fcs8_crc_check(p, RFCOMM_UIHCRC_CHECK_LEN, fcs) != 0) {
/
Packet discarded due to failing frame check sequence */
BT_RFCOMM_TRACE_DEBUG("rfcomm_input: UIH packet discarded due to failing frame check sequence\n");
bt_pbuf_free(p);
return BT_ERR_OK;
}
}

FrontLine Ellisys

FrontLine / Ellisys 这两个软件的安装包谁可以发一下,谢谢。

TODO:

1.HCI host -> controller flow control
2.HCI controller -> host flow control
3.RFCOMM C/R bit的理清
4. BT_STOP内存回收

BLE GAP Service 添加多个特性出错

默认BLE GAP Service中只有一个device name特性,于是我按照Battery Service添加了一个appearance。但是添加之后手机连接蓝牙显示GAP Service为空,也就是出错了。添加代码如下:
图片

//------------------------bt_gatt.c--------------------------------------------------------
uint8_t gatt_gap_uuid[] = {BT_LE_U16_TO_ARRAY(BT_UUID_SERVCLASS_GAP_SERVER)};
uint8_t gatt_gap_characteristic[] = {GATT_CHAR_PROP_BIT_READ,BT_LE_U16_TO_ARRAY(GATT_GAP_NAME_HANDLE),BT_LE_U16_TO_ARRAY(GATT_UUID_GAP_DEVICE_NAME)};

uint8_t gatt_gap_icon_characteristic[] = {GATT_CHAR_PROP_BIT_READ,BT_LE_U16_TO_ARRAY(GATT_GAP_ICON_HANDLE),BT_LE_U16_TO_ARRAY(GATT_UUID_GAP_ICON)};
uint8_t gatt_gap_appearance[] = {0,0};

gatt_server_service_t gap_service[] =
{
{ GATT_GAP_SERVICE_HANDLE,GATT_UUID_PRI_SERVICE,
gatt_gap_uuid,sizeof(gatt_gap_uuid),GATT_PERM_READ,NULL},

{ GATT_GAP_CHARACTERISTIC_HANDLE,GATT_UUID_CHAR_DECLARE,
	gatt_gap_characteristic,sizeof(gatt_gap_characteristic),GATT_PERM_READ,NULL},
	
{ GATT_GAP_NAME_HANDLE,GATT_UUID_GAP_DEVICE_NAME,
	(uint8_t*)GATT_GAP_NAME,sizeof(GATT_GAP_NAME),GATT_PERM_READ,NULL},
	
	{ GATT_GAP_ICON_CHARACTERISTIC_HANDLE,GATT_UUID_CHAR_DECLARE,
	gatt_gap_icon_characteristic,sizeof(gatt_gap_icon_characteristic),GATT_PERM_READ,NULL},
	 
	 { GATT_GAP_ICON_HANDLE,GATT_UUID_GAP_ICON,
		gatt_server_change,sizeof(gatt_server_change),GATT_PERM_READ,NULL},

};

err_t gatt_server_init(void)
{
gatt_server_add_pri_service(gap_service,GATT_GAP_SERVICE_HANDLE,GATT_GAP_ICON_HANDLE,sizeof(gap_service)/sizeof(gatt_server_service_t),BT_UUID_SERVCLASS_GAP_SERVER);
gatt_server_add_pri_service(gatt_service,GATT_SERVICE_HANLE,GATT_SRV_CHGD_CLIENT_CHARA_CONF_HANDLE,sizeof(gatt_service)/sizeof(gatt_server_service_t),BT_UUID_SERVCLASS_GATT_SERVER);

return BT_ERR_OK;

}
//--------------------------bt_config.h------------------------------------------------------
#define GATT_PRI_SERVICE_MAX_COUNT 15
#define GATT_BLE_MTU_SIZE 23
#define GATT_GAP_SERVICE_HANDLE 0x0001
#define GATT_GAP_CHARACTERISTIC_HANDLE 0x0002
#define GATT_GAP_NAME_HANDLE 0x0003
#define GATT_GAP_ICON_CHARACTERISTIC_HANDLE 0x0004
#define GATT_GAP_ICON_HANDLE 0x0005

#define GATT_SERVICE_HANLE 0x0006
#define GATT_SRV_CHGD_CHAR_HANDLE 0x0007
#define GATT_SERVICE_CHGD_HANLE 0x0008
#define GATT_SRV_CHGD_CLIENT_CHARA_CONF_HANDLE 0x0009

#define GATT_GAP_NAME BT_LOCAL_NAME
#define GATT_BAS_SERVICE_HANDLE 0x000A
#define GATT_BAS_CHARACTERISTIC_HANDLE 0x000B
#define GATT_BAS_LEVEL_HANDLE 0x000C
#define GATT_BAS_CLIENT_CHARA_CONF_HANDLE 0x000D

关于SDP AttributeID的问题

Hello! 你好.

我最近在学习蓝牙协议栈SDP部分内容, 在和手机/耳机交互时, 发现A2DP下有一个AttributeID是0x0311, 我从官方文档中找不到对这个AttributeID的定义, 以及它在SDP发现服务中的具体作用?

您可以解答一下我这个疑惑吗?

high risk of dead loop in function "void uart_bt_send(uint8_t *buf, uint16_t len)"

void uart_bt_send(uint8_t buf, uint16_t len)
{
uint8_t index;
for (index = 0; index < len ; index++) {
/
Wait until the last send is complete, then send the data */
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2, buf[index]);
}
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}

if len > 255, there will be a dead loop because index is uint8.

优化HCI层

  1. init code优化
  2. Command/event宏优化
  3. hci event input优化,把每个event拉出函数,防止函数过长,不易查看
  4. hci acl优化
  5. 函数static优化

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.