您好
我正在試著透過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;