코드 보기
'HOWTO'에 해당되는 글 4건
- 2010/02/09 [howto] .net CompactFramework 용의 Semaphore 클래스
- 2010/01/29 GPS 위치 측정하기
- 2010/01/28 [howto] 기지국 정보 구하기 (C#)
- 2010/01/27 [howto] SQLite C# 버전 사용법 (4)
Windows Mobile 6.0 SDK 를 설치하셨다면, 아래 위치에 샘플 소스코드가 같이 설치됩니다.
64 비트 Windows의 경우:
C:\Program Files (x86)\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS
32 비트 Windows의 경우:
C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS
위도, 경도, 고도 정도만 측정하는 경우라면 이 소스를 사용해도 괜찮을거 같네요.
이번 글에서는 Windows Mobile 휴대폰에서 기지국 정보를 구하는 방법을 소개합니다.
3G 네트워크에서는 기지국 하나가 커버할 수 있는 반경이 2-3km 정도 되기 때문에 기지국 정보만으로도 제한적인 위치 정보 기반 서비스를 할 수 있습니다. 특히 지하에서는 전파 전달이 잘 되지 않기 때문에 곳곳에 기지국을 설치해야 하죠. 때문에 기지국 ID를 알아낼 수 있다면 사용자가 현재 어느 지하철 역에 있는지, 어느 쇼핑몰 안에 있는지, 어느 대학교 안에 있는지를 구분해서 서비스를 제공할 수 있을 것입니다. 지하철에서는 배차 정보나 행선지 찾기 서비스에 응용할 수도 있고, 쇼핑몰에서는 약도나 상품 검색 서비스를 제공할 수 있을 것입니다.
C#으로 Cell ID를 가져오는 방법은 생각보다 복잡합니다. P/Invoke 라는 기술을 사용해야 하는데요. C 언어와 32비트 CPU에 대한 이해가 없으면 헤맬 가능성이 높습니다.
스크린 샷은 다음과 같습니다. 심플하게 MCC/MNC, LAC, CellId 를 찍어 주고 있습니다.
MCC는 국가 코드입니다. 450번이 우리나라인가봐요.
MNC는 통신망 코드입니다. 5번은 SKT 입니다. 전체 코드는 http://en.wikipedia.org/wiki/Mobile_Network_Code 에 나열되어 있습니다.
LAC하고 CellId가 지역/기지국 정보입니다.
코드에 대한 설명을 시작하겠습니다.
너무 길어서 가려둡니다
요즘 모바일용으로 새로운 프로그램을 하나 구상하고 있는데, 데이타베이스 기능이 필수적으로 필요합니다. 물론 MS에서는 SQL Server Compact 3.5 for Windows Mobile을 공개하고 있지만, 핸드폰에 저장된 데이타베이스 파일을 PC로 옮겨서 사용하는 상황을 생각해보면, 핸드폰의 데이타와 동기화하기 위한 MS SQL Server 까지 필요하게 되더군요. 그럴 바엔 공개 라이브러리를 택하는 편이 낫겠다 싶어 조금 찾아보았습니다.
그러다 SQLite 라는 라이브러리를 발견하였습니다. 속도가 얼마나 빠른지는 모르겠지만, 완전히 public domain으로 공개된 소스라 제 마음에 쏙 들더군요. 다운 받을 수 있는 경로는 http://www.sqlite.org 입니다. 원 제작자들은 C 함수로 API를 만들어 놨습니다만, 훌륭한 사람들이 C# 용으로도 개발해 놨더군요. 이것 역시 public domain으로 공개되어 있습니다. http://sqlite.phxsoftware.com/ 에서 다운 받을 수 있습니다.
제가 테스트해본 쪽은 후자쪽입니다. 인스톨 파일을 다운 받아 설치하고, C# 프로젝트를 하나 만든 후에 Reference에 System.Data.SQLite 를 추가해줍니다.
아래는 테스트해볼 겸해서 직접 짜본 코드입니다.
데이타 베이스 파일을 하나 만들고, table을 생성한 뒤에, C:\windows 밑에 있는 파일 목록을 집어 넣습니다. 이후에 1024 ~ 1048576 의 크기를 갖는 파일을 SELECT 하는데, ORDER BY Size로 정렬합니다.
일단 이 정도만 되더라도 모바일에서 쓰기엔 괜찮을거 같다는 생각이 듭니다.
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.IO;
namespace sqlitecs
{
class Program
{
static void Main(string[] args)
{
// Creating a database.
SQLiteConnection.CreateFile("test.db");
// Open the database.
using (var connection = new SQLiteConnection("Data Source=test.db"))
{
connection.Open(); try
{
// Create table.
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "CREATE TABLE File (Name text, Size bigint, Modified datetime);";
command.ExecuteNonQuery();
}
// Insert datas.
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "INSERT INTO File VALUES (?,?,?);";
SQLiteParameter p1 = new SQLiteParameter();
SQLiteParameter p2 = new SQLiteParameter();
SQLiteParameter p3 = new SQLiteParameter();
command.Parameters.Add(p1);
command.Parameters.Add(p2);
command.Parameters.Add(p3);
foreach (var fi in (new DirectoryInfo("c:\\Windows")).GetFiles())
{
p1.Value = fi.Name;
p2.Value = fi.Length;
p3.Value = fi.LastWriteTimeUtc;
command.ExecuteNonQuery();
}
}
// Select files by its size between 1k and 1M
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT * from File where Size >= 1024 and Size <= 1048576 order by Size;";
using (SQLiteDataReader reader = command.ExecuteReader())
{
while(reader.HasRows && reader.Read())
{
Console.WriteLine("{0}, {1}, {2}", reader.GetString(0), reader.GetInt64(1), reader.GetDateTime(2));
}
}
}
}
finally
{
connection.Close();
}
}
}
}
}
-
김상진 댓글주소 수정/삭제 댓글쓰기
안녕하세요 이번에 윈도우 모바일을 처음으로 개발하게 됬는데요
2010/02/22 10:48
c#에서 sqlite를 사용하려고 위와같이 따라 했는데 아래와 같은 오류가 나오더라구요.
무슨 에러일 까요? wm쪽은 처음이다 보니 경험도 없어 잘 모르겠네요.ㅠㅠ
--------------------------------------------------------------------
'System.Data.Common.DbConnection' 형식이 참조되지 않은 어셈블리에 정의되었습니다.
'System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
어셈블리에 참조를 추가해야 합니다. -
세상살기 댓글주소 수정/삭제 댓글쓰기
좋은 정보 감사합니다..
2010/03/25 15:18
다만, 위의 Insert 문장은 트랜잭션 처리를 건별로 자동적으로 수행하기 때문에 속도가 무척 느립니다. c 버젼이나 php 버젼등에서는 begin ; loop {insert } ; commit ; 이런 순으로 바꾸어서 처리해서 속도를 올리죠.
C#은 없는 줄 알았는데 아래처럼 하면 insert 속도가 대략 200배 정도 차이가 날 정도로 빨라지네요..;;;
using (SQLiteTransaction dbTrans = connection.BeginTransaction())
{
using (SQLiteCommand command = connection.CreateCommand())
{
command.CommandText = "INSERT INTO File VALUES (?,?,?);";
SQLiteParameter p1 = new SQLiteParameter();
SQLiteParameter p2 = new SQLiteParameter();
SQLiteParameter p3 = new SQLiteParameter();
command.Parameters.Add(p1);
command.Parameters.Add(p2);
command.Parameters.Add(p3);
foreach (var fi in (new DirectoryInfo("c:\\Windows")).GetFiles())
{
p1.Value = fi.Name;
p2.Value = fi.Length;
p3.Value = fi.LastWriteTimeUtc;
command.ExecuteNonQuery();
label1.Text = "B-INSERT TABLE";
}
}
dbTrans.Commit();
}