/****************************************************************************** * 函数名称:FrameDecapsulation() * 功能:数据帧解封装 * 参数:无 * 返回值:无 * ***************************************************************************/ public void FrameDecapsulation() { try { Object data = null; if (this.Component_reveice_queue.Count > 0) { //读取无线模块接收队列数据 data = this.Component_reveice_queue.Dequeue(); switch (data.GetType().Name) { case "Frame_802_15_4": //若为802.15.4数据帧 Frame_802_15_4 frame = (Frame_802_15_4)data; //检查目的地址是否为本模块地址 if (frame.dest_addr != mac_address) //若不是 { return; //返回,丢弃该数据帧 } //上层PDU判断方式1:读取第24字节前3bit值,若为011则是6LoWPAN PDU,若为111则为ConnID PDU //上层PDU判断方式2:若pdu_lowpan_iphc变量不为空,则为6LoWPAN PDU,若pdu_connid不为空, //则为ConnID PDU //采用判断方式2 if (frame.pdu_lowpan_iphc != null) { //解封装,获取6LoWPAN PDU,并进入无线模块组件发送队列 this.Component_send_queue.Enqueue(frame.pdu_lowpan_iphc); } else if (frame.pdu_connid != null) { //解封装,获取ConnID PDU,并进入无线模块组件发送队列 this.Component_send_queue.Enqueue(frame.pdu_connid); } break; case "Frame_802_15_1": //若为802.15.1数据帧 Frame_802_15_1 frame802151 = (Frame_802_15_1)data; //检查接入地址是否一致 if (frame802151.access_addr != access_address) //若不是 { return; //返回,丢弃该数据帧 } //解封装,获取ConnID PDU,并进入无线模块组件发送队列 this.Component_send_queue.Enqueue(frame802151.pdu_connid); break; } } } catch (Exception e) { Console.WriteLine("wireless module2错误情况:" + e.Message + " " + e.StackTrace); } }
/****************************************************************************** * 函数名称:FrameEncapsulation() * 功能:数据帧封装 * 参数:x表示数据帧封装格式 * x="frame802154":封装为802.15.4数据帧; * x="frame805151":封装为802.15.1数据帧; * x="frame80211":封装为802.11数据帧 * dest_addr表示目标地址 * 返回值:无 * ***************************************************************************/ public void FrameEncapsulation(string x, UInt64 dest_addr) { Byte temp = 0; try { Object data = null; if (this.Component_reveice_queue.Count > 0) { //读取无线模块接收队列数据 data = this.Component_reveice_queue.Dequeue(); if (data.GetType().Name == "PDU_LoWPAN_IPHC") //若为6LoWPAN报文数据 { //添加802.15.4帧首部 Frame_802_15_4 frame_802_15_4 = new Frame_802_15_4(); frame_802_15_4.frame_control = 0x2033; //帧控制位 0010 0000 0011 0011 if (i < 255) { temp = i++; } else { i = 0; temp = 0; } frame_802_15_4.sequence_number = temp; //序列号 frame_802_15_4.dest_panid = 0x2019; //目标PANID 0010 0000 0001 1001 //frame_802_15_4.dest_addr = 0x10010585FEAB1001;//目标地址 frame_802_15_4.dest_addr = dest_addr; //目标地址 frame_802_15_4.source_panid = 0x2019; //源PANID //frame_802_15_4.source_addr = 0x10010585FEAB5001;//源地址 frame_802_15_4.source_addr = mac_address; //源地址 //添加6LoWPAN PDU frame_802_15_4.pdu_lowpan_iphc = new PDU_LoWPAN_IPHC(); frame_802_15_4.pdu_lowpan_iphc = (PDU_LoWPAN_IPHC)data; //6LoWPAN PDU //802.15.4帧进入组件发送队列 this.Component_send_queue.Enqueue(frame_802_15_4); } else if (data.GetType().Name == "PDU_ConnID") { switch (x) { case "frame802154": //添加802.15.4帧首部 Frame_802_15_4 frame_802_15_4 = new Frame_802_15_4(); frame_802_15_4.frame_control = 0x2033; //帧控制位 0010 0000 0011 0011 if (i < 255) { temp = i++; } else { i = 0; temp = 0; } frame_802_15_4.sequence_number = temp; //序列号 frame_802_15_4.dest_panid = 0x2019; //目标PANID 0010 0000 0001 1001 frame_802_15_4.dest_addr = dest_addr; //目标地址 frame_802_15_4.source_panid = 0x2019; //源PANID frame_802_15_4.source_addr = mac_address; //源地址 //添加ConnID PDU frame_802_15_4.pdu_connid = new PDU_ConnID(); frame_802_15_4.pdu_connid = (PDU_ConnID)data; //ConnID PDU //802.15.4帧进入组件发送队列 this.Component_send_queue.Enqueue(frame_802_15_4); break; case "frame802151": //添加802.15.1帧首部 Frame_802_15_1 frame_802_15_1 = new Frame_802_15_1(); //802.15.1广播接入地址0x8E89BED6 //802.15.1数据接入地址0x8569FAC7 frame_802_15_1.access_addr = (UInt32)dest_addr; //接入地址 frame_802_15_1.notice_header = 0xFB; //通告首部 frame_802_15_1.dev_addr = mac_address; //设备地址 //添加ConnID PDU frame_802_15_1.pdu_connid = new PDU_ConnID(); frame_802_15_1.pdu_connid = (PDU_ConnID)data; //ConnID PDU int len = 0; foreach (Byte[] B in frame_802_15_1.pdu_connid.application_data) { foreach (Byte b in B) { len++; } } frame_802_15_1.payload_length = (Byte)(len + 9); //9:ConnID + message identify //802.15.1帧进入组件发送队列 this.Component_send_queue.Enqueue(frame_802_15_1); break; case "frame80211": break; } } } } catch (Exception e) { Console.WriteLine("wireless module错误情况:" + e.Message + " " + e.StackTrace); } }