Wednesday, November 26, 2008
Symbian อีกแล้ว
วันนี้บังเอิญเจอ link เทพ ที่เมื่อก่อนจะรวบรวมโค้ดที่น่าจะทำไม่ได้ แต่ทำได้ของมือถือ Symbian S60
เป็นอาจารย์ เอ่อ Ph.D น่ะครับ อยู่ที่นึง ชื่อ Mika Raento ไม่ได้รู็้จักเป็นการส่วนแต่ แต่แกเทพมากๆเมื่อตอนประมาณ 3-4 ปีก่อนน่ะครับ แต่เดี๋ยวนี้ Symbian มันก็ออกใหม่เรื่อง เป็น 3rd edition/ 5th Edition อาจจะล้าสมัยไปหน่อย แต่ก็เป็นที่ๆ share ความรู้ขั้นเทพที่ยังคงเหลืออยู่ ถ้าวจะเขียน code Symbian แบบ Advance ก็ควรที่จะดูไว้บ้างเหมือนกันนะครับ
เอามาเก็บไว้เผื่อต้องการหาครับ
Sunday, October 12, 2008
Install Subversion บน Windows
ไหนๆก็งงมาตั้งนานขอเอามา post เก็บไว้เผื่อใครมาติดแบบผมจะได้ไปได้ไว
INTRODUCTION
เราจะติดตั้งระบบ Subversion เพื่อใช้ในการภายในครับ Software ที่ใช้ได้แก่
- CollabNet Subversion ผมใช้ CollabNetSubversion-server-1.5.2-2.win32.exe
เป็น Installer สำเร็จ ส่วนจะสำเร็จไม่สำเร็จนั้นอีกเรื่องหนึ่ง... เอ้อ ผมเป็น Server โหลดที่ีนี่ครับ
http://www.collab.net/downloads/subversion/
- ตัว Tortoise SVN ถือว่าจะใช้เป็น Client ครับ ผมใช้ TortoiseSVN-1.5.3.13783-win32-svn-1.5.2.msi
โหลดไว้ซักพักแล้ว เป็น Installer สำเร็จจริงๆ ก็ลงแล้วใช้ได้เลยนะ โหลดที่นี่ครับ
http://tortoisesvn.net/downloads
มีแค่ 2 ตัวนี้ละครับ ที่จริงผมลอง WinCVS ด้วย เดี๋ยวจะเล่าถึงความงงให้อ่านทีหลัง
เริ่มกันเลย
1. ทั้ง 2 ตัวไม่ขึ้นต่อกัน (as far as I know นะครับ) ลงไปเลย แต่ก็จะเขียนตามที่ผมทำละกันครับ
บังเอิญผมลง เจ้า Tortoise SVN ก่อนครับ ก็ลงปกติ
เลือก Path ที่จะลง จะไว้ใน Program file ก็ได้ครับ หรือจะไว้ drive อื่นก็ไม่เป็นปัญหา
Next โลด แล้วเสร็จก็ Restart เครื่องซะ 1 ที
2. เสร็จแล้วมาลง CollabNet Subversion Server กัน เป็น Installer ก็เลือกตามไปปกติครับ
มันให้เลือกเลือก port ของ Subversion ปกติก็เลือก 3690
มันให้เลือกที่อยู่(Folder ของ Repository) ผมก็เลือกตามมัน เปลี่ยนหน่อยตรงที่ผมให้มันอยู่ Drive D:
เป็น D:\svn_repository ก็ธรรมดานะ
มันให้เลือก port ของ Apache (โอ้โห มี Apache ให้ด้วย) ผมไม่เอา 80 เพราะจะชนกะตัวอื่น ผมยังไม่รู้ว่าจะกระทบอะไรเมื่อไร แต่ถ้าทราบแล้วจะเอามาเขียน update ครับ (แต่ว่าตอนใช้งาน ผมก็ไม่ระบุ port นะถึงจะสร้าง project ได้ ก็ยังงงๆอยู่เหมือนกันคนับว่าจะไปใช้ตอนไหน เชื่อว่าใช้กับ Client ที่เป็น Browser อยู่แล้วละนะ)
มันให้เลือก Repository Folder อีกแล้ว ผมก็ว่าอะไรนักหนานะ แล้วก็ใส่ให้มันตามเดิม แล้ว Next
(ขออภัยครับ ไม่ได้มีรูปเลย)
มันให้เลือกอะไรอีกนิดหน่อย ผมจำไม่ได้ มีการให้เลือกว่าจะให้ View Tools อะไรซักอย่าง เข้าถึงได้มั้ย
บังเอิญผม Setup แบบ Newbie ก็ขอเปิดด้วยละกัน เพราะคุ้นๆว่าอาจได้ใช้ แล้วก็ไม่ได้ห่วย Security เพราะจะใช้ใน LAN
จบแล้วครับ มันควรจะใช้ได้ แต่ยังครับ
3. เราต้องแก้ไข user-password ของ Subversion ซักหน่อย
ผมอ่านตามเวบนี้ครับ
http://blogs.vertigosoftware.com/teamsystem/archive/2006/01/16/Setting_up_a_Subversion_Server_under_Windows.aspxข้ามไปข้อ C) ของเค้าเลยนะครับ เพราะก่อนหน้านั้น Wizard ของการลง ColabNet นั้นจัดการเรียบวุธไปแล้ว
ขออนุญาติเอามาแปะไว้นะครับ (ขอมันซะที่ประเทศไทยนี่แหละ)
C) Create a Repository
- Open a command prompt and type อันนี้เค้าจะสร้าง Repository ที่จริง Wizard ทำแล้วแต่พอเราเข้าไปดูจะเห็นเป็นแค่ Folder เปล่าๆครับ ทีแรกผมสร้างใหม่ อีก Folder หนึ่ง แต่แนะนำว่าใช้อันเดิมไปเลย (เพราะตอนท้ายเราจะไม่ต้องมาแก้ Service ที่ Wizart Gen เอาไว้ให้แล้ว)
svnadmin create "c:\Documents and Settings\Subversion Repository" ก็พิมพ์ตามนี้ครับ แก้ Folder เป็นของคุณเองนะครับ
- Navigate to the folder we just created. Within that folder, uncomment the following lines in the /conf/svnserve.conf file: แก้ Conf file ที่ Folder ที่สร้างขึ้น
[general]
anon-access = read
auth-access = write
password-db = passwdNext, uncomment these lines in the /conf/passwd file:
[users]
harry = harryssecret
sally = sallyssecret
4. ตรวจตามเค้า
D) Verify that everything is working
- Start the subversion server by issuing this command in the command window:
svnserve --daemon --root "C:\Documents and Settings\Subversion Repository"
ตรงนี้หน้าจอ conmmand จะค้างนะครับ
ไม่ต้องแปลกใจเพราะเป็นการตั้งใจของเค้าที่จะรันโปรแกรมเอง ก่อนที่จะไปทำ Service -
Create a project by opening a second command window and entering this command:
svn mkdir svn://localhost/myproject
ให้เปิดหน้า command ใหม่ขึ้นมาแล้วทำต่อ ตรงนี้ที่ผมงงว่าตกลงใช้ port อะไรแต่ที่ลอง ไม่ต้องใส่ port ครับ
แม้ว่าผมจะ set ให้ Apache เป็น port อื่นไปก็ตาม ก็ต้องไม่ใส่ portIt's a standard Subversion convention to have three folders at the root of a project:
เค้าว่ามันจะสร้าง Folder ตามนี้ ผมก็ยังไม่เห็นนะ/trunk
/branches
/tags -
At this point, Notepad should launch: พอเรา enter ในขั้นตอนที่แล้วปุ้บ มันก็จะขึ้น Editor ขึ้นมาให้ใส่ comment ก็ใส่ไปครับ แต่อย่าใส่ข้างล่างบรรทัดที่เขียนว่า --This line, and those below, will be ignored-- ให้ใส่ข้างบน (อย่าถามว่าทำไปนะครับ.. ไม่รุ็อะ)
-
You'll now be prompted for credentials. In my case I was prompted for the administrator credentials as well: อะฮ้า มีให้ใส่ password ของเครื่องที่เราใช้ด้วยครับ เอ..จะใส่ดีมั้ยนะ แต่ก็ใส่ๆไป และมีถามต้่อเรื่อง User กับ Password ใช้ใช้อันที่เราตั้งใน passwd.conf นะครับ
Authentication realm: 0f1a8b11-d50b-344d-9dc7-0d9ba12e22df
Password for 'Administrator': *********
Authentication realm: 0f1a8b11-d50b-344d-9dc7-0d9ba12e22df
Username: sally
Password for 'sally': ************
Committed revision 1.Congratulations! You just checked a change into Subversion!
5. สร้างเป็น Service จริงๆอันนี้เราทตามเค้าไม่ได้เพราะ SVNService.exe เราไม่มี งงไปนานแต่ดูดีๆมันถูกเป็นเป็นคำสั่งนี้ไปแล้วครับ
svnserve.exe" --service -r "D:\svn_repository" --listen-port "3690"ดังนั้นเราไม่ต้องทำตามเค้า แต่เราทำการทดสอบตามเค้าได้ครับด้วยคำสั่ง
สิ่งที่ผมทำคือเข้าไปใน Service ใน Administative Tools > Service
แล้วสั่ง Start มันเองเลย.. อะนะ
svn ls svn://localhost/
เอาของเค้ามาให้ดูด้วย
E) Start the server as a service
- Stop the existing command window that's running svnserve by pressing CTRL+C.
- Copy the file SVNService.exe from the zip file of the same name to the subversion\bin folder.
- Install the service by issuing the following commands:
svnservice -install --daemon --root "C:\Documents and Settings\Subversion Repository"
sc config svnservice start= auto
net start svnservice - Test the new service by listing all the files in the repository:
svn ls svn://localhost/
You should see the single project we created earlier, myproject/
เสร็จแล้วก็น่าจะทำตามตัวอย่างเค้าได้เลย (พอดียังไม่ได้ลอง มาเขียน Blog ก่อน)
ตามนี้ครับ
F) Set up the shell extension
- Run the TortoiseSVN installer. It will tell you to restart, but you don't need to.
- Create a project folder somewhere on your hard drive. Right click in that folder and select "SVN Checkout..."
type svn://localhost/myproject/ for the repository URL and click OK. - Create a new file in that directory. Right click the file and select "TortoiseSVN, Add"
- The file hasn't actually been checked in yet. Subversion batches any changes and commits them as one atomic operation. To send all your changes to the server, right click and select "SVN Commit":
And we're done! You now have a networked Subversion server and client set up on your machine. Note that the default port for svnserve is 3690.
For more tips on using subversion, take a look at the free O'Reilly Subversion book.
จบแล้วครับ
การ Setup แบบ Newbie จริงๆ ได้ผลยังไงจะเขียนเพิ่มครับ
หรือใครจะติชมก็ยินดีมากๆครับ
REFERENCES
ขอเพิ่มเติม Link น่าอ่านสำหรับ Newbie อีครับ ตามนี้
http://www.narisa.com/forums/index.php?showtopic=18875
[รบกวนเรื่องการใช้งานและลง SVN version server ด้วยครับ, ผมคิดว่าเพื่อนๆหลายคนก็คงจะศึกษาเรื่องนี้กันอยู่]
http://www.narisa.com/forums/index.php?showtopic=16023
[TortoiseSVN หรือ SVN ตัวอื่น ๆ มีใครเคยใช้บ้างค่ะ]
http://blogs.vertigosoftware.com/teamsystem/archive/2006/01/16/Setting_up_a_Subversion_Server_under_Windows.aspx
[อันนี้เป็น Link นอกที่อ่านรู้เรื่องสุดแล้วมั้งครับ]
สู้ๆครับ :-)
Sunday, October 05, 2008
เริ่มกลับมาเขียน pocket pc ด้ว Native ก็เลยต้องย้อนอดีตกันหน่อย
ถ้าเป็นเพลาอื่นคงปฏิเสธไปเพราะเรียนรู่ .Net มาจะแย่ยังจะให้กลับไปทำ Native อีก
แต่เวลานี้คงช่วยไม่ได้ เออ เอากะมึงไอ้เต้ จะเอาก็ต้องเอา มาลองระลึกความหลังกันดู
แต่เริ่มเลยนะ รู้จัก ATL, MFC และ Win32 มากแค่ไหน (สำหรับศิษย์รัก Sun ขาประจำ Java อย่างผมคงร้องอี๋ เพราะไม่เคยจะสนใจ) ก็มาลองอ่านดู เอามาจากนี่ http://www2.cs.science.cmu.ac.th/useminar/2544/pocketgame/technique.htm
เอามาเก็บอย่างนี้เพราะกลัววันนึง source จะหายไป ไม่ตั้งใจทำซ้ำเผยแพร่แต่อย่างใด หวังว่าไม่ผิดนะครับ
สิ่งที่ควรรู้ก่อนเริ่มพัฒนาโปรแกรมบน Pocket PC
1. Windows CE
Windows CE เป็นระบบปฏิบัติการที่จัดการการโต้ตอบกันระหว่างซอฟแวร์การประยุกต์ใช้งาน ฮาร์ดแวร์ การที่เป็นผู้ใช้งานนั้นไม่มีความจำเป็นต้องรู้ว่าระบบปฏิบัติการทำงานอย่างไร แต่อาจเป็นประโยชน์ในการที่รู้ถึงผลกระทบต่อผู้ใช้ดังนี้ Windows CE
- เป็นส่วนหนึ่งของ Win32 API ทำให้ง่ายสำหรับนักพัฒนาซอฟแวร์ที่จะเขียนโปรแกรมโดยใช้เครื่องมือที่คุ้นเคย จึงทำให้กระบวนการการพัฒนาซอฟแวร์รวดเร็วขึ้น
- เป็น Portable และสามารถใช้งานบนตัวประมวลผลแตกต่างกันได้หลากหลาย ซึ่งก็หมายถึงว่าสามารถที่จะเลือกใช้ตัวประมวลผลจากผู้ผลิตได้หลากหลาย ให้ใช้เทคโนโลยีล่าสุดที่ราคาต่ำ
- เป็นระบบปฏิบัติการแบบ Real Time จึงทำให้ระบบปฏิบัติการทำงานเร็วขึ้น
- Modular Design หมายถึงว่าสามารถใช้ กับอุปกรณ์ได้กว้างขวางเช่นใช้กับตัวอุปกรณ์ปลายทาง , ใช้กับเครื่องเล่นเกมส์ ปัมม์น้ำเป็นต้น
2. GDI (Graphics Device Interface)
คือส่วนการควบคุมการแสดงข้อความและกราฟฟิก GDI จัดหาหลาย ๆ function และ โครงสร้างเพื่อนำ กราฟฟิกมาแสดงในอุปกรณ์ต่าง ๆ เช่น จอภาพ, ปริ้นเตอร์ และใน devices อื่น ๆ
หน้าที่ของ GDI สามารถวาดเส้นตรง line,curves ,closed figures , ข้อความ และ bitmapped image นอกจากนี้ยังสามารถใส่สีให้กับสิ่งที่เราวาดหรือสิ่งที่เราสร้างขึ้น
GDI มี 3 อุปกรณ์ในการวาดรูปที่สามารถสร้างกราฟฟิกดังนี้
- ปากกาเพื่อวาด line & curves
- Brushes เพื่อเพิ่มภายในของรูปร่างปิด
- Fonts เพื่อเขียนข้อความ
Graphical user interface (GUI)
GUI เป็นวิธีการใช้งานของผู้ใช้คอมพิวเตอร์ที่เลือกแฟ้ม โปรแกรม หรือคำสั่ง โดยชี้ไปยังรูปภาพแทนสิ่งเหล่านั้นบนจอภาพแทนการป้อนคำสั่งยาวๆ ยุ่งยากที่เครื่องหมายรับคำสั่ง
โปรแกรมระบบงานที่ทำงานในวินโดวส์นั้นใช้ชุดของเมนูแบบดึงลง กรอบสนทนาและกราฟิกแบบอื่นๆ เช่น แถบเลื่อนและไอคอน เป็นต้น วิธีการโต้ตอบที่ตรงกันหมดนี้ทำให้ผู้ใช้ได้ประโยชน์ เพราะเมื่อเรียนรู้การใช้งานจากโปรแกรมหนึ่งก็นำไปใช้ได้กับทุกโปรแกรมที่ทำงนอยู่ในภาวะแบบเดียวกันนี้
การใช้งานแบบกราฟิกนี้มีขึ้นที่ศูนย์ วิจัย Palo Alto ของบริษัท XeRox (PARC) ในช่วงยุค 70 แต่โชคไม่ดี ในขณะนั้นฮาร์ดแวร์ที่ต้องการให้ใช้งานแบบนี้พัฒนาด้วยเทคนิคที่สูงและทำให้ ราคาแพงเกินกว่าที่ผู้ใช้ส่วนมากจะมีใช้ได้ ในปี 1979, Steve Jobs แห่งบริษัทแอปเปิลคอมพิวเตอร์ได้มาเยี่ยม PARC และได้เห็นความสำคัญในการทำงานของผู้ใช้จึงได้นำไปพัฒนาขึ้นใช้กับ คอมพิวเตอร์รุ่นแอปเปิลลิซาซึ่งไม่ประสบความสำเร็จและในที่สุดไปใช้กับ คอมพิวเตอร์ชุดแมคอินทอช จากนั้นมาวิธีการใช้งานแบบกราฟิกนี้ก็ได้ผสานเข้ากับการทำงานของคอมพิวเตอร์ จากพีซีไปจนถึงระบบยูนิกซ์อันใหญ่โต, แมคอินทอชซิสเต็ม 7, ไมโครซอฟต์วินโดวส์, วินโดวส์ 95, วินโดวส์เอ็นที และโอเอส/ทู ทั้งหมดนี้ใช้ GUI พร้อมกับเมาส์ แทร็กบอลหรืออุปกรณ์ที่ใช้ชี้ตำแหน่งแบบอื่นๆ
kernel
เป็นรากฐานที่สำคัญที่สุดของระบบปฏิบัติการเคอร์เนลจะฝังอยู่ในหน่วยความจำตลอดเวลา ผู้ใช้จะไม่สามารถมองเห็น ทำหน้าที่จัดการหน่วยความจำในระบบ ระบบแฟ้ม และการทำงานกับดิสก์
จากตัวอย่างจะเห็นได้ว่า การคำนวณส่วนต่างๆทำได้เร็ว แต่การคำนวณ sky ทำได้ช้ามาก และการคำนวณโดยรวมนั้นถือว่าอยู่ในระดับปานกลาง
3. GX (Game API)
ใช้สำหรับติดต่อกับ device (อุปกรณ์ input / output ต่างๆ) ข้อเสียคือไม่สามารถเข้าถึงข้อมูลได้โดยตรง
จากตัวอย่างจะเห็นได้ว่า การคำนวณส่วนต่างๆทำได้เร็ว แต่การคำนวณโดยรวมนั้นถือว่าอยู่ในระดับช้ามากๆ
4. DSA (direct Screen Access)
ลักษณะการทำงานจะทำการดึงข้อมูลต่างๆที่เกี่ยวกับหน้าจอ เช่น scan line (เส้นแต่ละเส้นบนหน้าจอ)จาก VRAM และสามารถเข้าถึงข้อมูลเหล่านั้นได้โดยตรง ข้อดีคือ สามารถทำงานได้รวดเร็วขึ้น
จากตัวอย่างจะเห็นได้ว่า การคำนวณส่วนต่างๆทำได้ช้า แต่การคำนวณโดยรวมนั้นถือว่าอยู่ในระดับที่เร็วมาก
การเลือกใช้ทั้ง 3 ตัวนี้ขึ้นอยู่กับลักษณะของ CPU ว่าจะเหมาะดัวไหน
ตารางแสดงการเปรียบเทียบการใช้ Visual Basic กับ Visual C++ ในการพัฒนาโปรแกรมบน PocketPC
Feature | Visual C++ | Visual Basic |
ต้องการโปรแกรม run time ติดตั้งใน PocketPC ด้วย | ต้องการถ้าคุณใช้ ATL (Active Template Library) หรือ MFC(Microsoft Foundation Classes) | ต้องการเสมอ |
ทดสอบผลโปรแกรมด้วย Emulator | ได้ | ได้ |
ทดสอบโปรแกรมบน H/PCs | ได้ | ได้ |
ทดสอบโปรแกรมบน Palm-size PC | ได้ | ไม่ได้ในอุปกรณ์ที่เป็น เวอร์ชั่น 1.0 |
ทดสอบโปรแกรมบน Pocket PC | ได้ | ได้ |
โปรแกรมที่ได้ไม่ผูกกับตัวประมาลผล (Processor) | ไม่ใช่ (ยกเว้นถ้าใช้ CEF - Common Executable Format) | ใช่ |
Debugging support บน desktop emulation | ใช่ | ใช่ |
Debugging support บนอุปกรณ์ Windows? CE | ใช่ | ใช่ (เฉพาะ H/PCs) และ Pocket PC |
Development of COM components (COM server or ActiveX? Controls) | ได้ | ไม่ได้ |
Hosting ActiveX controls | ได้ (แต่ยากในการพัฒนา) | ได้ (แต่ยากในการพัฒนา) |
การพัฒนา drivers | ได้ | ไม่ได้ |
การพัฒนา ActiveSync? Filter | ได้ | ไม่ได้ |
ความสามารถในการพัฒนาโปรแกรมได้อย่างรวดเร็ว | ไม่ได้ | ได้ |
ความอิสระในการพัฒนาโปรแกรม | มาก | จำกัด |
สนับสนุน embedded devices | ใช่ | สนับสนุนตั้งแต่ Windows CE 2.11 |
สนับสนุน remote services | ใช่ | ใช่ (ใช้ Winsock control) |
สนับสนุน Pocket PC enhancements | ใช่ | ใช่ |
สามารถใช้l Pocket PC API อย่างเต็มที่ | ใช่ | ไม่ (เฉพาะ ActiveX controls ที่เขียนด้วย C++) |
ความง่ายในการเข้าถึงข้อมูลด้วย ADOCE (Active Data Objects for Windows CE | ไม่ (สามารถทำได้แต่ยากในการพัฒนา) | ง่าย |
วิธีลบ loopback ออกจากเครื่องครับ
Uninstallling / Remove Microsoft Loopback Adapter in Windows XP
ref: http://www.rasyid.net/2007/06/07/uninstallling-remove-microsoft-loopback-adapter-in-windows-xp/
I got used network card for my old computer, it’s enough to do more experiment with ‘real network adapter’ thats way I need to uninstall/remove my loopback adapter. My frist thought about removing microsoft loopback adapter is from control panel till I realize it’s behaves like real network adapter. To remove it off course via hardware menu.
Here’s step by step removing process Microsoft loopback adapter in my windows xp :
1. Open My Computer
2. Right Click on My Computer, followed by click Properties
3. By default General Tab displayed
4. Click on Hardware Tab -> Device Manager
5. Click + near Network Adapters
6. Click On Microsoft Loopback Adapter, followed by click delete button
7. Confirmation pop up, choose OK
Done, uninstall process successfully accomplished
Friday, August 22, 2008
sign Midlet (J2ME)
http://www.narisa.com/forums/index.php?showtopic=12074
ยังงงๆอยู่ ไม่ใช่ของ symbian นะ
http://browndrf.blogspot.com/2006/06/build-and-install-singed-midlet.html
อันนี้เป็น strep เทพเลย
ไว้มีเวลาจะลองอ่านนะ
ระวังเรื่องวันที่บน phone ด้วย
http://developer.att.com/developer/index.jsp?page=netOSTechContent4&id=11300207
จากพี่คริต
Wednesday, August 20, 2008
set etc/host บน windows mobile
บน windows mobile ก็เช่นกัน ทำได้ ใน emulator ก็ทำได้ แต่ต้องลงโปรแกรม edit registry
ที่ชื่อว่า PHM Registry Editor
Download จากที่นี่ http://www.phm.lu/Products/PocketPC/RegEdit/
ที่เราต้องทำคือ ไปที่
HKEY_LOCAL_MANCHINE -> Comm -> Tcpip -> Hosts
ถ้ายังไม่มี Hosts ก็ New Key ขึ้นมาเลย
แล้วใส่ค่า
new key [aek.------.beta] with following value items
[ExpireTime (99 99 99 99 99 99 99) (REG_BINARY)]
[ipaddr (C0 A8 01 7E) (REG_BINARY)] <<= ip = 192.168.1.126
(>_o) จำไว้ๆ
Sunday, July 20, 2008
windows mobile get CellID
http://dalelane.co.uk/blog/?p=241
he said..
I don’t know how the FindMe app is implemented, but after a little bit of playing tonight, it seems fairly easy to grab something similar to the “Cell” string they are using from the RIL_GetCellTowerInfo function in the Radio Interface Layer (RIL) API.
- Call
RIL_Initialize
to get a RIL handle- Call
RIL_GetCellTowerInfo
to get the information about the cell tower the phone is connected toThe “Cell” string that FindMe displays seems to be a combination of the
dwCellID
,dwLocationAreaCode
anddwMobileCountryCode
fields- Call
RIL_Deinitialize
to release the RIL handle
and a code.. just try next week..
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace CellId
{
public class RIL
{
// string used to store the CellID string
private static string celltowerinfo = "";
/*
* Uses RIL to get CellID from the phone.
*/
public static string GetCellTowerInfo()
{
// initialise handles
IntPtr hRil = IntPtr.Zero;
IntPtr hRes = IntPtr.Zero;
// initialise result
celltowerinfo = "";
// initialise RIL
hRes = RIL_Initialize(1, // RIL port 1
new RILRESULTCALLBACK(rilResultCallback), // function to call with result
null, // function to call with notify
0, // classes of notification to enable
0, // RIL parameters
out hRil); // RIL handle returned
if (hRes != IntPtr.Zero)
{
return "Failed to initialize RIL";
}
// initialised successfully
// use RIL to get cell tower info with the RIL handle just created
hRes = RIL_GetCellTowerInfo(hRil);
// wait for cell tower info to be returned
waithandle.WaitOne();
// finished - release the RIL handle
RIL_Deinitialize(hRil);
// return the result from GetCellTowerInfo
return celltowerinfo;
}
// event used to notify user function that a response has
// been received from RIL
private static AutoResetEvent waithandle = new AutoResetEvent(false);
public static void rilResultCallback(uint dwCode,
IntPtr hrCmdID,
IntPtr lpData,
uint cbData,
uint dwParam)
{
// create empty structure to store cell tower info in
RILCELLTOWERINFO rilCellTowerInfo = new RILCELLTOWERINFO();
// copy result returned from RIL into structure
Marshal.PtrToStructure(lpData, rilCellTowerInfo);
// get the bits out of the RIL cell tower response that we want
celltowerinfo = rilCellTowerInfo.dwCellID + "-" +
rilCellTowerInfo.dwLocationAreaCode + "-" +
rilCellTowerInfo.dwMobileCountryCode;
// notify caller function that we have a result
waithandle.Set();
}
// -------------------------------------------------------------------
// RIL function definitions
// -------------------------------------------------------------------
/*
* Function definition converted from the definition
* RILRESULTCALLBACK from MSDN:
*
* http://msdn2.microsoft.com/en-us/library/aa920069.aspx
*/
public delegate void RILRESULTCALLBACK(uint dwCode,
IntPtr hrCmdID,
IntPtr lpData,
uint cbData,
uint dwParam);
/*
* Function definition converted from the definition
* RILNOTIFYCALLBACK from MSDN:
*
* http://msdn2.microsoft.com/en-us/library/aa922465.aspx
*/
public delegate void RILNOTIFYCALLBACK(uint dwCode,
IntPtr lpData,
uint cbData,
uint dwParam);
/*
* Class definition converted from the struct definition
* RILCELLTOWERINFO from MSDN:
*
* http://msdn2.microsoft.com/en-us/library/aa921533.aspx
*/
public class RILCELLTOWERINFO
{
public uint cbSize;
public uint dwParams;
public uint dwMobileCountryCode;
public uint dwMobileNetworkCode;
public uint dwLocationAreaCode;
public uint dwCellID;
public uint dwBaseStationID;
public uint dwBroadcastControlChannel;
public uint dwRxLevel;
public uint dwRxLevelFull;
public uint dwRxLevelSub;
public uint dwRxQuality;
public uint dwRxQualityFull;
public uint dwRxQualitySub;
public uint dwIdleTimeSlot;
public uint dwTimingAdvance;
public uint dwGPRSCellID;
public uint dwGPRSBaseStationID;
public uint dwNumBCCH;
}
// -------------------------------------------------------------------
// RIL DLL functions
// -------------------------------------------------------------------
/* Definition from: http://msdn2.microsoft.com/en-us/library/aa919106.aspx */
[DllImport("ril.dll")]
private static extern IntPtr RIL_Initialize(uint dwIndex,
RILRESULTCALLBACK pfnResult,
RILNOTIFYCALLBACK pfnNotify,
uint dwNotificationClasses,
uint dwParam,
out IntPtr lphRil);
/* Definition from: http://msdn2.microsoft.com/en-us/library/aa923065.aspx */
[DllImport("ril.dll")]
private static extern IntPtr RIL_GetCellTowerInfo(IntPtr hRil);
/* Definition from: http://msdn2.microsoft.com/en-us/library/aa919624.aspx */
[DllImport("ril.dll")]
private static extern IntPtr RIL_Deinitialize(IntPtr hRil);
}
}