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.

ZDP_BindUnbindReq的使用

Other Parts Discussed in Thread: Z-STACK

我只有两个设备,想让协调器和终端设备进行绑定,绑定表存储在协调器中。

1、用ZDP_BindUnbindReq是否可以实现?

2、如果可以实现,能否讲解一下使用流程,我写了一个代码,发现无法绑定。

我代码的流程如下,请问有什么问题么?

1、定义、注册了绑定端口的描述符

2、定义ZDO_BIND_UNBIND_REQUEST、ZDO_BIND_UNBIND_RESPONSE

3、注册请求和响应

  ZDO_RegisterForZDOMsg(ZDAppTaskID, Bind_rsp );//注册绑定响应
  ZDO_RegisterForZDOMsg(ZDAppTaskID, Bind_req );//注册绑定请求

4、调用函数发起绑定

         ZDP_BindUnbindReq(Bind_req,

MyApp_BindMSGAddr,      //我赋值为协调器的地址0x0000
 NLME_GetExtAddr(),        //协调器的64位地址

MYAPP_BIND_ENDPOINT,  //协调器的绑定端口

(cId_t)MYAPP_BIND_OUTCLUSTERS, //输出簇
 (zAddrType_t*)MyApp_BindDstAddr,     //终端64位地址

MYAPP_BIND_ENDPOINT,                    //终端的绑定端口
                      FALSE );

  • 應該是透過ZDP_BindReq做綁定,可以參考Z-Stack API.pdf

  • 你可以用ZDP_BindReq

    在 mesh1.0中提供了两种常见的绑定方式match 和bind req:


    if ( keys & HAL_KEY_SW_2 )
    {
    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

    // Initiate an End Device Bind Request for the mandatory endpoint
    dstAddr.addrMode = Addr16Bit;
    dstAddr.addr.shortAddr = 0x0000; // Coordinator
    ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
    GenericApp_epDesc.endPoint,
    GENERICAPP_PROFID,
    GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
    GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
    FALSE );
    }

    if ( keys & HAL_KEY_SW_3 )
    {
    }

    if ( keys & HAL_KEY_SW_4 )
    {
    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
    // Initiate a Match Description Request (Service Discovery)
    dstAddr.addrMode = AddrBroadcast;
    dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
    ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
    GENERICAPP_PROFID,
    GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
    GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
    FALSE );
  • ZDP_BindReq就是ZDP_BindUnbindReq,
    #define ZDP_BindReq( dstAddr, SourceAddr, SrcEP, \
    ClusterID, DestinationAddr, DstEP, SecurityEnable ) \
    ZDP_BindUnbindReq( Bind_req, dstAddr, \
    SourceAddr, SrcEP, ClusterID, \
    DestinationAddr, DstEP, SecurityEnable )
    在Z-Stack API.pdf中没有找到具体的讲解。
    比如我协调器发起绑定,要和终端1进行绑定,调用ZDP_BindReq,每个参数应该怎么赋值呢?
    下面赋值对么?
    ZDP_BindReq( 协调器16位地址, 协调器64位地址, 协调器绑定端口,
    输出ID, 终端164位地址, 终端1绑定端口, 不是能) 。
  • 1、ZDP_EndDeviceBindReq是否至少需要三个设备。
    2、ZDP_MatchDescReq需要几个设备?
  • 用ZDP_BindReq怎么实现?能否讲解一下?
  • 你的赋值是对的
  • 1、ZDP_EndDeviceBindReq是否至少需要三个设备。只要有兩个就行,其中一個要是協調器
    2、ZDP_MatchDescReq需要几个设备?兩个
  • 1、手册上说,ZDP_EndDeviceBindReq,终端A和终端B要实现绑定,需要经过协调器,也就是需要三个设备。
    我如果让协调器和终端进行绑定,协调器直接调用ZDP_EndDeviceBindReq,只需要两个设备。是这样么?
  • ZDP_EndDeviceBindReq 最少2个即绑定双方必须包含ZC
    ZDP_MatchDescReq 绑定双方即可。
  • 我确实是这么赋值的,可是发现无法使用绑定通信。
  • 有没有ZDP_BindReq的使用例程?
    我想实现在网络建立、加入成功后,自动建立绑定。
    ZDP_BindReq、ZDP_EndDeviceBindReq ZDP_MatchDescReq这三个用哪个合适?
  • 應該是你協調器跟終端之間的in/out cluster沒對應好,你有抓包看看狀況嗎?
  • 如YK说的一样,怀疑你的cluster 不匹配,上传抓包文件吧。
  • 协调器是out cluster 终端是in cluster 。是这样吧?
    协调器中::::
    out cluster 定义如下:
    const SimpleDescriptionFormat_t MyApp_Bind_SimpleDesc =
    {
    MYAPP_BIND_ENDPOINT, // int Endpoint;
    MYAPP_PROFID, // uint16 AppProfId[2];
    MYAPP_DEVICEID, // uint16 AppDeviceId[2];
    MYAPP_DEVICE_VERSION, // int AppDevVer:4;
    MYAPP_FLAGS, // int AppFlags:4;
    0, // byte AppNumInClusters;
    NULL, // byte *pAppInClusterList;
    MYAPP_BIND_MAX_CLUSTERS, // byte AppNumOutClusters;
    (cId_t *)MyApp_Bind_OutClusterList // byte *pAppOutClusterList;输出
    };
    协调器发起绑定:
    ZDP_BindUnbindReq(Bind_req,
    MyApp_BindMSGAddr, //协调器地址0x0000
    NLME_GetExtAddr(), //协调器的64位地址
    MYAPP_BIND_ENDPOINT, //协调器的绑定端口号
    (cId_t)MYAPP_BIND_OUTCLUSTERS, //输出簇 ----------------------------这个参数对么?
    (zAddrType_t*)MyApp_BindDstAddr, //终端的64位地址
    MYAPP_BIND_ENDPOINT, //终端的绑定端口号
    FALSE );
    终端中:::
    in cluster 定义如下:
    const SimpleDescriptionFormat_t MyApp_Bind_SimpleDesc =
    {
    MYAPP_BIND_ENDPOINT, // int Endpoint;
    MYAPP_PROFID, // uint16 AppProfId[2];
    MYAPP_DEVICEID, // uint16 AppDeviceId[2];
    MYAPP_DEVICE_VERSION, // int AppDevVer:4;
    MYAPP_FLAGS, // int AppFlags:4;
    MYAPP_BIND_MAX_CLUSTERS, // byte AppNumInClusters;
    (cId_t *)MyApp_Bind_InClusterList, // byte *pAppInClusterList;
    0, // byte AppNumOutClusters;
    NULL // byte *pAppOutClusterList;
    };


    请问这样有错么?定义了相关的端口描述符,没做其他操作,好像处理是协议栈自动完成的。

    请您帮我看一下哪里有问题/
  • 应该事我的in/out cluster 没对应好。但是我不知道哪里错了。
    我每个设备中用到了两个端口,一个端口20用于绑定,一个端口10用于命令控制。
    协调器的端口20中为输出,终端的端口20中为输入。
    协调器和终端的端口10 为输入输出。请问这个可以么?
  • 不大懂你的输入输出是指什麼
  • 端口20用于绑定,协调器的端口20为in cluster ,终端的端口20位out cluster 。
  • 一个设备中我想用两个endpoint。端口号10用来正常的发送接收数据。端口号20 用来单向发送配置信息。现在的问题是:模板中已经有了端口号10 的定义,端口号20 该如何定义?完全按照端口号10 来copy就可以了么?
  • 按照端口号10 来copy就可以

  • 绑定成功了,而且能正常通信。但是发现一个问题。协调器如果和两个终端(1、2)进行绑定。
    步骤如下:1、协调器和终端1建立绑定;2、协调器和终端2建立绑定。
    3、协调器通过绑定表发送信息。

    结果发现只有终端2 接收到了信息,请问为什么不是两个设备都接收到消息?
  • 建議你抓包看發生了什麼狀況
  • 找到了,终端和协调器第一次同时按下按键,会建立绑定。再次同时按下按键又会解除绑定,导致了上述的错误。
    我想让设备上电后,自动绑定。如果这样的话,设备异常重启,就是导致之前绑定好的设备,会解除绑定,是这样么?
  • 如果你應用程序修改了绑定的邏輯,你得要確認不會隨意被解除绑定,基本上綁定是存在NV,設備重启並不会解除绑定