Posts

Showing posts from March, 2009

UPnP Device Implementations

UPnP Device的開發Sample: Intel做的Device,使用功能強大精靈來開發,有一點小bug,使用C,並且可以截去網路上的UPnP Device,很有趣 http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/index.htm Cyberlink使用C++, Java, OSGi所做的UPnP sample http://cgupnpjava.sourceforge.net/ ushare Microsoft開發的ushare 是針對 xbox所開發的UPnP server。 http://ushare.geexbox.org/ 可參考這篇 http://jason-rdtech.blogspot.com/2008/06/upnp.html

[UPnP] UPnP Certification Tool

下載完UPnP Certification Tool之後,將想測的XML檔放入xml data files的資料夾。 UPnP Certification Tool共分為六個Task Addressing Description Discovery Control Sytax Eventing Syntax Semantics 從這六點來看所測試的目標,並且使用Intel Stack來修改: Addressing:測裝置的網路環境 0.0測Auto IP,一開始將Router的DHCP功能關掉,而Device的IP會改成169.254.x.x 0.1測DHCP,將Router的DHCP功能打開,IP為192.168.x.x Description:Description的正確性 1.0.*Device description is well format 1.1.*Servcie description is well format,使用Intel Builder的修改功能,可以解決此問題。 Discovery: 2.0.0.*主要是測ssdp:alive訊息的正確性與週期性,Intel Builder對此有許多問題。Intel Builder是預設90秒會發送一次notify,而Intel Builder不一定會準時送,因此必須修改它的時間,請修改 UPnPMicroStacks的UPnPFragmentedSendNotify的function,把NotifyCycleTime設為30,這樣test tool會比較快回覆訊息,如果順利的話,通常二、三分鐘就會過。 2.1.*測MSearch的responce,要注意的是,項目0~4對於Intel Builder的udn必須為數字,若用英文字母,可能會有錯誤發生"Fail Reason: Missing Responce of Notification..."。還是要看2.0.0.*,如果2.0.0.*錯的話,項目0~4也有可能會錯,這應該是test tool不穩的地方。 Control: 3.0.*每個Service的控制方法都不同,所以有其專屬的控制方法,需要注意的是必須通過Description,尤其是Test Case 1.1.3。其實Conrtol的項目通常不會判斷回覆的訊息,所以回傳...

7-Zip

Image
一個簡單好用的壓縮軟體,不過沒什麼人用就是了,下面是官網: http://www.7-zip.org/ 我要的是用commed line下指令來解壓縮,它也有其版本: http://downloads.sourceforge.net/sevenzip/7za465.zip 7z e archive.zip -y archive.zip就是想要解壓的資料,解完後會出現再通一個資料夾,-y是後面所帶的參數,如果解壓縮後有重複的名稱,則會蓋過去。改成-u則會產生一個新的名稱。 並可以指定解壓縮後的路徑: C:\\7za465\7za.exe e -o"C:\7za465\" -y "C:\7za465\archive.zip" 依序是 解壓執行檔、解壓後路徑、解壓縮檔。

[UPnP] UPnP Certification

若貴公司是UPnP註冊會員,申請會員帳號後可進入下面UPnP Test Tools的下載網頁: http://www.upnp-ic.org/members/test_tool_downloads/ 目前共有以下可供應的測試項目 Test Tool 1.5 Low Power XML Data Files AV XML Data Files Remote UI XML Data Files IGD XML Data Files Printer XML Data Files Printer Enhanced V1.0 XML Data Files Scanner XML Data Files WLAN Access Point XML Data Files Device Security XML Data Files Digital Security Camera XML Data Files QoS V1.0 XML Data Files QoS V2.0 XML Data Files QoS V3.0 XML Data Files HVAC XML Data Files Lighting Controls XML Data Files Test Tool 1.5 此為測試程式的主程式,其他為需要測試的XML檔,選擇所需要的檔案,放入特定資料夾,則可開始使用。 想看有什麼產品通過認證; http://www.upnp-ic.org/kshowcase/view/catalogs_by_category 由公司去看通過認證的產品: http://www.upnp-ic.org/kshowcase/view/profiles_by_category

[UPnP] UPnP Implementers Corporation & UPnP Forum

Image
UPnP Forum是在制定各裝置的規格,UIC是關於認證的組織。 而UPnP認證通過才能進行DLNA認證,UPnP的認證取得很容易,下載它們的Certification Tool,按照上面的需求,建立一個獨立的網路環境,跑完所有tasks,當然要全部通過,最後將log寄回去給UIC,很快就會回覆證書給你。

[UPnP] Documentation

UPnP由Microsoft一手主導的協定,下面是官方連結: http://upnp.org/ 現在 Documentation 已出到1.1版,下面是 UPnP™ Device Architecture Documents 連結,此規格是UPnP最基本、也是主要的文件,許多的想法都是由它而來,這個架構非常重要: http://www.upnp-ic.org/resources/UPnP_device_architecture_docs/

[UPnP] UPnP, Universal Plug and Play Introduction

Image
名子聽起來很厲害的樣子,想想看"隨插即用"加上 Universal代表什麼?什麼東西都可以"隨插即用",太神奇了吧! 我認為這個名子實在太言過其實,應該是插上"網路線"就可以"隨插即用",所謂的"網路線"可以是有線或是無線,反正就是可以網路連線的意思,應該稱為Network Plug and Play比較合適。 而UPnP定義了兩種型態的裝置: 遙控器(Control Point, CP) 電器(Device) 我使用遙控器去找電器,找到後讀取電器所提供的功能,然後去控制它,就這麼簡單。 較深入的解釋: 遙控器尋找電器,UPnP稱為(Discovery),走UDP的協定。 讀取電器所提供的功能,UPnP稱為(Description),走TCP的協定。 控制電器,UPnP稱為(Control),也是走TCP的協定。 電器傳訊息給遙控器,UPnP稱為(Eventing),也是走TCP的協定。 因為透過網路,電器提供Web page給使用者,UPnP稱為(Presentation),也是走TCP的協定。

[DLNA] Certification 2009.March

其實早就想寫有關UPnP與DLNA的東西,只是整理起來很麻煩,又不想亂寫,畢竟花了很多心血,先來個DLNA Certification update。 今天2009.3.18 DLNA開始可以認證 Digital Media Renderer (DMR) Digital Media Controller (DMC) Mobile Digital Media Controller (M-DMC) Printer Controller 2 Capability (PR2) 下面是DLNA認證網址,但是需要login https://certification.dlna.org/ 目前可以認證的裝置包括: Certifications can now be granted for DMS, DMP, M-DMS, M-DMP, DMC, M-DMC, DMR and DMPr device classes and +PR1+, +PR2+, +UP+, and +DN+ capabilities.

[Web Server] Mongoose

一個超輕量跨平台的Web Server,裡面沒有CGI,要自己plugin http://code.google.com/p/mongoose/

[C/C++] Socket

原本以為用別人寫的Socket就好了,但是寫到後來,是不可能了,所以只好自己寫一個吧。

[Eclipse] Short Cut

找了好久的整理程式碼軟體, 想不到Eclipse就有內建 Format source code  (ctrl + shift + f) Template  (alt + /) Run code (ctrl + shift + F11) Run code in debug mode (ctrl + F11)

[Win32 Thread] WaitForSingleObject

WaitForSingleObject (等待一個執行緒的結束) Win32 提供一個名為 WaitForSingleObJect() 的函式可以在某個執行緒結束時被喚起。它的第一個參數是個核心物件 (如執行緒) 的 handle。舉例來說 , 把即將等待的執行緒稱為執行緒 #1,把正在執行的執行緒稱為執行緒 #2。所指的執行緒核心物件」是執行緒#2。呼叫WaitForSingleObject()並放置一個 「執行緒核心物件」做為參數,將使執行緒 #1 開始睡眠,直到執行緒 #2 結束為止。就像 Sleep()函或一樣,WaitForSingleObject()也有一個參數用來指定最長的等待時間。 DWORD WaitForSingleObject( HANDLE  hHandle, DWORD dwMilliseconds, ); 參數 hHndle 等待對象的handle (代表一個核心物件)。 dwMilliseconds 等待的最長時間。時間終了,即使handle 尚未成為激發狀態,此函式還是要回返。此值可以是0 (代表立刻返),也可以是 INFINITE 代表無窮等待。 回返值 如果函式失敗,傳回WAIT_FAILED。這時候你可呼叫GetLastError() 取得更多資訊。此函式的成功有三個因素: l﹒ 等待的目標(核心物件)變成激發狀態。此種情況下回返值將為    WAIT_OBJECT_O。 2. 核心物件變成激發狀態之前,等待時間終了。此種情況下回返值將為    WAITTIMEOUT。 3. 如果一個擁有 mutex(互斥器)的執行緒結束前沒有釋放mutex,則傳回    WAIT_ABANDONED。 獲得一個執行緒物件的handle 之後,WaitForSingleObject()要求作業系統讓執行緒 #1 睡覺,直到以下任何一種情況發生: 1.執行緒# 2結束 2.dwMillisecond,時間終了。此值係從函式呼叫後開始計算。 由於作業系統持續追蹤執行緒#2,即使執行緒 #2 被強迫結束WaitForSingleObject()仍然能夠正常運作。 關於 time-out,有一個特別重要的用途,但很少被人注意。設定 time-out為 0使你能夠檢查 handle的狀態並立刻回返,沒有片刻停留。handle已經備妥,那麼這個函式會成...

[Win32 Thread] WaitForMultipleObjects

WaitForMultipleObjects() Win32 函式中的WaitForMultipleObjects() 允許你在同一時間等待一個上的物件。你必須將一個由 handles 組成的陣列交給此函式,並指定要等其中一個物件或是全部的物件。下面就是這個函式的原型: DWORD  WaitForMultipleObjects( DWORD  nCount, CONST  HANDLE *lpHandles, BOOL  bWaitAll, DWORD dwMilliseconds ) 參數 nCount 表示 lpHandles  所指之 handles  陣列的元素個數。最大容量是 MAXIMUM_WAIT_OBJECTS 。 lpHandles 指向一個由物件 handles  所組成的陣列 。這些handles  不需要是相同的型態。                 DWaitAll 如果此為 TRUE ,表示所有的 handles  都必須激發 ,此函式才得以回返。否則此函式將在任何一個handIle 激發時就回返。   dwMilliseconds 當此時間長度終了 ,即使沒有任何 handles  激發,此函式地會回返。此值可為 0  ,以便測試。           亦可指定為INFINITE ,表示無窮等待。    回返值 WaitForMultipleObjects()  的回返值有些複雜。 1.如果因時間終了而回返,回返值是 WAIT_TIMEOUT ,類似WaitForSingleObject()。 2.如果 bWaitAll 是 TRUE ,那麼回返值將是 WAIT_OBJECT_O 。 3.如果 bWaitAll 是 FALSE ,那麼將回返值減去 WAIT_OBJECT_O  ,就表 示陣列中的哪一個 handle  被激發了 。 4.如果你等待的物件中有任何 mutexes ,那麼回返值可能從WAIT _ABANDONED_O  到 WATT  _ABANDONED  _O+nCount-l  。 5.如果函式失敗 ,它會傳回 WAIT_FAILED 。這時候你可以使用 GetLastError()  找出失敗的原因 。

Windows Service Registry Sample

註冊Windows Service的指令 WinSrvReg.exe add 名稱 描述 路徑 WinSrvReg.exe add YourService WindowsService "C:\Program Files\YourService .exe" 反註冊Windows Service的指令 WinSrvReg.exe dele 名稱 WinSrvReg.exe dele YourService WinSrvReg.cpp : Defines the entry point for the console application. 宣告 #include "stdafx.h" #include <windows.h> #include <winsvc.h> #include <tchar.h> bool createService(SC_HANDLE scm, LPCTSTR Servicename, LPCTSTR ServiceDescription, LPCTSTR program_path); bool deleteService(SC_HANDLE scm, LPCTSTR Servicename); tmain int _tmain(int argc, _TCHAR* argv[]){ bool bRet; TCHAR param[5][256]; SC_HANDLE scm;    int i=0; for (i=0; i<argc;i++){      lstrcpy(param[i], argv[i]);  _tprintf(_T("Param[%d] : %s\n"), i, param[i]); } scm = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS); if(!scm){ _tprintf(_T("Open SCM failed !\n")); return 0; } if(lstrcmp(_T("add"), param[1])==0){ bRet=createService(scm, param...

Windows Service Sample

宣告 #include "stdafx.h" #include <time.h> #include <stdlib.h> #include <windows.h> #include <crtdbg.h> For Windows Service #define UPDATE_TIME 1000 void WINAPI ServiceMain (DWORD argc, LPTSTR argv[]); VOID WINAPI ServerCtrlHandler(DWORD); //volatile static ShutFlag = FALSE; static SERVICE_STATUS hServStatus; static SERVICE_STATUS_HANDLE hSStat; static LPTSTR ServiceName = _T("Replay"); HANDLE hStopEvent; HANDLE hThreads[3]={NULL,NULL,NULL}; SERVICE_STATUS_HANDLE ssh; DWORD WINAPI ThreadInit(LPVOID lpPrar); VOID WINAPI ServerCtrlHandler( DWORD Control); void SetTheServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwCheckPoint, DWORD dwWaitHint); int lock = 1; void callDMC(); tmain啟動主程式 VOID _tmain (int argc, LPTSTR argv []){ SERVICE_TABLE_ENTRY DispatchTable[] = { { ServiceName, ServiceMain }, { NULL, NULL } }; if (!StartServiceCtrlDispatcher (DispatchTable)) _tprintf (_T("Failed calling Replay StartServiceCtr...

Cygwin vs. MinGW

Cygwin Cygwin 的目的是希望透過一個 DLL 建立一個系統呼叫轉換層,將原先 unix 世界裡的 system call 呼叫,經由這個 DLL 把它們映對到微軟視窗作業系統的系統呼叫,如此一來就可以很方便在 Windows 底下模擬出一個 unix 平台來,這樣你不需要一個 unix 機器照樣也可以開發 unix 程式。開發好的程式只要拿到 UNIX 平台上就可以使用。同理原來UNIX上諸多 Open source 程式也可以粉方便拿到 Windows 世界來享用,當然UNIX system calls 與 Windows APIs 不盡然可以一對一對應,Cygwin 的目標在於儘可能 Compatible ,執行績效倒不是重點考量。  MinGW MinGW 原來是 Cygwin裡 GNU 開發工具的一個分支,沒 Cygwin 複雜,而且目的也與 Cygwin 不同,他的目的反而是將 GNU 這個 open source, free 的開發工具移植到微軟視窗平台,他直接產生出來的PC視窗平台機器碼,可以說與微軟 Visual Studio 做出來的一摸一樣,可以彼此互相通用。執行效率反而是重點。MinGW 常與 MSYS (Minimal SYStem)搭配使用,MSYS是跑在Windows視窗上的一個瘦身型羽量級 UNIX shell 功能,MinGW與他搭檔還可以進一步做一些更彈性的 Config。 (按: UNIX 世界Open source 的玩法,大約都是用 cvs 或是 Sub version 去取得 Source code,然後 configure --> build --> install 三部曲, configure 會先蒐集你平台上各個工具元件實際安裝路徑,根據它們來調整軟體 Project檔(通常它是一個Makefile),之後才執行 make 去 Build 出軟體,透過 Install 腳本,最後再把作好的軟體 install (安裝)到適當的資料夾來使用。這 MSYS 就可以讓 MinGW 這編譯工具也具備第一步的 configure 功能。  xminGW  xminGW 則是有人突發奇想,再進一步把 minGW 移植回去 UNIX平台,在 UNIX/Linux平台上有個 xminGW的好處是,在 UNIX...

[Win32 Thread] ExitThread

ExitThread(結束一個執行緒) 若以更強制的手法結束一個執行緒。你可以使用ExitThread()。 VOID ExitThread(DWORD dwExitCode); 參數 dwExitCode: 指定此執行緒之結束碼 回返值 沒有。此函式從不回返。 這個函式有點像C runtime library 中的 exit() 函式,因為它可以在任何時候被呼叫並且絕不會回返。任何碼若放在此行之下,保證不會被執行。 程式啟動後就執行的那個執行緒稱為主執行緒(Primary thread)。主執行緒有兩個特點。第一,它必須負責 GUI(Graphic User Interface)程式中的主要訊息迴路。第二,此一執行緒的結束(不論是因為回返或因為呼叫了ExitThread() )會使得程式中的所有執行緒都被強迫結束,程式也因此而結束。其他執行緒沒有機會做清理工作。

[Win32 Thread] ResumeThread

ResumeThread() DWORD  ResumeThread(HANDLE   hThread); 參數 hThread 卻被再次執行的執行緒 回返值 如果函式成功 , 傳回執行緒的前一個虛懸次數 。如果失敗則傳回 0XFFFFFFFF

[Win32 Thread] CreateMutex

CreateMutex Win32 CreateMutex函式的原型如下: HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in_opt LPCTSTR lpName ); HANDLE hMutex; lpMutexAttributes: 指向安全屬性的指標 default security attributes bInitialOwner: 初始化互斥物件的所有者 initially not owned lpName: 指向互斥物件名的指標 unnamed mutex hMutex = CreateMutex(NULL, false, "LOCK"); 宣告 WaitForSingleObject(hMutex, INFINITE); Lcok ReleaseMutex(hMutex); Unlock 通常 WaitForSingleObject與ReleaseMutex會用再同一個function內,一個放開頭,一個放結尾。

[Win32 Thread] CreatThread

CreatThread Win32執行緒此函式的原型如下: HANDLE  CreateThread (  LPSECURITY_ATTRIBUTES IpThreadAttributes,  DWORD dwStackSize,  LPTHREAD_START_ROUTINE lpStartAddress,  LPVOID IpParameter,  DWORD dwCreationFlags,  LPDWORD IpThreadId ); 參數 lpThreadAttributes 描述施行於新執行緒的security屬性。 NULL表示使用預設值                   dwStackSize 新執行緒擁有自己的堆疊。0表示使用預設大小 : 1MB lpStartAddress 新執行緒將開始的起始位址。是一個函式指標。        lpParameter 此值將被傳送到所上述指定的新執行緒函式作為參數 dwCreationFlags 允許你產生一個暫時虛懸的執行緒。傳入0則立即開始執行。傳入CREATE_SUSPENDED則會成暫停狀態(suspended state),一直到程式用ResumeThread後才會執行。 lpThreadId 新執行緒的ID會被傳回到這裡 如果你不需要執行緒 lD,IpThreadId參數可以被設為 NULL。但這只在Windows95中才行得通,WindowsNT不行。如果你要寫一個程式可以在WindowsNT中跑,不要把lpThreadId 參數設為NULL。

[Blog] Google Code Prettify

Image
Google Code Prettify 為了讓code放在網頁上,找了很多方法,相信Google的東西依定讓人驚奇,看到別人做的網頁,感覺很不錯。 參考以下官網: http://code. google.com/p/google-code-prettify/ 在 Google Blogger 上則不用下載,只要修改範本: 在 <head> 後加入下列code: <link href='http://huaning.myweb.hinet.net/Prettify/prettify.css' rel='stylesheet' type='text/css'/> <script src='http://huaning.myweb.hinet.net/Prettify/prettify.js' type='text/javascript'/> 在 <body> 改成 <body onload='prettyPrint()'> 中間再加入下列code,這樣就有code外面的框架: code { display: block; font-family: 'Verdana'; font-size: 8pt; /*font-weight: bold; */ overflow: auto; white-space: nowrap; border: 1px solid #7F7F7F; padding: 10px 10px 10px 21px; max-height: 500px; line-height: 1.5em; letter-spacing: 0px; color: #000000; background: #fbfaf7 url(http://sites.google.com/site/xinyu0123/Home/BG_CODE.gif) left top repeat-y; } cmd { display: block; font-family: 'Verdana'; font-size: 10pt; overflow: auto; border: 1px solid #2F4F4...

MinGW for Windows

Image
MinGW 是套免費又跨平台的編譯器,可以去下列網址download http://sourceforge.net/project/showfiles.php?group_id=2435 下載安裝MinGW-5.1.4.exe,選擇需要的compiler之後,必須修改環境變數: 將C:\MinGW\bin;加入 但是在dowload & install的時候有一個重要的compiler無法下載 gcc-4.3.0-20080502-mingw32-alpha-bin ,必須要手動下載,如果要使用eclipse來debug的話,還需要下載 gdb-6.8-mingw-3.tar.bz2 ,將它們解壓縮到C:\MinGW。 再來去MinGW的安裝目錄C:\MinGW\bin下將 mingw32-make.exe 修改成 make.exe 即可。不然會有錯誤(Cannot run program "make": Launching failed) 寫個Hello World在Eclipse上: 選擇File->New->C++ Project->Executable->Hello World C++ Project。 然後再建一個Makefile。選擇File->New->C++ Project->Makefile project->Hello World C++ Project。 安裝完成。