一、修改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後重啓
- void SampleApp_HandleKeys( uint8 shift, uint8 keys )
- {
- (void)shift; // Intentionally unreferenced parameter
- if ( keys & HAL_KEY_SW_1 ) //FLASH讀寫實驗
- {
- /* This key sends the Flash Command is sent to Group 1.
- * This device will not receive the Flash Command from this
- * device (even if it belongs to group 1).
- */
- SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION );
- }
- if ( keys & HAL_KEY_SW_2 )
- {
- /* The Flashr Command is sent to Group 1.
- * This key toggles this device in and out of group 1.
- * If this device doesn't belong to group 1, this application
- * will not receive the Flash command sent to group 1.
- */
- aps_Group_t *grp;
- grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
- if ( grp )
- {
- // Remove from the group
- aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
- }
- else
- {
- // Add to the flash group
- aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
- }
- }
- if ( keys & HAL_KEY_SW_5 )
- {
- //廣播至所有節點
- if(UpdateAllNetwork(_NIB.nwkPanId, _NIB.nwkLogicalChannel) == afStatus_SUCCESS)
- {
- osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SYS_RESET_SOFT, 5000);//新建一個任務,5S後重啓
- }
- }
- }
- static afStatus_t UpdateAllNetwork(uint16 panId, uint8 channelId)
- {
- afAddrType_t dstAddr;
- uint8 dataLength = 3; //PAN ID+CHANNEL
- uint8 *msg = osal_mem_alloc(dataLength);
- dstAddr.addrMode = (afAddrMode_t)afAddrBroadcast;
- dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL;
- dstAddr.endPoint = AF_BROADCAST_ENDPOINT;
- msg[0] = LO_UINT16(panId);
- msg[1] = HI_UINT16(panId);
- msg[2] = channelId;
- return AF_DataRequest(&dstAddr,
- &SampleApp_epDesc,
- YOURNAME_NETCONF_CLUSTERID,
- dataLength,
- msg,
- &SampleApp_TransID,
- 0,
- AF_DEFAULT_RADIUS);
- }
節點接收部分:
- void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
- {
- uint16 flashTime;
- switch ( pkt->clusterId )
- {
- case SAMPLEAPP_PERIODIC_CLUSTERID:
- break;
- case SAMPLEAPP_FLASH_CLUSTERID:
- flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
- HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
- break;
- //配置網絡信息
- case ELINKCS_NETCONF_CLUSTERID:
- _NIB.nwkPanId=BUILD_UINT16(pkt->cmd.Data[0], pkt->cmd.Data[1] );
- _NIB.nwkLogicalChannel=pkt->cmd.Data[2];
- NLME_UpdateNV(0x01);
- HalLedBlink( HAL_LED_4, 6, 50, (flashTime / 4) );
- osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SYS_RESET_SOFT, 5000);//創建一個任務,5S後重啓
- break;
- }
- }
複製代碼