⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.h

📁 无线传感器星型网络的节点的基站程序,采用802.15.4协议
💻 H
📖 第 1 页 / 共 3 页
字号:
    WORD panId;
    UINT8 srcAddrMode;
    ADDRESS srcAddr;
    UINT8 dstAddrMode;
    ADDRESS dstAddr;
    MAC_ENUM status;
} MLME_COMM_STATUS_INDICATION;


typedef struct{
	LONG_ADDR  Deviceaddr;
	Node_Capability  cap_info;
	bool              security_use;
	uint8_t          aclentry;
}MLME_ASSOCIATE_INDICATION;

//做扫描时候容忍最多保存记录多少个PAN 描述符和 信道ED值,与实现相关的参数,可由自己确定
#define  MAC_MAX_PAN_DESCRIPTORS     5
#define  MAC_MAX_ED_MEASUREMENT      16

typedef struct {
    BYTE status;
    BYTE scanType;
    DWORD unscannedChannels;
    UINT8 resultListSize;
    union 
		{
    int8_t pEnergyDetectList[MAC_MAX_ED_MEASUREMENT];
    PAN_DESCRIPTOR pPANDescriptorList[MAC_MAX_PAN_DESCRIPTORS];
    };
} MLME_SCAN_CONFIRM;



//--------------------------------------------------//
//---------下面为Zigbee中MAC层原语的函数声明--------//
//--------------------------------------------------//

//原语函数声明
//对于某些比较简单的只返回状态成功与否的confirm原语,可以放在request原语的返回值里面返回。
//对于GTS,zigbee协议里面没有使用,故本版本的协议实现没有实现GTS相关的原语。
//----------------------------------------------------------------------------------------------------------
// MCPS and MLME prototypes (ordered alphabetically)
void mcpsDataRequest(NODE_INFO dst, NODE_INFO src,UINT8 msduLength, BYTE *pMsdu, BYTE msduHandle, BYTE txOptions);
void mcpsDataConfirm(MAC_ENUM status, BYTE msduHandle);

//参数作为一个全局的数据结构体来访问
void mcpsDataIndication(MCPS_DATA_INDICATION  mcps_data_indication_info);

//没有实现该原语
MAC_ENUM mcpsPurgeRequest(BYTE msduHandle);

void mlmeAssociateRequest(UINT8 logicalChannel, BYTE coordAddrMode, SHORT_ADDR coordPANId, ADDRESS pCoordAddress, Node_Capability capabilityInformation, bool securityEnable);

//void mlmeAssociateRequest(UINT8 logicalChannel, BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, Node_Capability capabilityInformation, bool securityEnable);
void mlmeAssociateIndication(MLME_ASSOCIATE_INDICATION   mlme_associate_indication_info);
void mlmeAssociateResponse(LONG_ADDR deviceAddress, SHORT_ADDR assocShortAddress, BYTE status, bool securityEnable);
void mlmeAssociateConfirm(SHORT_ADDR AssocShortAddress, BYTE status);

//参数作为一个全局的数据结构体来访问
void mlmeBeaconNotifyIndication(MLME_BEACON_NOTIFY_INDICATION  beacon_payload_info);

void mlmeCommStatusIndication(WORD panId, BYTE srcAddrMode, ADDRESS *pSrcAddr, BYTE dstAddrMode, ADDRESS *pDstAddr, BYTE status);

void mlmeDisassociateRequest(LONG_ADDR pDeviceAddress, BYTE disassociateReason, bool securityEnable);
void mlmeDisassociateIndication(LONG_ADDR deviceAddress, BYTE disassociateReason, bool securityUse, BYTE aclEntry);
void mlmeDisassociateConfirm(MAC_ENUM status);

MAC_ENUM mlmeGetRequest(MAC_PIB_ATTR pibAttribute, void *pPibAttributeValue);

void mlmeOrphanIndication(LONG_ADDR orphanAddress, bool securityUse, BYTE aclEntry);
void mlmeOrphanResponse(LONG_ADDR orphanAddress, SHORT_ADDR shortAddress, bool associatedMember, bool securityEnable);

//本代码不实现这两个原语
void mlmePollRequest(BYTE coordAddrMode, WORD coordPANId, ADDRESS *coordAddress, bool securityEnable);
void mlmePollConfirm(MAC_ENUM status);

MAC_ENUM mlmeResetRequest(bool setDefaultPIB);


//本版本代码不实现下面两个原语
void mlmeRxEnableRequest(bool deferPermit, uint32_t  rxOnTime, uint32_t rxOnDuration);
void mlmeRxEnableConfirm(MAC_ENUM status);

MAC_ENUM mlmeScanRequest(BYTE scanType, DWORD scanChannels, UINT8 scanDuration);
//没有必要定义mlmescanconfirm函数,scan request得到的结果:
//状态由scan request返回,其他的结果由全局结构MLME_SCAN_CONFIRM返回;
void mlmeScanConfirm(MLME_SCAN_CONFIRM  scan_result_info);

MAC_ENUM mlmeSetRequest(MAC_PIB_ATTR pibAttribute, void *pPibAttributeValue);

//void mlmeStartRequest(SHORT_ADDR  panId, UINT8 logicalChannel, UINT8 beaconOrder, UINT8 superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, bool securityEnable, QWORD StartTime);
void mlmeStartRequest(SHORT_ADDR panId, uint8_t  logicalChannel, uint8_t beaconOrder, uint8_t superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, bool securityEnable , WORD StartTime);

void mlmeStartConfirm(void);

void mlmeSyncRequest(UINT8 logicalChannel, bool trackBeacon);

void mlmeSyncLossIndication(MAC_ENUM lossReason);




//--------------------------------------------------//
//----下面为Zigbee中MAC层内部需要的一些数据结构-----//
//--------------------------------------------------//


//射频发送buffer。已经打包好,准备向物理层发送的MAC帧,
//由于信标帧具有最高的发送优先级,故本队列里面不包括信标帧
//采用间接通信方式的帧由于在收到
typedef struct _TX_BUFFER
{
	//队列中该结构元素是否可用,如果发送完一个不需要ack的帧
	//或者发送一个需要ack的帧,并且已经收到ack帧,则发送完成后可以置IsValid为无效。
	bool IsNeedAcked;
	//区分各个帧的句柄
  BYTE FrameHandle;
  //是否发送过,表明该帧在等待ack中
  bool IsTxed;
  //该帧序列号,在处理应答帧的时候有用。
  BYTE FrameSeq; 
  //该帧已经发送过的次数,初始化为aMaxFrameRetries,每发送一次,减1。为0时候,不需要发送,直接向上层报告出错。
  BYTE FrameRetriesCounter;
  //发送的MAC帧长度
  BYTE frameLength;
  //命令帧类型字段
  BYTE  cmd_type;
  //待发送的帧负载
  BYTE * payload;
  struct _TX_BUFFER   *next;
} TX_BUFFER;

//初始化发送队列函数声明,将IsValid置为无效,payload指针置为空.
void initial_tx_queue(void);

//射频发送队列的操作函数声明,寻找发送buffer中的一个空位置,如果没有,则返回发送忙,把须发送的包放到队列中
TX_BUFFER * add_tx_queue(BYTE framelength, BYTE * payload, BYTE framehandle, bool is_ack, BYTE frameseq,BYTE cmd_type);

//射频发送队列的删除一个元素函数声明。对于需要应答的帧,在收到对应的ack后,即可从队列中删除,释放payload域,置isvalid为无效。
//如果为一个不需要应答的帧,则发送完成收到正确的confirm后即可直接删除掉
void remove_tx_queue(BYTE frameseq);

TX_BUFFER * get_frame_pointer(BYTE frameseq);

//下面的结构用于发送任务的参数传递作用
#define   MAX_TX_BUFFER_SIZE    5
typedef struct _parameter_tx_task
{
     TX_BUFFER * parameter_tx_task[MAX_TX_BUFFER_SIZE];
     uint8_t top;
     uint8_t tail;
}parameter_tx_task;


/*
//
//标志用于存储发送时候需要的信息,不用再到MAC帧里面去查找
typedef struct _MAC_FRAME_FLAG
{
	BYTE IsValid     :1;   //表示该帧是否处理完毕,那么该存储空间可以重新放入一个新的待发送的帧
	BYTE IsAcked     :1;   //
} MAC_FRAME_FLAG;
*/
//pending transaction队列,协调者用于存储采用间接通信的数据或命令帧
//注意:pending队列里面的帧,在发送时,还需要打包进入TX_BUFFERS队列,然后才能发送。在pending队列时候还没有分配帧序列号
typedef struct _INDIRECDT_TX_PENDING_QUEUE
{
	//该元素是否有效,在将该元素添加到发送队列中去以后,可以置该域为无效。同时置pending_payload指针为空
	bool IsValid;
	//可以表明该间接通信的帧已经经历过多少个超帧,如果计数到零,则需要通过原语向上层报告超时。
	//对于数据帧或协调者发给设备的disassociation notification帧,可以采用相应的confirm原语向高层报告
	//对于association response帧,采用comu_status原语向高层报告
	//该值的更新在每次发送信标帧时候,递减1,减到0时候,向上层报告,初始值设为macTransactionPersistenceTime
	uint16_t MacTranPersistCounter;
	//用于区分是哪个帧的句柄
	BYTE FrameHandle;
	//帧控制域,两字节
	FRAME_CONTROL framectl_field;
	bool   associate_or_disassociate;
	SHORT_ADDR shortaddralloc;
	union{
	 BYTE associate_status;
	 BYTE disassociation_reason;
		};
	union{
	 LONG_ADDR associate_device_addr;
	 LONG_ADDR end_device_addr;
		};
	//目标地址和源地址信息,包括PANID
	NODE_INFO  dst;
	NODE_INFO  src;
	//pending帧的长度                
	BYTE frameLength;
	//该帧的负载域
	BYTE * high_level_payload;

	struct _INDIRECDT_TX_PENDING_QUEUE  *next;
	//?????需要扩展?         
} INDIRECT_TX_PENDING_QUEUE;

//操作函数声明

//pending队列的初始化函数
void initial_pending_queue(void);

//添加一个数据包到pending队列中,如果队列满,需要采用对应的原语通知高层。
void add_pending_queue(BYTE framehandle, FRAME_CONTROL framectl, NODE_INFO dst, NODE_INFO src, BYTE framelength, BYTE *payload,BYTE associate_status_or_disassociate_reason,bool associate_or_disassociate,LONG_ADDR addr,SHORT_ADDR shortaddralloc);

//从pending队列中删除一个元素
void remove_pending_queue(INDIRECT_TX_PENDING_QUEUE  *current);
INDIRECT_TX_PENDING_QUEUE * get_pending_frame(NODE_INFO dst);

bool  Is_data_pending(NODE_INFO dst);





void transmit_with_csmaca(void);
uint32_t direct_transmit(uint8_t psdulength,uint8_t * psdu);






//MAC层在收到一个帧后如何处理该帧的函数(或任务)
void mac_frame_rcvd(void);




//定时器中断服务程序post的一个任务
void mac_timer_task(void);

uint16_t mac_timer3queue_getnextinterval(void);


//物理信道状态
//物理层将根据该状态进行接收的帧的预过滤,减轻高层负担


typedef enum  {

	PHY_IDLE=0,
       DOINGCSMA_CA,
       TRANSMITTING_FRAME,
       WAITING_FOR_ACK,
       WAITING_FOR_BEACON,
       INACTIVE_PERIOD
  
}PHY_CHANNEL_STATE ;
PHY_CHANNEL_STATE phy_channel_state;


#define    MAX_RX_BUFFER_SIZE    3
typedef  struct _RX_BUFFER
{
     BYTE    framelength;
     BYTE    * payload;
     BYTE     lqi;
     uint32_t  timestamp;
     struct  _RX_BUFFER  *next;
}RX_BUFFER;

RX_BUFFER * add_to_rx_buffer(BYTE framelength, BYTE *payload,BYTE lqi,uint32_t timestamp);
void  remove_from_rx_buffer(RX_BUFFER  * framepointer);


//该任务负责是从物理层取一个帧并进行解析
void  mac_get_received_frame(void);


//void beacon_received(void);



void data_request_frame_send(void);

void pending_data_send(NODE_INFO dst);

void  data_frame_send(BYTE * nwkpayload, BYTE nwkpayloadlength, NODE_INFO dst,NODE_INFO src,BYTE frameHandle);

void  associate_request_frame_send(SHORT_ADDR panid,NODE_INFO dst, Node_Capability node_capinfo);



void disassociate_notification_frame_send(BYTE disassociation_reason,LONG_ADDR end_device_addr);

void panid_confilct_frame_send(void);

void orphan_notification_frame_send(void);


void beacon_request_frame_send(void);

//#ifdef I_AM_COORDINATOR
void coordinator_realignment_frame_send(bool Isunicast,  NODE_INFO  dst, SHORT_ADDR allocated_addr);

void associate_response_frame_send(SHORT_ADDR coor_short_addr, BYTE associate_status,LONG_ADDR associate_device_addr,SHORT_ADDR shortaddralloc);

void  beacon_frame_send(bool short_or_long);


void mac_frame_send(void);
void pending_frame_handle(void);
//endif
void beacon_frame_tx_timing(void);
void mlmesyn_finished(void);
void  synrequest_task(void);

uint8_t  random_generate(void);
//uint8_t wait_for_backoff_boundary(void);
uint8_t  do_backoff(void);
uint8_t  csma_initial(void);
void  failure_to_tx_with_csma(void);
void CSMA_CA_DOING(void);
void scan_task(void);
#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -