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
------------------------------------------------------------------------
- //////////////////////////////////////////////////////////////////////////
- //Filename:SMS_RIL.h
- //Author:houjiong
- //Date:2008-1-3
- //Description:封装RIL的短消息功能
- //
- //Update:
- //DateNameDescription
- //=================================================================
- //2008-1-3houjiongCreate
- //////////////////////////////////////////////////////////////////////////
- #pragmaonce
- #include"ril.h"
- #include"SMS_CodeDecode.h"
- classSMS_RIL
- {
- public:
- SMS_RIL();
- HRESULTSmsSendMessage(TCHAR*tcharNumber,TCHAR*tcharInformation);
- HRILm_hRil;//ril实例句柄
- CList<CString,CString&>MsgList;
- protected:
- voidInitialize();
- staticvoidCALLBACKResultCallback(DWORDdwCode,HRESULThrCmdID,constvoid*lpData,DWORDcbData,DWORDdwParam);
- staticvoidCALLBACKNotifyCallback(DWORDdwCode,constvoid*lpData,DWORDcbData,DWORDdwParam);
- private:
- boolGetDefaultSubmitMsgCfg(RILMESSAGE&MsgItem);
- intWildChar2BYTE(BYTE*MsgToBeBuild,TCHAR*WideCharStr,constintWideMsgLen);
- intBuildWildChar(TCHAR*WideCharStr,BYTE*MsgToBeBuild,constintMsgLen);
- intSetDestValue(TCHAR*DestVal,TCHAR*temp);
- SMS_CodeDecodem_SMS_CodeDecode;
- DWORDconvertContext2UNICODE(TCHAR*pszOutUnicodeContext,BYTE*pszInrgbMsg,DWORDdwAlphabet,intcchMsgLength,BOOLisCbMsg=FALSE);
- };
- //////////////////////////////////////////////////////////////////////////
- //Filename:SMS_RIL.cpp
- //Author:houjiong
- //Date:2008-1-3
- //Description:封装RIL的短消息功能
- //
- //Update:
- //DateNameDescription
- //=================================================================
- //2008-1-3houjiongCreate
- //////////////////////////////////////////////////////////////////////////
- #include"stdafx.h"
- #include"SMS_RIL.h"
- #include"SMS_CodeDecode.h"
- //HRILSMS_RIL::m_hRil=NULL;
- //CList<CString,CString&>SMS_RIL::MsgList=NULL;
- SMS_RIL::SMS_RIL()
- {
- Initialize();
- }
- voidSMS_RIL::Initialize()
- {
- HRESULThr=RIL_Initialize(1,ResultCallback,NotifyCallback,RIL_NCLASS_MESSAGE/*RIL_NCLASS_ALL*/,(LPARAM)this,&m_hRil);
- if(FAILED(hr))
- {
- //MessageBox(NULL,_T(">>>>>CallingRIL_Initialize()Fail/r/n"),_T("Caption"),MB_OK);
- return;
- }
- }
- voidCALLBACKSMS_RIL::ResultCallback(DWORDdwCode,HRESULThrCmdID,constvoid*lpData,DWORDcbData,DWORDdwParam)
- {
- DWORD*dwNum;
- switch(dwCode)
- {
- caseRIL_RESULT_OK:
- dwNum=(DWORD*)lpData;
- break;
- caseRIL_RESULT_NOCARRIER:
- caseRIL_RESULT_NODIALTONE:
- caseRIL_RESULT_ERROR:
- caseRIL_RESULT_BUSY:
- break;
- }
- }
- voidCALLBACKSMS_RIL::NotifyCallback(DWORDdwCode,constvoid*lpData,DWORDcbData,DWORDdwParam)
- {
- //RILMESSAGE*pMessage=(RILMESSAGE*)lpData;
- switch(dwCode)
- {
- caseRIL_NOTIFY_CONNECT:
- caseRIL_NOTIFY_DISCONNECT:
- caseRIL_NOTIFY_RING:
- break;
- caseRIL_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"));
- /*CStringmessage;
- WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
- NewMsg->msgInDeliver.rgbMsg
- NewMsg->msgInDeliver.raOrigAddress.wszAddress;
- This->MsgList.AddHead(CString(_T("world")));*/
- CStringstrMessage;
- TCHAR*WideCharStr=newTCHAR();
- //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;
- }
- }
- HRESULTSMS_RIL::SmsSendMessage(TCHAR*tcharNumber,TCHAR*tcharInformation)
- {
- RILMESSAGE*pSimMsg=newRILMESSAGE;
- GetDefaultSubmitMsgCfg(*pSimMsg);
- //通常用Unicode编码
- pSimMsg->msgOutSubmit.rmdDataCoding.dwAlphabet=RIL_DCSALPHABET_UCS2;
- TCHAR*WideCharStr=NULL;
- //WideCharStr=_T("对方号码");
- WideCharStr=tcharInformation;
- //intMsglen=WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
- intMsglen=m_SMS_CodeDecode.WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
- pSimMsg->msgOutSubmit.cchMsgLength=Msglen;
- WideCharStr=tcharNumber;
- lstrcpy(pSimMsg->msgOutSubmit.raDestAddress.wszAddress,WideCharStr);//发送地址
- HRESULTlr=RIL_SendMsg(m_hRil,pSimMsg,0);
- returnlr;
- }
- //////////////////////////////////////////////////////////////////////////
- //Functionname:GetDefaultSubmitMsgCfg
- //Author:houjiong
- //Date:2008-1-4
- //Description:GetDefaultSubmitMsgConfig
- //
- //Input:arg0:RILMESSAGE:RILMESSAGE
- //Returnvalue:bool
- //Notes:
- //Update:
- //DateNameDescription
- //=================================================================
- //2008-1-3houjiongCreate
- //////////////////////////////////////////////////////////////////////////
- boolSMS_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;//设置协议IDPID设置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中值来设置
- SYSTEMTIMEcurTime;
- 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;
- //destaddress
- 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"));//发送地址
- returnTRUE;
- }
- //////////////////////////////////////////////////////////////////////////
- //Functionname:WildChar2BYTE
- //Author:houjiong
- //Date:2008-1-3
- //Description:把我们认识的Unicode编码转换为UCS2编码,用来发送短消息
- //
- //Input:arg0:BYTE*MsgToBeBuild
- //arg1:TCHAR*WideCharStr
- //arg2:constintWideMsgLen
- //Returnvalue:int
- //Notes:把UNICODE编码转换为UCS2编码,返回长度
- //Update:
- //DateNameDescription
- //=================================================================
- //2008-1-3houjiongCreate
- //////////////////////////////////////////////////////////////////////////
- intSMS_RIL::WildChar2BYTE(BYTE*MsgToBeBuild,TCHAR*WideCharStr,constintWideMsgLen)
- {
- intj=0;
- while(*WideCharStr!=0x0000)
- {
- BYTEtemp=0x00;
- j++;
- temp=(*WideCharStr&0xFF00)>>8;
- *MsgToBeBuild=temp;
- MsgToBeBuild++;
- temp=(*WideCharStr&0x00FF);
- *MsgToBeBuild=temp;
- MsgToBeBuild++;
- WideCharStr++;
- }
- *MsgToBeBuild=0x00;
- returnj;
- }
- intSMS_RIL::BuildWildChar(TCHAR*WideCharStr,BYTE*MsgToBeBuild,constintMsgLen)
- {
- inti,j;
- for(i=0,j=0;i<MsgLen;i+=2,j++)
- {
- TCHARtemp=0x0000;
- #if1
- {
- 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;
- returnj;
- }
- intSMS_RIL::SetDestValue(TCHAR*DestVal,TCHAR*temp)
- {
- TCHARadd=0x0000;
- intCount=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));
- }
- returnCount;
- }
- //////////////////////////////////////////////////////////////////////////
- //Functionname:convertContext2UNICODE
- //Author:Huanglb
- //Date:2004-4-1
- //Description:转换信息内容
- //
- //Input:
- //arg0:pszOutUnicodeContext,转换结果:Unicode串
- //arg1:pszInrgbMsg,提供要进行转换的内容地址
- //arg2:dwAlphabet,编码方式
- //arg3:cchMsgLength,原信息长度
- //Returnvalue:DWORD
- //Notes:
- //Update:
- //DateNameDescription
- //=================================================================
- //2004-4-1huanglbCreate
- //////////////////////////////////////////////////////////////////////////
- DWORDSMS_RIL::convertContext2UNICODE(TCHAR*pszOutUnicodeContext,BYTE*pszInrgbMsg,DWORDdwAlphabet,intcchMsgLength,BOOLisCbMsg)
- {
- intWildchLen=0;
- switch(dwAlphabet)
- {
- caseRIL_DCSALPHABET_DEFAULT://(0x00000001)//@constdefineTBD
- {
- //先将7Bit编码转换成GSM0338编码;
- WildchLen=m_SMS_CodeDecode.UnpackSMS(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength,isCbMsg);
- m_SMS_CodeDecode.Gsm0338toUNICODE(&pszOutUnicodeContext[0],WildchLen);
- }
- break;
- caseRIL_DCSALPHABET_8BIT://(0x00000002)//@constdefineTBD
- {
- //每8位一个字符
- WildchLen=m_SMS_CodeDecode.Convert8Bit2UNICODE(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength);
- }
- break;
- caseRIL_DCSALPHABET_UCS2://Unicode编码
- {
- WildchLen=m_SMS_CodeDecode.BuildWildChar(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength*sizeof(TCHAR));
- }
- break;
- default:
- memcpy((void*)&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength);
- break;
- }
- returnWildchLen;
- }