Пример #1
0
        }     // public void run(object x)

        /********************************************
        *  函数名称:GeneratingHartRateData()
        *  功能:基于函数模拟生成心率数据
        *  参数:无
        *  返回值:无
        * ******************************************/
        public void GeneratingHartRateData()
        {
            //int max_rate = 90; //最高心率
            //int min_rate = 70; //最低心率



            heartRateData = new HeartRateDataType();

            Random rand = new Random();

            if (rand.Next() % 2 == 0)
            {
                heartRateData.HeartRate = (Int16)(heartRateValue + rand.Next(-5, 5));
            }
            else if (rand.Next() % 3 == 0 && rand.Next() % 4 == 0)
            {
                heartRateData.HeartRate = (Int16)(heartRateValue + rand.Next(-10, 10));
            }
            else
            {
                heartRateData.HeartRate = (Int16)(heartRateValue + rand.Next(-2, 3));
            }

            this.Component_send_queue.Enqueue(heartRateData); //心率数据进入组件发送队列
            Thread.Sleep(delay);                              //延迟
        }
Пример #2
0
        /****************************************************************
        *  函数名称:CollectHeartRateData()
        *  功能:体温传感器采样数据,采样周期period,同时添加随机噪音数据
        *  参数:无
        *  返回值:无
        * **************************************************************/
        public void CollectHeartRateData()
        {
            //int[] temp = new int[2];
            HeartRateDataType temp = null;

            sampled_hr_data = new HeartRateDataType();

            //生成噪音数据
            noise = this.GeneratingNoiseData(noise_low, noise_high);
            //Console.WriteLine("Component_reveice_queue.Count2=" + this.Component_reveice_queue.Count);
            try
            {
                //若组件接收队列不为空
                if (this.Component_reveice_queue.Count > 0)
                {
                    //temp = (int[])this.Component_reveice_queue.Dequeue();
                    temp = (HeartRateDataType)this.Component_reveice_queue.Dequeue();

                    //Console.WriteLine("Component_reveice_queue.Count3=" + this.Component_reveice_queue.Count);
                    i++;
                    if (i == frequency)
                    {
                        //采样数据添加噪音数据
                        sampled_hr_data.HeartRate = (Int16)(temp.HeartRate + noise);

                        //样本数据进入组件发送队列
                        this.Component_send_queue.Enqueue(sampled_hr_data);
                        //Console.WriteLine("Component_send_queue.Count=" + this.Component_send_queue.Count);
                        i = 0;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("HRS错误情况" + e.Message + e.StackTrace);
            }

            //Thread.Sleep(period); //采样周期
        }
Пример #3
0
        /***************************************************************************
        *  函数名称: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;
                    }
                }
            }
        }
Пример #4
0
        /******************************************************************************
         *  函数名称: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);
            }
        }