zigbee ZIGBEE_FRAGMENTATION

不切片传输,每个应用层包最大可以传输99字节
切片传输,没个应用层包最大可以传输431字节
在SampleApp.c中实验,协调器使用pro,enddev也使用pro。这样就不用在配置中预定义ZIGBEE_FRAGMENTATION了。否则要预定义。在项目中,如果发现已经预编译了ZIGBEE_FRAGMENTATION,但是仍然发不出长数据,很可能的原因是
1.应用层的内存开辟的多了,导致协议栈所需内存不足,osal_mem_alloc失败,而发送失败。协议帧内部发送大帧需要的内存也多。
2.当然,乙方在接收大帧的时候,协议栈也需要较大的可以osal_mem_alloc的内存。如果乙方内存不足,即使甲方发送成功,乙方应用层也收不到消息。
经过试验,协议栈正常进行发送   或者   接收的时候,系统应该剩余512B内存,供协议栈使用。

终端发给协调器:
   if ( keys & HAL_KEY_SW_3 )
    {


      SampleApp_Flash_DstAddr.addrMode = afAddr16Bit;
      SampleApp_Flash_DstAddr.addr.shortAddr = 0;
      SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;

      SendTheMessage();
    }

static int32 num=0;
void SendTheMessage( void )
{

      uint8 *theMessageData = osal_mem_alloc(500);
    
        if (theMessageData != NULL)
      {
        const char constMessageData[] = "Hello World";
        osal_memcpy(theMessageData, constMessageData, sizeof(constMessageData));
        if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc,
                             1,
                             400,
                             theMessageData,
                             &SampleApp_TransID,
                             AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
        {
              int8 str[6];
              num++;
             _itoa(num,str,10);//str="19232",10进制
            HalLcdWriteString(str,1);
          // Successfully requested to be sent.
        }
        else
        {       int8 str[6];
                num++;
                _itoa(num,str,10);//str="19232",10进制
                HalLcdWriteString(str,2);
          // Error occurred in request to send.
        }
      }
      
      osal_mem_free(theMessageData);


}

实验中发现使用广播地址将无法切片发送长帧,只能发送短帧。
      SampleApp_Flash_DstAddr.addrMode = AddrBroadcast;
      SampleApp_Flash_DstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL;
      SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;


posted on 2013-05-11 10:50  _song  阅读(731)  评论(0编辑  收藏  举报