2009-01-07 29 views
3

我想知道是否有人設法創建一個發送二進制消息(配置Symbian手機)的工作代碼,並且還有一些二進制數據樣本。 到目前爲止,我發現的所有樣本都無法離開發件箱或永遠不會返回。Symbian中的二進制短信

// Current entry is the Draft folder. 
    iSmsMtm->SwitchCurrentEntryL(KMsvDraftEntryId); 
    // Create a new SMS message entry as a child of the current context. 
    iSmsMtm->CreateMessageL(KUidMsgTypeSMS.iUid); 
    CMsvEntry& serverEntry = iSmsMtm->Entry(); 
    TMsvEntry entry(serverEntry.Entry()); 

    /* Send Binary SMS */ 
    CSmsHeader &hdr = iSmsMtm->SmsHeader(); 
    CSmsMessage &msg = hdr.Message(); 
    CSmsPDU &pdu = msg.SmsPDU(); 
    CSmsUserData &userdata = pdu.UserData(); 

    // Set the DCS byte 
    pdu.SetBits7To4(TSmsDataCodingScheme::ESmsDCSTextUncompressedWithNoClassInfo); 
    pdu.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet8Bit); 
    pdu.SetClass(ETrue, TSmsDataCodingScheme::ESmsClass2); 

    char buf[]= {...}; //my binary data, 247 bytes long 

    // Construct a dummy message 
    HBufC8 * iMessage = HBufC8::NewL(300); 

    TPtr8 TempUDHBufDesc((TUint8*)buf,247,247); 
    iMessage->Des().Copy(TempUDHBufDesc); 
    _LOGFENTRY1(_L("mess length %d"),iMessage->Des().Length()); 
    userdata.SetBodyL(*iMessage); 
    delete iMessage; 

    // Message will be sent immediately. 
    entry.SetSendingState(KMsvSendStateWaiting); 

    entry.iDate.UniversalTime(); // insert current time //Solution for HomeTime() 
    // Set the SMS message settings for the message. 
    CSmsHeader& header = iSmsMtm->SmsHeader(); 
    CSmsSettings* settings = CSmsSettings::NewL(); 
    CleanupStack::PushL(settings); 

    settings->CopyL(iSmsMtm->ServiceSettings()); // restore settings 
    settings->SetDelivery(ESmsDeliveryImmediately); // to be delivered immediately 
    settings->SetDeliveryReport(EFalse); 
    settings->SetCharacterSet(TSmsDataCodingScheme::ESmsAlphabet8Bit); // IMPORTANT! For sending binary SMS 
    header.SetSmsSettingsL(*settings); // new settings 

    // Let's check if there is a service center address. 
    if (header.Message().ServiceCenterAddress().Length() == 0) 
    { 
     // No, there isn't. We assume there is at least one service center 
     // number set and use the default service center number. 
     CSmsSettings* serviceSettings = &(iSmsMtm->ServiceSettings()); 
     // Check if number of service center addresses in the list is null. 
     if (!serviceSettings->ServiceCenterCount()) 
     {  _LOGENTRY("No SC"); 
      return ; // quit creating the message 
     } 
     else 
     { 
      CSmsNumber* smsCenter= CSmsNumber::NewL(); 
      CleanupStack::PushL(smsCenter); 
      smsCenter->SetAddressL((serviceSettings->GetServiceCenter(serviceSettings->DefaultServiceCenter())).Address()); 
      header.Message().SetServiceCenterAddressL(smsCenter->Address()); 
      CleanupStack::PopAndDestroy(smsCenter); 
     } 
    } 

    CleanupStack::PopAndDestroy(settings); 

    // Recipient number is displayed also as the recipient alias. 
    entry.iDetails.Set(_L("+3725038xxx")); 
    iSmsMtm->AddAddresseeL(_L("+3725038xxx") , entry.iDetails); 

    // Validate message. 
    if (!ValidateL()) 
    { _LOGENTRY("Not valid"); 
     return ; 
    } 

    entry.SetVisible(ETrue); // set message as visible 
    entry.SetInPreparation(EFalse); // set together with the visibility flag 
    serverEntry.ChangeL(entry); // commit changes 
    iSmsMtm->SaveMessageL(); // save message 

    TMsvSelectionOrdering selection; 
    CMsvEntry* parentEntry = CMsvEntry::NewL(iSmsMtm->Session(), KMsvDraftEntryId, selection); 
    CleanupStack::PushL(parentEntry); 

    // Move message to Outbox. 
    iOperation =parentEntry->MoveL(entry.Id(), KMsvGlobalOutBoxIndexEntryId, iStatus); 

    CleanupStack::PopAndDestroy(parentEntry); 

    iState = EWaitingForMoving; 
    SetActive(); 

大部分我不確定端口和類的正確值。還有一些正確的二進制字符串將是很好的測試。現在我不確定代碼是壞的還是數據。

+0

根據我的回答,使用「iSmsMtm-> ServiceId()」將消息複製到服務條目 – 2009-01-12 13:25:34

+0

好的,我試試。 我想知道什麼是正確的端口和短信類(class1,class2)使用。 – Riho 2009-01-13 11:54:33

回答

1

工作的解決方案是使用RComm和「DATAPORT :: 1」使用AT命令(如使用調制解調器)發送二進制SMS。

1

使用JSR120規範和無線工具包。它們包含可以肯定工作的java示例代碼。

這些是直接在Symbian C++中使用RSocket對象實現的。

如果你真的想用C++來做,最簡單的方法是將你的TMsvEntry複製到短信服務的入口。在上面的代碼中,這意味着使用「iSmsMtm-> ServiceId()」而不是「KMsvGlobalOutBoxIndexEntryId」。此外,只需將消息複製到服務,但在發送成功後將其移至發件箱。

無恥插件:http://www.quickrecipesonsymbianos.com將包含對Symbian C++消息API的解釋,將簡單且可重用的示例代碼。

+0

是的,我必須用C++來做,而且我知道在Java中它對普通消息只是一個小小的調整。 我知道如何使用消息API或RSocket創建正常的SMS,但我只是在發送二進制文件時失敗。 – Riho 2009-01-07 13:11:01