FSC-BT2024NI 指令手册
介绍
描述
本设计指南适用于工程师开发 FSC-BT2024NI 系列蓝牙模组
模组默认配置
Name |
FSC-BT2024NI |
Service UUID |
FFF0 |
Write UUID |
FFF2 |
Notify UUID |
FFF1 |
UART Baudrate |
115200/8/N/1 |
硬件说明
引脚图
引脚描述
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
指令
指令格式
所有的指令使用 AT 开头,使用 <CR><LF> 结尾
<CR> 代表回车符,对应 HEX 为 0x0D
<LF> 代表换行符,对应 HEX 为 0x0A
若指令包含参数,参数应使用 = 分隔
若指令包含多项参数,参数应使用 , 分隔
若指令有响应返回,响应使用 <CR><LF> 开始,使用 <CR><LF> 结束
模组应当总是返回指令执行的结果 (成功返回 OK,失败时返回 ERROR)
通知
通知格式
所有的通知使用<CR><LF>开始, 使用<CR><LF>结束
若通知包含参数, 参数应位于 “=” 后面
若通知包含多项参数, 参数应使用 “,” 分割
指令列表
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}} |
|
1~31字节ASCII |
|
0/1,控制是否在广播中拼接 MAC 后缀 |
Response |
+NAME=<name> |
Description |
设置或读取模块名称,修改后立即更新 |
AT+BAUD - 读写串口波特率
Command |
AT+BAUD{=Param} |
|
1200/2400/4800/9600/19200/38400/ 57600/115200/230400/460800/921600 |
Response |
+BAUD=<rate> |
Description |
超出列表范围的数值会被拒绝,成功写入后立即切换 UART |
AT+TXPOWER - 读写发射功率
Command |
AT+TXPOWER{=Param} |
|
-20~10(dBm,整数) |
Response |
+TXPOWER=<value> |
Description |
设置 BLE 发射功率,范围外数值返回 |
AT+TPMODE - 透传模式
Command |
AT+TPMODE{=Param} |
|
0/1,0=指令模式,1=透传模式 |
Response |
+TPMODE=<value> |
Description |
切换 指令模式和透传模式 |
AT+CHINFO - 查询连接状态
Command |
AT+CHINFO{=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} |
|
0:禁用;1:串口 5 s 超时休眠;2:GPIO 联动休眠 |
Response |
+LPM=<mode> |
Description |
模式以 |
AT+REBOOT - 软件复位
Command |
AT+REBOOT |
参数范围 |
不接受参数 |
Response |
OK |
Description |
软件复位 |
AT+RESTORE - 恢复出厂
Command |
AT+RESTORE |
参数范围 |
不接受参数 |
Response |
OK |
Description |
清空 NVM 并恢复出厂默认值 |
AT+ADVIN - 广播间隔
Command |
AT+ADVIN{=Param} |
|
20~10000(毫秒) |
Response |
+ADVIN=<interval_ms> |
Description |
超出范围会提示 |
AT+ADVDATA - 修改自定义厂商数据
Command |
AT+ADVDATA{=payload} |
|
1~31 字节二进制(推荐 |
Response |
+ADVDATA=<payload> |
Description |
修改自定义厂商数据 |
AT+BADVDATA - 修改 Beacon 数据
Command |
AT+BADVDATA{=payload} |
|
1~31 字节二进制 |
Response |
+BADVDATA=<payload> |
Description |
修改 Beacon 数据 |
AT+ADVEN - 广播开关
Command |
AT+ADVEN{=Param} |
|
0:关闭;1:开启 |
Response |
+ADVEN=<1/0> |
Description |
设置广播开关 |
AT+LEDISC - 断开连接
Command |
AT+LEDISC{=idx} |
|
索引,省略则全部断开 |
Response |
OK |
Description |
索引非法会返回 |
AT+LESEND - 发送数据
Command |
AT+LESEND=idx,len,data |
|
0~最大连接数 |
|
数据长度(十进制) |
|
原始二进制负载 |
Response |
OK |
Description |
AT+LECHCNT - 最大连接数
Command |
AT+LECHCNT{=Param} |
|
1~8 |
Response |
+LECHCNT=<value> |
Description |
配置最大连接数 |
AT+LECCONN - 向指定地址发起连接
Command |
AT+LECCONN{=Param1{,Param2{,Param3{,Param4}}}} |
|
12字节设备地址+1字节地址类型 |
|
通信服务UUID |
|
通信写权限特征值UUID |
|
通信通知权限特征值UUID |
Response |
OK |
Description |
向指定设备发起连接,参数由12字节(设备地址)和1字节
(地址类型)组成,一般情况下地址类型为“0”或者“1”。地址
类型获取方式:
使用 AT+SCAN 扫描返回的第二个参数,例:
+SCAN=0,0,DC0D30001ED4,-65,10,FSC-BT946
连接命令:
AT+LECCONN=DC0D30001ED40
|
AT+FILTER - 读/写搜索过滤条件
Command |
AT+FILTER{=Param1{,Param2}} |
|
过滤类型(0~3)
0: 删除全部条件
1: 地址过滤
2: 广播数据过滤
3: 信号强度过滤
|
|
过滤类型为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。
|
AT+SCAN - 搜索附近的设备
Command |
AT+SCAN{=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格式)
|
|
列表序号 |
|
地址类型(1字节) |
|
地址(12字节) |
|
RSSI |
|
设备名长度 |
|
设别名名 |
|
地址类型(1字节) |
|
地址(12字节) |
|
RSSI |
|
广播数据包类型 |
|
广播数据包长度 |
|
广播数据包 |
Description |
AT+SCAN=1 常用于连接前的搜索
AT+SCAN=2 常用于作为蓝牙网关使用,搜索周围的Beacon设备
|
通知列表
+SCAN - AT+SCAN=1扫描结果上报
Indication |
+SCAN=Param1,Param2,Param3,Param4,Param5,Param6 |
|
列表序号 |
|
地址类型(1字节) |
|
地址(12字节) |
|
RSSI |
|
设备名长度 |
|
设别名名 |
Description |
模组收到AT+SCAN=1后,会持续扫描,发现设备后通过+SCAN进行上报 |
+SCAN - AT+SCAN=2扫描结果上报
Indication |
+SCAN=Param1,Param2,Param3,Param4,Param5,Param6 |
|
地址类型(1字节) |
|
地址(12字节) |
|
RSSI |
|
广播数据包类型 |
|
广播数据包长度 |
|
广播数据包 |
Description |
模组收到AT+SCAN=2后,会持续扫描,发现设备后通过+SCAN进行上报 |
+GATTSTAT - 连接状态上报
字段 |
描述 |
|---|---|
|
连接索引。 |
|
连接状态:1=未连接、2=连接中、3=已连接。 |
+DATA - 指令模式下的透传数据
字段 |
描述 |
|---|---|
|
连接索引。 |
|
数据长度。 |
|
原始数据(不做转义),使用 |
应用场景
查询/修改模组默认参数
模组在蓝牙没有连接的状态下,会将串口数据按照AT指令解析。 主机可以对模组的默认参数进行查询和修改,下图展示了:
修改设备名为 ABC
查询设备名
查询蓝牙地址
发送数据的流程
模组上电会持续向外发送广播数据,远端蓝牙(手机)可以通过搜索获取到广播包, 并向模组发起连接请求。连接成功后模组会拉高连接状态脚通知主机蓝牙连接成功。 主机可以通过蓝牙模组将数据发送给远端蓝牙,远端蓝牙也可以把数据发送给主机。
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; }