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.

INTER PAN單方無法收到

Other Parts Discussed in Thread: CC2530

您好

我正在試著透過INTER PAN模式傳送資訊,設定END端的PANID.

ZStack的版本為 2.5.1a

2台CC2530,皆已實作interPAN,預設channel 為0xb

1為Coordinator,開機後,即設定自己的PANID為IEEE address未四碼,進入Coordinator模式,並設定為 NLME_PermitJoiningRequest(0);

1為Router,一直處在無法入網的狀態。

Step1 :

按住Coordinator的SW1,進入INTER PAN 模式, channel 為 0x10,維持15秒

Function: StubAPS_SetInterPanChannel(INTER_PAN_CHANNEL);

Step2

按下Router的SW1,進入INTER PAN 模式, channel 為 0x10,維持15秒

Function: StubAPS_SetInterPanChannel(INTER_PAN_CHANNEL);

使用  ZInterReportMAC 主動傳送自己的mac address,coordinator在收到後,以 ZInterSendPANID 回報網路的PANID ,Router收到後,寫入NV RAM。

狀況:

Coordinator能收到INTER PAN封包,並回應。在Sniffer 也都有看到Router傳出,與Coordinator回應的封包(附件),但是在 Router 端一點反應都沒有。
在ZHome_ZMessageMSGCB沒有回應,在Af.c的afIncoming Data 也沒看到有東西傳入。

但是!在coordinator將此 router寫入白名單後並予許入網,router在try了幾 次後,會入網成功。

入網成功後,再以上面的方式傳送INTER PAN封包,Router的確能接到封包,並成功的將PANID寫入NV RAM.

------------------------------ 底下為我使用的function ------------------------------

static void ZInterReportMAC(void)
{

  afAddrType_t dstAddr;
  dstAddr.addrMode = afAddrBroadcast;
  dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL; // 0xFFFF
  dstAddr.endPoint = STUBAPS_INTER_PAN_EP;
  dstAddr.panId = 0xFFFF;

  uint8 byData[10];
  memcpy(&byData,(uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET),Z_EXTADDR_LEN);
  byData[Z_EXTADDR_LEN] = MY_TYPE;
  byData[Z_EXTADDR_LEN+1] = ZHome_DEV_TYPE;

  if ( AF_DataRequest( &dstAddr,
                        &ZHome_epDesc,
                        CID_INTER_E2C_MYMAC,
                        10,
                        &byData[0],
                        &ZHome_TransID,
                        AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) != afStatus_SUCCESS )
  {
    // Error occurred in request to send.
    HalLedSet ( LED_RED, HAL_LED_MODE_FLASH );
  }
  PrintInfoToLCD();
}

/// ZigBee 透過InterPAN發送 自身 MAC address
void ZInterSendPANID(uint8 *pMAC)
{
  afAddrType_t dstAddr;
  dstAddr.addrMode = afAddrBroadcast;
  dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL; // 0xFFFF
  dstAddr.endPoint = STUBAPS_INTER_PAN_EP;
  dstAddr.panId = 0xFFFF;

  uint8 byData[10];

  byData[0] = ((_NIB.nwkPanId >> 8) & 0xFF);
  byData[1] = ((_NIB.nwkPanId ) & 0xFF);

  memcpy(&byData[2],pMAC,Z_EXTADDR_LEN);
  HalLcdWriteString("ZInterSendPANID",HAL_LCD_LINE_7);
 

  if ( AF_DataRequest( &dstAddr,
                  &ZHome_epDesc,
                 CID_INTER_C2E_PANID,
                 10,
                &byData[0],
                &ZHome_TransID,
                AF_DISCV_ROUTE,
               AF_DEFAULT_RADIUS ) != afStatus_SUCCESS )
  {
     // Error occurred in request to send.
     HalLedSet ( LED_RED, HAL_LED_MODE_FLASH );

  }
}

// 接收處
static void ZHome_ZMessageMSGCB( afIncomingMSGPacket_t *pkt )
{

case CID_INTER_C2E_PANID: // router or end
   // 確認為自己的 mac address 才寫入。
   HalLcdWriteString("CID_INTER_C2E_PANID",HAL_LCD_LINE_8);
   if(memcmp((void const *)&pkt->cmd.Data[2],(void const *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET),Z_EXTADDR_LEN) == 0)
   {
       HalLcdWriteString("CID_INTER_C2E_PANID A",HAL_LCD_LINE_8);
       uint16 wPANID = ((pkt->cmd.Data[0] << 8) | pkt->cmd.Data[1]);
       osal_nv_write(ZCD_NV_PANID,0,sizeof(wPANID),&wPANID);
       SetInterPAN(0); /// 取消 InterPAN模式
       //SystemResetSoft();
   }
break;

case CID_INTER_E2C_MYMAC: // coordinator
    if((m_byInterPAN & INTER_PAN_ON) != 0) // 在配對模式下才予許更新
    {
        EEUART_AddMAC(pkt->cmd.Data,pkt->cmd.Data[Z_EXTADDR_LEN],pkt->cmd.Data[Z_EXTADDR_LEN+1]); // 回報Server
    }
break;

interpan.psd