如何用BREW短消息啟動BREW應用程式
本文介紹了BREW短消息的另一種用途,使用者可以通過發送一條基于BREW的特定格式的短信,來啟動手機的某一個BREW應用。BREW應用開發商可以采用本文提供的方法可以靈活地實作各種對BREW應用程式的遠端啟動功能;例如新聞訂閱、通知、提醒,天氣預報提示等等。
BREW定義了一種特定的短消息格式來啟動應用程式。BREW把這種格式的短消息稱為BREW特定應用消息(BREW application-directed message),即這種特殊的短消息是發送給某一個特定的BREW應用程式的。為友善起見,以下文中我們統稱之為BREW短信,以差別普通短信。
BREW短信的格式如下:
//BREW:<Class ID>:<Text Payload>
其中:
//BREW——消息頭,表示本短信為BREW短信;
Class ID——表示接收短信的應用程式的Class ID 号;
Text Payload——附加的消息文本,ASCII格式;
例如:
//BREW:01009FF0:test
//BREW:0x01009FF0:Hello world
BREW短信的發送非常簡單。和發送普通短信一樣,調用ITAPI_SendSMS()函數發送就可以了。例如:
ITAPI_SendSMS(pMe->m_pITAPI,”13331016512”,”//BREW:0x01009FF0:Hello world”, 0, (PFNSMSSTATUS)MySmsNotify, pMe);
BREW短信的接收過程如下:
1. BREW手機的底層軟體首先截獲短消息,判斷消息頭是否為 //BREW;
2. 如果判斷是BREW短信,則啟動BREW應用管理器;
3. BREW應用管理器根據收到的Class ID加載對應的BREW應用程式,并完成該應用程式的初始化工作;
4. BREW應用管理器發送EVT_APP_MESSAGE事件給應用程式;
5. 應用程式的HandleEvent()函數處理EVT_APP_MESSAGE事件,如果需要啟動應用,則調用ISHELL_StartApplet()函數來啟動;或者也可以“悄悄地”進行處理而不用啟動應用程式。
通過以上的描述我們知道,BREW應用管理器是通過發送EVT_APP_MESSAGE來喚醒應用程式的,是以應用程式必須處理EVT_APP_MESSAGE才能接收BREW短信,才能完成程式的啟動。具體例子如下:
……
case EVT_APP_MESSAGE:
//start up applet
ISHELL_StartApplet(pMe->a.m_pIShell,
AEECLSID_HELLOWORLD);
return TRUE;
……
注意:代碼中的 return TRUE 語句是必須要加上的。
如果應用程式想得到BREW短信的文本資訊,可以通過EVT_APP_MESSAGE事件的dwParam參數來得到。即參數dwParm的内容實際上是指向Text Payload消息體的指針。具體例子如下:
{
char* textPayload = (char *)dwParam;
}
為簡單起見,前面都是以發送英文ASCII字元為例子的,其實BREW短信也可以發送/接收中文字元,隻是步驟上比發送英文複雜一些。
我們知道,中文短消息需要用UNCODE碼格式,但是BREW短信的消息頭必須用ASCII碼發送(包括Class ID),即字元串 //BREW:<Class ID>: 須用英文發送才能被BREW的底層軟體正确識别,如果是UNICODE字元,會被認作是普通短消息而不會啟動相應的應用程式。這就産生了一個沖突:如果用ASCII碼,則無法發送中文;如果用UNICODE碼,則會被認作普通短消息。
解決辦法是采用拼接的辦法“騙過”BREW底層。即BREW短消息的消息頭部分采用ASCII碼,後段的消息體部分采用UNICODE碼,把這兩段拼起來發送出去就可以了。具體步驟如下:
1. 定義變量wStrMessage, 類型為(AECHAR*),指向一段UNICODE字元串的緩沖區;
2. 定義變量BrewHeader存儲BREW短信的消息頭字元串,這裡假設為 //BREW:0x01009FF0:。将這段ASCII字元串拷貝到wStrMessage緩沖區的開始段。可以用STRNCPY函數來完成拷貝,例子如下:
STRNCPY( (char *)(wStrMessage), BrewHeader, STRLEN(BrewHeader) );
3. 在wStringMessage緩沖區中,緊接着BREW短消息頭的後面,将中文字元串ChineseTextMsg拷貝過來;
例如:WSTRCPY(&(wstrMessage[STRLEN(BrewHeader)/2]),
ChineseTextMsg);
4. 調用ITAPI_SendSMS()函數發送,注意UNICODE字元串wStrMessage要強制轉換成(const char*),這是ITAPI_SendSMS()函數要求的。
經過以上的處理,在要發送的UNICODE字元串的前面實際上是包含了BREW消息頭的ASCII字元,是以能被BREW底層正确識别,而BREW底層對其後面的資料不作任何處理。
在接收方進行中文短信很簡單,EVT_APP_MESSAGE事件的dwParam變成了指向UNICODE字元串的指針,隻要把該段的資料拷貝過來即可。例子如下:
case EVT_APP_MESSAGE:
{
WSTRCPY( (AECHAR*)wTextPayload, (AECHAR*)dwParam);
return TRUE;
}
采用上述方法,即可以發送中文,也可以發送中英文混排的字元串。我們在幾款手機上測試通過。需要注意的是由于中文短信最多是70個,扣除掉BREW短信頭,大約還能夠發送60個中文字元。
開法商可以BREW短信功能可以根據不同的需求靈活地實作各種應用,這裡我們提供幾種方案,以供參考:
1. 在短信中直接傳送消息。如果在使用者的資料量不大的情況下,是最簡單實用的方法。缺點是當資料量變大時,不适用;
2. 在短信中傳送應用程式的啟動參數。和指令行參數類似,通過發送不同的參數來執行程式的不同分枝。可以用ISHELL_StartAppletArgs()函數來實作。
具體例子如下:
case EVT_APP_MESSAGE:
{
char * lpszMsg = (char *)dwParam;
ISHELL_StartAppletArgs(pme->a.m_pIShell, AEECLSID_TAPIAPP, lpszMsg);
}
return TRUE;
應用程式可以分成不同種情況,參數1執行A情況,2執行B情況,3執行C情況。。。以此類推。
3. 在短信中傳送一個網站的URL位址,應用程式收到短信後可以自動連接配接網站。
例如:
case EVT_APP_MESSAGE:
const char * url = (const char *)dwParam;
if(url && !STRNICMP(url,”http”,4))
ISHELL_BrowseURL(pme->a.m_pIShell, url);
return(TRUE);
總之,對BREW短信的消息體,開發者可以做任意地解釋,開發者可以根據自己的特點加以靈活地運用。
有以下幾點需要注意:
l 也可以發送普通短信的方式來發送BREW短信,隻要資料格式正确,在任何一台能發短信的手機上都可以發送。但是由于短信格式必須是ASCII,是以要先把手機的語言設定成英文再發送;在中文環境下即使輸入英文,發送的實際上也是UNICODE碼,在接收方BREW手機的底層軟體也會無法識别,進而無法啟動應用程式;
l 如果BREW短信的消息頭格式錯誤,則該短信會被手機的短消息信箱接收到。
l 如果BREW短信的消息頭格式正确,但是Class ID錯誤或者接收方手機中無此應用程式,該短消息會丢棄不用,而不會傳到手機的普通短消息信箱中,也不産生任何形式的提示資訊。
l 接收方的應用程式無需在MIF檔案中作notification, ITAPI等選項設定。
1. BREW 2.0 API Reference
2. BREW 2.0 SDK User’s Guide
3. Handling SMS in BREW™, BREW Online Knowledge base, Document ID 52,
聯通博路通信技術有限公司
張慧剛