代码之家  ›  专栏  ›  技术社区  ›  Riho

Symbian中的二进制短信

  •  3
  • Riho  · 技术社区  · 16 年前

    我想知道是否有人已经成功地创建了用于发送二进制消息的工作代码(用于配置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();
    

    大多数情况下,我不确定端口和类的正确值。另外,一些正确的二进制字符串将很好地用于测试。现在我不确定代码是坏的还是数据。

    3 回复  |  直到 16 年前
        1
  •  1
  •   michael aubert    15 年前

    这些都是直接使用Symbian C++中的RSoT对象实现的。

    如果您真的想用C++做这件事,最简单的方法就是把您的TMSVItIt复制到SMS服务的条目中。在上面的代码中,这意味着使用“iSmsMtm->ServiceId()”而不是“KMsvGlobalOutBoxIndexEntryId”。此外,只需将邮件复制到服务,但在成功发送邮件后,请将其移动到发件箱。

    无耻插头: http://www.quickrecipesonsymbianos.com 将包含一个解释Symbian C++消息传递API将简单和可重用的示例代码。

        2
  •  1
  •   Riho    15 年前

        3
  •  0
  •   KevinD    16 年前

    如果希望以静默方式发送SMS(并避免使用消息传递API的复杂性),则应通过 RSocket http://wiki.forum.nokia.com/index.php/How_to_send_an_SMS_using_sockets

    根据您的需要,这可能比使用消息传递API更合适。