/// <summary> /// MUX 메세지를 만들어서 보내준다. /// </summary> /// <returns></returns> public static MUXMsg MakeMUXMsg(string sessionId, ProtocolBase pBase) { //Segment Data 넣기 MUXMsg muxMsg = new MUXMsg(sessionId, pBase); return(muxMsg); }
//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); }
/// <summary> /// 일반 수신기 스케줄러 큐에 쌓다 /// </summary> /// <param name="muxMessage"></param> /// <returns></returns> public bool AddNorQueue(MUXMsg muxMessage) { this.norQueue.Add(muxMessage); return(true); }
/// <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); }