Exemplo n.º 1
0
        /// <summary>
        /// MUX 메세지를 만들어서 보내준다.
        /// </summary>
        /// <returns></returns>
        public static MUXMsg MakeMUXMsg(string sessionId, ProtocolBase pBase)
        {
            //Segment Data 넣기
            MUXMsg muxMsg = new MUXMsg(sessionId, pBase);

            return(muxMsg);
        }
Exemplo n.º 2
0
        //public static void showbits(string rem, BitArray bits)
        //{
        //    Console.WriteLine(rem);
        //    for (int i = bits.Count - 1; i > -1; i--)
        //    {
        //        Console.Write("{0, -6} ", bits[i]);
        //    }
        //    Console.WriteLine("\n");
        //}
        #endregion


        /// <summary>
        /// 특수 수신기 스케줄러 큐에 쌓다
        /// </summary>
        /// <param name="muxMessage"></param>
        /// <returns></returns>
        public bool AddSpcQueue(MUXMsg muxMessage)
        {
            this.spcQueue.Add(muxMessage);

            return(true);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 일반 수신기 스케줄러 큐에 쌓다
        /// </summary>
        /// <param name="muxMessage"></param>
        /// <returns></returns>
        public bool AddNorQueue(MUXMsg muxMessage)
        {
            this.norQueue.Add(muxMessage);

            return(true);
        }
Exemplo n.º 4
0
        /// <summary>
        /// MUX로 보낼 만큼의 byte[] 로 잘라 리스트로 반환한다.
        /// </summary>
        /// <param name="byteArray"></param>
        /// <returns></returns>
        private List <byte[]> SplitMUXMsg(MUXMsg muxMsg)
        {
            List <byte[]> segList = new List <byte[]>(); //반환할 세그먼트 리스트

            try
            {
                //받은 byteArray 의 개수를 26byte 로 나눈 개수
                int listCount = (muxMsg.message.Length / 26) + 1;

                // 받은 byteArray 의 개수를 26으로 나눈 나머지
                int listLeft = muxMsg.message.Length % 26;

                //복사를 위해 필요한 임시 byte 배열
                byte[] segArray = null;

                /////////////////////////////Segment Header//////////////////////////////
                int segHeader = 0;

                //1. DC(1)
                // '1' : d2=0 세그먼트 전송 이후, D2=1 인 데이터가 전송 예정임을 나타냄.
                // '0' : d2=0 세그먼트 전송 이후, D2=1 인 데이터 전송 안됨.
                int dc = 1;
                dc        = dc << 31;
                segHeader = dc | segHeader;


                //2. Valid_bit(1)
                //'1': data 에 유용한 정보가 있음.
                //'0': data 가 Null 임.
                int validBit = 1;
                validBit  = validBit << 30;
                segHeader = validBit | segHeader;


                //3. Provider(3)
                // '000' :소방방재청
                int provider = 0;
                provider  = provider << 27;
                segHeader = validBit | segHeader;


                //4. Version(3)
                //: '000'
                int version = 0;
                version   = version << 24;
                segHeader = validBit | segHeader;

                ////5. Identification(8)
                ////메세지 고유 ID (0~255 까지)
                //int id = 0;
                //id = id << 16;
                //segHeader = id | segHeader;

                //6. Total Segment(6)////
                //메세지 전체 세그먼트 수(받은 byte 를 26byte 로 나눈 수)
                int totSeg = listCount;
                totSeg    = totSeg << 10;
                segHeader = totSeg | segHeader;

                ////7. Current Segment(6)
                ////메세지의 현재 세그먼트 번호 (현재 전송중인 세그먼트)
                //int curSeg = 0;
                //curSeg = curSeg << 4;
                //curSeg = curSeg | segHeader;

                //8. Extension(4) - Version '000' : 사용 안함
                int extension = 0;
                extension = extension << 0;
                extension = extension | segHeader;


                if (muxMsg.message.Length <= 26)
                {
                    //5. Identification(8)/////////////////////////////////
                    //메세지 고유 ID (0~maxid 까지)
                    int id = nowSendId;
                    id        = id << 16;
                    segHeader = id | segHeader;

                    if (this.nowSendId < Convert.ToInt32(ConfigurationManager.AppSettings["MaxId"]))
                    {
                        this.nowSendId++;
                    }
                    else
                    {
                        this.nowSendId = 0;
                    }

                    //7. Current Segment(6)
                    //메세지의 현재 세그먼트 번호 (현재 전송중인 세그먼트)
                    int curSeg = 1;
                    curSeg = curSeg << 4;
                    curSeg = curSeg | segHeader;

                    segArray = new byte[listLeft + sizeof(int)];
                    Array.Copy(BitConverter.GetBytes(segHeader), 0, segArray, 0, sizeof(int));
                    Array.Copy(muxMsg.message, 0, segArray, 0, listLeft);
                    segList.Add(segArray);
                }
                else
                {
                    //현재 세그먼트 번호
                    //전체 세그먼트 번호
                    //재난 메세지 ID
                    // byte tempSendId = 0;

                    for (byte i = 0; i < listCount; i++)
                    {
                        //5. Identification(8)
                        //메세지 고유 ID (0~maxid 까지)
                        int id = nowSendId;
                        id        = id << 16;
                        segHeader = id | segHeader;

                        if (this.nowSendId < Convert.ToInt32(ConfigurationManager.AppSettings["MaxId"]))
                        {
                            this.nowSendId++;
                        }
                        else
                        {
                            this.nowSendId = 0;
                        }

                        //7. Current Segment(6)
                        //메세지의 현재 세그먼트 번호 (현재 전송중인 세그먼트)
                        int curSeg = (i + 1);
                        curSeg    = curSeg << 4;
                        segHeader = curSeg | segHeader;


                        #region 비트 검증을 위한 출력 코드
                        //BitArray ba = new BitArray(8);
                        //byte[] b1 = { BitConverter.GetBytes(segHeader)[0] };
                        //byte[] b2 = { BitConverter.GetBytes(segHeader)[1] };
                        //byte[] b3 = { BitConverter.GetBytes(segHeader)[2] };
                        //byte[] b4 = { BitConverter.GetBytes(segHeader)[3] };

                        //ba = new BitArray(b1);
                        //showbits("4 of 1:", ba);
                        //ba = new BitArray(b2);
                        //showbits("4 of 2:", ba);
                        //ba = new BitArray(b3);
                        //showbits("4 of 3:", ba);
                        //ba = new BitArray(b4);
                        //showbits("4 of 4:", ba);
                        #endregion

                        /////////////////////////////Segment Data//////////////////////////////
                        if (i == (listCount - 1))
                        {
                            segArray = new byte[listLeft + sizeof(int)];
                            Array.Copy(BitConverter.GetBytes(segHeader), 0, segArray, 0, sizeof(int));
                            Array.Copy(muxMsg.message, i * 26, segArray, 2, listLeft);
                        }
                        else
                        {
                            segArray = new byte[26 + sizeof(int)];
                            Array.Copy(BitConverter.GetBytes(segHeader), 0, segArray, 0, sizeof(int));
                            Array.Copy(muxMsg.message, i * 26, segArray, 2, 26);
                        }

                        //Segment Array 에 추가
                        segList.Add(segArray);
                    }
                }
            }
            catch (Exception ex)
            {
                segList.Clear(); //세그먼트 리스트의 요소를 모두 지운다.

                Debug.WriteLine("MUX.MUXScheduler.SplitMUXMsg()| " + ex.Message);
                Log.WriteLog("MUX.MUXScheduler.SplitMUXMsg()| " + ex.Message);
            }

            return(segList);
        }