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.

怎样配置一个TouchLink Target?

Genius 3030 points
Other Parts Discussed in Thread: Z-STACK, CC2652R, CC2530, CC2538

添加预编译

BDB_TL_TARGET
INTER_PAN

然后用按键启动target,但是每次按下按键0后都会重启是怎么回事?还是说我的启动流程是错的?

 if(keys & HAL_KEY_SW_0)
   {
      HalLcdWriteString("BDB_TL!!", 3);
      //bdb_StartCommissioning(BDB_COMMISSIONING_MODE_INITIATOR_TL);
       bdb_TouchlinkSetAllowStealing(1);
       touchLinkTarget_EnableCommissioning( TOUCHLINK_TARGET_PERPETUAL-10 );
   }

  • 预编译BDB_TOUCHLINK_CAPABILITY_ENABLED == TRUE

    你可以去看一下ZR Light (touchlink target) and ZR Switch (touchlink initiator)

    启动设置为bdb_StartCommissioning(BDB_COMMISSIONING_MODE_INITIATOR_TL);

    然后去追踪程序:

    #if ( defined ( BDB_TL_INITIATOR ) && (BDB_TOUCHLINK_CAPABILITY_ENABLED == TRUE) )
      if(bdbAttributes.bdbCommissioningMode & BDB_COMMISSIONING_MODE_INITIATOR_TL)
      {
        uint16 nwkAddr;
    
        //Does the device supports this commissioning mode?
        if(bdbAttributes.bdbNodeCommissioningCapability & BDB_TOUCHLINK_CAPABILITY)
        {
          //Clear previous state and substates
          osal_memset(&bdbCommissioningProcedureState,0,sizeof(bdbCommissioningProcedureState));
          bdbCommissioningProcedureState.bdbCommissioningState = BDB_COMMISSIONING_STATE_TL;
          
          // Get our short address
          ZMacGetReq( ZMacShortAddress, (byte*)&nwkAddr );
    
          // Check if address is invalid
          if ( nwkAddr >= NWK_BROADCAST_SHORTADDR_DEVZCZR )
          {
            initiatorSelectNwkParams();
          }
          
          touchLinkInitiator_StartDevDisc( );  
          
          bdb_NotifyCommissioningModeStart(BDB_COMMISSIONING_TOUCHLINK);
        }

    上面的程ZR Light (touchlink target) and ZR Switch (touchlink initiator)中callback已经写好了,具体流程去看Z-Stack 3.0 Developer's Guide

  • 您好
    Z-Stack中已经有了BDB_TOUCHLINK_CAPABILITY_ENABLED的配置,如下:
    #if defined ( INTER_PAN ) && ( defined ( BDB_TL_INITIATOR ) || defined ( BDB_TL_TARGET ) )
    #define BDB_TOUCHLINK_CAPABILITY_ENABLED 1
    #else
    #define BDB_TOUCHLINK_CAPABILITY_ENABLED 0
    #endif
    我现在是Target 收不到TouchLink的Scan Request。
  • 你有没有跳到 touchLinkInitiator_StartDevDisc( ); 这句话?
  • 有的,但target就是收不到REQUEST
  • 抓包又发出吗?没有response?

    在touchLinkTargetApp_Init中注册了 bdbTL_RegisterInterPANCmdCallbacks(&touchLinkTarget_CmdCBs);

    这个回调最后出去rsp。

    static ZStatus_t targetNwkStartReqCB( afAddrType_t *srcAddr, bdbTLNwkStartReq_t *pReq, uint8 seqNum )
    {
    #if ZSTACK_END_DEVICE_BUILD
      return ( ZFailure );
    #else
      if ( touchLink_IsValidTransID( pReq->transID ) == FALSE )
      {
        return ( ZFailure );
      }
      
      dstAddr = *srcAddr;
      dstAddr.panId = 0xFFFF;
    
      zstack_tlTargetNwkStartReq_t *pTargetNwkStartReq;
      pTargetNwkStartReq = (zstack_tlTargetNwkStartReq_t*)zcl_mem_alloc( sizeof(zstack_tlTargetNwkStartReq_t) );
    
      zcl_memcpy(&(pTargetNwkStartReq->addr), &dstAddr, sizeof(afAddrType_t));
      zcl_memcpy(&(pTargetNwkStartReq->nwkStartReq), pReq, sizeof(bdbTLNwkStartReq_t));
      pTargetNwkStartReq->seqNum = seqNum;
      pTargetNwkStartReq->allowStealing = touchlinkAppAllowStealing;
    
      Zstackapi_tlTargetNwkStartReqInd(tlAppEntity, pTargetNwkStartReq);
      zcl_mem_free(pTargetNwkStartReq);
    
      return ( ZSuccess );
    #endif
    }

    zstack_ZStatusValues Zstackapi_tlTargetNwkStartReqInd(
    
       ICall_EntityID appEntity, zstack_tlTargetNwkStartReq_t *pReq)
    
    {
    
       // Build and send the message, then wait of the response message
    
       return( sendReqDefaultRsp(appEntity, zstackmsg_CmdIDs_TL_TARGET_NWK_START_REC_IND,
    
                                 pReq, sizeof(zstackmsg_tlTargetNwkStartReq_t),
    
                                 matchTLTargetNetworkStartReqInd) );
    
    }

    你用的是我让你用的那个两个ZR程序?

  • Target 收到req后到了这里,但 抓包没发现scan Response

    static ZStatus_t targetScanReqCB( afAddrType_t *srcAddr, bdbTLScanReq_t *pReq, uint8 seqNum )

    {

     ZStatus_t ret = ZSuccess;

     int8 rssi;

     char buff[4];

     extern void HalLcdWriteStringValue( char *title, uint32 value, uint8 format, uint8 line );

     extern void HalLcdWriteString ( char *str, uint8 option);

     HalLcdWriteStringValue("TL_I", pReq->touchLinkInitiator,10, 1);

     if( pReq->touchLinkInitiator == FALSE )

     {

       return ZFailure;

     }

     rssi = touchLink_GetMsgRssi();

     sprintf(buff, "%d", rssi);

     HalLcdWriteString(buff,  2);

     if( rssi > TOUCHLINK_WORST_RSSI )

     {

       if ( pDiscoveredNwkParamList == NULL )

       {

         dstAddr = *srcAddr;

         dstAddr.panId = 0xFFFF;

         ret = touchLink_TargetSendScanRsp( TOUCHLINK_INTERNAL_ENDPOINT, &dstAddr, pReq->transID, seqNum );

         if ( ret == ZSuccess )

         {

           touchLinkTransID = pReq->transID;

         }

       }

     }

     HalLcdWriteStringValue("ret", ret, 10, 3);

     return ( ret ); //返回0

    }

  • 因为我的板子是自己做的,所以没有用你说的那两个ZR程序,但是我是按照那两个程序来改的。
  • 我大致说一下,我这边是可以的,因为没带PC只能用Wireshark抓包就不上传了。

    TARGET:

               zstack_bdbStartCommissioningReq.commissioning_mode =

           BDB_COMMISSIONING_MODE_NWK_STEERING|BDB_COMMISSIONING_MODE_NWK_FORMATION;

               Zstackapi_bdbStartCommissioningReq(zclSampleLight_Entity,&zstack_bdbStartCommissioningReq);

               touchLinkTarget_EnableCommissioning( TOUCHLINK_TARGET_PERPETUAL);

    BDB_TL_INITIATOR :

    zstack_bdbStartCommissioningReq_t zstack_bdbStartCommissioningReq;

           zstack_bdbStartCommissioningReq.commissioning_mode = BDB_COMMISSIONING_MODE_INITIATOR_TL;

           Zstackapi_bdbStartCommissioningReq(zclSampleSw_Entity,&zstack_bdbStartCommissioningReq);

  • 我在Samplelight找不到以下两个函数/变量
    Zstackapi_bdbStartCommissioningReq,zstack_bdbStartCommissioningReq
  • 我这个是CC2652R,类似于bdb_StartCommissioning(BDB_COMMISSIONING_MODE_INITIATOR_TL);
  • 你是用CC253x還是CC2652來測試touch link?
  • 您好,我昨天先让Router(Touchlink target)建立一个网络后,再让EndDevice(initiator)发送scan request,Router有回应,并且到了Identity这个流程,但是没有到Network Join这里;BDB文档和Sample文档里说target收到network start  request才建立网络也可以的啊。

  • 我用的CC2530
  • 你Touchlink target只写touchLinkTarget_EnableCommissioning( TOUCHLINK_TARGET_PERPETUAL);,
    也是可以的,你是发出Identity这个流程,之后会有一个beacon request发出建立网络以及后续入网。慢慢去排查程序吧。
  • target(router) response 后就没反应了

  • 你什么芯片?你把两个板子拉近试一下。
  •  CC2530,板子已经很近了, RSSI = -27, Initiator(EndDevice)发出的scan request如下

  • 那就需要自己去写了,CC2652R那个是可以直接更改,你自己去看一下程序,我有时间的话,会写一个出来的。
  • bdb_touchlink 不是写好的吗,用户应该只需要调用api就可以了吧?
  • 你好,能不能把你的抓包发我一下?我现在到了network start request这个步骤

  • 你是light 和switch的程序吗,ZLL是基于ON OFF的的cluster的,你去light 和switch的程序去更改,或者你把程序贴上来,我的没有network start request,我的是join,不是start,仔细去看.
  • touch link 只能用在 On Off 这个Cluster?
  • ZLL 是 light switch的程序。

    请见:https://e2e.ti.com/support/wireless_connectivity/zigbee_6lowpan_802-15-4_mac/f/158/t/706202

  • 追踪代码返现Target(Router )建立新网络后并没有按照Z-Stack 3.0 Sample Application User's Guide.pdf中所展示的流程(如图)给

    Initiator(EndDevice)发送Network start respons,而是通过NLME_DirectJoinRequestWithAddr()函数请求Initiator入网,但是返回值却是ZNwkAlreadyPresent          0xc5,也没有抓到任何数据包,估计是没有发数据出来。

  • 如果你使用CC2530添加BDB_TL_TARGET及INTER_PAN到SampleLigth router應該是會編譯失敗,檢查看看你是不是為了優化內存使用移除了一些程序造成問題?因為CC2530內存限制,比較建議你用CC2538或是最新的CC2652測試touchlink

  • 对的,建议使用的是CC2652R,如果想使用CC2530建议采用RAM优化以及FLASH优化,请参考下面的文章。
    processors.wiki.ti.com/.../Optimizing_Flash_and_RAM_Usage_of_Z-Stack_for_CC2530
  • 你好,我屏蔽了一些不需要的功能,现在Router(Target)正常,但是EndDevice(Initiator)不正常,基本上每次Rejoin后PanID都会变,只有少数是成功的。

  • CC2530什么时候支持TouchLink呢?
  • EndDevice(Initiator)不正常,基本上每次Rejoin后PanID都会变

    這還是要你自己檢查看看有沒有改動了什麼不該改動的地方了

  • 用的CC2530,只更改了Router Touchlink的部分代码,EndDevice Touchlink部分没有改过,很头痛。