FSC-BT2024NI 指令手册

介绍

描述

本设计指南适用于工程师开发 FSC-BT2024NI 系列蓝牙模组

模组默认配置

Name

FSC-BT2024NI

Service UUID

FFF0

Write UUID

FFF2

Notify UUID

FFF1

UART Baudrate

115200/8/N/1

硬件说明

引脚图

_images/BT2024NI_pin_map.png

引脚描述

Pin

Pin Name

Type

Pin Descriptions

19

VDD

Power

3.3v供电

20

GND

GND

GND

22

STATUS

O

蓝牙未连接输出低电平,蓝牙连接输出高电平

23

RESET

I

复位引脚

28

SWDDIO

I/O

烧录引脚

29

SWDCLK

I/O

烧录引脚

31

UART_TX

I/O

串口引脚

32

UART_RX

I/O

串口引脚

35

EXT_ANT

ANT

改变天线附近的0欧电阻,可以外接蓝牙天线

硬件设计说明

  • 模组只需要连接VDD/GND/STATUS/UART_RX/UART_TX即可使用

  • 如果MCU需要获取蓝牙模组的连接状态,需要接STATUS引脚

  • 画完原理图后请发给飞易通进行审核,避免蓝牙距离达不到最佳效果

  • 模组支持通过串口唤醒

  • VDD/GND/RESET/SWCLK/SWDIO 是烧录口,可以预留测试点

功能说明

GPIO指示

连接状态引脚 PIN 22

状态

描述

低电平

蓝牙未连接

高电平

蓝牙连接

GATT透传服务

类型

UUID

权限

描述

Service

0xFFF0

透传服务

Write

0xFFF2

Write Without Response

APP发给模组

Notify

0xFFF1

Notify

模组发给APP

AT指令说明

规范说明

适用于整个文档

  • {} : 包括与{…}中的内容为可选项

  • << : 主机发给模组的 COMMAND

  • >> : 模组回复主机的 RESPONSE

指令

指令是主机主动发给模组的控制命令,模组在收到指令后需要回复 <CR><LF>OK<CR><LF> 作为应答。

指令格式

AT+Command{=Param1{,Param2{,Param3…}}}<CR><LF>
  • 所有的指令使用 AT 开头,使用 <CR><LF> 结尾

  • <CR> 代表回车符,对应 HEX 为 0x0D

  • <LF> 代表换行符,对应 HEX 为 0x0A

  • 若指令包含参数,参数应使用 = 分隔

  • 若指令包含多项参数,参数应使用 , 分隔

  • 若指令有响应返回,响应使用 <CR><LF> 开始,使用 <CR><LF> 结束

  • 模组应当总是返回指令执行的结果 (成功返回 OK,失败时返回 ERROR)

Example:
读取模块固件版本
<< AT+VER
>> +VER=1.0.0,FSC-BT2024NI

写入不支持的波特率
<< AT+BAUD=0
>> ERROR

通知

通知是模组主动发给主机的数据。一般用来指示状态的变化或收到的数据。

通知格式

<CR><LF>+Indication{=Param1{,Param2{,Param3…}}}<CR><LF>
  • 所有的通知使用<CR><LF>开始, 使用<CR><LF>结束

  • 若通知包含参数, 参数应位于 “=” 后面

  • 若通知包含多项参数, 参数应使用 “,” 分割

Example:
指令模式下收到APP发来的数据
>> +DATA=0,10,1234567890

指令列表

AT+VER - 读取固件版本

Command

AT+VER

参数范围

不接受参数

Response

+VER=<version>,<device_name>

Description

查询软件版本号和模块型号

AT+ADDR - 读取蓝牙地址

Command

AT+ADDR

参数范围

不接受参数

Response

+ADDR=<12位HEX>

Description

返回当前使用的 BLE 地址(ASCII 十六进制)

AT+NAME - 读写蓝牙名称

Command

AT+NAME{=Param1{,Param2}}

Param1

1~31字节ASCII

Param2

0/1,控制是否在广播中拼接 MAC 后缀

Response

+NAME=<name>

Description

设置或读取模块名称,修改后立即更新

AT+BAUD - 读写串口波特率

Command

AT+BAUD{=Param}

Param

1200/2400/4800/9600/19200/38400/ 57600/115200/230400/460800/921600

Response

+BAUD=<rate>

Description

超出列表范围的数值会被拒绝,成功写入后立即切换 UART

AT+TXPOWER - 读写发射功率

Command

AT+TXPOWER{=Param}

Param

-20~10(dBm,整数)

Response

+TXPOWER=<value>

Description

设置 BLE 发射功率,范围外数值返回 ERROR

AT+TPMODE - 透传模式

Command

AT+TPMODE{=Param}

Param

0/1,0=指令模式,1=透传模式

Response

+TPMODE=<value>

Description

切换 指令模式和透传模式

AT+CHINFO - 查询连接状态

Command

AT+CHINFO{=Param}

Param

0:停止;1:上报一次;2:1 s 周期+自动上报

Response

+CHINFO=<idx>,<state>,<role>,<cs>,<addr>

Description

state=1/2/3 对应未连接/连接中/已连接,role=0/1 对应从机/主机

AT+LPM - 低功耗配置

Command

AT+LPM{=Param}

Param

0:禁用;1:串口 5 s 超时休眠;2:GPIO 联动休眠

Response

+LPM=<mode>

Description

模式以 f_mod_power_manager 定义为准,取值仅限0~2

AT+REBOOT - 软件复位

Command

AT+REBOOT

参数范围

不接受参数

Response

OK

Description

软件复位

AT+RESTORE - 恢复出厂

Command

AT+RESTORE

参数范围

不接受参数

Response

OK

Description

清空 NVM 并恢复出厂默认值

AT+ADVIN - 广播间隔

Command

AT+ADVIN{=Param}

Param

20~10000(毫秒)

Response

+ADVIN=<interval_ms>

Description

超出范围会提示 ERROR,修改后立即重新

AT+ADVDATA - 修改自定义厂商数据

Command

AT+ADVDATA{=payload}

Param

1~31 字节二进制(推荐 \xAA 形式)

Response

+ADVDATA=<payload>

Description

修改自定义厂商数据

AT+BADVDATA - 修改 Beacon 数据

Command

AT+BADVDATA{=payload}

Param

1~31 字节二进制

Response

+BADVDATA=<payload>

Description

修改 Beacon 数据

AT+ADVEN - 广播开关

Command

AT+ADVEN{=Param}

Param

0:关闭;1:开启

Response

+ADVEN=<1/0>

Description

设置广播开关

AT+LEDISC - 断开连接

Command

AT+LEDISC{=idx}

idx

索引,省略则全部断开

Response

OK

Description

索引非法会返回 ERROR

AT+LESEND - 发送数据

Command

AT+LESEND=idx,len,data

idx

0~最大连接数

len

数据长度(十进制)

data

原始二进制负载

Response

OK

Description

AT+LECHCNT - 最大连接数

Command

AT+LECHCNT{=Param}

Param

1~8

Response

+LECHCNT=<value>

Description

配置最大连接数

AT+LECCONN - 向指定地址发起连接

Command

AT+LECCONN{=Param1{,Param2{,Param3{,Param4}}}}

Param1

12字节设备地址+1字节地址类型

Param2

通信服务UUID

Param3

通信写权限特征值UUID

Param4

通信通知权限特征值UUID

Response

OK

Description

向指定设备发起连接,参数由12字节(设备地址)和1字节
(地址类型)组成,一般情况下地址类型为“0”或者“1”。地址
类型获取方式:
使用 AT+SCAN 扫描返回的第二个参数,例:
+SCAN=0,0,DC0D30001ED4,-65,10,FSC-BT946
连接命令:
AT+LECCONN=DC0D30001ED40
Example:
连接指定设备,0为地址类型
<< AT+LECCONN=DC0D3000039E0
>> OK

向指定地址发起连接,使用FFF0,FFF2,FFF1进行通信
<< AT+LECCONN=DC0D3000039E0,FFF0,FFF2,FFF1
>> OK

AT+FILTER - 读/写搜索过滤条件

Command

AT+FILTER{=Param1{,Param2}}

Param1

过滤类型(0~3)
0: 删除全部条件
1: 地址过滤
2: 广播数据过滤
3: 信号强度过滤

Param2

过滤类型为1,参数为地址
过滤类型为2,参数为广播数据
过滤类型为3,参数为信号强度

Response

+FILTER=1,Param1
+FILTER=2,Param2
+FILTER=3,Param3

Description

过滤指令只会影响AT+SCAN=2
过滤广播数据时,参数字段依次为:tag,offset,len,data
配置完毕后启动 AT+SCAN=2时按照设置参数过滤扫描到的设备
AT+FILTER=0,删除全部过滤条件。
过滤参数不会保存到flash。
Example:
地址过滤
<< AT+FILTER=1,DC0D30010203
>> OK

过滤广播数据 \x是十六进制
<< AT+FILTER=2,\xFF,\x04,\x02,\xDC\x0D
>> OK

清除过滤条件
<< AT+FILTER=0
>> OK

AT+SCAN - 搜索附近的设备

Command

AT+SCAN{=Param}

Param

扫描方式(0~2)
0: 停止扫描
1: 扫描附近的设备,过滤重复地址,最多可以搜到8个设备
2: 扫描BLE广播包,输出原始广播数据包,可以通过AT+FILTER指令进行过滤

Response

+SCAN=Param1,Param2,Param3,Param4,Param5,Param6 (AT+SCAN=1格式)
+SCAN=Param21,Param22,Param23,Param24,Param25,Param26 (AT+SCAN=2格式)

Param1

列表序号

Param2

地址类型(1字节)

Param3

地址(12字节)

Param4

RSSI

Param5

设备名长度

Param6

设别名名

Param21

地址类型(1字节)

Param22

地址(12字节)

Param23

RSSI

Param24

广播数据包类型

Param25

广播数据包长度

Param26

广播数据包

Description

AT+SCAN=1 常用于连接前的搜索
AT+SCAN=2 常用于作为蓝牙网关使用,搜索周围的Beacon设备
Example:
搜索设备
<< AT+SCAN=1
>> +SCAN={
>> +SCAN=0,1,70CFC9A98840,-43,24,LE-Bose QuietControl 30
>> +SCAN=1,1,DC0D30001ED4,-65,10,FSC-BT946
>> +SCAN=}

嗅探 BLE 广播,并返回原始数据(乱码部分为原始数据,使用 hex 格式)
<< AT+SCAN=2
>> +SCAN{
>> +SCAN=0,DC0D24CFB6D0,-70,1,31,?.曹$隙衐 觜40#-BP104D
>> +SCAN}

通知列表

+SCAN - AT+SCAN=1扫描结果上报

Indication

+SCAN=Param1,Param2,Param3,Param4,Param5,Param6

Param1

列表序号

Param2

地址类型(1字节)

Param3

地址(12字节)

Param4

RSSI

Param5

设备名长度

Param6

设别名名

Description

模组收到AT+SCAN=1后,会持续扫描,发现设备后通过+SCAN进行上报

Example:
搜索设备
<< AT+SCAN=1
>> +SCAN={
>> +SCAN=0,1,70CFC9A98840,-43,24,LE-Bose QuietControl 30
>> +SCAN=1,1,DC0D30001ED4,-65,10,FSC-BT946
>> +SCAN=}

+SCAN - AT+SCAN=2扫描结果上报

Indication

+SCAN=Param1,Param2,Param3,Param4,Param5,Param6

Param1

地址类型(1字节)

Param2

地址(12字节)

Param3

RSSI

Param4

广播数据包类型

Param5

广播数据包长度

Param6

广播数据包

Description

模组收到AT+SCAN=2后,会持续扫描,发现设备后通过+SCAN进行上报

Example:
嗅探 BLE 广播,并返回原始数据(乱码部分为原始数据,使用 hex 格式)
<< AT+SCAN=2
>> +SCAN{
>> +SCAN=0,DC0D24CFB6D0,-70,1,31,?.曹$隙衐 觜40#-BP104D
>> +SCAN}

+GATTSTAT - 连接状态上报

字段

描述

Param1

连接索引。

Param2

连接状态:1=未连接、2=连接中、3=已连接。

+DATA - 指令模式下的透传数据

字段

描述

Param1

连接索引。

Param2

数据长度。

Param3

原始数据(不做转义),使用 AT+TPMODE=0 时才会上报。

应用场景

查询/修改模组默认参数

模组在蓝牙没有连接的状态下,会将串口数据按照AT指令解析。 主机可以对模组的默认参数进行查询和修改,下图展示了:

  1. 修改设备名为 ABC

  2. 查询设备名

  3. 查询蓝牙地址

@startuml
hide footbox
skinparam sequenceMessageAlign center

box "local" #LightBlue
participant Host as host
participant Module as bt
end box


rnote over host, bt: 修改设备名为 ABC

host -> bt: AT+NAME=ABC\\r\\n
bt -> host: \\r\\nOK\\r\\n"

rnote over host, bt: 查询设备名

host -> bt: AT+NAME\\r\\n
bt -> host: \\r\\n+NAME=ABC\\r\\n\\r\\nOK\\r\\n"

rnote over host, bt: 查询蓝牙地址

host -> bt: AT+ADDR\\r\\n
bt -> host: \\r\\n+ADDR=DC0D30010203\\r\\n\\r\\nOK\\r\\n

@enduml

发送数据的流程

模组上电会持续向外发送广播数据,远端蓝牙(手机)可以通过搜索获取到广播包, 并向模组发起连接请求。连接成功后模组会拉高连接状态脚通知主机蓝牙连接成功。 主机可以通过蓝牙模组将数据发送给远端蓝牙,远端蓝牙也可以把数据发送给主机。

@startuml
hide footbox
skinparam sequenceMessageAlign center

box "local" #LightBlue
participant Host as host
participant Module as bt
end box

box "remote" #LightBlue
participant ”Remote BT“ as remote
end box

rnote over host, remote: 建立连接

        bt --> remote: 广播包
        bt <-  remote: 扫描
        bt --> remote: 广播包
        bt <-  remote: 请求建立连接

rnote over host, remote: 连接成功

host <- bt: 拉高连接状态脚

rnote over host, remote: 发送数据

host -> bt: 串口发送 ABC
        bt ->  remote: 蓝牙发送 ABC
        bt <-  remote: 蓝牙发送 DEF
host <- bt: 串口输出 DEF

        bt <-  remote: 断开蓝牙

host <- bt: 连接断开

host <- bt: 拉低连接状态脚
        bt --> remote: 广播包

@enduml

FAQ

IOS 手机如何获取蓝牙MAC地址?

IOS系统出于安全考虑,在底层将蓝牙MAC地址变成了UUID发送给上层应用。所以APP无法获取到设备的MAC地址。

FSC-BT2024NI 默认会将MAC地址放在广播中,APP可以通过下面的方法从广播包中获取MAC地址。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    if(![self describeDictonary:advertisementData])
    {
        NSLog(@"is not fsc module");
        return;
    }
}

- (Boolean)describeDictonary: (NSDictionary *) dict
{
    NSArray *keys;
    id key;
    keys = [dict allKeys];
    for(int i = 0; i < [keys count]; i++)
    {
        key = [keys objectAtIndex:i];
        if([key isEqualToString:@"kCBAdvDataManufacturerData"])
        {
            NSData *tempValue = [dict objectForKey:key];
            const Byte *tempByte = [tempValue bytes];
            if([tempValue length] == 6)
            {
                // tempByte 后面参数是蓝牙地址
                return true
            }
        }else if([key isEqualToString:@"kCBAdvDataLocalName"])
        {
            //there is name
            //NSString *szName = [dict objectForKey: key];
        }
    }
    return false;
}

附录

下载 PDF版本

下载 PDF版本