天天看點

BREW短消息相關

如何用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, ​​​​

聯通博路通信技術有限公司

張慧剛