|
데이터 베이스 다이어그램
데이터 베이스 구성도 입니다.
기본적으로 member 테이블로 ID와 PW 를 저장 memberContent테이블과 member 테이블은 member 테이블의 기본 키와 memberContent 테이블의 기본 키는 관계가 있습니다. 그리고 member의 ID 와 Diary 테이블은 ID의 관계로 ID의 Diary 을 저장합니다. DiaryKind 는 어던 Diary 인지 구분 합니다. DiaryContent 는 Diary의 내용을 입력 합니다. |
셔틀 버스 검색을 위해 노선을 선택 할 때 사용하는 User Control 이다.
<code explain> |
<BusUserContorl.xaml.cs>
public delegate void ChunAn(string data); public event ChunAn ChunAnEventHandler; // delegate로 ChunAnEventHandler를 생성한다.
void BusUserControl_ChunAnEventHandler(string data) { ChunAnEventHandler(data); }
… private void ChunAnTerminal_Click(object sender, RoutedEventArgs e) { BusUserControl_ChunAnEventHandler("천안터미널"); } … //다음과 같은 이벤트가 발생하였을 때 처리하는 함수 입니다. |
<BusSchedule.xaml.cs>
this.busUserControl1.ChunAnEventHandler += new BusSchedule.BusUserControl.ChunAn(busUserControl1_ChunAnEventHandler);
void busUserControl1_ChunAnEventHandler(string data) { textBlock1.Text = data; busUserControl1.Visibility = System.Windows.Visibility.Collapsed;
SearchBus(); } // 데이터가 넘어오게 되면 SearchBus()에서 버스를 탐색하는 함수로 넘어가게 됩니다.
|
<code explain> |
<GPSUserControl.xaml.cs>
public delegate void GPSTest(int data); public event GPSTest GPSTestHandler; //delegate로 GPSTestHandler를 생성한다.
void GPSTest_GPSTestHandler(int data) { GPSTestHandler(data); }
private void StudnetBtn_Click(object sender, RoutedEventArgs e) { GPSTest_GPSTestHandler(2); }
<Maps.xaml.cs>
GPSUserControl.GPSTestHandler += new BusSchedule.GPSUserControl.GPSTest(GPSUserControl_GPSTestHandler);
void GPSUserControl_GPSTestHandler(int data) { GPSUserControl.Visibility = System.Windows.Visibility.Collapsed; switch (data) { case 1: CenterMove(); break; case 2: StudentMove(); break; } } //해당 이벤트가 발생하게 되면 넘어온 값에 switch case 문에 따라 GPS Simulation의 예제가 실행이 된다.
private void SetMark(double lx, double ly, Image image) { MapLayer maplayer = new MapLayer(); Location location = new Location(); location.Longitude = lx; location.Latitude = ly; PositionOrigin position = PositionOrigin.Center;
maplayer.AddChild(image, location, position); Map.Children.Add(maplayer); }
// 시뮬레이션 되는 마크의 좌표가 변할때마다 마크의 이미지 위치를 변경 시켜주는 부분이다. |
< 해당 지역을 선택하면 GPS Simulation을 확인 할 수 있다.>
<Code Explain> |
<Maps.xaml.cs>
System.Windows.Threading.DispatcherTimer tm = new System.Windows.Threading.DispatcherTimer(); List<Location> road = new List<Location>();
private void StudentMove() { tm.Interval = new TimeSpan(0, 0, 0, 2); tm.Tick += new EventHandler(tm_Tick); tm.Start(); }
//타이머의 시간에 따라 마크가 움직이는 시간을 설정하였다.
void tm_Tick(object sender, EventArgs e) { Map.Children.Clear(); Location center = new Location(); center.Latitude = road[cnt].Latitude; center.Longitude = road[cnt].Longitude; ApplicationTitle.Text = "My Location : "; ApplicationTitle.Text += center.Latitude.ToString() + " " + center.Longitude.ToString(); SetMark6(center); Map.SetView(center, 19); cnt++; if (road.Count == (cnt + 1)) { tm.Stop(); cnt = 0; } } //현재 시뮬레이션 되는 마크의 움직임이 위도와 경도가 어디에 위치했는지 나타내주는 부분이다
private void SetMark6(Location center) { Image image = new Image(); image.Source = new BitmapImage(new Uri("/Images/3.jpg", UriKind.Relative)); image.MaxHeight = 20; image.MaxWidth = 10; SetMark(center.Longitude, center.Latitude, image); }
private void SetMark(double lx, double ly, Image image) { MapLayer maplayer = new MapLayer(); Location location = new Location(); location.Longitude = lx; location.Latitude = ly; PositionOrigin position = PositionOrigin.Center;
maplayer.AddChild(image, location, position); Map.Children.Add(maplayer); } //현재 시뮬레이션 되는 마크가 위도와 경도에 의해 위치가 변경이 되는 코드이다.
|
<지도 화면이 초기화되면서 DB에 저장되어 있던 마크를 불러오게 하는 기능이다.>
<code Explain> |
<Maps.xaml.cs>
List<MarkInfo> one = new List<MarkInfo>(); another_ami_Service.ServiceSoapClient aas = new another_ami_Service.ServiceSoapClient(); //마크가 저장되어 있는 데이터를 가져오기 위해 서비스를 호출하고, 그 데이터를 저장하기 위해 리스트를 생성한다.
aas.RequestSearchmarkCompleted += new EventHandler<another_ami_Service.RequestSearchmarkCompletedEventArgs> (aas_RequestSearchmarkCompleted); aas.RequestSearchmarkAsync("기타1"); //해당 서비스에 대한 이벤트를 호출한다.
void aas_RequestSearchmarkCompleted(object sender, another_ami_Service.RequestSearchmarkCompletedEventArgs e) { byte[] buf = e.Result; MemoryStream ms = new MemoryStream(buf); BinaryReader br = new BinaryReader(ms); int count = br.ReadInt32(); MarkInfo mark_save; for (int i = 0; i < count; i++) { double mark_y = br.ReadDouble(); double mark_x = br.ReadDouble(); string mark_title = br.ReadString(); string mark_body = br.ReadString(); string mark_kind = br.ReadString(); mark_save = new MarkInfo(mark_title, mark_body, mark_x, mark_y); Location center = new Location(); if (mark_kind == "기타1") { one.Add(mark_save); center.Latitude = mark_y; center.Longitude = mark_x; SetMark1(center); } else if (mark_kind == "기타2") …
} } } //DB에 저장 되어 있는 마크에 대한 정보를 불러오는 이벤트 핸들러 함수이다. 불러옴과 동시에 List에 마크에 대한 정보가 순차적으로 저장된다.
Location center = new Location(); foreach (MarkInfo mk in one) { center.Latitude = mk.Ynum; center.Longitude = mk.Xnum; SetMark2(center); } //리스트에 저장되어 있는 마크에 대한 정보 중 위도와 경도를 불러온다.
private void SetMark2(Location center) { Image image = new Image(); image.Source = new BitmapImage(new Uri("/Images/12.jpg", UriKind.Relative)); image.MaxHeight = 20; image.MaxWidth = 10; SetMark(center.Longitude, center.Latitude, image); } //맵에 마크로 쓸 이미지에 대한 정보를 입력한다.
private void SetMark(double lx, double ly, Image image) { MapLayer maplayer = new MapLayer(); Location location = new Location(); location.Longitude = lx; location.Latitude = ly; PositionOrigin position = PositionOrigin.Center;
maplayer.AddChild(image, location, position);
Map.Children.Add(maplayer); } //맵에 마크를 추가 해준다. |
Pin 찍기 기존에 핀을 찍는 메소드가 있지만 이번 프로젝트에서는 기존에 있는 이미지와 다른 이미지를 사용하기 위해 새로 dll을 만듬. MapPin.dll 파일을 추가
MapPin.dll ImagSize : 등록 될 이미지의 크기를 정한다. AddPin : 이미지를 등록한다. MovePin : 화면을 이동한다.( 기존의 SetView는 좌표를 Location 형으로 바꿔 넣어야 하는 것을 좌표를 넣어도 이동할 수 있도록 변경) DeletePin : 등록한 핀을 삭제.
사용한 예)
|
1. IOCP, .NET Socket 파일전송
IOCP 서버 1) 풀 소스(파일정보)
4) 분석 1000바이트씩 다운받는다고 설정이 되어 있을 때 남은 파일의 사이즈가 1000이 넘는다면 실제 받은 recvsize만큼씩 줄여가면서 반복적으로 파일을 써주고 1000 이하일때 마지막으로 받은 후 파일을 닫아준다.
.NET SOCKET 클라이언트 1) 풀소스
의 형태로 저장될 것이다.
속성들을 바꿔보면
yy 는 2자리 년 yyy, yyyy는 4자리 년 YY, YYYY는 형식없음 MM은 월 단위의 숫자 MMMM은 숫자+”월”까지 출력 dd는 일 단위의 숫자 ddd는 해당 일의 요일 dddd는 해당 일의 요일+”요일”까지 출력 DD, DDDD는 형식 없음 tt, ttt, tttt는 오전, 오후를 출력해줌 TT, TTTT는 형식없음 hh, hhh, hhhh는 12시간 단위의 시 HH, HHHH는 24시간 단위의 시 mm, mmm, mmmm은 분 ss, sss, ssss는 초 SS, SSSS는 형식없음
인 것을 알 수 있다. 정리해보면
이 된다.
이를 이용하면 시간까지 변경할 수 있게 된다 3. 사용된 서비스 중
프로시저가 row를 반환(2개의 column) + 이미지 파일을 반환 + 개수를 체크하고 pack화 public byte[] AllMarkKind() { SqlConnection sConn; SqlCommand sComm;
// 데이터베이스 접속 sConn = new SqlConnection(); sConn.ConnectionString = @"Data Source=504-19\SQL2005;Initial Catalog=amiDB;User ID=sa;Password=1;Pooling=False"; sComm = new SqlCommand();
// 프로시저 sComm.Connection = sConn; sComm.CommandText = "AllMarkKind"; sComm.CommandType = CommandType.StoredProcedure; sConn.Open(); // 프로시저 내의 select된 row를 받기위한 dr SqlDataReader dr = sComm.ExecuteReader();
// 결과를 보관할 byte[] 선언 byte[] result = new byte[4096]; MemoryStream ms = new MemoryStream(result); BinaryWriter bw = new BinaryWriter(ms);
// 이미지를 보관할 byte[] byte[] buf = null; int count = 0; while (dr.Read()) { // 카운트 count++; // 첫번째 column의 이미지 이름을 result에 써줌 bw.Write((string)dr.GetValue(0)); // 두번째 column에는 이미지의 이진 데이터 buf = (byte[])dr.GetValue(1); // 이진 데이터의 길이를 써줌 bw.Write(buf.Length); // 실제 이진 데이터를 써줌 bw.Write(buf); } // result에는 이름+이미지이진데이터길이+이미지이진데이터
// 제일 앞에 갯수를 추가해주고, result를 뒤에 붙일것임 byte[] pack = new byte[4 + (int)ms.Position]; MemoryStream pms = new MemoryStream(pack); BinaryWriter pbw = new BinaryWriter(pms);
pbw.Write(count); pbw.Write(result, 0, (int)ms.Position);
// 모든 것을 닫고 pms.Close(); pbw.Close(); dr.Close(); sConn.Close(); // pack을 반환 return pack; }
|
Flow
사용자는 windows phone 7 에서 또는 웹 어플리케이션을 통해서 데이터베이스 연결 되며
마크, 다이어리 등을 저장 및 출력 합니다. 또한 관리자 어플리케이션을 통해서 학과의 정보, 식당을 저장 및 출력 합니다.
Future Work
선문대학교 에는 한국 학생들뿐만이 아니라 여러 나라의 학생들이 공존하고 있는 곳입니다.
다양한 언어들을 서비스를 제공할 것입니다.
또한 GPS 를 통한 길 찾기 기능을 제공 할 수 있습니다.
Reference
--책
실버라이트 3
RIA in silverlight
에덤 네이선의 WPF 언리쉬드
NETWORK PROGERAMMING WINDOWS 2
Programming Windows Phone 7
.NET Enterprise System 객체 지향 CBD 개발 방법론
--웹 브라우저
MSDN
ehclub
|