} // public void run(object x) /******************************************** * 函数名称:GeneratingBloodPressureData() * 功能:基于函数模拟生成血压数据 * 参数:无 * 返回值:无 * ******************************************/ public void GeneratingBloodPressureData() { bpData = new BloodPressureDataType(); Random rand = new Random(); if (rand.Next() % 2 == 0) { bpData.HighBP = (Int16)(HighPressure + rand.Next(-15, 15)); bpData.LowBP = (Int16)(LowPressure + rand.Next(-10, 10)); } else if (rand.Next() % 3 == 0 && rand.Next() % 4 == 0) { bpData.HighBP = (Int16)(HighPressure + rand.Next(-20, 20)); bpData.LowBP = (Int16)(LowPressure + rand.Next(-10, 10)); } else { bpData.HighBP = (Int16)(HighPressure + rand.Next(-5, 5)); bpData.LowBP = (Int16)(LowPressure + rand.Next(-5, 5)); } this.Component_send_queue.Enqueue(bpData);//血压数据进行组件发送队列 Thread.Sleep(delay); }
/*************************************************************************** * 函数名称:NetworkPacketProcess * 功能:进行网络报文处理 * 依据源IPv6地址接口标识获得节点标识,填充“节点标识-网络前缀”映射表 * 依据源IPv6地址网络前缀判断通信技术类型 * 依据源端口号判断数据类型 * 参数:无 * 返回值:无 * *************************************************************************/ private void NetworkPacketProcess(PDU_Network IPv6_packet) { //获取源IPv6地址 UInt16[] source_IPv6_addr = IPv6_packet.source_ipv6_address; UInt16[] IPv6_Prefix = new UInt16[4]; //网络前缀 UInt16[] IPv6_IID = new UInt16[4]; //接口标识 bool[] Category = new bool[4]; //子网类别 bool[] Tech_ID = new bool[4]; //通信技术类型 for (Int16 i = 0; i < 4; i++) { IPv6_Prefix[i] = source_IPv6_addr[i]; } int j = 0; for (Int16 i = 4; i < 8; i++) { IPv6_IID[j++] = source_IPv6_addr[i]; } //填充“节点标识-网络前缀”映射表 NodeIID_NetPrefix_Mapping.Add(IPv6_IID, IPv6_Prefix); //获取网络前缀第四字段 Byte[] temp_arr = BitConverter.GetBytes(IPv6_Prefix[3]); BitArray temp_bitarr = new BitArray(temp_arr); //同一字节低位优先 //网络前缀中,第四字段5、6、7、8位为子网类别,对应存储位为4、3、2、1 j = 0; for (Int16 i = 3; i >= 0; i--) { Category[j++] = temp_bitarr[i]; } //若子网类别为0x8;0x9;0xA;0xB;则可判断为源节点来自物联子网 if ((Category[0] && !Category[1] && !Category[2] && !Category[3]) || (Category[0] && !Category[1] && !Category[2] && Category[3]) || (Category[0] && !Category[1] && Category[2] && !Category[3]) || (Category[0] && !Category[1] && Category[2] && Category[3])) { //获取通信技术类型 //网络前缀中,第四字段9、10、11、12位为子网类别,对应存储位为15、14、13、12 j = 0; for (Int16 i = 15; i >= 12; i--) { Tech_ID[j++] = temp_bitarr[i]; } //Console.WriteLine("----------------------------------------------------------------"); //Console.Write(Tech_ID[0] + " "+Tech_ID[1] + " "+Tech_ID[2] + " "+Tech_ID[3] + " "); //若Tech ID为0x9,则采用6LoWPAN技术 if (Tech_ID[0] && !Tech_ID[1] && !Tech_ID[2] && Tech_ID[3]) { LoWPAN_data = IPv6_packet.pdu_transport.application_data; //Console.WriteLine("LoWPAN_data长度=" + LoWPAN_data.Count); switch (IPv6_packet.pdu_transport.source_port) { case 0xF0BF: //若采用6LoWPAN技术的报文源端口号为0xF0BF,则为血压数据 BloodPressure_data.Clear(); //血压数据列表变量清空 for (int i = 0; i < LoWPAN_data.Count - 1; i = i + 2) { BloodPressureDataType bpData = new BloodPressureDataType(); bpData.HighBP = BitConverter.ToInt16(LoWPAN_data[i], 0); bpData.LowBP = BitConverter.ToInt16(LoWPAN_data[i + 1], 0); BloodPressure_data.Add(bpData); } //Console.WriteLine("BloodPressure_data长度=" + BloodPressure_data.Count); //lock (lockObject) //{ //血压数据进入网络数据处理组件发送队列 this.Component_send_queue.Enqueue(BloodPressure_data); //} break; //可扩展... ... } } //若Tech ID为0xA,则采用ConnID技术 else if (Tech_ID[0] && !Tech_ID[1] && Tech_ID[2] && !Tech_ID[3]) { ConnID_data = IPv6_packet.pdu_transport.application_data; //Console.WriteLine(IPv6_packet.pdu_transport.source_port + " "); switch (IPv6_packet.pdu_transport.source_port) { case 0xF0BF: //若采用ConnID技术且报文源端口号为0xF0BF,则为体温数据 Temperature_data.Clear(); //体温数据列表变量清空 for (int i = 0; i < ConnID_data.Count - 1; i = i + 2) { TemperatureDataType tempData = new TemperatureDataType(); tempData.TemperatureInteger = ConnID_data[i][0]; tempData.TemperatureDecimal = ConnID_data[i + 1][0]; Temperature_data.Add(tempData); } this.Component_send_queue.Enqueue(Temperature_data); break; case 0xF0BE: //若采用ConnID技术且报文源端口号为0xF0BE,则为心率数据 HeartRate_data.Clear(); //心率数据列表变量清空 for (int i = 0; i < ConnID_data.Count - 1; i = i + 1) { HeartRateDataType hrData = new HeartRateDataType(); hrData.HeartRate = BitConverter.ToInt16(ConnID_data[i], 0); HeartRate_data.Add(hrData); } this.Component_send_queue.Enqueue(HeartRate_data); break; } } } }
/****************************************************************************** * 函数名称:MessageEncapsulation() * 功能:报文封装 * 参数:x 表示模拟传输协议 * x="6LoWPAN" 表示构建6LoWPAN协议数据单元 ,x="ConnID"表示构建基于ConnID * 方式协议数据单元 * 返回值:无 * ***************************************************************************/ public void MessageEncapsulation(string x) { try { Object temp = null; if (this.Component_reveice_queue.Count > 0) { //读取微处理器组件接收队列数据 temp = this.Component_reveice_queue.Dequeue(); //将该数据作为应用层数据,同时转换为字节表示形式 List <Byte[]> app_data = new List <Byte[]>(); //应用层数据列表 //if (temp.GetType().Name == "Int32[]") switch (temp.GetType().Name) { case "BloodPressureDataType": BloodPressureDataType bpData = (BloodPressureDataType)temp; Byte[] bytes0 = BitConverter.GetBytes(bpData.HighBP); Byte[] bytes1 = BitConverter.GetBytes(bpData.LowBP); app_data.Add(bytes0); app_data.Add(bytes1); break; case "TemperatureDataType": TemperatureDataType tempData = (TemperatureDataType)temp; //Byte[] bytes2 = BitConverter.GetBytes(tempData.TemperatureInteger); //Byte[] bytes3 = BitConverter.GetBytes(tempData.TemperatureDecimal); app_data.Add(new Byte[] { tempData.TemperatureInteger }); app_data.Add(new Byte[] { tempData.TemperatureDecimal }); break; case "HeartRateDataType": HeartRateDataType hrData = (HeartRateDataType)temp; Byte[] bytes4 = BitConverter.GetBytes(hrData.HeartRate); app_data.Add(bytes4); break; } switch (x) { case "6LoWPAN": //6LoWPAN协议数据单元 //构建6LoWPAN PDU PDU_LoWPAN_IPHC pdu_lowpan_iphc = new PDU_LoWPAN_IPHC(); pdu_lowpan_iphc.dispatch = 0x7C; //0111 1100 pdu_lowpan_iphc.iphc_header = 0xD5; //1101 0101 pdu_lowpan_iphc.context_identifier = 0x12; //0001 0010 pdu_lowpan_iphc.IP_uncompressed_field = new List <Byte[]>(); //非压缩字段1,跳数限制255 Byte[] hop_limit = new Byte[] { 0xFF }; pdu_lowpan_iphc.IP_uncompressed_field.Add(hop_limit); //非压缩字段2,源地址1201_0585_FEAB_5001H Byte[] source_addr = new Byte[] { 0x12, 0x01, 0x05, 0x85, 0xFE, 0xAB, 0x50, 0x01 }; pdu_lowpan_iphc.IP_uncompressed_field.Add(source_addr); //非压缩字段3,目的地址0000_0000_0000_1234H Byte[] dest_addr = new Byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34 }; pdu_lowpan_iphc.IP_uncompressed_field.Add(dest_addr); //根据IPHC报头NH=1,可判断下一报头采用LoWPAN_NHC压缩 pdu_lowpan_iphc.nhc_header = 0xF3; //1111 0011 pdu_lowpan_iphc.NH_field = new List <Byte[]>(); //根据nhc_header最后两位,确定端口号采用最短压缩形式,即源端口号和目的端口号所占存储均为4bit,默认前12bit为0xF0B Byte[] port = new Byte[] { 0xF0 }; //即源端口号为0xF0BF,目的端口号为0xF0B0; pdu_lowpan_iphc.NH_field.Add(port); //UDP校验和0 Byte[] checksum = new Byte[] { 0x00, 0x0F }; pdu_lowpan_iphc.NH_field.Add(checksum); //添加应用层数据 //foreach (Byte[] data in app_data) //{ // pdu_lowpan_iphc.application_data.Add(data); //} pdu_lowpan_iphc.application_data = app_data; //6LoWPAN PDU进入组件发送队列 this.Component_send_queue.Enqueue(pdu_lowpan_iphc); //foreach (PDU_LoWPAN_IPHC p in Component_send_queue) //{ // Console.WriteLine(p + "////"); //} break; case "ConnID": //ConnID协议数据单元 //构建ConnID PDU PDU_ConnID pdu_connid = new PDU_ConnID(); pdu_connid.message_identifier = 0xFF; //FF表示Data消息类型 //Byte[] connid = new Byte[] { 0xF4, 0x31, 0xCA, 0x18, 0x5F, 0x74, 0xC6, 0xE6 }; //f431ca185f74c6e6 //pdu_connid.connid = new List<byte[]>(); //pdu_connid.connid.Add(connid); pdu_connid.connid = 0xF431CA185F74C6E6; //添加应用层数据 //foreach (Byte[] data in app_data) //{ // pdu_connid.application_data.Add(data); //} pdu_connid.application_data = app_data; //ConnID PDU进入组件发送队列 this.Component_send_queue.Enqueue(pdu_connid); break; case "ConnID_2": //ConnID协议数据单元 //构建ConnID PDU PDU_ConnID pdu_connid_2 = new PDU_ConnID(); pdu_connid_2.message_identifier = 0xFF; //FF表示Data消息类型 //Byte[] connid_2 = new Byte[] { 0x73, 0xB6, 0xD1, 0x72, 0x50, 0x35, 0x87, 0x8d }; //73b6d1725035878d //pdu_connid_2.connid = new List<byte[]>(); //pdu_connid_2.connid.Add(connid_2); pdu_connid_2.connid = 0x73B6D1725035878D; //添加应用层数据 //foreach (Byte[] data in app_data) //{ // pdu_connid.application_data.Add(data); //} pdu_connid_2.application_data = app_data; //ConnID PDU进入组件发送队列 this.Component_send_queue.Enqueue(pdu_connid_2); break; } } } catch (Exception e) { Console.WriteLine("MP错误情况:" + e.Message + e.StackTrace); } }