WCH沁恒单片机
直播中

刘桂英

8年用户 1281经验值
私信 关注
[问答]

做类似于mesh组网的功能,请问广播在哪里调用啊?

我们要做类似于mesh组网的功能,接收到控制命令后通过广播中转,但是不知道广播在哪里发送的,广播了中转数据就得一直发。我想在中转数据发送完毕就把广播的内容修改为类似于心跳的东西。

回帖(1)

李红霞

2022-9-2 09:47:27
广播开关/重启

//获取当前广播状态
//0为非广播,非0为广播
uint8_t adv_status;
GAPRole_GetParameter(GAPROLE_ADVERT_ENABLED, &adv_status );

//开启广播
uint8_t advertising_enable = true;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8_t ), &advertising_enable );
//关闭广播
advertising_enable = false;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8_t ), &advertising_enable );
// 对应的状态上报:
// :GAPROLE_WAITING
// :pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT

//重启广播
//要先关闭广播,然后在停止广播的事件产生后才能再去使能广播,不能刚执行完关闭广播,就去开启广播
//因为这里只是设置协议栈状态机标识位,实际上广播并没有立刻停止,要等协议栈轮询处理后,才会真正关闭,如果现在去启动广播,协议栈会认为当前已经在广播状态


广播间隔


//获取当前的广播间隔
uint16_t advInt;
advInt = GAP_GetParamValue( TGAP_DISC_ADV_INT_MIN );
PRINT("min adv %drn",advInt);
advInt = GAP_GetParamValue( TGAP_DISC_ADV_INT_MAX );
PRINT("max adv %drn",advInt);

//修改广播间隔

/*注意,广播的参数修改,需要重启广播,才能生效
*可以修改后,然后在广播 GAPROLE_WAITING(广播停止)状态产生后,然后立刻开启广播. 不能关闭广播后立刻开启广播.
*/
uint16 advInt = 160;
GAP_SetParamValue( TGAP_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_DISC_ADV_INT_MAX, advInt );


广播超时


uint16_t adv_timeout;
//获取当前的广播超时时间,以0.625ms为单位,0表示永不超时
adv_timeout = GAP_GetParamValue( TGAP_GEN_DISC_ADV_MIN );
PRINT("adv_timeout =%drn",adv_timeout);
//设置广播间隔,需要重启广播后才能生效
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, 16000 );
//超时产生后,会产生蓝牙状态更新事件上报,对应的事件为"GAPROLE_WAITING"

//也可以通过应用层的去手动控制广播的关闭与开启


设置/修改广播内容

广播内容的修改不用停止广播,直接在协议栈初始化后修改即可

//设置/修改扫描回复以及广播数据,这种修改需要重启广播
GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

//或者 通过下面方式进行修改,实时生效
bStatus_t GAP_UpdateAdvertisingData( u8 taskID,u8 adType,u8 dataLen,u8 *pAdvertData );


设置广播类型

//设置广播类型为 不可连接的,不支持扫描回复包
uint8 initial_adv_event_type = GAP_ADTYPE_ADV_NONCONN_IND;
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &initial_adv_event_type );

//设置广播类型为 可连接的,支持扫描回复包
initial_adv_event_type = GAP_ADTYPE_ADV_IND;
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &initial_adv_event_type );


广播信道MAP


//获取广播信道映射
// GAP_ADVCHAN_DEFINES GAP Advertisement Channel Map
#define GAP_ADVCHAN_37 0x01 //!< Advertisement Channel 37
#define GAP_ADVCHAN_38 0x02 //!< Advertisement Channel 38
#define GAP_ADVCHAN_39 0x04 //!< Advertisement Channel 39
#define GAP_ADVCHAN_ALL (GAP_ADVCHAN_37 | GAP_ADVCHAN_38 | GAP_ADVCHAN_39) //!< All Advertisement Channels Enabled

uint8_t adv_channel_map;
GAPRole_GetParameter(GAPROLE_ADV_CHANNEL_MAP, &adv_channel_map);

//设置广播信道映射
//可以在任何时候设置
adv_channel_map = GAP_ADVCHAN_37 | GAP_ADVCHAN_38 ;
GAPRole_SetParameter( GAPROLE_ADV_CHANNEL_MAP, sizeof( uint8 ), &adv_channel_map);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分