文档库 最新最全的文档下载
当前位置:文档库 › 分析BACnet协议栈1

分析BACnet协议栈1

从现在开始分析BACnet协议栈了,版本号是bacnet-stack-0.7.1。目录是bacnet-stack-0.7.1\ports\linux\rs485.c

rs485.c文件主要要解决在物理层发送和接收数据的作用。不同的开发板需要移植该文件。

#include

#include

#include

#include

#include

#include

#include

/* Linux includes */

#include

#include

#include

#include

#include

#include

/* Local includes */

#include "mstp.h"

#include "rs485.h"

#include "fifo.h"

#include

#include

/* Posix serial programming reference:

https://www.wendangku.net/doc/0a13200326.html,/~mike/serial/serial.html */

/* Use ionice wrapper to improve serial performance:

$ sudo ionice -c 1 -n 0 ./bin/bacserv 12345

*/

/* handle returned from open() */

static int RS485_Handle = -1;

/* baudrate settings are defined in , which is

included by */

static unsigned int RS485_Baud = B38400;//波特率选择38400 bps

/* serial port name, /dev/ttyS0,

/dev/ttyUSB0 for USB->RS485 from B&B Electronics USOPTL4 */

static char *RS485_Port_Name = "/dev/ttyUSB0"; /*系统默认是通过USB转485的,根据需要设置,若你的开发板用485接口,则用static char *RS485_Port_Name = "/dev/ttyS0";代替*/

/* some terminal I/O have RS-485 specific functionality */

#ifndef RS485MOD

#define RS485MOD 0

#endif

/* serial I/O settings */

static struct termios RS485_oldtio;

/* Ring buffer for incoming bytes, in order to speed up the receiving. */ static FIFO_BUFFER Rx_FIFO;

/* buffer size needs to be a power of 2 */

static uint8_t Rx_Buffer[4096];

#define _POSIX_SOURCE 1 /* POSIX compliant source */

/*********************************************************************

* DESCRIPTION: Configures the interface name

* RETURN: none

* ALGORITHM: none

* NOTES: none

*********************************************************************/

void RS485_Set_Interface(

char *ifname)

{

/* note: expects a constant char, or char from the heap */

if (ifname) {

RS485_Port_Name = ifname;

}

}

/*********************************************************************

* DESCRIPTION: Returns the interface name

* RETURN: none

* ALGORITHM: none

* NOTES: none

*********************************************************************/

const char *RS485_Interface(

void)

{

return RS485_Port_Name;

}

/****************************************************************************

* DESCRIPTION: Returns the baud rate that we are currently running at * RETURN: none

* ALGORITHM: none

* NOTES: none

*****************************************************************************/ uint32_t RS485_Get_Baud_Rate(

void)

{

uint32_t baud = 0;

switch (RS485_Baud) {

case B0:

baud = 0;

break;

case B50:

baud = 50;

break;

case B75:

baud = 75;

break;

case B110:

baud = 110;

break;

case B134:

baud = 134;

break;

case B150:

baud = 150;

break;

case B200:

baud = 200;

break;

case B300:

baud = 300;

break;

case B600:

baud = 600;

break;

case B1200:

baud = 1200;

break;

case B1800:

baud = 1800;

break;

case B2400:

baud = 2400;

break;

case B4800:

baud = 4800;

break;

case B9600:

baud = 9600;

break;

case B19200:

baud = 19200;

break;

case B38400:

baud = 38400;

break;

case B57600:

baud = 57600;

break;

case B115200:

baud = 115200;

break;

case B230400:

baud = 230400;

break;

default:

baud = 9600;

}

return baud;

}

/**************************************************************************** * DESCRIPTION: Sets the baud rate for the chip USART

* RETURN: none

* ALGORITHM: none

* NOTES: none

*****************************************************************************/ bool RS485_Set_Baud_Rate(

uint32_t baud)

{

bool valid = true;

switch (baud) {

case 0:

RS485_Baud = B0;

break;

case 50:

RS485_Baud = B50;

break;

case 75:

RS485_Baud = B75;

break;

case 110:

RS485_Baud = B110;

break;

case 134:

RS485_Baud = B134;

break;

case 150:

RS485_Baud = B150;

break;

case 200:

RS485_Baud = B200; break;

case 300:

RS485_Baud = B300;

break;

case 600:

RS485_Baud = B600;

break;

case 1200:

RS485_Baud = B1200;

break;

case 1800:

RS485_Baud = B1800;

break;

case 2400:

RS485_Baud = B2400;

break;

case 4800:

RS485_Baud = B4800;

break;

case 9600:

RS485_Baud = B9600;

break;

case 19200:

RS485_Baud = B19200;

break;

case 38400:

RS485_Baud = B38400;

break;

case 57600:

RS485_Baud = B57600;

break;

case 115200:

RS485_Baud = B115200;

break;

case 230400:

RS485_Baud = B230400;

break;

default:

valid = false;

break;

}

if (valid) {

/* FIXME: store the baud rate */

}

return valid;

}

/****************************************************************************

* DESCRIPTION: Transmit a frame on the wire

* RETURN: none

* ALGORITHM: none

* NOTES: none

*****************************************************************************/

void RS485_Send_Frame(

volatile struct mstp_port_struct_t *mstp_port, /* port specific data */

uint8_t * buffer, /* frame to send (up to 501 bytes of data) */

uint16_t nbytes)

{ /* number of bytes of data (up to 501) */

uint32_t turnaround_time = Tturnaround * 1000;

uint32_t baud = RS485_Get_Baud_Rate();

ssize_t written = 0;

int greska;

/* sleeping for turnaround time is necessary to give other devices

time to change from sending to receiving state. */

usleep(turnaround_time / baud); //至少要等待Tturnaround时间才启动RS485缓冲器发送/*

On success, the number of bytes written are returned (zero indicates

nothing was written). On error, -1 is returned, and errno is set

appropriately. If count is zero and the file descriptor refers to a

regular file, 0 will be returned without causing any other effect. For

a special file, the results are not portable.

*/

written = write(RS485_Handle, buffer, nbytes); //RS485_Handle初始时是为-1,当发出open操作时应该是个正整数,而write函数的原型是(fd,buf,n)

greska = errno;

if (written <= 0) {

printf("write error: %s\n", strerror(greska));

} else {

/* wait until all output has been transmitted. */

tcdrain(RS485_Handle); //Linux中的传输等待函数

}

/* tcdrain(RS485_Handle); */

/* per MSTP spec, sort of */

if (mstp_port) {

mstp_port->SilenceTimerReset();

}

return;

}

/****************************************************************************

* DESCRIPTION: Get a byte of receive data

* RETURN: none

* ALGORITHM: none

* NOTES: none

*****************************************************************************/

RS485_Check_UART_Data函数分别检查ReceiveError、DataAvailable。然后选择端口从UART中读数据

void RS485_Check_UART_Data(

volatile struct mstp_port_struct_t *mstp_port)

{

fd_set input;

struct timeval waiter;

uint8_t buf[2048];

int n;

if (mstp_port->ReceiveError == true) {

/* do nothing but wait for state machine to clear the error */

/* burning time, so wait a longer time */

https://www.wendangku.net/doc/0a13200326.html,_sec = 0;

https://www.wendangku.net/doc/0a13200326.html,_usec = 5000;

} else if (mstp_port->DataAvailable == false) {

/* wait for state machine to read from the DataRegister */

if (FIFO_Count(&Rx_FIFO) > 0) {

/* data is available */

mstp_port->DataRegister = FIFO_Get(&Rx_FIFO);

mstp_port->DataAvailable = true;

/* FIFO is giving data - don't wait very long */

https://www.wendangku.net/doc/0a13200326.html,_sec = 0;

https://www.wendangku.net/doc/0a13200326.html,_usec = 10;

} else {

/* FIFO is empty - wait a longer time */

https://www.wendangku.net/doc/0a13200326.html,_sec = 0;

https://www.wendangku.net/doc/0a13200326.html,_usec = 5000;

}

}

/* grab bytes and stuff them into the FIFO every time */

FD_ZERO(&input);

FD_SET(RS485_Handle, &input);

n = select(RS485_Handle + 1, &input, NULL, NULL, &waiter);

if (n < 0) {

return;

}

if (FD_ISSET(RS485_Handle, &input)) {

n = read(RS485_Handle, buf, sizeof(buf));

FIFO_Add(&Rx_FIFO, &buf[0], n);

}

}

void RS485_Cleanup(

void)

{

/* restore the old port settings */

tcsetattr(RS485_Handle, TCSANOW, &RS485_oldtio); //tcgetattr用于获取终端的相关参数,而tcsetattr函数用于设置终端参数close(RS485_Handle);

}

void RS485_Initialize(

void)

{

struct termios newtio;

printf("RS485: Initializing %s", RS485_Port_Name);

/*

Open device for reading and writing.

Blocking mode - more CPU effecient

*/

RS485_Handle = open(RS485_Port_Name, O_RDWR | O_NOCTTY /*| O_NDELAY */ );

if (RS485_Handle < 0) {

perror(RS485_Port_Name);

exit(-1);

}

#if 0

/* non blocking for the read */

fcntl(RS485_Handle, F_SETFL, FNDELAY);

#else

/* efficient blocking for the read */

fcntl(RS485_Handle, F_SETFL, 0);

#endif

/* save current serial port settings */

tcgetattr(RS485_Handle, &RS485_oldtio);

/* clear struct for new port settings */

bzero(&newtio, sizeof(newtio));

/*

BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.

CRTSCTS : output hardware flow control (only used if the cable has

all necessary lines. See sect. 7 of Serial-HOWTO)

CS8 : 8n1 (8bit,no parity,1 stopbit)

CLOCAL : local connection, no modem contol

CREAD : enable receiving characters

*/

newtio.c_cflag = RS485_Baud | CS8 | CLOCAL | CREAD | RS485MOD;

/* Raw input */

newtio.c_iflag = 0;

/* Raw output */

newtio.c_oflag = 0;

/* no processing */

newtio.c_lflag = 0;

/* activate the settings for the port after flushing I/O */

tcsetattr(RS485_Handle, TCSAFLUSH, &newtio);

/* destructor */

atexit(RS485_Cleanup);

/* flush any data waiting */

usleep(200000);

tcflush(RS485_Handle, TCIOFLUSH);

/* ringbuffer */

FIFO_Init(&Rx_FIFO, Rx_Buffer, sizeof(Rx_Buffer));

printf("=success!\n");

}

/*以上都是为了兼容POSIX接口而编写的,Linux系统中最关键的是一下代码*/

#ifdef TEST_RS485

#include

int main(

int argc,

char *argv[])

{

uint8_t buf[8];

char *wbuf = { "BACnet!" };

size_t wlen = strlen(wbuf) + 1;

unsigned i = 0;

size_t written = 0;

int rlen;

/*设置串口,如波特率,端口,初始化*/

/* argv has the "/dev/ttyS0" or some other device */

if (argc > 1) {

RS485_Set_Interface(argv[1]);

}

RS485_Set_Baud_Rate(38400);

RS485_Initialize();

/*循环读取串口的数据*/

for (;;) {

written = write(RS485_Handle, wbuf, wlen);

rlen = read(RS485_Handle, buf, sizeof(buf));

/* print any characters received */

if (rlen > 0) {

for (i = 0; i < rlen; i++) {

fprintf(stderr, "%02X ", buf[i]); //长度不足2的话前面补0

}

}

}

return 0;

}

#endif

补充:

1、select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include

#include

int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);

参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。

fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型

通过下面四个宏来操作:

FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。

FD_SET(int fd, fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。

FD_CLR(int fd, fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。

FD_ISSET(int fd, fd_set *fdset);用于测试指定的文件描述符是否在该集合中。

过去,一个fd_set通常只能包含<32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd;现在,UNIX系统通常会在头文件中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示<1024的fd。根据fd_set的位矢量实现,我们可以重新理解操作fd_set的四个宏:

fd_set set;

FD_ZERO(&set);

FD_SET(0, &set);

FD_CLR(4, &set);

FD_ISSET(5, &set);

―――――――――――――――――――――――――――――――――――――――

注意fd的最大值必须

2、struct termios结构体

一、数据成员

termios 函数族提供了一个常规的终端接口,用于控制非同步通信端口。这个结构包含了至少下列成员:

tcflag_t c_iflag; /* 输入模式 */

tcflag_t c_oflag; /* 输出模式 */

tcflag_t c_cflag; /* 控制模式 */

tcflag_t c_lflag; /* 本地模式 */

cc_t c_cc[NCCS]; /* 控制字符 */

struct termios

{unsigned short c_iflag;

/* 输入模式标志*/

unsigned short c_oflag;

/* 输出模式标志*/

unsigned short c_cflag;

/* 控制模式标志*/

unsigned short c_lflag;

/*区域模式标志或本地模式标志或局部模式*/

unsigned char c_line;

/*行控制line discipline */

unsigned char c_cc[NCC];

/* 控制字符特性*/

};

分析BACnet协议栈1

从现在开始分析BACnet协议栈了,版本号是bacnet-stack-0.7.1。目录是bacnet-stack-0.7.1\ports\linux\rs485.c rs485.c文件主要要解决在物理层发送和接收数据的作用。不同的开发板需要移植该文件。 #include #include #include #include #include #include #include /* Linux includes */ #include #include #include #include #include #include /* Local includes */ #include "mstp.h" #include "rs485.h" #include "fifo.h" #include #include /* Posix serial programming reference: https://www.wendangku.net/doc/0a13200326.html,/~mike/serial/serial.html */ /* Use ionice wrapper to improve serial performance: $ sudo ionice -c 1 -n 0 ./bin/bacserv 12345 */ /* handle returned from open() */ static int RS485_Handle = -1; /* baudrate settings are defined in , which is included by */ static unsigned int RS485_Baud = B38400;//波特率选择38400 bps /* serial port name, /dev/ttyS0, /dev/ttyUSB0 for USB->RS485 from B&B Electronics USOPTL4 */ static char *RS485_Port_Name = "/dev/ttyUSB0"; /*系统默认是通过USB转485的,根据需要设置,若你的开发板用485接口,则用static char *RS485_Port_Name = "/dev/ttyS0";代替*/ /* some terminal I/O have RS-485 specific functionality */

网络协议报文格式大集合

可编辑 目录 1 序、 (2) 1.1 协议的概念 (2) 1.2 TCP/IP体系结构 (2) 2 链路层协议报文格式 (2) 2.1 Ethernet报文格式 (2) 2.2 802.1q VLAN数据帧(4字节) (3) 2.3 QinQ帧格式 (4) 2.4 PPP帧格式 (4) 2.5 STP协议格式 (5) 2.5.1 语法 (5) 2.5.2 语义 (6) 2.5.3 时序 (8) 2.6 RSTP消息格式 (9) 2.6.1 语法 (9) 2.6.2 语义 (11) 2.6.3 时序 (13) 3 网络层协议报文 (14) 3.1 IP报文头 (14) 3.2 ARP协议报文 (16) 3.2.1 语法 (16) 3.2.2 语义 (17) 3.2.3 时序 (17) 3.3 VRRP协议报文 (18) 3.3.1 语法 (18) 3.4 BGP协议报文 (19) 3.4.1 语法 (19) 3.4.2 语义 (25)

1 序、 1.1 协议的概念 协议由语法、语义和时序三部分组成: 语法:规定传输数据的格式; 语义:规定所要完成的功能; 时序:规定执行各种操作的条件、顺序关系; 1.2 TCP/IP体系结构 TCP/IP协议分为四层结构,每一层完成特定的功能,包括多个协议。本课程实验中相关协议的层次分布如附图3-1所示。 图1-1TCP/IP协议层次 这些协议之间的PDU封装并不是严格按照低层PDU封装高层PDU的方式进行的,附图3-2显示了Ethernet帧、ARP分组、IP分组、ICMP报文、TCP报文段、UDP数据报、RIP报文、OSPF报文和FTP报文之间的封装关系。 图1-2各协议PDU间的封装关系 2 链路层协议报文格式 2.1 Ethernet报文格式 最新的IEEE 802.3标准(2002年)中定义Ethernet帧格式如下:

Zigbee协议栈原理基础

1Zigbee协议栈相关概念 1.1近距离通信技术比较: 近距离无线通信技术有wifi、蓝牙、红外、zigbee,在无线传感网络中需求的网络通信恰是近距离需求的,故,四者均可用做无线传感网络的通信技术。而,其中(1)红外(infrared):能够包含的信息过少;频率低波衍射性不好只能视距通信;要求位置固定;点对点传输无法组网。(2)蓝牙(bluetooth):可移动,手机支持;通信距离10m;芯片价格贵;高功耗(3)wifi:高带宽;覆盖半径100m;高功耗;不能自组网;(4)zigbee:价格便宜;低功耗;自组网规模大。?????WSN中zigbee通信技术是最佳方案,但它连接公网需要有专门的网关转换→进一步学习stm32。 1.2协议栈 协议栈是网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议。 1.2.1Zigbee协议规范与zigbee协议栈 Zigbee各层协议中物理层(phy)、介质控制层(mac)规范由IEEE802.15.4规定,网络层(NWK)、应用层(apl)规范由zigbee联盟推出。Zigbee联盟推出的整套zigbee规范:2005年第一版ZigBeeSpecificationV1.0,zigbee2006,zigbee2007、zigbeepro zigbee协议栈:很多公司都有自主研发的协议栈,如TI公司的:RemoTI,Z-Stack,SimpliciTI、freakz、msstatePAN 等。 1.2.2z-stack协议栈与zigbee协议栈 z-stack协议栈与zigbee协议栈的关系:z-stack是zigbee协议栈的一种具体实现,或者说是TI公司读懂了zigbee 协议栈,自己用C语言编写了一个软件—---z-stack,是由全球几千名工程师共同开发的。ZStack-CC2530-2.3.1-1.4.0软件可与TI的SmartRF05平台协同工作,该平台包括MSP430超低功耗微控制器(MCU)、CC2520RF收发器以及CC2591距离扩展器,通信连接距离可达数公里。 Z-Stack中的很多关键的代码是以库文件的形式给出来,也就是我们只能用它们,而看不到它们的具体的实现。其中核心部分的代码都是编译好的,以库文件的形式给出的,比如安全模块,路由模块,和Mesh自组网模块。与z-stack 相比msstatePAN、freakz协议栈都是全部真正的开源的,它们的所有源代码我们都可以看到。但是由于它们没有大的商业公司的支持,开发升级方面,性能方面和z-stack相比差距很大,并没有实现商业应用,只是作为学术研究而已。 还可以配备TI的一个标准兼容或专有的网络协议栈(RemoTI,Z-Stack,或SimpliciTI)来简化开发,当网络节点要求不多在30个以内,通信距离500m-1000m时用simpliciti。 1.2.3IEEE802.15.4标准概述 IEEE802.15.4是一个低速率无线个人局域网(LowRateWirelessPersonalAreaNetworks,LR-WPAN)标准。定义了物理层(PHY)和介质访问控制层(MAC)。 LR-WPAN网络具有如下特点: ◆实现250kb/s,40kb/s,20kb/s三种传输速率。 ◆支持星型或者点对点两种网络拓扑结构。 ◆具有16位短地址或者64位扩展地址。 ◆支持冲突避免载波多路侦听技术(carriersensemultipleaccesswithcollisionavoidance,CSMA/CA)。(mac层) ◆用于可靠传输的全应答协议。(RTS-CTS) ◆低功耗。 ◆能量检测(EnergyDetection,ED)。 ◆链路质量指示(LinkQualityIndication,LQI)。 ◆在2.45GHz频带内定义了16个通道;在915MHz频带内定义了10个通道;在868MHz频带内定义了1个通道。 为了使供应商能够提供最低可能功耗的设备,IEEE(InstituteofElectricalandElectronicsEngineers,电气及电子工程师学会)定义了两种不同类型的设备:一种是完整功能设备(full.functionaldevice,FFD),另一种是简化功能设备

BACnet协议的体系结构

B A C n e t协议的体系结 构 Revised by Petrel at 2021

B A C n e t 协议的体系结构 国际标准化组织在制定计算机网络通讯协议标准时定义了一个模型,称为开放系统互联参考模型(OSI )(ISO7498)。模型的目的是解决计算机与计算机之间普遍的通信问题。在这个模型中,将计算机通信这样一个复杂的问题分解成7个小的、容易解决的子问题,每个子问题只与某些通信功能相关,并且把这些子问题称为协议体系结构的一层,整个模型是一个七层的体系结构。在图4-1中给出这七层的体系结构图。 层。信的单个计算机之间可能相距很远,因此报文要通过一系列中间点才能到达。 而这些中间点相应地可能需要实现路由选择功能、某种解析功能,以及复杂的同步和差错恢复功能。 实现OSI 模型协议所需的费用较高,在绝大部分楼宇自动控制系统中,并不需要实现OSI 模型的所有内容。不过只从OSI 的功能性方面来考虑,经过简化,OSI 模型仍然是楼宇自动控制协议的一个很好的参考。如果只选择OSI 模型中需要的层次,形成一个简化的模型,作为楼宇自动控制系统的协议体系结构,就可以减少报文的长度,降低通信处理的开销,并且也满足楼宇自动控制系统的需要。这个简化的体系结构降低了楼宇自动控制工业的生产成本,同时处理器的大批量生产、局域网技术的发展,也为过程控制和办公自动化工业的发展起到了推动作用。另一方面,可以充分利用现有的、易用的、应用广泛的局域网技术,如以太网、ARCNET 和LonTalk 。这样不但可以降低成本,而且也有利于提高性能,为系统集成开辟新的途径。 用户1 用户2 图4-1开放系统互联基本参考模型

ZigBee测试与协议分析

ZigBee测试与协议分析 1 前言 ZigBee协议栈包括物理层协议(IEEE802.15.4)和上层软件协议(ZigBee 2007以及其他的ZigBee网络协议)。本文将从这两方面来了解这些协议,通过介绍如何捕获及如何理解关键参数,深层次剖析ZigBee技术。有了这些本质性的认识,对于分析解决无线产品应用问题,会有很大的帮助。 2 物理层分析 ZigBee的物理层为IEEE802.15.4标准所规定,定义了ZigBee底层的调制编码方式。这些规约大多是芯片设计者需要关心的,对于应用开发来说,更关心的是衡量一个芯片、一个射频系统性能的参数。在过去的文章中,已介绍了输出功率、接收灵敏度和链路预算等参数,这一讲将更深入地介绍一个调制质量的参数:EVM。EVM指的是误差向量(包括幅度和相位的矢量),表征在一个给定时刻理想无误差基准信号与实际发射信号的向量差,。从EVM参数中,可以了解到一个输出信号的幅度误差及相位误差。 EVM是衡量一个RF系统总体调制质量的指标,定义为信号星座图上测量信号与理想信号之间的误差,它用来表示发射器的调制精度,调制解调器、PA、混频器、收发器等对它都会有影响。EVM数据和眼图。 了解完这个参数之后,再看看实际测试中是如何获取EVM参数的。 ZigBee物理层的测试,在产品研发、生产和维护阶段,可以分别采用不同的仪器。 (1)产品研发阶段要测量EVM参数,需要使用带协议解析的频谱仪,最好是自带相应协议插件的仪器,可以使用安捷伦PXA N9030A频谱分析仪+8960B插件(选配了ZigBee分析插件)。这些仪器可以测试出ZigBee调制信号的星座图、实时数据和眼图等信息,在芯片级开发过程中,需要考量高频电容电感以及滤波器等的单个及组合性能,特别需要注意的是ZigBee信号的临道抑制参数,利用PXA N9030A的高分辨率,可以查看点频的带外信号,这些细节在更换射频器件供应商时,需要仔细测量,一般数字电路抄板比较容易,因为器件性能的影响不是很大,只要值和封装对了就可以,但是射频前端的设计上,即使原样的封装、容值和感值,供应商不一样,射频参数也是不一样的,板材的选用也极大地影响着阻抗匹配,因此复制和再开发都有较大难度。合格的测试工具,加上有质量保证的射频器件供应商资源,方能真正具备RF设计能力。安捷伦PXA N9030A频谱分析仪。 (2)批量生产阶段在批量生产中,不可能将实验室的研发测试仪器搬到工厂,因此,需要便携小巧的测试设备,这时可用罗德与斯瓦茨公司的热功率探头,如NRP-Z22,做一个2.4 GHz的输出功率测试,保证能够输出公差允许的功率信号即可,因为在生产中,射频器件的焊接不良、馈线连接头的接触不良,都会造成输出功率的下降甚至消失。需要注意的是,探头非常容易被静电损坏,必须要带上防静电手套进行操作,返修过程如需要经过德国,则时间长,经费也不便宜,不是很严重的损坏倒是可以在深圳维修中心处理。NRP-Z22。 (3)应用阶段在现场出现问题时,ZigBee节点已经安装到现场,不能逐一拆下来测试,并且周围的电磁环境也是没办法在单个节点上检测到,这时就需要手持式的频谱仪进行现场勘查了,例如安捷伦公司的N9912A手持式频谱仪。使用该频谱仪,可以完成无线系统设计初期的现场勘查工作,检测现场各个地点是否有异常电磁干扰,对于ZigBee来说,当然是检测是否有持续的WIFI信号干扰了。同时,更为详细的现场勘查,还包括在定点进行数据发送,预期覆盖点进行信号强度分析,以实地评估墙体等障碍物的信号衰减,在已经架设好的ZigBee网络中,也可以检测信号覆盖,数据通信是否正常等。N9912A。

传统协议栈和DPDK

一、传统协议栈之数据包从NIC到内核 1、从NIC到内存 概括地说,网络数据包进入内存(接收数据包)的流程为: 网线--> Rj45网口--> MDI 差分线 --> bcm5461(PHY芯片进行数模转换) --> MII总线 --> TSEC的DMA Engine 会自动检查下一个可用的Rx bd -->把网络数据包DMA 到Rx bd所指向的内存,即skb->data

1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。 2、内核将这个缓冲区通过DMA映射,把这个队列交给网卡; 3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向系统产生一个中断; 4、内核收到这个中断,就取消DMA映射,这样,内核就直接从主内存中读取数据; 对应以上4步,来看它的具体实现: 1、分配环形DMA缓冲区 Linux内核中,用skb来描述一个缓存,所谓分配,就是建立一定数量的skb,然后把它们组织成一个双向链表 2、建立DMA映射 内核通过调用dma_map_single(struct device *dev,void *buffer,size_tsize,enumdma_data_direction direction) 建立映射关系。 struct device *dev,描述一个设备;buffer:把哪个地址映射给设备;也就是某一个skb——要映射全部,当然是做一个双向链表的循环即可;size:缓存大小;direction:映射方向——谁传给谁:一般来说,是“双向”映射,数据在设备和内存之间双向流动;对于PCI设备而言(网卡一般是PCI的),通过另一个包裹函数pci_map_single,这样,就把buffer交给设备了!设备可以直接从里边读/取数据。 3、这一步由硬件完成; 4、取消映射 ma_unmap_single,对PCI而言,大多调用它的包裹函数pci_unmap_single,不取消的话,缓存控制权还在设备手里,要调用它,把主动权掌握在CPU手里——因为我们已经接收到数据了,应该由CPU把数据交给上层网络栈;当然,不取消之前,通常要读一些状态位信息,诸如此类,一般是调用dma_sync_single_for_cpu() 让CPU在取消映射前,就可以访问DMA

语料库常用统计方法

3.5语料库常用统计方法 第3章前几节对语料库应用中的几种主要技术做了介绍。通过语料检索、词表和主题词表的生成,可以得到一定数量的句子、词汇或结构。为能更好说明所得到的结果的真正意义,常常需要对它们加以统计学分析。本章主要介绍语料分析中的一些常用统计方法。 3.5.1 语料库与统计方法 介绍相关统计方法之前,首先需要了解为什么语料库应用中需要运用统计方法。在2.1节讲到文本采集时,我们知道文本或会话构成了最终的语料库样本。这些样本是通过一定的抽样方法获得的。研究中,我们需要描述这些样本的出现和分布情况。此外,我们还经常需要观察不同语言项目之间在一定语境中共同出现(简称共现)的概率;以及观察某个(些)语言项目在不同文本之间出现多少的差异性。这些需要借助统计学知识来加以描写和分析。 理论上说,几乎所有统计方法都可以用于语料库分析。本章只择其中一些常用方法做一介绍。我们更注重相关统计方法的实际应用,不过多探讨其统计学原理。这一章我们主要介绍语料分析中的频数标准化(normalization )、频数差异检验和搭配强度的计算方法。 3.5.2 频数标准化 基本原理 通常语料检索、词表生成结果中都会报告频数(frequency, freq 或raw frequency )。那么某词(如many )在某语料库中出现频数为100次说明什么呢?这个词在另一个语料库中出现频数为105次,是否可以说many 在第二个语料库中更常用呢?显然,不能因为105大于100,就认定many 在第二个语料库中更常用。这里大家很容易想到,两个语料库的大小未必相同。按照通常的思维,我们可以算出many 在两个语料库中的出现百分比,这样就可比了。这种情况下,我们是将many 在两个语料库中的出现频数归到一个共同基数100之上,即每100词中出现多少个many 。这里通过百分比得到的频率即是一种标准化频率。有些文献中标准化频率也称归一频率或标称频率,即基于一个统一基准得出的频率。 实例及操作 频数标准化,首先需要用某个(些)检索项的实际观察频数(原始频数,raw frequency )除以总体频数(通常为文本或语料库的总词数),这样得到每一个单词里会出现该检索项多少次。在频数标准化操作中,我们通常会在此基础上乘以1千(1万、1百万)得到平均每千(万、百万)词的出现频率。即: 1000?=总体频数 观测频数标准化频率(每千词) (注:观测频数即检索词项实际出现的次数;总体频数即语料库的大小或总形符数。) 例如,more 在中国学生的作文里出现251次,在英语母语者语料中出现475次。两个语料库的大小分别为37,655词次和174,676词次。我们可以根据上面的公式很容易计算出251和475对应的标准化频率。另外,我们还可以利用Excel 或SPSS 等工具来计算标准化频率。比如,可以将实际观察频数和语料库大小如图3.5.1输入相应的单元格,然后在C1单元格里输入=(A1/B1)*1000即可得到中国学生每千词使用more 约为6.67次。要得到母语

计算机网络使用网络协议分析器捕捉和分析协议数据包样本

计算机网络使用网络协议分析器捕捉和分析协议数据包样 本 计算机网络使用网络协议分析器捕捉和分析协议数据包广州大学学生实验报告开课学院及实验室:计算机科学与工程实验室11月月28日学院计算机科学与教育软件学院年级//专业//班姓名学号实验课程名称计算机网络实验成绩实验项目名称使用网络协议分析器捕捉和分析协议数据包指导老师熊伟 一、实验目的 (1)熟悉ethereal的使用 (2)验证各种协议数据包格式 (3)学会捕捉并分析各种数据包。 本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 二、实验环境1.MacBook Pro2.Mac OS3..Wireshark 三、实验内容,验证数据帧、IP数据报、TCP数据段的报文格式。 ,,分析结果各参数的意义。 器,分析跟踪的路由器IP是哪个接口的。 对协议包进行分析说明,依据不同阶段的协议出分析,画出FTP 工作过程的示意图a..地址解析ARP协议执行过程b.FTP控制连接建立过程c.FTP用户登录身份验证过程本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。 d.FTP数据连接建立过程 e.FTP数据传输过程 f.FTP连接释放过程(包括数据连接和控制连接),回答以下问题:a..当访问某个主页时,从应用层到网络层,用到了哪些协议?b.对于用户请求的百度主页(),客户端将接收到几个应答报文??具体是哪几个??假设从是本地主机到该页面的往返时间是RTT,那么从请求该主页开始到浏览器上出现完整页面,一共经过多长时间??c.两个存放在同一个服务器中的截然不同的b Web页(例如,,和d.假定一个超链接从一个万维网文档链接到另一个万维网文档,由于万维网文档上出现了差错而使超链接指向一个无效的计算机名,这时浏览器将向用户报告什么?e.当点击一个万维网文档时,若该文档除了次有文本外,,那么需要建立几次TCP连接和个有几个UDP过程?本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 析,分析ARP攻击机制。 (选做),事实上,TCP开始发送数据时,使用了慢启动。 利察用网络监视器观察TCP的传输和确认。 在每一确认到达之后,慢启动过程中发生了什么?(选做),,TCP 必须准备重发初始段(用于打开一个连接的一个段)。 TCP应等多久才重发这一段?TCP应重发多少次才能宣布它不能打开一个连接?为找到结果尝试向一个不存在的地址打开一个连接,并使用网络监视器观察TCP的通信量。

楼宇自控协议BACnet 简介

BACnet 简介 BACnet 是 A Data Communication Protocol for Building Automation and Control Network 的简称,是一种为楼宇自控网络制定的数据通讯协议。 1987年,美国暖通空调工程师协会组织(ASHARE)的标准项目委员会调集了全球20多位业内著名专家,经过8年半时间,在1995年6月,ASHARE正式通过全球首个楼宇自控行业通讯标准--BACnet,标准编号为ANSI/ASHARE Standard135-1995,同年12月成为美国国家标准,并且还得到欧盟委员会的承认,成为欧盟标准草案。 BACnet是一个标准通讯和数据交换协议。各厂家按照这一协议标准开发与楼宇自控网兼容的控制器与接口,最终达到不同厂家生产的控制器都可以相互交换数据,实现互操作性。换言之,它确立了在不必考虑生产厂家,不依赖任何专用芯片组的情况下,各种兼容系统实 现开放性与互操作性的基本规则。 根据1999年底楼宇自控网在互联网页里的资料,目前世界上已有数百家国际知名的厂家支持BACnet ,其中包括楼宇自控系统厂家、消防系统厂家、冷冻机厂家、配电照明系统厂 家和安保系统厂家等。 〖 BACnet技术特点〗 BACnet采用了面向对象的技术,它定义了一组具有属性的对象(Object)来表示任意的楼宇自控设备的功能,从而提供了一种标准的表示楼宇自控设备的方式。同时BACnet定义了四种服务原语来传递某些特定的服务参数。目前BACnet共定义了18个对象,123 个属性和35个服务。由于一个楼宇自控系统中并不是所有的设备都要有必要支持BACnet所有的功能,BACnet协议还定义了6个性能级别和13个功能组。 〖 BACnet协议优点〗 BACnet是一个完全开放性的楼宇自控网协议,其开放性表现在: 独立于任何制造商,不需要专门芯片,并得到众多制造商的支持; 有完善和良好的数据表示和交换方法; 按标准制造的产品有严格的性能等级和完整的说明;

TI_zigbee协议栈结构分析应用

无线盛世《快速进入ZB世界》
Ver:1

进入Zigbee世界的准备工作
§ 首先,我们需具备一些硬件设备及平台。以下 我就罗列一下Zigbee开发基本工具: § 计算机:不管是设计电路还是编程开发都是离 不开它的。 § Zigbee开发板:对于初学者来说,Zigbee开发 板无疑是最佳选择。有了开发板,你可以在我 们成熟设计的基础上学习或者做自己的设计。 § Zigbee模块:集MCU,RF,天线设计于一体 的Zigbee模块。使用它,我们可省去设计天线 及IC周边电路设计的复杂工作。

进入Zigbee世界的准备工作
§ Zigbee仿真器:是集烧写程序、在线编程和在线仿真 功能于一身的开发过程工作中必不可少的开发工具。 编程器既能对CC243x芯片(其实包括TI产品中的CC 系列的大部分芯片)进行烧写程序(hex标准文件程序 ),也能对CC243x芯片进行在线编程和仿真,让我们 能方便地在线调试开发,从而大大地提高了开发效率 。 § Zigbee协议分析仪:ZigBee的设计开发者必不可少的 工具!ZigBee协议分析仪具有广泛的功能,包括:分 析以及解码在PHY、MAC、NETWORK/SECURITY、 APPLICATION FRAMEWORK、和APPLICATION PROFICES等各层协议上的信息包;显示出错的包以 及接入错误;指示触发包;在接收和登记过程中可连 续显示包。

进入Zigbee世界的准备工作
§ 再次,我们需要在将用于开发Zigbee的计 算机平台上安装这些软件: § Zigbee协议分析软件(sniffer) § 程序烧写软件(Flash Programmer) § IAR公司的EW8051 version 7.20I/W32 。

tcp、ip协议栈移植

This article was downloaded by: [University of Jiangnan] On: 27 March 2015, At: 06:51 Publisher: Taylor & Francis Informa Ltd Registered in England and Wales Registered Number: 1072954 Registered office: Mortimer House, 37-41 Mortimer Street, London W1T 3JH, UK Journal of Discrete Mathematical Sciences and Cryptography Publication details, including instructions for authors and subscription information: https://www.wendangku.net/doc/0a13200326.html,/loi/tdmc20 An abridged protocol stack for micro controller in place of TCP/IP R. Seshadri a a Computer Centre, S.V. University , Tirupati , 517 502 , India Published online: 03 Jun 2013. PLEASE SCROLL DOWN FOR ARTICLE

An abridged protocol stack for micro controller in place of TCP/IP R.Seshadri ? Computer Centre S.V .University Tirupati 517502India Abstract The existing TCP/IP protocol stack running in hosts takes lot of overhead while the node in network is for a speci?c purpose.For example transferring simple messages across network.If the node in the network is not a PC but,some thing like a micro controller,which measures some values and stores in its local memory,then it becomes lavishness in using the micro controller’s memory.As it is a node in a network,working with TCP/IP ,it should be able to transfer those values in the form of messages to other hosts which are in either local network or global network. But in micro controller terms the memory is expensive and compact.The existing TCP/IP stack consumes a few mega bytes of memory.Therefore it can’t be accommodated in the memory of micro controller.Hence one needs to reduce the memory consumption.In this regard,an abridged protocol which replaces the existing TCP/IP has been designed to suit the above needs.For this purpose,the TCP/IP have been combined with KEIL C51features for 8051micro controller to make it work in transferring messages in local area network as well as global network. The above scheme was implemented and tested and the system was working satisfac-torily.The results are found to be more effective in communicating information/message from the micro controller to a PC. Keywords :Ethernet,stack,Transmission Control Protocol (TCP ),Internet Protocol (IP ).Introduction to TCP/IP The name TCP/IP refers to a suite of communication protocols.The name is misleading because TCP and IP are the only two of the dozens of protocols that compose the suite.Its name comes from two of the most ?E-mail :ravalaseshadri@yahoo.co.in —————————————————– Journal of Discrete Mathematical Sciences &Cryptography Vol.9(2006),No.3,pp.523–536 c Taru Publications D o w n l o a d e d b y [U n i v e r s i t y o f J i a n g n a n ] a t 06:51 27 M a r c h 2015

BACnet协议

BACnet、楼宇自动化系统与Internet的集成    徐正元 王盛卫  香港理工大学屋宇设备工程系  注:本文作者徐正元可以通过bacman@https://www.wendangku.net/doc/0a13200326.html,联系。  摘要:BACnet即“楼宇自控网络的数据通讯协议” ,是一种使不同厂家生产的楼宇自动化控制器能够互相通讯和共享信息的开放协议。本文论述了BACnet系统与Internet集成的几种方式,从而能够利用Internet的现有资源,采用统一的浏览器界面对分布在各地的BACnet系统进行监控。  关键字:BACnet,Internet,LonWorks,集成,BA,楼宇自动化通信协议    一、 什么是BACnet?  BACnet,即A Data Communication Protocol for Building Automation and Control Networks[2],简称BACnet协议,是美国采暖、制冷和空调工程师协会(ASHRAE)经过近9年时间的研究制定的世界上第一个开放的楼宇自动控制网络协议。它详细地阐述了楼宇自控网的功能,阐明了系统组成单元相互分享数据实现的途径、使用的通讯媒介、可以使用的功能以及信息如何翻译的全部规则。它确立了不同生产厂家生产的各种BACnet兼容系统在不依赖任何专用芯片的情况下,相互开放通讯的基本规则。它使不同厂商生产的设备与系统在互连和互操作的基础上实现无缝集成成为可能。  该协议1995年一经颁布,即引起了各国政府、专家学者和企业的广泛关注。1995年由美国国家标准学院通过成为美国国家标准,目前韩国、日本已将其列为国家标准,也成为欧盟的预标准、ISO草案标准(关于BACnet成为ISO正式BA标准的投票正在进行之中)。  BACnet提供了一个描述各种自动化系统的精确模型,模型包括以下这些组成部分:23种对象(2001年版)、40个服务、137种属性、6种数据链路层、网络功能、互操作一致性。  BACnet是一个实现控制系统互操作的应用独立模型,它有着众多的互操作性类型和通用的对象,这使它不仅可以用于HVAC,还可以用于照明、安防、消防、门禁、交通等领域,事实证明它的应用领域还在不断的扩展之中[3]。    二、 关于BA系统与Internet的集成  Internet作为一个覆盖全世界的超级计算机网际网,在上个世纪九十年代得到了非常广泛的使用。无论是对人们的生活还是各个行业的发展都产生了极大的影响,楼宇自动化行业也不例外。楼宇自动化系统与Internet结合起来,就能够利用Internet的现有资源条件,实现分布在各地的BA设备及网络的低成本互

Zigbee协议栈学习总结教学提纲

典型的智能家居网络总体结构图 智能家居系统模块整体框图

ZigBee是一种标准,该标准定义了短距离、低速率传输速率无线通讯所需要的一系列通信协议。基于ZigBee的无线网络所使用的工作频段为868MHz、915MHz和2.4GHz,最大数据传输速率为250Kbps。 ZigBee无线网络共分为5层:物理层(PHY),介质访问控制层(MAC),网络层(NWK),应用程序支持子层(APS),应用层(APL)。 总体而言,ZigBee技术有如下特点:高可靠性,低成本,低功耗,高安全性,低数据速率

Zigbee网络中的设备主要分为三种: 1,协调器,协调器节点负责发起并维护一个无线网络,识别网络中的设备加入网络,一个ZigBee 网络只允许有一个ZigBee 协调器; 2,路由器,路由器节点支撑网络链路结构,完成数据包的转发;。ZigBee 网格或树 型网络可以有多个ZigBee 路由器。ZigBee 星型网络不支持ZigBee 路由器。 3,终端节点,负责数据采集和可执行的网络动作。 从功能上,zigbee节点应由微控制器模块、存储器、无线收发模块、电源模块和其它外设功能模块组成。 ZigBee/IEEE802.15.4定义了两种类型的设备:它们是全功能设备(FFD,Full Function Device)和精减功能设备(RFD,Reduced Function Device)。FFD可以当作一个网络协调器或者一个普通的传感器节点,它可以和任何其他的设备通讯,传递由RFD发来的数据到其他设备,即充当了路由的功能。而RFD只能是传感器节点,它只能和FFD进行通讯,经过FFD可以将自己测得数据传送出去。在ZigBee网络中大多是这两种设备,网络中结点数理论上最多可达65,536个,可以组成三种类型网络:星型、网状型和树型。 星状网络由一个PAN 协调器和多个终端设备组成,只存在PAN 协调器与终端的通讯,终端设备间的通讯都需通过PAN 协调器的转发。 树状网络由一个协调器和一个或多个星状结构连接而成,设备除了能与自己的父节点或子节点进行点对点直接通讯外,其他只能通过树状路由完成消息传输。 网状网络是树状网络基础上实现的,与树状网络不同的是,它允许网络中所有具有路由功能的节点直接互连,由路由器中的路由表实现消息的网状路由。 星型,如果用星型网络的话,在房间内的节点是否能够穿墙,与房间外的协调器进行正常通信。

TCPIP等协议报文格式

TCP/IP等协议报文格式 应用层(Application) HTTP、Telnet、FTP、SNMP、SMTP 传输层(transport) TCP、UDP 网间层(Internet) IP-ARP、RARP、ICMP 网络接口层(NETwork)Ethernet、X.25、SLIP、PPP 以太网数据报文封装格式 TCP报文 TCP数据区 TCP IP报文 IP数据区 IP 帧头 帧数据区

ETH 前导 目的地址 源地址 帧类型 数据 CRC 长度 8 6 6 2 46~1500 4 用户填充数据60~1514 8字节前导用于帧同步,CRC用于帧校验,此2类数据可由网卡芯片自动添加。目的地址和源地址是指网卡的物理地址,即MAC地址,多数情况下具有唯一性。帧类型或协议类型——0X0806为ARP协议,0X0800为IP协议。 ARP/RARP (地址解析/反向地址解析)报文格式 0~7

8~15 16~23 24~31 硬件协议 协议类型 硬件地址长度 协议地址长度 操作 发送者硬件地址(字节0~3) 发送者硬件地址(字节4~5) 发送者IP地址(字节0~1) 发送者IP地址(字节2~3) 目的硬件地址(字节0~1) 目的硬件地址(字节2~5) 目的IP地址(字节0~3) 硬件类型——发送者本机网络接口类型(以太网=1) 协议类型——发送者所提供/请求的高级协议地址类型(IP协议=0x0800)操作——ARP请求=1,ARP响应=2,RARP请求=3,RARP响应=4

IP数据报头格式如下表0~3 4~7 8~11 12~15 16~18 19~31 4位 版本 4位 包头长度 8位 服务类型(TOS) 16位 总长度 16位 标识号(ID号) 3位 Flag 13位 片偏移 8位 生存时间 8位 协议类型 16位

BACnet协议

BACnet是用于智能建筑的通信协议,是国际标准化组织(ISO)、美国国家标准协会(ANSI)及美国采暖、制冷与空调工程师学会(ASHRAE)定义的通信协议。BACnet针对智能建筑及控制系统的应用所设计的通信,可用在暖通空调系统(HVAC,包括暖气、通风、空气调节)也可以用在照明控制、门禁系统、火警侦测系统及其相关的设备。优点在于能降低维护系统所需成本并且安装比一般工业通信协议更为简易,而且提供有五种业界常用的标准协议,此可防止设备供应商及系统业者的垄断,也因此未来系统扩充性与兼容性大为增加[1]。 BACnet为Building Automation and Control networks 的简称,台湾通常翻译为“建筑自动化控制网路通讯协定”[5][6],而中国大陆则译为“楼宇自动化与控制网络”[7]。 协议简介[编辑]BACnet通信协议中定义了几种不同的数据链结层/物理层,包括: 1.ARCNET(ARCNET)。 2.以太网。 3.BACnet/IP。 4.RS-232上的点对点通信(Point-to-point_(telecommunications))。 5.RS-485上的主站-从站/令牌传递(Master-Slave/Token-Passing,简称MS/TP)通信。 6.LonTalk(LonTalk) BACnet通信协议中定义了许多服务(service),可供各设备之间的通信,服务可以分为五类:有关设备对象管理的服务包括Who-Is、I-Am、Who-Has及I-Have等服务,有关对象访问的服务包括读取属性、写入属性等服务,有关报警与事件的服务包括确认报警、属性改变(change of state)报告等,此外也有有关文件读写及虚拟终端的服务[8]。

zigbee协议栈源码

竭诚为您提供优质文档/双击可除 zigbee协议栈源码 篇一:zigbeez-stack协议栈构架 zstack基础 1、zstack协议栈构架 zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些应用层api,供用户调用。协议栈体系分层架构与协议栈代码文件夹对应表如下:整个协议栈的构架,如图所示 app:应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的。 hal:硬件层目录,包含有与硬件相关的配置和驱动及操作函数。 mac:mac层目录,包含了mac层的参数配置文件及其mac的lib库的函数接口文件。 mt:监控调试层,主要用于调试目的,即实现通过串口调试各层,与各层进行直接交互。nwk:网络层目录,含网络层配置参数文件及网络层库的函数接口文件,aps层库的

函数接口。 osal:协议栈的操作系统。 profile:aF层目录,包含aF层处理函数文件。 security:安全层目录,安全层处理函数接口文件,比如加密函数等。 services:地址处理函数目录,包括着地址模式的定义及地址处理函数。 tools:工程配置目录,包括空间划分及zstack相关配置信息。 zdo:zdo目录。 zmac:mac层目录,包括mac层参数配置及mac层lib 库函数回调处理函数。zmain:主函数目录,包括入口函数main()及硬件配置文件。 output:输出文件目录,这个ew8051ide自动生成的。 2、zigbee20xx协议栈源码库结构分析 了解了zigbee20xx协议栈整个构架后,再来看看协议栈源码库结构是什么样的,各层的具体文件是什么,建立不同的项目、添加自己的应用层任务及处理函数需要修改什么文件。zigbee20xx协议栈zstack-1.4.2文件目录及说明如下: 打开smapleapp项目工程 先看app层:

相关文档