协调器这样发数据,节点都收不到数据,是哪里设置不对吗
源码如下
if (pDstAddr->addr.shortAddr == 0)
{
uint8_t *pMsgBuf = (uint8_t *)OsalPort_malloc(sendLen);
if(pMsgBuf)
{
/* Build the message */
uint8_t *pBuf = pMsgBuf;
*pBuf++ = (uint8_t)Smgs_cmdIds_broadcastCtrlMsg;
memcpy(pBuf, pMsg, len);
sendBroadcastMsg(Smgs_cmdIds_broadcastCtrlMsg,
sendLen,
pMsgBuf);
OsalPort_free(pMsgBuf);
}
}
static void sendBroadcastMsg(Smsgs_cmdIds_t type, uint16_t len,
uint8_t *pData)
{
ApiMac_mcpsDataReq_t dataReq;
/* Only supported for FH mode */
if(!fhEnabled)
{
return;
}
/* Fill the data request field */
memset(&dataReq, 0, sizeof(ApiMac_mcpsDataReq_t));
dataReq.dstAddr.addrMode = ApiMac_addrType_none;
dataReq.srcAddrMode = ApiMac_addrType_short;
dataReq.dstPanId = devicePanId;
dataReq.msduHandle = getMsduHandle(type);
dataReq.txOptions.ack = false;
dataReq.txOptions.indirect = false;
dataReq.msdu.len = len;
dataReq.msdu.p = pData;
#ifdef FEATURE_MAC_SECURITY
/* Fill in the appropriate security fields */
Cllc_securityFill(&dataReq.sec);
#endif /* FEATURE_MAC_SECURITY */
/* Send the message */
ApiMac_mcpsDataReq(&dataReq);
}
Viki Shi:
1、参考一下sensor/collector的例程
2、抓包看一下具体情况
YiKai Chen:
sensor的RX如果不是一直開著,广播数据可能漏接
FreePom:
回复 Viki Shi:
你好
collector的发广播数据为什么要限制在FH模式下,之前发不出广播数据,是因为fhEnabled这个标志影响了
static void sendBroadcastMsg(Smsgs_cmdIds_t type, uint16_t len,uint8_t *pData)
{ApiMac_mcpsDataReq_t dataReq;
/* Only supported for FH mode */if(!fhEnabled){return;}
FreePom:
回复 YiKai Chen:
谢谢提醒
Viki Shi:
回复 FreePom:
因为广播数据没有ACK,无法保证睡眠节点能收到广播消息。而在FH模式下,存在一个sensor可以接收广播数据的特定时隙
FreePom:
回复 Viki Shi:
意思是,如果广播不需要ACK的话,可以不需要这个条件限制了?
FreePom:
回复 Viki Shi:
好的,谢谢