2009-01-07 70 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