z-stack修改PAN ID(組網地址)

一、修改PAN ID
在之前的實驗中,我一直糾結於pan id的設置,有2種方法:
方法1.
pan_id=0x1122;//你想要的ID
zb_WriteConfiguration(ZCD_NV_PANID, sizeof(uint16),  &pan_id) ;
zb_SystemReset();
方法2:
pan_id = 0x1122;     
_NIB.nwkPanId = pan_id;
NLME_UpdateNV(0x01);
zb_SystemReset();

if ( keys & HAL_KEY_SW_1 )

  {

      uint16 mypanid = 0x1122;

      _NIB.nwkPanId = mypanid;

      NLME_UpdateNV(0x01);

      zgConfigPANID = mypanid;

      osal_nv_write(ZCD_NV_PANID, 0, osal_nv_item_len( ZCD_NV_PANID ), &zgConfigPANID);

      //要用定時器延時一段時間後再重啓,否則 osal_nv_write 會來不及執行

      osal_start_timerEx( SampleApp_TaskID,

                              SAMPLEAPP_RESET_EVT,

                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );

  

    

    

  }

我自己的實驗結果顯示,方法2是可行的,於是,我對MT_UTIL.C函數中的MT_UtilSetPanID做了修改
(我用ztool中util修改PAN ID不成功,不知道爲什麼,有人遇到過嗎?)
二、修改CHANNEL
這裏有個概念問題:
_NIB.channelList表示可以掃描的信道;
_NIB.nwkLogicalChannel表示正在使用的邏輯信道,從11~26,即0x0B~0x1A

所以我們要修改的目標是_NIB.nwkLogicalChannel
代碼奉上:

記得改一下:-DDEFAULT_CHANLIST=0x00003800   //使能0B 0C 0D信道

串口發送數據:
_NIB.nwkLogicalChannel                                   幀結構
0x0b                                             fe 05 27 03 00 08 00 00 0b 22
0x0c                                             fe 05 27 03 00 10 00 00 0c 3d

三、廣播發送

直接貼上代碼,有不懂的同學想一想,實在想不通再問。

協調器廣播部分:

其中KEY1    KEY2是例程自帶的,KEY5是我自己定義的廣播發送按鍵。

之前的帖子中說道協調器廣播完後重啓的問題,所以我在這裏新建了一個任務,讓協調器5秒後自動重啓:

osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SYS_RESET_SOFT, 5000);//新建一個任務,5S後重啓

  1. void SampleApp_HandleKeys( uint8 shift, uint8 keys )
  2. {
  3.   (void)shift;  // Intentionally unreferenced parameter
  4.   
  5.   if ( keys & HAL_KEY_SW_1 )  //FLASH讀寫實驗
  6.   {
  7.     /* This key sends the Flash Command is sent to Group 1.
  8.      * This device will not receive the Flash Command from this
  9.      * device (even if it belongs to group 1).
  10.      */
  11.     SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION );
  12.   }
  13.   
  14.    if ( keys & HAL_KEY_SW_2 )
  15.   {
  16.     /* The Flashr Command is sent to Group 1.
  17.      * This key toggles this device in and out of group 1.
  18.      * If this device doesn't belong to group 1, this application
  19.      * will not receive the Flash command sent to group 1.
  20.      */
  21.     aps_Group_t *grp;
  22.     grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
  23.     if ( grp )
  24.     {
  25.       // Remove from the group
  26.       aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
  27.     }
  28.     else
  29.     {
  30.       // Add to the flash group
  31.       aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
  32.     }
  33.   }
  34.    
  35.   if ( keys & HAL_KEY_SW_5 )
  36.   {            
  37.         //廣播至所有節點
  38.         if(UpdateAllNetwork(_NIB.nwkPanId, _NIB.nwkLogicalChannel) == afStatus_SUCCESS)
  39.         {
  40.                  osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SYS_RESET_SOFT, 5000);//新建一個任務,5S後重啓
  41.         }
  42.   }
  43. }
  44. static afStatus_t UpdateAllNetwork(uint16 panId, uint8 channelId)
  45. {
  46.  
  47.   afAddrType_t dstAddr;
  48.   uint8 dataLength = 3;   //PAN ID+CHANNEL
  49.   uint8 *msg = osal_mem_alloc(dataLength);
  50.  
  51.   dstAddr.addrMode = (afAddrMode_t)afAddrBroadcast;
  52.   dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL;
  53.   dstAddr.endPoint = AF_BROADCAST_ENDPOINT;
  54.  
  55.   msg[0] = LO_UINT16(panId);
  56.   msg[1] = HI_UINT16(panId);
  57.   msg[2] = channelId;
  58.  
  59.   return AF_DataRequest(&dstAddr, 
  60.                        &SampleApp_epDesc, 
  61.                        YOURNAME_NETCONF_CLUSTERID,
  62.                        dataLength, 
  63.                        msg,
  64.                        &SampleApp_TransID, 
  65.                        0, 
  66.                        AF_DEFAULT_RADIUS);
  67. }

節點接收部分:

  1. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
  2. {
  3.   uint16 flashTime;
  4.  
  5.   switch ( pkt->clusterId )
  6.   {
  7.     case SAMPLEAPP_PERIODIC_CLUSTERID:
  8.       break;
  9.  
  10.     case SAMPLEAPP_FLASH_CLUSTERID:
  11.       flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
  12.         HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
  13.       break;
  14.         //配置網絡信息
  15.     case ELINKCS_NETCONF_CLUSTERID:
  16.         _NIB.nwkPanId=BUILD_UINT16(pkt->cmd.Data[0], pkt->cmd.Data[1] );
  17.         _NIB.nwkLogicalChannel=pkt->cmd.Data[2];
  18.         NLME_UpdateNV(0x01);
  19.         HalLedBlink( HAL_LED_4, 6, 50, (flashTime / 4) );
  20.         osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SYS_RESET_SOFT, 5000);//創建一個任務,5S後重啓
  21.         break;
  22.   }
  23. }
  24.  

複製代碼

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章