我用的编译器是IAR Assembler for 8051 7.51A/W32 (7.51.1.3);协议栈版本是ZStack-CC2530-2.2.2-1.3.0;
我自己的应用程序是根据官方的无线测温实验改写的(sensor采集片内温度和电压值,周期性传给collector)。 我的最终目的是达到PC端可以从ZC中平均每秒钟读取50个float数。我现在已经实现了ZED平均9ms采集一个float,每个float转成四个Byte再传给协调器。但是我却不知道该如何成功的发往协调器?
首先我想知道,ZED要把数传给ZC,这个发送周期该怎么修改,在哪里修改?当然不是osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT, myTempReportPeriod );中的myTempReportPeriod时间了,因为myTempReportPeriod设置的很慢,肯定不需要考虑协调器的反应时间。如果这个值设置的很快,那这个时间是由哪里决定的呢?
其次,我说一个可行性的分析。网上有一篇名为“zigbee流量研究”,标题为“通过分析仿真和实验来最大化无线zigbee网络的吞吐量”,有一句话是“在一个单跳传输、无信标的个人局域网,最大的传输速率大约可以达到115.5kbps。这个估计考虑到了额外的zigbee包头,因此这是一个zigbee无线网络通信中的传输速率的上界的合理估计。”所以说110Kbps为理论的最大值,110Kbps = 13.75KByte/s =13.75*1024 Byte /s = 14080 Byte /s = 3520 float /s。所以我从ZC端每秒钟得到50个浮点数,这个应该是可行的!
我也找了TI相关的帖子和飞比论坛上的帖子,以zb_SendDataRequest( 0xFFFE的方式进行发送,最大的APS净荷应该是99Byte。所以就剩下最小周期的问题没有解决了!
我这几天一直在用sniffer监听官方原版实验的数据包,其实是挺糊涂的,根本没弄明白通信流程。也看了一下Zigbee2007规范3.6.2传输和接收,又看了ZigBee Wireless Networks and Transceivers,根本就弄明白我往哪个方向努力呢?我该看哪部分代码?如何测量这个ZED向ZC传送数据的最小周期?又如何改变他的最小周期值呢?
VV:
osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT, myTempReportPeriod );最小周期为什么不能通过myTempReportPeriod这个来改变呢。相当于你设置了一个定时器时间,每次这个事件发生就是你的数据发送周期么!
一般ZED发数据给ZC的通信流程是,ZED通过AF发数据给ZC,然后ZC首先会发出来一个MAC层的ACK帧,然后在APS层发出来一个ACK帧,总共三条无线数据。
阳春三月:
回复 VV:
首先,非常感谢您的及时回复!
其次,我还想问问?
按照您说的,比如我上面的第二幅图。
那就是P.nbr. RX 20 (和RX 19一样的Sequence number),就是您说的ZC首先发出来的一个MAC层的ACK帧对吗?
P.nbr. RX 21 就是您说的APS层发出来的一个ACK帧对吗?
那红色的ZED向ZC发的红色的Data request又是什么呢?按照zigbee葵花宝典说的,应该是ZC向其他设备发送数据,才会有Data request
而在 数据发送到一个coordinator,就不会有这个Data request了,只会有Data了
我可否这样理解?ZED只是问ZC,你有没有数据要发给我,而且是一直在问。而ZC没有数据传给它,只是回了MAC层的ACK,而且这个ACK和上一个Data request具有相同的Sequence number。对不?
而事实上,我上面的第二幅图应该是分解为两种工作方式。一种是ZC向其他设备发送数据,一种是 数据发送到一个coordinator,而且两种工作方式是互不影响、并行不悖的。而且,都是进行非信标通信!不知道我这样理解对吗?
当我把poll_rate都修改为0以后,我发现还可以分配16位地址,ZED还可以向0x0000发消息,ZC以广播方式回消息,但是不是数据帧。而且两者发的东西都是一样的,这个究竟是发了些什么呢?
阳春三月:
回复 VV:
再次,我还想问问。
事实上,我发现,如果我的ZED中osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT, myTempReportPeriod );这个 myTempReportPeriod值比如设置为10ms的话,然后以zb_SendDataRequest( 0xFFFE的方式进行发送组网貌似是可以成功的,但是ZC收数据的 速率,我接了引脚翻转以后,频率是个跳变的值。或者是我用示波器并没捕捉到。
而在我个人的应用程序上,我发现,如果定时器设置为10ms,好像根本组网都是不成功的。用sniffer看,全部是ZED发出的Data request。
其实我一直很好奇的是,难道ZC回复MAC层的ACK,或者是APS层的ACK,有没有一个最快的阈值时间。就是说,如果ZED发的太快,ZC就来不及收取,或者是造成重新组网的问题呢?
阳春三月:
回复 VV:
我昨晚又想了一下,我要问的问题应该叫做PHY层传输的数据帧 帧间隔,当然APS的净荷变化,PHY数据帧长度也会有变化。但是,该怎么知道这个值,或者说,如何测量这个值呢?
VV:
看了你的提问,首先有两点你需要清楚:
1)为什么说ZED向ZC发送数据可以直接发送,而ZC向ZED发送数据的时候必须得有ZED 发出data request?
ZC在网络里面一直出active状态,因为需要监控管理整个网络,而ZED是有可能处于休眠状态的,那么ZC在向ZED发送数据的时候,它可能认为ZED正处于休眠状态,所以不能立即把数据发出去,那么当ZED发送data request出来的时候,ZC可以判断此时,ZED一定出去active状态,那么这时候才把数据发出去。那么ZED发送数据给ZC,因为ZED知道ZC一直出去active状态,所以想发的时候就直接发出去了。
2)关于数据发送的最小周期
如果单单从物理层发送数据来说,最小周期应该是微秒级的。但是现在有个协议栈以后发送数据,很多时间都花在OASL系统的调度,上层到底层的数据帧封装,任务的处理等等,所以时间间隔会比较大。
VV:
回复 阳春三月:
阳春三月:
回复 VV:
我非常非常的感激,又一次等到了您的回复,实在是太感谢了!
按照您(2)的说法,我是不是可以理解为?就是说很多地方都会影响这个最小周期,而且这个可能只能靠自己的实际测试来获得了呢?
有没有一个经验可以参考,我的aps净荷数量 和 我的发送周期之间 各自设置为多大的时候,这个传输才是希望得到的最大值?