大家好、
我正在使用我的定制板(基于光开关项目的 Z 协议栈1.2)、并且我希望 在 LED2中实现闪烁(HAL_LED_MODE_BLINK)、当我的器件从网关接收到允许加入消息时、在该消息中包含的加入时间内、 我创建了几个断点来查找代码中需要包含 HAL_LED2才能在 ZDapp.c 中闪烁的确切部分、但我没有成功。
有人实施了吗?
BR、
Alex
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我正在使用我的定制板(基于光开关项目的 Z 协议栈1.2)、并且我希望 在 LED2中实现闪烁(HAL_LED_MODE_BLINK)、当我的器件从网关接收到允许加入消息时、在该消息中包含的加入时间内、 我创建了几个断点来查找代码中需要包含 HAL_LED2才能在 ZDapp.c 中闪烁的确切部分、但我没有成功。
有人实施了吗?
BR、
Alex
你好,Yk 先生,很抱歉我说得很差!
´设备已连接到网关、并且在收到另一个 Permit2Join 后表明远程侧允许或允许模式连接设备、我想在另一个状态下闪烁 LED2。
我在 ZDapp_NWkDescListProcessing 中创建了断点、并观察到只有当器件将连接到网络中时才会命中!
我n´t 找到了另一个宏或函数、我可以在书目模式中包含 LED2、请帮我吗?
BR。
Alex
你(们)好、Yk 先生。
我 在 zclXXX_ProcessZDOMsg 内的 ZDO_CB_MSG 中使用了 ZDP API cmd Mgmt_permit_join_req、正如您在下面的代码中看到的那样。
为了进行测试、我在 zclXXX_ProcessZDOMsg 中包含了断点、但网关发送中间 ZDP 允许加入请求的所有时间、在连接器件后 、该断点永远不会被命中。 在相同的处理过程中,我还在连接过程中测试了此 ZDO/ZDP cmd,而且断点 从未被命中。 您能在下面看到一些关于这种陌生行为的图片。
函数 zclXXX_ProcessZDOMsg 代码:
/*********************************************************************
* @fn zclAZh0004_ProcessZDOMsgs
*
* @brief Called when this node receives a ZDO/ZDP response.
*
* @param none
*
* @return status
*/
static void zclAZh0004_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg )
{
zclEZMode_ActionData_t data;
ZDO_MatchDescRsp_t *pMatchDescRsp;
// Let EZ-Mode know of the Simple Descriptor Response
if ( pMsg->clusterID == Match_Desc_rsp )
{
pMatchDescRsp = ZDO_ParseEPListRsp( pMsg );
data.pMatchDescRsp = pMatchDescRsp;
zcl_EZModeAction( EZMODE_ACTION_MATCH_DESC_RSP, &data );
osal_mem_free( pMatchDescRsp );
}
if ( pMsg->clusterID == Mgmt_Permit_Join_req )
{
}
}
许可2加入请求消息:
匹配 描述请求消息:
zclXXX_ProcessZDOMsg 中的断点
黄先生、您好!
在您上次提出建议后、在案例 ZDO_CB_MSG 中、我成功地收到了消息"允许加入请求"。 现在、我的代码在连接过程之后获取允许加入请求、以指示网关已启动发现或更改为连接模式。
´m、我开始了解如何解析消息 permit to join request 并获取 HalLedBlink 函 数上使用的字段持续时间、以及如何在 permit to join 定义的同时设置 LED2闪烁同步。
我尝试使用 ZDObject.c 来形成解析器结构以获得加入请求持续时间字段的许可、这是正确的方法、还是有一个宏来获得它?
BR、
Alex
黄先生。
我n´t 使用 ZDObject.c 中的 duration 变量来实现它、但我没有确定它是否正确、我在 zclAch0004_ProcessZDOMsgs 中进行了更改、如下所示:
请帮帮我。
static void zclAZh0004_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg )
{
zclEZMode_ActionData_t data;
ZDO_MatchDescRsp_t *pMatchDescRsp;
uint8 duration;
switch ( pMsg->clusterID)
{
case Match_Desc_rsp:
pMatchDescRsp = ZDO_ParseEPListRsp( pMsg );
data.pMatchDescRsp = pMatchDescRsp;
zcl_EZModeAction( EZMODE_ACTION_MATCH_DESC_RSP, &data );
osal_mem_free( pMatchDescRsp );
break;
case Mgmt_Permit_Join_req:
duration = pMsg->asdu[ZDP_MGMT_PERMIT_JOIN_REQ_DURATION];
HalLedBlink ( HAL_LED_2, 0, 50, 254 );
default:
break;
}
}你(们)好、Yk 先生。 很抱歉我耽误了时间。
我已经为 LED 2创建了一个新的治疗、以监控网络中的许可2加入请求。 我包含了一个事件来使用 OSAL_timerEx 执行它。
但是、我n´t 断点观察到、在计时器过期后、在我使用5秒的初始示例中、我的程序会在事件之后返回到下一行。 命令 HalLedBlink (HAL_LED_2、0、60、0)永远不会被到达、并且 LED2继续闪烁。
我在新n´tn´t 中看不到任何问题、这些问题说明了为什么运行良好。 请帮帮我。
主要思路是、在我的器件接收到 Permit2Join 请求后、在第一个版本中、当 LED2停止时间到期时、开始闪烁(LED2)。
我在 zclAch0004_ProcessZDOMsgs 中的新代码:
static void zclAZh0004_ProcessZDOMsgs( zdoIncomingMsg_t *pMsg )
{
zclEZMode_ActionData_t data;
ZDO_MatchDescRsp_t *pMatchDescRsp;
uint8 duration;
duration = pMsg->asdu[ZDP_MGMT_PERMIT_JOIN_REQ_DURATION];
switch ( pMsg->clusterID)
{
case Match_Desc_rsp:
pMatchDescRsp = ZDO_ParseEPListRsp( pMsg );
data.pMatchDescRsp = pMatchDescRsp;
zcl_EZModeAction( EZMODE_ACTION_MATCH_DESC_RSP, &data );
osal_mem_free( pMatchDescRsp );
break;
case Mgmt_Permit_Join_req:
if (duration !=0)
{
osal_start_timerEx( zclAZh0004_TaskID, AZh0004_Permit2JOIN_Status_EVT, 10 );
HalLedBlink ( HAL_LED_2, 0, 60, 0 );
} else {
//HalLedBlink ( HAL_LED_2, 0, 60, 0 );
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
}
break;
}
我的新事件代码:
if( events & AZh0004_Permit2JOIN_Status_EVT )
{
HalLedBlink ( HAL_LED_2, 0, 60, 100 );
osal_start_timerEx( zclAZh0004_TaskID, AZh0004_Permit2JOIN_Status_EVT, 5000 ); //5 sec.
return (events ^ AZh0004_Permit2JOIN_Status_EVT);
}
myfile.h 上的事件声明:
// Application Events #define AZh0004_IDENTIFY_TIMEOUT_EVT 0x0001 #define AZh0004_POLL_CONTROL_TIMEOUT_EVT 0x0002 #define AZh0004_EZMODE_TIMEOUT_EVT 0x0004 #define AZh0004_EZMODE_NEXTSTATE_EVT 0x0008 #define AZh0004_MAIN_SCREEN_EVT 0x0010 #define AZh0004_LEVEL_CTRL_EVT 0x0020 #define AZh0004_START_EZMODE_EVT 0x0040 #define AZh0004_Permit2JOIN_Status_EVT 0x0080
你好,黄先生。
此时,我不使用事件中的持续时间变量 ,而只在 zclAch0004_ProcessZDOMSG 中使用。
我不知道为什么、但我不能在 zclAZh0004_ProceesZDOMSG 中包含断点。 但是、商业网关发送两个加入许可、第一个是从持续时间值254开始、第二个是在结束持续时间结束时持续时间、持续时间值为0、因为我成功地检查了持续时间变量、 但是、正如我在上面所说的、我无法检查持续时间变量中的确切值。
关于事件进程不会停止运行,我认为5秒后,该进程应该停止, 并且 zclAch0004_ProcessZDOMSG 中的下一行代码 HalLedBlink (HAL_LED_2、0、60、0)将被到达,之后 LED2可以停止闪烁。
注意:很抱歉用粗体字书写,我在手机上写了这个文本,但无法更改。
您好、Yk 先生、在您的最后一条消息之后、我成功地检查了 duration 变量是否正确地表示从允许加入请求获取的值、并根据从网关发送的消息0xFE (254)或0x00 (0)成功地看到了两种可能性。
我想我可以在 osal_start_timerEx (zclAch0004_TaskID、Ach0004_Permit2JOIN_Status_EVT、[Duration]*1000)中使用持续时间;
但在´s 前、我需要转换为十进制并屏蔽 uint 32.a 新变量[duration (持续时间)]它会更正我的想法、对吗?
BR、
Alex
谢谢 Yk 先生。
但是、在将变量持续时间从十六进制转换为十进制之前、我使用值254 (0xFE)进行一些测试、以查看我的代码是否能够正常运行。 我将事件代码中的 lite 位更改为仅以秒为单位进行计数、并将 HalLedBlink 命令从事件移动 到 zclAch0004_ProcesZDOMSG。
我看到 OSAL_timerEx 没有计数254秒、或者不工作、因为 LED2不闪烁、并且保持开启!
请、LRT ME 查看您在代码中是否看到任何问题?
注意:我使用了其他事件、如 AZHA0004_LEVEL_CTRL_EVT 、并且看到了相同的行为。
我的代码- Mgmt_permit_join_req:
case Mgmt_Permit_Join_req:
if (duration !=0)
{
HalLedBlink ( HAL_LED_2, 0, 50, 100 );
osal_start_timerEx( zclAZh0004_TaskID, AZh0004_Permit2JOIN_Status_EVT,254);
//HalLedBlink ( HAL_LED_2, 0, 60, 0 );
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
} else {
//HalLedBlink ( HAL_LED_2, 0, 60, 0 );
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
}
break;
我的活动代码:
if( events & AZh0004_Permit2JOIN_Status_EVT )
{
osal_start_timerEx( zclAZh0004_TaskID, AZh0004_Permit2JOIN_Status_EVT, 1000 ); // 1 sec.
return (events ^ AZh0004_Permit2JOIN_Status_EVT);
}您是否在"osal_start_timerEx (zclAch0004_TaskID、Ach0004_Permit2JOIN_Status_EVT、254)"行上设置断点、以确保它被首先调用。 如果是、还请添加代码以检查"osal_start_timerEx (zclAZh0004_TaskID、AZh0004_Permit2JOIN_Status_EVT、254)的返回值;并查看它是否返回成功。
´m Yk 先生、我很高兴!
在我进行一些更改之后、在事件和 zclAZh0004_ProcesZDOMSG 中、"osal_start_timerEx (zclAch0004_TaskID、AchZ0004_Permit2JOIN_Status_EVT、254);"所有的操作都非常好、使用固定时间为254000!
您能看到下面的变化!
´m 我´s´ll 转换 duration 变量以在"osal_start_timerEx"中使用它、一旦它运行、我就在这里通知您。
非常感谢 YK 先生!
BR
Alex
更改后的我的事件:
if( events & AZh0004_Permit2JOIN_Status_EVT )
{
//Do things that need periodic processing here!
osal_start_timerEx( zclAZh0004_TaskID, AZh0004_Permit2JOIN_Status_EVT, 1000 ); // 1 sec.
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON ); // new changes on 05/17
return (events ^ AZh0004_Permit2JOIN_Status_EVT);
}
我 的 zclAch0004_ProcesZDOMSG 在更改后:
switch ( pMsg->clusterID)
{
case Match_Desc_rsp:
pMatchDescRsp = ZDO_ParseEPListRsp( pMsg );
data.pMatchDescRsp = pMatchDescRsp;
zcl_EZModeAction( EZMODE_ACTION_MATCH_DESC_RSP, &data );
osal_mem_free( pMatchDescRsp );
break;
case Mgmt_Permit_Join_req:
if (duration !=0)
{
HalLedBlink ( HAL_LED_2, 0, 50, 100 ); // new changes on 05/17
osal_start_timerEx( zclAZh0004_TaskID, AZh0004_Permit2JOIN_Status_EVT,254000);
} else {
//HalLedBlink ( HAL_LED_2, 0, 60, 0 );
HalLedSet ( HAL_LED_2, HAL_LED_MODE_ON );
}
break;
Yk 先生
´m、您能告诉我、我的道路是否正确?
我已经使用 strtoul 函数尝试将 duration 变量从 uint8 (hexa)转换为 usigned long IT 类型。 但我对如何设置可变持续时间的格式以用于 strtoul 函数有一些疑问。 我有恒定值测试、一切都运行良好、但当我尝试使用持续时间时、我需要更改变量数据类型或使用另一种方法来修复它。
请告诉我、我的想法是否合理。
uint8 duration; char str1[] = "0xFE"; duration = pMsg->asdu[ZDP_MGMT_PERMIT_JOIN_REQ_DURATION]; unsigned long int hex_int = strtoul(str1, NULL, 16);