应用开发示例

初始化及读写参数

模块Profile初始化修改蓝牙名称

响应事件示例如下:

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: Profile初始化

bt -> host: +DEVSTAT=0
bt -> host: +PWRSTAT=1
bt -> host: +SPPSTAT=1
bt -> host: +GATTSTAT=1
bt -> host: +VER=BT909C,V2.2.1,20230103
bt -> host: +PROFILE=1195
bt -> host: +A2DPMUTED=0
bt -> host: +A2DPSTAT=1
bt -> host: +AVRCPSTAT=1
bt -> host: +HFPSTAT=1
bt -> host: +PBSTAT=1
bt -> host: +DEVSTAT=1
bt -> host: +DEVSTAT=7 (可发现打开,手机可以找到bt且可以连接)

rnote over host, bt: 修改蓝牙名称为CARKIT,且不带地址码后缀,并校验

host -> bt: AT+NAME
bt -> host: +NAME=FSC-BT909C-0BB5
host -> bt: AT+NAME=CARKIT,0
bt -> host: OK
host -> bt: AT+NAME
bt -> host: +NAME=CARKIT
@enduml

读写参数

../_images/909c-read-write.png

MCU 修改参数示例

修改任何参数,建议先查询再修改最后校验,避免出错。MCU 修改设备名CARKIT,参考代码如下:

 1void change_name(void)
 2{
 3    uart_send("AT+NAME\r\n");
 4    if(uart_read("+NAME",name_buf))
 5    {
 6        if(memcmp(name_buf,"CARKIT",6))
 7        {
 8            uart_send("AT+NAME=CARKIT,0\r\n");      //defalut disable MAC address suffix
 9            uart_send("AT+NAME\r\n"); // read bt name
10            if(uart_read("+NAME",name_buf))
11            {
12                if(memcmp(name_buf,"CARKIT",6))
13                {
14                    //change name fail
15                }
16                else
17                {
18                    //change name success
19                }
20            }
21        }
22    }
23}

数据透传应用

FSC-BT909C 通用蓝牙双模数传应用固件程序,工作模式包含两种数据传输模式:透传模式和指令模式。一般默认数据透传模式,在透传状态下可进行全双工透明通信,如需切换工作模式,可参考 FSC-BT909C 通用双模数传应用 AT命令集 使用 AT+TPMODE 指令来进行切换。

两种数据传输模式工作机制与区别如下:

  • 透传模式

蓝牙未连接,串口收到的数据按照AT指令进行解析;

蓝牙连接成功后,串口收到的数据全部原样发送到远端蓝牙。

  • 指令模式

蓝牙未连接,串口收到的数据按照AT指令进行解析;

蓝牙连接成功后,串口收到的数据仍然按照AT指令进行解析,需要通过AT指令发送数据给远端,如AT+SPPSEND。

有关模块进入透传状态的时序,参考如下:

../_images/909c-datatp.png

SPP主从应用

FSC-BT909C 通用蓝牙双模数传应用固件程序,可同时支持SPP主从功能, 当使用SPP主功能的AT命令时,模块充当主角色,否则充当从角色。

SPP主端功能AT命令列表:

Commands

Description

AT+SCAN

搜索周围蓝牙设备

AT+SPPCONN

建立SPP连接

AT+SPPSTAT

读SPP状态

AT+SPPDISC

断开SPP连接

AT+SPPSEND

通过SPP发送数据

SPP主端交互(AT命令模式)示例:

../_images/909c-spp-master-at.png

音频接收模式连接

Note

  • 出厂固件如果是收发一体程序,程序默认 +PROFILE=339,需发送 AT+PRFOILE=1195 配置成音频接收模式(即使能SPP,GATT Server,HFP Sink,A2DP Sink,AVRCP-Controller,PBAP);

  • 部分模块收发一体程序不支持PBAP,如FSC-BT955模块。

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: Profile初始化

bt -> host: +PROFILE=1195
bt -> host: ...
bt -> host: +DEVSTAT=7

rnote over host, bt: 手机搜索BT并发起连接
bt -> host: +A2DPSTAT=2
bt -> host: +A2DPSTAT=3 (A2DP已连接)
bt -> host: +A2DPDEV=8C861E94A09E,Navy
bt -> host: +AVRCPSTAT=3 (AVRCP已连接)
bt -> host: +HFPSTAT=3 (HFP已连接)
bt -> host: +HFPDEV=8C861E94A09E,Navy
bt -> host: +HFPSIG=3
bt -> host: +HFPBATT=4
bt -> host: +HFPROAM=0
bt -> host: +HFPNUM=8618620277271
bt -> host: +HFPMANU=AppleInc.

host -> bt: +HFPDIAL=10086 (拨打"10086")
bt -> host: OK
bt -> host: +HFPSTAT=4,10086
bt -> host: +HFPAUDIO=1 (建立audio)
bt -> host: +HFPSTAT=6,10086 (call active)
host -> bt: AT+HFPCHUP(挂断电话)
bt -> host: +HFPSTAT=3
bt -> host: +HFPAUDIO=0 (断开audio)

host -> bt: AT+PLAY(播放音乐)
bt -> host: +A2DPSTAT=5
bt -> host: +PLAYSTAT=1
bt -> host: +TRACKINFO=song,artist,album
bt -> host: +TRACKSTAT=1,1,240
bt -> host: +TRACKSTAT=1,2,240
host -> bt: AT+PAUSE(暂停音乐)
bt -> host: +PLAYSTAT=2
bt -> host: +A2DPSTAT=4

@enduml

发射模式连接

Note

  • 发射模式连接需将模块配置到A2DP Source 、 HFP Source;

  • 程序默认连接耳机、音箱后不会主动进入音频发射模式或通话(对讲)模式,需使用AT指令来进行模式切换: 启动音频发射(AT+AUDROUTE=1) , 启动通话(AT+AUDROUTE=2)。

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: Profile初始化

bt -> host: +PROFILE=339
bt -> host: ...
bt -> host: +DEVSTAT=7

rnote over host, bt: 搜索周边耳机,音响设备并连接
host -> bt: AT+SCAN=1
bt -> host: +SCAN=1,-87,0,DC0D30001E49,FSC-BT1036-1E49,5A020C
bt -> host: +SCAN=2,-78,0,7C9A1DA36B41,AirPods,240404
bt -> host: +SCAN=E

host -> bt: AT+A2DPCONN=7C9A1DA36B41
bt -> host: +A2DPSTAT=2
bt -> host: +A2DPSTAT=3 (A2DP已连接)
bt -> host: +A2DPDEV=7C9A1DA36B41,AirPods
bt -> host: +HFPSTAT=2
bt -> host: +HFPSTAT=3 (HFP已连接)
bt -> host: +HFPDEV=7C9A1DA36B41,AirPods
bt -> host: +AVRCPSTAT=3 (AVRCP已连接)


rnote over host, bt: 启动音频发射模式
host -> bt: AT+AUDROUTE=1
bt -> host: +PLAYSTAT=1
bt -> host: +A2DPSTAT=5
bt -> host: +AUDMODE=1 (返回当前音频路由模式)

rnote over host, bt: 关闭音频发射模式
host -> bt: AT+AUDROUTE=0
bt -> host: +PLAYSTAT=2
bt -> host: +A2DPSTAT=4
bt -> host: +AUDMODE=0

rnote over host, bt: 启动通话、对讲模式
host -> bt: AT+AUDROUTE=2
bt -> host: +HFPAUDIO=1 (建立audio)
bt -> host: +HFPSTAT=4
bt -> host: +AUDMODE=2
bt -> host: +HFPSTAT=6

rnote over host, bt: 关闭通话、对讲模式
host -> bt: AT+AUDROUTE=0
bt -> host: +HFPAUDIO=0 (断开audio)
bt -> host: +HFPSTAT=3
bt -> host: +AUDMODE=0

@enduml

MCU 连接AirPods,并启动音频发射 参考代码:

 1#define PROFILE_HFP_HF              (uint16)(BIT3)
 2#define PROFILE_HFP_AG              (uint16)(BIT4)
 3#define PROFILE_A2DP_SINK           (uint16)(BIT5)
 4#define PROFILE_A2DP_SOURCE         (uint16)(BIT6)
 5
 6void bt_connect(void)
 7{
 8    //enable hfp source,a2dp source,avrcp tg,spp,gatt
 9    uart_send("AT+PROFILE=339\r\n"); //if profile changes,module will auto reboot,
10    wait_ms(500);
11    uart_send("AT+PROFILE\r\n");
12    uint32 profiles = uart_read("+PROFILE",profiles);
13    if(profiles & (PROFILE_A2DP_SOURCE|PROFILE_HFP_AG))
14    {
15        uint8 addr[6];
16        uint8 buf[30]={0};
17        uint8 a2dp_state=0
18        uart_send("AT+SCAN=1\r\n");
19        uart_read_scan_addr("+SCAN",addr);
20        sprintf(buf,"AT+A2DPCONN=%s\r\n",addr);
21        uart_send(buf); //send a2dp connect
22
23        uart_read("+A2DPSTAT",a2dp_state);
24        if(a2dp_state == 3) //a2dp connected
25        {
26            uart_send("AT+AUDROUTE=1"); // start a2dp audio
27        }
28        uart_read("+A2DPSTAT",a2dp_state);
29        if(a2dp_state == 5)
30        {
31            //a2dp streaming
32        }
33    }
34    else
35    {/*not support master*/}
36}

HFP三方通话操作

Note

  • 非通用音频固件包含功能;

  • FSC-BT1036x、FSC-BT909C、FSC-BT955等模块未打开三方通话功能,若需要测试该功能请和飞易通联系。

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: HFP connected

bt -> host: ...
bt -> host: +HFPSTAT=3

rnote over host, bt: 拨打电话"10086"
host -> bt: AT+HFPDIAL=10086
bt -> host: OK
bt -> host: +HFPSTAT=4,10086 (phone dialing)
bt -> host: +HFPAUDIO=1
bt -> host: +HFPSTAT=6,10086 (call active)

rnote over host, bt: 三方通话来电
bt -> host: +HFPSTAT=8,10086,18620277271
host -> bt: AT+HFPMCAL=2 (Hold active call and accept another call)
bt -> host: +HFPSTAT=9,18620277271,10086 (18620277271 active,10086 hold)
host -> bt: AT+HFPMCAL=2 (Hold active call and accept another call)
bt -> host: +HFPSTAT=9,10086,18620277271 (10086 active,18620277271 hold)

host -> bt: AT+HFPMCAL=1 (Release active call and accept another call)
bt -> host: +HFPSTAT=6,18620277271 (one call active now)

rnote over host, bt: 挂断电话
host -> bt: AT+HFPCHUP
bt -> host: +HFPAUDIO=0
bt -> host: +HFPSTAT=3

@enduml

AVRCP文件系统浏览

Note

  • 非通用音频固件包含功能;

  • FSC-BT1036、FSC-BT909C、FSC-BT955等模块未打开此功能,若需要测试该功能请和飞易通联系。

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: A2DP/AVRCP connected

bt -> host: ...
bt -> host: +AVRCPSTAT=3

rnote over host, bt: 操作文件浏览功能
bt -> host: +BROWSTAT=3 (browsing channel connected)
host -> bt: AT+GETMP (retrieve media players)
bt -> host: +BROWSTAT=4
bt -> host: +BROWDATA=P,1,1,Music (found browsable media player)
bt -> host: +BROWDATA=E,0
bt -> host: +BROWSTAT=3

host -> bt: AT+SETMP=1 (select player)
bt -> host: +BROWSTAT=4
bt -> host: +BROWDATA=R,iPhone (filesystem root:iPhone)
bt -> host: +BROWDATA=E,0
bt -> host: +BROWSTAT=3

host -> bt: AT+GETFD=1,5 (list folders under root dir)
bt -> host: +BROWSTAT=4
bt -> host: +BROWDATA=F,0100000000000000,我的音乐 (/iPhone/我的音乐)
bt -> host: +BROWDATA=F,0200000000000000,播放列表 (/iPhone/播放列表)
bt -> host: +BROWDATA=E,0
bt -> host: +BROWSTAT=3

host -> bt: AT+SETFD=0200000000000000 (list folders under 播放列表)
bt -> host: +BROWSTAT=4
bt -> host: +BROWDATA=E,0
bt -> host: +BROWSTAT=3

host -> bt: AT+GETFD=1,5
bt -> host: +BROWSTAT=4
bt -> host: +BROWDATA=F,0100000000000000,最近添加
bt -> host: +BROWDATA=F,524A57F5E4594DE6,播放历史
bt -> host: +BROWDATA=E,0
bt -> host: +BROWSTAT=3

bt <--> host: (continue list sub dir until find audio tracks:AT+SETFD=folder id,AT+GETFD=x,y)
bt -> host: +BROWDATA=M,285E9813C3AB900E,New Soul
bt -> host: +BROWDATA=F,C15E9813C3AB900E,BLUE
bt -> host: +BROWDATA=E,0
bt -> host: +BROWSTAT=3

host -> bt: AT+ADDMP=C15E9813C3AB900E (select audio track and add to media player)
bt -> host: OK
bt --> host: media player playing BLUE now

@enduml

AVRCP专辑图片下载

Note

  • AVRCP专辑图片下载功能,SOC音频模块不支持,仅车载协议栈RF模块支持。

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: A2DP/AVRCP connected

bt -> host: ...
bt -> host: +AVRCPSTAT=3

rnote over host, bt: 下载专辑图片
bt -> host: +BIPSTAT=3 (basic image profile connected)
bt <--> host: music start streaming
bt -> host: +TRACKINFO=song,artist,album
bt -> host: +BIPSTAT=4 (blueware auto pulling coverart jpeg image background)
bt -> host: +COVERART=1000090 (download complete)
bt -> host: +BIPSTAT=3

@enduml

Phonebook/Contact Photo下载

Note

  • Contact Photo SOC音频模块不支持,仅车载协议栈RF模块支持。

  • 部分固件不支持下载时,自动连接PBAP, 需发送AT+PBCONN连接PBAP再下载

@startuml
hide footbox
skinparam sequenceMessageAlign center

box  #LightBlue
participant Host as host
participant Blueware as bt
end box

rnote over host, bt: HFP connected

bt -> host: ...
bt -> host: +HFPSTAT=3

rnote over host, bt: 下载所有电话本
host -> bt: AT+PBDOWN=1
bt -> host: +PBSTAT=2
bt -> host: +PBSTAT=3 (PBAP已连接)
bt -> host: +PBSTAT=4 (PBAP下载中)
bt -> host: +PBDATA=1,本机号码,+8618620277272
bt -> host: +PBDATA=1,张三,0571-85592192
bt -> host: ...
bt -> host: +PBDATA=1,jerry,18909731215
bt -> host: +PBDATA=E (下载完成)
bt -> host: +PBSTAT=3

rnote over host, bt: 下载所有电话本且请求头像
host -> bt: AT+PBDOWN=1,,,1
bt <--> host: (if item's photo flag set,photo image number.jpg should be placed in spcecify folder)
bt -> host: +PBDATA=1,本机号码,+8618620277272,1
bt -> host: +PBDATA=1,张三,0571-85592192
bt -> host: +PBDATA=1,jerry,18909731215,1
bt -> host: +PBDATA=E
bt -> host: +PBSTAT=3

rnote over host, bt: 下载50条通话记录
host -> bt: AT+PBWODN=5,50
bt -> host: +PBDATA=3,yidong,+10086,20200213T114247
bt -> host: ...
bt -> host: +PBDATA=2,andy,85592192,20200212T104202
bt -> host: +PBDATA=E
bt -> host: +PBSTAT=3

@enduml