12
返回列表 发新帖
楼主: 我的生活

串口修改PAN ID和CHANNEL,广播发送后重启

[复制链接]
Alert 发表于 2013-11-20 10:18:42 | 显示全部楼层
串口发送数据:
_NIB.nwkLogicalChannel                                   帧结构
0x0b                                             fe 05 27 03 00 08 00 00 0b 22
0x0c                                             fe 05 27 03 00 10 00 00 0c 3d
这种串口数据发送格式不理解,求教各位大神!
laoxiaomage 发表于 2014-7-2 13:09:08 | 显示全部楼层
本帖最后由 laoxiaomage 于 2014-7-2 14:32 编辑

请教楼主,就SampleApp这里例子里 YOURNAME_NETCONF_CLUSTERID 怎么写?我猜就是端点接收的 ELINKCS_NETCONF_CLUSTERID?我是这么写的:

const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
{
  SAMPLEAPP_PERIODIC_CLUSTERID,
  SAMPLEAPP_FLASH_CLUSTERID,
  ELINKCS_NETCONF_CLUSTERID//macq add   我添加的
};


#define SAMPLEAPP_MAX_CLUSTERS      3 // 2  //macq modify 加多了一个
#define SAMPLEAPP_PERIODIC_CLUSTERID 1
#define SAMPLEAPP_FLASH_CLUSTERID     2
#define ELINKCS_NETCONF_CLUSTERID   3 //macq add 我添加的

修改PAN_ID调用的函数,广播:


static afStatus_t UpdateAllNetwork(uint16 panId)//, uint8 channelId  只修改PAN_ID
{

        afAddrType_t dstAddr;
        uint8 dataLength = 2;//3;   //PAN ID+CHANNEL,只修改PAN_ID
        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;  //只修改PAN_ID

        return AF_DataRequest(&dstAddr,
        &SampleApp_epDesc,
        ELINKCS_NETCONF_CLUSTERID,//YOURNAME_NETCONF_CLUSTERID,    //macq modify  我修改的
        dataLength,
        msg,
        &SampleApp_TransID,
        0,
        AF_DEFAULT_RADIUS);
}

协调器接收串口消息,修改PAN_ID,接收到串口消息修改自己的PAN_ID并且立即广播:

void MT_UtilSetPanID(uint8 *pBuf)
{
  uint16 temp16;
  uint8 retValue = ZFailure;
  uint8 cmdId;

  /* parse header */
  cmdId = pBuf[MT_RPC_POS_CMD1];
  pBuf += MT_RPC_FRAME_HDR_SZ;

  temp16 = BUILD_UINT16(pBuf[0], pBuf[1]);
  pBuf += sizeof(uint16);
//macq add for comport modify PANID
  _NIB.nwkPanId = temp16;
  NLME_UpdateNV(0x01);
//add end
  retValue = osal_nv_write(ZCD_NV_PANID, 0, osal_nv_item_len( ZCD_NV_PANID ), &temp16);

  /* Build and send back the response */
  MT_BuildAndSendZToolResponse(((uint8)MT_RPC_CMD_SRSP | (uint8)MT_RPC_SYS_UTIL), cmdId, 1, &retValue);

// SystemResetSoft();//macq add for via comport modify PANID

  if(UpdateAllNetwork(_NIB.nwkPanId) == afStatus_SUCCESS)//, _NIB.nwkLogicalChannel  //广播
  {
           SystemResetSoft();
  }

}

端点接收消息:

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://macq add
        _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) );
        SystemResetSoft();//macq add
       // osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SYS_RESET_SOFT, 5000);//创建一个任务,5S后重启
        break;
  }
}

问题是,不用开端点,串口发送数据的时候
if(UpdateAllNetwork(_NIB.nwkPanId) == afStatus_SUCCESS)//, _NIB.nwkLogicalChannel
  {
           SystemResetSoft();
  }
就已经执行了,当然,广播不成功,问题在哪里?请教各位大牛
也可以回我qq邮箱:331332430@qq.com,或者加我qq好友,多谢!


wzjking 发表于 2015-4-22 11:30:38 | 显示全部楼层
你好,
为什么我这样设置了之后,PANID不修改成功呢
pan_id=0x1122;
_NIB.nwkPanId = pan_id;
NLME_UpdateNV(0x01);
SystemReset();

默认协调器跟终端PANID=0x2abc, 然后只修改协调器的PANID=0x1122, 最后终端都还能进到这个网。说明协调器的PANID没有修改成功
明夜 发表于 2015-5-14 17:45:33 | 显示全部楼层
兄弟有具体的程序给个吗?谢谢了!按照你的那个预编译出错了,还是没有见过的,所以帮个忙把源代码给来瞧瞧,谢谢了
明夜 发表于 2015-5-15 13:52:54 | 显示全部楼层
你好,请问个问题,就是
pan_id = 0x1122;     



_NIB.nwkPanId = pan_id;



NLME_UpdateNV(0x01);



zb_SystemReset();
和uint16 pan_id;

pan_id=0x1122;//你想要的ID

zb_WriteConfiguration(ZCD_NV_PANID, sizeof(uint16),  &pan_id) ;

zb_SystemReset();//重启后才会启用新的PAN_ID,不然只是修改了NV里面的数据
这些代码,都放在那个文件厘米编译阿,我方在SAMAPP.C中就抱错啊,谢谢了
1214 发表于 2015-5-15 17:55:04 | 显示全部楼层
你这个MT_UtilSetPanID函数是在什么地方调用,配置项只配置MT_UTIL_FUNC和NV_RESTORE这两个可以吗,还有版主在广播发送UpdateAllNetwork的CLUSTERID:发送端YOURNAME_NETCONF_CLUSTERID和节点接收端ELINKCS_NETCONF_CLUSTERID不一致也可以收到数据吗
刀锋1937 发表于 2015-9-11 16:29:12 | 显示全部楼层
mark!  楼主赞一个~~~~
xiebin 发表于 2015-11-2 09:17:51 | 显示全部楼层
楼主,我按照你的方法实现后无法加入到网络,我看到终端的PAND和信道跟协调器是一样的
12
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表