您的位置:首页 > 其它

WinCE 使用RIL发送短信SMS(类似sms.dll)

2010-02-03 11:22 459 查看
RIL函数是通过异步机制调用的.
RIL_Initialize 在底层会调用RIL_OPEN函数,创建一个相应的对象(ril 层管理着许多这样的对像),比如:当调用如RIL_GetCurrentOperator时,通过HRIL就关联到一个RIL_Initialize创建的对像上,这样的函数时会调用RIL_IOCONTROL,这时RIL层会下发相应的AT命令,发完之后就返回了,应用层调用RIL_GetCurrentOperator就返回了,当底层处理完这个AT命令后,其结果返回给RIL,RIL通过这个对象上结果回调函数返回相应的结果(此时调用ResultCallback)。如果RIL_Initialize时请求了通知,当RIL层收到底层的通知后,会通过对像上的通知回调函数返回(调用notifyCallback)

 

------------------------------------------------------------

问题:hrRilInit  =  RIL_Initialize(1,
                              FDNResultCallback,
                              FDNNotifyCallback,
                              dwRILNotificationClasses,
                              NULL,
                              &g_hRil
                              );
上面函数调用中的回调函数FDNResultCallback和FDNNotifyCallback分别在什么时候别调用到?
小弟对…

答复:一个是结果回调,一个是通知回调。结果回调就是查询、命令的结果出来的时候RIL将调用此回调函数告诉上层;通知回调一般是网络消息之类的,例如ril发现无网络了,就会用通知回调来告诉所有的APP

 

------------------------------------------------------------------------

//////////////////////////////////////////////////////////////////////////
// File name:   SMS_RIL.h
// Author:        houjiong
// Date:          2008-1-3
// Description:   封装RIL的短消息功能
//
// Update:
// Date          Name           Description
// ============= ============== ======================================
// 2008-1-3     houjiong         Create
//////////////////////////////////////////////////////////////////////////

#pragma once
#include "ril.h"
#include "SMS_CodeDecode.h"
class SMS_RIL
{
public:
SMS_RIL();

HRESULT SmsSendMessage(TCHAR *tcharNumber,TCHAR *tcharInformation);

HRIL m_hRil;             //ril实例句柄

CList<CString,CString&> MsgList;

protected:
void Initialize();
static void CALLBACK ResultCallback(DWORD dwCode, HRESULT hrCmdID, const void* lpData, DWORD cbData, DWORD dwParam);
static void CALLBACK NotifyCallback(DWORD dwCode, const void* lpData, DWORD cbData, DWORD dwParam);

private:
bool GetDefaultSubmitMsgCfg(RILMESSAGE &MsgItem);
int WildChar2BYTE(BYTE *MsgToBeBuild,TCHAR *WideCharStr,const int WideMsgLen );
int BuildWildChar(TCHAR *WideCharStr,BYTE *MsgToBeBuild,const int MsgLen );
int SetDestValue(TCHAR *DestVal,TCHAR *temp);

SMS_CodeDecode m_SMS_CodeDecode;
DWORD convertContext2UNICODE(TCHAR *pszOutUnicodeContext,BYTE *pszInrgbMsg,DWORD dwAlphabet,int cchMsgLength, BOOL isCbMsg= FALSE);

};

//////////////////////////////////////////////////////////////////////////
// File name:   SMS_RIL.cpp
// Author:        houjiong
// Date:          2008-1-3
// Description:   封装RIL的短消息功能
//
// Update:
// Date          Name           Description
// ============= ============== ======================================
// 2008-1-3     houjiong         Create
//////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SMS_RIL.h"
#include "SMS_CodeDecode.h"

//HRIL SMS_RIL::m_hRil = NULL;
//CList<CString,CString&> SMS_RIL::MsgList=NULL;
SMS_RIL::SMS_RIL()
{
Initialize();
}

void SMS_RIL::Initialize()
{

HRESULT hr = RIL_Initialize(1, ResultCallback, NotifyCallback,RIL_NCLASS_MESSAGE /* RIL_NCLASS_ALL*/, (LPARAM)this, &m_hRil);

if(FAILED(hr))
{
//  MessageBox(NULL, _T(">>>>> Calling RIL_Initialize() Fail/r/n"), _T("Caption"), MB_OK);
return ;
}

}

void CALLBACK SMS_RIL::ResultCallback(DWORD dwCode, HRESULT hrCmdID, const void* lpData, DWORD cbData, DWORD dwParam)
{
DWORD *dwNum;
switch (dwCode)
{
case RIL_RESULT_OK:
dwNum = (DWORD*)lpData;
break;
case RIL_RESULT_NOCARRIER:
case RIL_RESULT_NODIALTONE:
case RIL_RESULT_ERROR:
case RIL_RESULT_BUSY:
break;
}
}

void CALLBACK SMS_RIL::NotifyCallback(DWORD dwCode, const void* lpData, DWORD cbData, DWORD dwParam)
{
//RILMESSAGE *pMessage = (RILMESSAGE *)lpData;
switch (dwCode)
{
case RIL_NOTIFY_CONNECT:
case RIL_NOTIFY_DISCONNECT:
case RIL_NOTIFY_RING:
break;
case RIL_NOTIFY_MESSAGE:  //通知消息
RILMESSAGE *NewMsg= (RILMESSAGE *)lpData;
SMS_RIL *This = (SMS_RIL*)dwParam;
//RIL_WriteMsg(This->m_hRil, NewMsg, RIL_MSGSTATUS_STOUNSENT);
//This->MsgList.InsertAfter(,"houjiong!")
//This->MsgList.AddTail(CString("XYZ"));
//This->MsgList.AddTail(
//pos = This->MsgList.InsertAfter(pos, CString("ABC"));
//pos = This->MsgList.InsertAfter(pos, CString("123"));
/*CString message;
WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
NewMsg->msgInDeliver.rgbMsg
NewMsg->msgInDeliver.raOrigAddress.wszAddress;
This->MsgList.AddHead( CString(_T("world")));*/

CString strMessage;
TCHAR *WideCharStr= new TCHAR();
//This->BuildWildChar(WideCharStr,NewMsg->msgInDeliver.rgbMsg,NewMsg->msgInDeliver.cchMsgLength );
//memcpy((void*)&WideCharStr[0],NewMsg->msgInDeliver.rgbMsg,NewMsg->msgInDeliver.cchMsgLength);
This->convertContext2UNICODE(WideCharStr,NewMsg->msgInDeliver.rgbMsg,NewMsg->msgInDeliver.rmdDataCoding.dwAlphabet,NewMsg->msgInDeliver.cchMsgLength);
strMessage=(CString)WideCharStr;
This->MsgList.AddHead( strMessage);
break;
}
}

HRESULT SMS_RIL::SmsSendMessage(TCHAR *tcharNumber,TCHAR *tcharInformation)
{

RILMESSAGE *pSimMsg= new RILMESSAGE;

GetDefaultSubmitMsgCfg(*pSimMsg);

//通常用Unicode编码
pSimMsg->msgOutSubmit.rmdDataCoding.dwAlphabet = RIL_DCSALPHABET_UCS2;

TCHAR *WideCharStr=NULL;
//WideCharStr=_T("对方号码");
WideCharStr=tcharInformation;
//int Msglen = WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
int Msglen = m_SMS_CodeDecode.WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
pSimMsg->msgOutSubmit.cchMsgLength = Msglen;

WideCharStr=tcharNumber;
lstrcpy( pSimMsg->msgOutSubmit.raDestAddress.wszAddress, WideCharStr );//发送地址

HRESULT  lr = RIL_SendMsg(m_hRil, pSimMsg, 0);
return lr;

}

//////////////////////////////////////////////////////////////////////////
// Function name: GetDefaultSubmitMsgCfg
// Author:        houjiong
// Date:          2008-1-4
// Description:   Get Default SubmitMsg Config
//
// Input: arg0 : RILMESSAGE: RILMESSAGE
// Return value: bool
// Notes:

// Update:
// Date          Name           Description
// ============= ============== ======================================
// 2008-1-3     houjiong         Create
//////////////////////////////////////////////////////////////////////////
bool SMS_RIL::GetDefaultSubmitMsgCfg(RILMESSAGE &MsgItem)
{

memset((void*)&MsgItem, 0x00, sizeof(RILMESSAGE));

MsgItem.cbSize=sizeof(RILMESSAGE);

MsgItem.dwParams = RIL_PARAM_M_SVCCTRADDRESS|RIL_PARAM_M_TYPE|RIL_PARAM_M_DESTADDRESS|RIL_PARAM_M_PROTOCOLID|RIL_PARAM_M_MSGLENGTH|RIL_PARAM_M_FLAGS|RIL_PARAM_M_VPFORMAT|RIL_PARAM_M_DATACODING;
MsgItem.dwParams |= RIL_PARAM_M_VP|RIL_PARAM_M_MSG;

MsgItem.dwType = RIL_MSGTYPE_OUT_SUBMIT;

MsgItem.dwFlags =RIL_MSGFLAG_STATUSREPORTRETURNED;// RIL_MSGFLAG_STATUSREPORTRETURNED;//标识回复路径等信息

MsgItem.msgOutSubmit.dwVPFormat = RIL_MSGVP_RELATIVE; //0x00000001;

MsgItem.msgOutSubmit.dwProtocolID = RIL_MSGPROTOCOL_SMETOSME;//设置协议ID PID设置 0x0001

//信息中心
MsgItem.raSvcCtrAddress.cbSize=sizeof(MsgItem.raSvcCtrAddress);
MsgItem.raSvcCtrAddress.dwParams = RIL_PARAM_A_ALL;
MsgItem.raSvcCtrAddress.dwType = RIL_ADDRTYPE_INTERNATIONAL;
MsgItem.raSvcCtrAddress.dwNumPlan = RIL_NUMPLAN_TELEPHONE;
lstrcpy( MsgItem.raSvcCtrAddress.wszAddress, _T("8613800280500") );

//设置数据编码方案DCS
MsgItem.msgOutSubmit.rmdDataCoding.cbSize = sizeof(RILMSGDCS);
MsgItem.msgOutSubmit.rmdDataCoding.dwParams = RIL_PARAM_MDCS_TYPE|RIL_PARAM_MDCS_ALPHABET;
MsgItem.msgOutSubmit.rmdDataCoding.dwType = RIL_DCSTYPE_GENERAL;
MsgItem.msgOutSubmit.rmdDataCoding.dwFlags = 0x00000000;
MsgItem.msgOutSubmit.rmdDataCoding.dwMsgClass = 0x00000000;
MsgItem.msgOutSubmit.rmdDataCoding.dwAlphabet = RIL_DCSALPHABET_UCS2;
MsgItem.msgOutSubmit.rmdDataCoding.dwIndication = 0x00000000;
MsgItem.msgOutSubmit.rmdDataCoding.dwLanguage = 0x00000000;

//设置有效时间设置ValidatePeriod, 直接根据当前保存在pSmsList中值来设置
SYSTEMTIME curTime;
GetLocalTime(&curTime);
MsgItem.msgOutSubmit.stVP.wYear = curTime.wYear;
MsgItem.msgOutSubmit.stVP.wMonth = curTime.wMonth;
MsgItem.msgOutSubmit.stVP.wDayOfWeek = curTime.wDayOfWeek;
MsgItem.msgOutSubmit.stVP.wDay = curTime.wDay;
MsgItem.msgOutSubmit.stVP.wHour = curTime.wHour;
MsgItem.msgOutSubmit.stVP.wMinute = curTime.wMinute;
MsgItem.msgOutSubmit.stVP.wSecond = curTime.wSecond;
MsgItem.msgOutSubmit.stVP.wMilliseconds = curTime.wMilliseconds;

//dest address
MsgItem.msgOutSubmit.raDestAddress.cbSize = sizeof(RILADDRESS);
MsgItem.msgOutSubmit.raDestAddress.dwParams = RIL_PARAM_A_ADDRESS|RIL_PARAM_A_TYPE|RIL_PARAM_A_NUMPLAN;//AWI_PARAM_A_ALL
MsgItem.msgOutSubmit.raDestAddress.dwType = RIL_ADDRTYPE_UNKNOWN;
MsgItem.msgOutSubmit.raDestAddress.dwNumPlan = RIL_NUMPLAN_TELEPHONE;
MsgItem.msgOutSubmit.raDestAddress.wszAddress[0] = 0x0000;
//lstrcpy( MsgItem.msgOutSubmit.raDestAddress.wszAddress, _T("8615928041614") );//发送地址

return TRUE;
}

//////////////////////////////////////////////////////////////////////////
// Function name: WildChar2BYTE
// Author:        houjiong
// Date:          2008-1-3
// Description:   把我们认识的Unicode编码转换为UCS2编码,用来发送短消息
//
// Input: arg0 :BYTE *MsgToBeBuild
//        arg1 :TCHAR *WideCharStr
//        arg2 :const int WideMsgLen
// Return value: int
// Notes: 把UNICODE编码转换为UCS2编码,返回长度

// Update:
// Date          Name           Description
// ============= ============== ======================================
// 2008-1-3     houjiong         Create
//////////////////////////////////////////////////////////////////////////
int SMS_RIL::WildChar2BYTE(BYTE *MsgToBeBuild,TCHAR *WideCharStr,const int WideMsgLen )
{
int j=0;
while(*WideCharStr!=0x0000)
{
BYTE temp=0x00;
j++;
temp = (*WideCharStr&0xFF00)>>8;
*MsgToBeBuild = temp;
MsgToBeBuild++;
temp = (*WideCharStr&0x00FF);
*MsgToBeBuild = temp;
MsgToBeBuild++;
WideCharStr++;
}
*MsgToBeBuild=0x00;

return j;
}

int SMS_RIL::BuildWildChar(TCHAR *WideCharStr,BYTE *MsgToBeBuild,const int MsgLen )
{
int i,j;
for(i = 0, j = 0; i < MsgLen; i +=2, j ++)
{
TCHAR temp=0x0000;
#if 1
{
memcpy(&temp,&MsgToBeBuild[i],1);
/*if((0x20==temp))
{
WideCharStr=WideCharStr+SetDestValue(WideCharStr,(TCHAR*)&temp);
temp=0x0000;
}
*/
temp=temp<<8;
memcpy(&temp,&MsgToBeBuild[i+1],1);
WideCharStr=WideCharStr+SetDestValue(WideCharStr,(TCHAR*)&temp);
/*
if((0x000D==temp)||(0x000A==temp))
{
temp=0x000D;
memcpy(WideCharStr,&temp,sizeof(TCHAR));
WideCharStr++;
temp=0x000A;
memcpy(WideCharStr,&temp,sizeof(TCHAR));
}
else
{
memcpy(WideCharStr,&temp,sizeof(TCHAR));
}
*/
}
#else
*WideCharStr=(MsgToBeBuild[i]<<8)|MsgToBeBuild[i+1];
#endif
//WideCharStr++;
//swscanf(&temp,_T("%x"),&WideCharStr[j]);
//MsgToBeBuild=MsgToBeBuild+2;
}
*WideCharStr=0x00;

return j;
}

int SMS_RIL::SetDestValue(TCHAR *DestVal,TCHAR *temp)
{
TCHAR add=0x0000;
int Count=1;

// if((0x000D==*temp)||(0x000A==*temp))
// {
//  add=0x000D;
//  memcpy(DestVal,&add,sizeof(TCHAR));
//  DestVal++;
//  add=0x000A;
//  memcpy(DestVal,&add,sizeof(TCHAR));
//  Count=2;
// }
if((0x000D==*temp)||(0x000A==*temp))
{
add = 0x000A;
memcpy(DestVal,&add,sizeof(TCHAR));
}
else
{
memcpy(DestVal,temp,sizeof(TCHAR));
}

return Count;
}

//////////////////////////////////////////////////////////////////////////
// Function name: convertContext2UNICODE
// Author:        Huanglb
// Date:          2004-4-1
// Description:   转换信息内容
//
// Input:
//       arg0 :pszOutUnicodeContext,转换结果:Unicode串
//       arg1 :pszInrgbMsg,提供要进行转换的内容地址
//       arg2 :dwAlphabet,编码方式
//       arg3 :cchMsgLength,原信息长度
// Return value:DWORD
// Notes:
// Update:
// Date          Name           Description
// ============= ============== ======================================
// 2004-4-1     huanglb         Create
//////////////////////////////////////////////////////////////////////////
DWORD SMS_RIL::convertContext2UNICODE(TCHAR *pszOutUnicodeContext,BYTE *pszInrgbMsg,DWORD dwAlphabet,int cchMsgLength, BOOL isCbMsg)
{
int WildchLen=0;
switch(dwAlphabet)
{
case RIL_DCSALPHABET_DEFAULT://                     (0x00000001)      // @constdefine TBD
{
//先将7Bit编码转换成GSM0338编码;
WildchLen=m_SMS_CodeDecode.UnpackSMS(&pszOutUnicodeContext[0], pszInrgbMsg,cchMsgLength, isCbMsg);
m_SMS_CodeDecode.Gsm0338toUNICODE(&pszOutUnicodeContext[0], WildchLen);
}
break;
case RIL_DCSALPHABET_8BIT://                        (0x00000002)      // @constdefine TBD
{
//每8位一个字符
WildchLen=m_SMS_CodeDecode.Convert8Bit2UNICODE(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength);
}
break;
case RIL_DCSALPHABET_UCS2://Unicode 编码
{
WildchLen=m_SMS_CodeDecode.BuildWildChar(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength*sizeof(TCHAR));
}
break;
default:
memcpy((void*)&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength);
break;
}
return WildchLen;
}


 

l1w1w1 发表于2008年3月17日 11:02:43  IP:举报回复删除

学习一下luoxinan0110 发表于2008年4月22日 11:09:53  IP:举报回复删除

非常不错!如果了解SMS.LIB是怎么封装的,能否麻烦介绍下,谢谢!hou_jiong 发表于2008年5月14日 16:20:45  IP:举报回复删除

mobile的sms.lib其实是对RIL的封装,其原理和我的代码是一样的,通过RIL的API实现sendSMS等功能。fxx2008lv 发表于2009年4月10日 15:17:04  IP:举报回复删除

SMS_CodeDecode这个类在哪里定义的啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息