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.

[参考译文] CC2530:如何在网关发送的加入许可期间刷写 LED2

Guru**** 2562970 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/999694/cc2530-how-do-i-flash-led2-during-the-permit-to-join-sent-by-gateway

器件型号:CC2530

大家好、  

我正在使用我的定制板(基于光开关项目的 Z 协议栈1.2)、并且我希望 在 LED2中实现闪烁(HAL_LED_MODE_BLINK)、当我的器件从网关接收到允许加入消息时、在该消息中包含的加入时间内、 我创建了几个断点来查找代码中需要包含 HAL_LED2才能在 ZDapp.c 中闪烁的确切部分、但我没有成功。

有人实施了吗?

BR、

Alex

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您可以尝试在 ZDRApp_NWKDESCListProcessing (位于 ZDRApp.c 内)中添加闪烁的 LED2。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Yk 先生,很抱歉我说得很差!

    ´设备已连接到网关、并且在收到另一个 Permit2Join 后表明远程侧允许或允许模式连接设备、我想在另一个状态下闪烁 LED2。

    我在 ZDapp_NWkDescListProcessing 中创建了断点、并观察到只有当器件将连接到网络中时才会命中!

    我n´t 找到了另一个宏或函数、我可以在书目模式中包含 LED2、请帮我吗?

    BR。

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您可以尝试在 zclXXX_EVENT_LOOP 的"案例 ZDO_CB_MSG:"中添加处理 Mgmt_permit_join_req。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、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 中的断点

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试在 zclAch0004__Init 中添加"ZDO_RegisterForZDOMsg (task_id、Mgmt_permit_join_req);"以注册接收 Mgmt_permit_join_req 事件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    黄先生、您好!

     在您上次提出建议后、在案例 ZDO_CB_MSG 中、我成功地收到了消息"允许加入请求"。 现在、我的代码在连接过程之后获取允许加入请求、以指示网关已启动发现或更改为连接模式。

    ´m、我开始了解如何解析消息 permit to join request 并获取 HalLedBlink 函 数上使用的字段持续时间、以及如何在 permit to join 定义的同时设置 LED2闪烁同步。

    我尝试使用 ZDObject.c 来形成解析器结构以获得加入请求持续时间字段的许可、这是正确的方法、还是有一个宏来获得它?

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以在 ZDObject.c 中引用 ZDO_ProcessMgmtPermitJoinq 来解析 Mgmt_permit_join_req。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,黄先生。

    我想使用持续时间来控制 LED2上的双边时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ZDObject.c 中的 ZDO_ProcessMgmtPermitJoinq 显示了如何获取持续时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    黄先生。

    我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;
    	
    
      }
      
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您可以设置一个断点来检查传入的 msg 缓冲区、以查看您的问题是什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否设置了断点以检查接收 Mgmt_permit_join_req 时 duration 变量的值是多少?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,黄先生。

    此时,我不使用事件中的持续时间变量 ,而只在  zclAch0004_ProcessZDOMSG 中使用。

    我不知道为什么、但我不能在 zclAZh0004_ProceesZDOMSG 中包含断点。 但是、商业网关发送两个加入许可、第一个是从持续时间值254开始、第二个是在结束持续时间结束时持续时间、持续时间值为0、因为我成功地检查了持续时间变量、 但是、正如我在上面所说的、我无法检查持续时间变量中的确切值。

    关于事件进程不会停止运行,我认为5秒后,该进程应该停止,   并且 zclAch0004_ProcessZDOMSG 中的下一行代码 HalLedBlink (HAL_LED_2、0、60、0)将被到达,之后 LED2可以停止闪烁。  

    注意:很抱歉用粗体字书写,我在手机上写了这个文本,但无法更改。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我看到您使用的是“if (duration !=0)…” 在您的案例 中、Mgmt_permit_join_req:。 您为什么说您不使用持续时间? 您可以尝试将编译器优化级别设置为低电平、以查看 是否可以在 Mgmt_permit_join_req 情况下设置断点来调试什么持续时间值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您可以使用 uint32变量来保留供以后使用的持续时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,先生,非常感谢!!!

    在您发表最后一篇文章后、我理解正确的方式!

    现在、我的代码在我将变量 duration 定义为 UINT32之后运行得很好。

    我会喜欢我的新器件!

    BR、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很酷!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢先生。 黄!!!

    BR、

    Alex