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.

SampleSwitch 和SampleLight例程使用

SampleSwitch 和SampleLight例程,home 1.2.2
1.开关控制灯的时候,是通过zclGeneral_SendOnOff_CmdToggle函数去控制灯?
2.灯那边处理来自开关命令的是通过哪个函数执行开关灯动作的?
3.灯执行开关动作后,如果想把灯现在的状态再发给开关,用哪个函数发送?开关那边哪个函数接收并处理?

  • 1. 是通过zclGeneral_SendOnOff_CmdToggle函数去控制灯
    2. 处理来自开关命令的是zclSampleLight_OnOffCB
    3. 灯现在的状态再发给开关用zcl_SendReportCmd,开关那边接收函数用zclSampleSw_ProcessIncomingMsg
  • zclGeneral_SendOnOff_CmdToggle,你可以定义这个函数,这是控制灯状态的反转。

    有其他控制灯的ZCL command 函数,你定义这个都可以看见。

    类似于:

    /*
     *  Send an On Off Command - COMMAND_ONOFF_OFF
     *  Use like:
     *      ZStatus_t zclGeneral_SendOnOff_CmdOff( uint16 srcEP, afAddrType_t *dstAddr, uint8 disableDefaultRsp, uint8 seqNum );
     */
    #define zclGeneral_SendOnOff_CmdOff(a,b,c,d) zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF, COMMAND_OFF, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR, (c), 0, (d), 0, NULL )
    
    /*
     *  Send an On Off Command - COMMAND_ONOFF_ON
     *  Use like:
     *      ZStatus_t zclGeneral_SendOnOff_CmdOn( uint16 srcEP, afAddrType_t *dstAddr, uint8 disableDefaultRsp, uint8 seqNum );
     */
    #define zclGeneral_SendOnOff_CmdOn(a,b,c,d) zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF, COMMAND_ON, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR, (c), 0, (d), 0, NULL )
    
    /*
     *  Send an On Off Command - COMMAND_ONOFF_TOGGLE
     *  Use like:
     *      ZStatus_t zclGeneral_SendOnOff_CmdToggle( uint16 srcEP, afAddrType_t *dstAddr, uint8 disableDefaultRsp, uint8 seqNum );
     */
    #define zclGeneral_SendOnOff_CmdToggle(a,b,c,d) zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF, COMMAND_TOGGLE, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR, (c), 0, (d), 0, NULL )
    

    至于如何反向,在light里面有回调可以看见,类似下面:

    static zclGeneral_AppCallbacks_t zclSampleLight_CmdCallbacks =
    {
    zclSampleLight_BasicResetCB, // Basic Cluster Reset command
    NULL, // Identify Trigger Effect command
    zclSampleLight_OnOffCB, // On/Off cluster commands
    NULL, // On/Off cluster enhanced command Off with Effect
    NULL, // On/Off cluster enhanced command On with Recall Global Scene
    NULL, // On/Off cluster enhanced command On with Timed Off
    #ifdef ZCL_LEVEL_CTRL
    zclSampleLight_LevelControlMoveToLevelCB, // Level Control Move to Level command
    zclSampleLight_LevelControlMoveCB, // Level Control Move command
    zclSampleLight_LevelControlStepCB, // Level Control Step command
    zclSampleLight_LevelControlStopCB, // Level Control Stop command
    #endif
    #ifdef ZCL_GROUPS
    NULL, // Group Response commands
    #endif
    #ifdef ZCL_SCENES
    NULL, // Scene Store Request command
    NULL, // Scene Recall Request command
    NULL, // Scene Response command
    #endif
    #ifdef ZCL_ALARMS
    NULL, // Alarm (Response) commands
    #endif
    #ifdef SE_UK_EXT
    NULL, // Get Event Log command
    NULL, // Publish Event Log command
    #endif
    NULL, // RSSI Location command
    NULL // RSSI Location Response command
    };

    至于灯上报状态,在ZCL spec里面没有这个attitude ,你要走私有协议。

    如果有疑问,建议先去看一下程序,上面的程序在demo里面写的很清晰。

    附上ZCL 标准:

    www.zigbee.org/.../07-5123-06-zigbee-cluster-library-specification.pdf

  • 1.zclSampleSw_IdentifyCB是做什么用的?识别灯吗?
    2.ZCL_READ和ZCL_WRITE以及ZCL_DISCOVER是干什么用的?
    3.没有LCD的时候怎么禁用?默认的是LCD_SUPPORTED=DEBUG
    4.保存地址信息去掉叉号xNV_RESTORE,终端自动启动保留叉号xHOLD_AUTO_START,对吧?
    5.xPOWER_SAVING和-DRFD_RCVC_ALWAYS_ON=FALSE他们有什么不同,我想终端低功耗要怎么做?
  • 1. 识别switch

    2. 使能zcl read/write/discover服務用的

    3. 拿掉LCD_SUPPORTED=DEBUG

    4. 建議使能NV_RESTORE

    5. 终端低功耗要使能POWER_SAVING和-DRFD_RCVC_ALWAYS_ON=FALSE

  • 没有屏幕的时候的,禁用LCD,
    是直接把LCD_SUPPORTED=DEBUG一行去了,还是加个叉号 xLCD_SUPPORTED=DEBUG
  • ZCL_READ和ZCL_WRITE以及ZCL_DISCOVER
    这些都用来处理ZCL read write discover 命令的。
    先去看看ZCL spec。
  • 这就是个宏定义,随便怎么弄,不一样就不生效
  • 没有屏幕的时候的,禁用LCD

    可以直接把LCD_SUPPORTED=DEBUG一行去了也可以加个叉号 xLCD_SUPPORTED=DEBUG,我私人愛加个叉号

  • 请教一个问题,我们没有使用EZMODE,
    协调器开启允许入网,终端加入网络,
    但是我下面的绑定是什么意思?
    不太明白绑定和NV_RESTORE的区别,
    开启NV_RESTORE,重启后终端会自动加入协调器,
    但是绑定后又是什么情况?
    // bind to remote light
    zAddrType_t dstAddr;
    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

    // Initiate an End Device Bind Request, this bind request will
    // only use a cluster list that is important to binding.
    dstAddr.addrMode = afAddr16Bit;
    dstAddr.addr.shortAddr = 0; // Coordinator makes the match
    ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
    SAMPLESW_ENDPOINT,
    ZCL_HA_PROFILE_ID,
    0, NULL, // No incoming clusters to bind
    ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,
    TRUE );
  • NV_RESTORE是把Zigbee網絡相關的資訊存到NV,所以就算設備重新上電,資料也會保存著;绑定是用來指定command或是report要發送的端點地址跟endpoint的資訊的,跟NV_RESTORE沒有多大關聯,頂多是你始能了NV_RESOTRE,绑定表也會存在NV中
  • 比如说环境中只要一个协调器和多个终端,协调器控制终端的前提需要终端加入他,
    如果协调器和终端已经绑定,把他们都重启,此时如果终端处于15分钟的睡眠期(即此段时间,终端不会加入协调器),
    那么此段时间是不是协调器也能控制终端?
  • NV就是存储网络信息的,如果你开启NV,你重启就相当于一个新设备。

    当然你要使用绑定,要开启NV,否则掉电后绑定表也没了。
    当没有NV,睡眠不会丢失网络信息,除非你重启,深度睡眠没有poll rate ,coordinator无法控制。
  • 开启NV,如果某个时刻,终端掉线了,此时直接用短地址控制肯定是不行的,
    如果终端和协调器之前是绑定过的,此时协调器能否控制终端?
  • 终端处于睡眠時协调器就不能控制终端
  • 你有个概念错误吧。
    能否控制不取决于你的是否绑定。。。。
    直接用短地址单播是最稳定的方式。
    你开启NV,掉线重连就可以控制。
    你掉线了,不重连怎么也控制不了。

  • 还有个情况,比如一个环境里有30个终端,一个协调器,
    当停电又恢复的时候,所有的终端都会同时去连协调器,
    这样会不会协调器响应不过来导致终端入网失败?
  • rejoin 应该不会,因为过程很简单,,你这个问题之前不是讨论过。
  • 基本上終端回連不會同時,照理來說不会协调器响应不过来导致终端入网失败,就算有這樣的情況,反正終端會在重試回連