【问题标题】:Binary SMS in SymbianSymbian 中的二进制短信
【发布时间】:2010-09-29 23:58:45
【问题描述】:

我想知道是否有人设法创建了用于发送二进制消息(配置 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();

大多数情况下,我不确定 port 和 class 的正确值。一些正确的二进制字符串也可以用于测试。现在我不确定是代码坏了还是数据坏了。

【问题讨论】:

  • 按照我下面的回答,使用“iSmsMtm->ServiceId()”将消息复制到服务条目
  • 好的,我试试。我想知道要使用的正确端口和短信类(class1、class2)是什么。

标签: binary sms symbian


【解决方案1】:

使用 JSR120 规范和无线工具包。它们包含肯定会工作的 java 示例代码。

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

如果你真的想用 C++ 做,最简单的方法就是把你的 TMsvEntry 复制到 sms 服务的入口。在上面的代码中,这意味着使用“iSmsMtm->ServiceId()”而不是“KMsvGlobalOutBoxIndexEntryId”。此外,只需将消息复制到服务,但在成功发送后将其移至发件箱。

无耻插件:http://www.quickrecipesonsymbianos.com 将包含对 Symbian C++ 消息传递 API 的解释以及简单且可重用的示例代码。

【讨论】:

  • 是的,我必须在 C++ 中进行,而且我知道在 Java 中这只是对正常消息传递的一个小调整。我知道如何使用消息传递 API 或 RSocket 创建普通的 SMS,只是无法发送二进制文件。
  • 嗯,二进制消息出去了,但它们也以同样的方式到达。我希望看到一些用于设置书签或其他东西的消息。
【解决方案2】:

有效的解决方案是使用 RComm 和“DATAPORT::1”通过 AT 命令(如使用调制解调器)发送二进制 SMS。

【讨论】:

    【解决方案3】:

    如果您想静默发送 SMS(并避免使用消息 API 的复杂性),您应该通过 RSocket:http://wiki.forum.nokia.com/index.php/How_to_send_an_SMS_using_sockets 发送它

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

    【讨论】:

    • 我不在乎噪音。我只想要二进制短信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多