CH579CH573CH583CH57xCH58x蓝牙从机使用注意事项
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CH579CH573CH583CH57xCH58x蓝⽛从机使⽤注意事项
本⽂涉及到ble从机的:
⼴播相关
连接相关
服务/特征相关
数据收发相关
其他
1.[⼴播相关]
⼴播内容:
对于BLE4.x或者兼容模式,⼴义上的⼴播分为:⼴播数据,扫描回复数据,这两个内容的总长度都是31个字节;
对于⼴播的内容格式, 蓝⽛有定义按照 |1byte长度|1byte类型|n字节内容|来放,如:
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8_t scanRspData[] = {
9, // length of this data //length
GAP_ADTYPE_LOCAL_NAME_COMPLETE, //complete name type
'b','l','e','_','n','a','m','e', //name
5, //length
0xff, //manufacturer type
0x00,0x01,0x02,0x03 //manufacturer data
};
设置更新⼴播内容
//设置/修改扫描回复以及⼴播数据,这种修改需要重启⼴播
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
//或者通过下⾯⽅式进⾏修改,实时⽣效
bStatus_t GAP_UpdateAdvertisingData( uint8_t taskID,uint8_t adType,uint8_t dataLen,uint8_t *pAdvertData );
⼴播间隔超时和类型:
//获取当前的⼴播间隔
//这⾥的值都是1=0.625ms
uint16_t advInt;
advInt = GAP_GetParamValue( TGAP_DISC_ADV_INT_MIN );
PRINT("min adv %d\r\n",advInt);
advInt = GAP_GetParamValue( TGAP_DISC_ADV_INT_MAX );
PRINT("max adv %d\r\n",advInt);
//修改⼴播间隔
/*注意,⼴播的参数修改,需要重启⼴播,才能⽣效
*可以修改后,然后在⼴播 GAPROLE_WAITING(⼴播停⽌)状态产⽣后,然后⽴刻开启⼴播. 不能关闭⼴播后⽴刻开启⼴播.
*/
//1=1.25ms, 160*1.25ms = 200ms
uint16_t advInt = 160;
GAP_SetParamValue( TGAP_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_DISC_ADV_INT_MAX, advInt );
//获取通⽤⼴播超时
//1=0.625ms
uint16_t adv_timeout;
adv_timeout = GAP_GetParamValue(TGAP_GEN_DISC_ADV_MIN);
PRINT("get adv timer TGAP_GEN_DISC_ADV_MIN=%d\r\n",adv_timeout);
//设置通⽤⼴播的超时
//1=0.625ms
adv_timeout = 1600;
GAP_SetParamValue(TGAP_GEN_DISC_ADV_MIN,adv_timeout);
PRINT("set adv timer TGAP_GEN_DISC_ADV_MIN=%d\r\n",adv_timeout);
//修改⼴播类型
// GAP_ADVERTISEMENT_TYPE_DEFINES GAP Advertising Event Types
#define GAP_ADTYPE_ADV_IND 0x00 //!< Connectable undirected advertisement
#define GAP_ADTYPE_ADV_HDC_DIRECT_IND 0x01 //!< Connectable high duty cycle directed advertisement
#define GAP_ADTYPE_ADV_SCAN_IND 0x02 //!< Scannable undirected advertisement
#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected advertisement
#define GAP_ADTYPE_ADV_LDC_DIRECT_IND 0x04 //!< Connectable low duty cycle directed advertisement
//对于只⼴播的类型,如⼀些 beacon,可以⽤ GAP_ADTYPE_ADV_NONCONN_IND 类型,这样不可以连接,会⽐较省电,但是数据只能放到 GAPROLE_ADVERT_DATA 中不能放到 GAPROLE_SCAN_RSP_DATA 中uint8 adv_type = GAP_ADTYPE_ADV_IND;
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE,sizeof( uint8_t ),&adv_type);
⼴播开关:
//获取当前⼴播状态
//0为⾮⼴播,⾮0为⼴播
uint8_t adv_status;
GAPRole_GetParameter(GAPROLE_ADVERT_ENABLED, &adv_status );
//开启⼴播
//对应状态上报:GAPROLE_ADVERTISING
uint8_t advertising_enable = true;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8_t ), &advertising_enable );
//关闭⼴播
// 对应的状态上报:
// :GAPROLE_WAITING
// :pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT
advertising_enable = false;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8_t ), &advertising_enable );
//重启⼴播
//要先关闭⼴播,然后在停⽌⼴播的状态产⽣后才能再去使能⼴播,不能刚执⾏完关闭⼴播,就去开启⼴播
//否则会导致⽴刻开启失败,如当前在⼴播状态,执⾏关闭⼴播,然后⽴刻执⾏开始⼴播,这时候开始⼴播是不会调⽤成功的
//因为这⾥只是设置协议栈状态机标识位,实际上⼴播并没有⽴刻停⽌,要等协议栈轮询处理后,才会真正关闭,如果现在去启动⼴播,协议栈会认为当前已经在⼴播状态2.[连接相关]
2.1 状态和参数
//连接参数
//设置最⼤最⼩连接间隔,最⼩为6,这⾥通常是在初始化的时候设置
//这⾥的最⼤最⼩范围要尽量的⼤,⽐如6,1000因为主机端连的时候,可能会不断的修改连接间隔,从⽽实现更快速的服务相关的查询
//后⾯的连接间隔,通过GAPRole_PeripheralConnParamUpdateReq 函数去更新即可
GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
//在从机启动的api⾥⾯传⼊了⼏个回调函数:
GAPRole_PeripheralStartDevice( Peripheral_TaskID, &Peripheral_BondMgrCBs, &Peripheral_PeripheralCBs );
//其中Peripheral_PeripheralCBs的定义类似下⾯:
static gapRolesCBs_t Peripheral_PeripheralCBs = {
peripheralStateNotificationCB, // Profile State Change Callbacks,⼴播状态改变,连接断开连上都会调⽤这个回调
peripheralRssiCB, // When a valid RSSI is read from controller (not used by application),当读RSSI后,这⾥会产⽣ RSSI的回调,把rssi 值传进来.
peripheralParamUpdateCB // 连接参数更新,⽐如连接间隔发⽣改变之类,都会传⼊到这个函数⾥
};
2.2 连接断开更新参数等相关API
//断开连接
///这⾥的connHandle 就是在连接的时候传进来的时候的代表⼀个连接,多连接场景,这个值不同.
extern bStatus_t GAPRole_TerminateLink( uint16 connHandle );
//连接参数更新
//这个是从机端,去向主机端请求连接更新
//这⾥的gapConnHandle 就是在连接的时候传进来的时候的代表⼀个连接,多连接场景,这个值不同.
//注意下⾯⼏个参数值,这⼏个值要按照ble的规范去写,如果是对接ios,ios的这⼏个值更为严格.
GAPRole_PeripheralConnParamUpdateReq( gapConnHandle,
DEFAULT_DESIRED_MIN_CONN_INTERVAL,
DEFAULT_DESIRED_MAX_CONN_INTERVAL,
DEFAULT_DESIRED_SLAVE_LATENCY,
DEFAULT_DESIRED_CONN_TIMEOUT,
heartRate_TaskID );
3.[服务/特征相关]
4.[数据传输相关]
5.[其他]
修改发射功率
初始化时候修改
在协议栈出事时候的config.h⽂件中修改以下定义:
#ifndef BLE_TX_POWER
#define BLE_TX_POWER LL_TX_POWEER_0_DBM
#endif
初始化以后修改
这⾥的传参,和BLE_TX_POWER 中宏的取值范围⼀致
extern bStatus_t LL_SetTxPowerLevel( u8 power );
BLE从机的名称
BLE⾥⾯有两个地⽅涉及到名字:
1. ⼴播/扫描回复包中
2. GAP中
在wch的例程⾥,分别对应下⾯两个地⽅
(规范并没有规定,两个地⽅的名字必须⼀致,但是这⾥建议⼤家⽤⼀致.)
如果程序中修改,上电时候改这两个数组就好了
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8 scanRspData[ ] =
{
// complete name
0x12, // length of this data
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
'S',
'i',
'm',
'p',
'l',
'e',
' ',
'P',
'e',
'r',
'i',
'p',
'h',
'e',
'r',
'a',
'l',
// connection interval range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), // 100ms
HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),
LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), // 1s
HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),
// Tx power level
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL,
0 // 0dBm
};
// GAP GATT Attributes
static uint8 attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple Peripheral";
// Set the GAP Characteristics
GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );
IOS中BLE设备的名称问题:
对于ble设备有两个名称,⼀个是在⼴播/扫描回复的字段中放着,⼀个是叫ATT device name,需要连接后去通过GATT读取。
并没有明确的要求⼆者必须⼀致,但是对于诸如N家,S家的SDK来看,⼆者是⼀致的,在IOS 获取BLE设备的名字时,如果这个设备之前没有连接过,那默认是⼴播中的名字;当连接后,IOS会通过去读从机的ATT DEVICE NAME,然后私⾃建⽴MAC->ATT DEVICE NAME 映射表,当下次再扫描时候,直接根据mac地址匹配⾃⼰缓存的BLE设备名字,所以IOS开发者时不时抱怨,为什么⼴播的名字改了,扫描出来的名字却没变。
IOS开发者需要每次都从⼴播/扫描回复数据中拿BLE设备⼴播出来的名称即可。
也可以在开发ble固件时候,强制让⼴播名字与ATT device name ⼀致,这样IOS端的代码就不⽤动.
IOS中的BLE MAC地址问题:
IOS 不提供BLE的MAC地址获取接⼝,如需要mac地址,通常做法是把mac地址放到⼴播信息中,⽐如放到名字中,或者放到⾃定义信息中
微信⼩程序中交换mtu问题
属性类型默认值必填说明
deviceId string是⽤于区分设备的 id
mtu number是最⼤传输单元(22,512) 区间内,单位 bytes
success function否接⼝调⽤成功的回调函数
fail function否接⼝调⽤失败的回调函数
complete function否接⼝调⽤结束的回调函数(调⽤成功、失败都会执⾏)
存在问题:当设备的mtu 不⽀持传⼊的值时候,会直接返回fail,⽽不会把从机⽀持的最⼤值给报上来。
从微信8.0.9 开始,当mtu交换后,会将最终交互的mtu传出来。