wince 使用RIL实现SMS(短信息)

本文介绍了RIL函数的工作原理,特别是RIL_Initialize函数及其回调机制,并详细展示了如何使用RIL函数封装短信发送功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

  1. //////////////////////////////////////////////////////////////////////////
  2. //Filename:SMS_RIL.h
  3. //Author:houjiong
  4. //Date:2008-1-3
  5. //Description:封装RIL的短消息功能
  6. //
  7. //Update:
  8. //DateNameDescription
  9. //=================================================================
  10. //2008-1-3houjiongCreate
  11. //////////////////////////////////////////////////////////////////////////
  12. #pragmaonce
  13. #include"ril.h"
  14. #include"SMS_CodeDecode.h"
  15. classSMS_RIL
  16. {
  17. public:
  18. SMS_RIL();
  19. HRESULTSmsSendMessage(TCHAR*tcharNumber,TCHAR*tcharInformation);
  20. HRILm_hRil;//ril实例句柄
  21. CList<CString,CString&>MsgList;
  22. protected:
  23. voidInitialize();
  24. staticvoidCALLBACKResultCallback(DWORDdwCode,HRESULThrCmdID,constvoid*lpData,DWORDcbData,DWORDdwParam);
  25. staticvoidCALLBACKNotifyCallback(DWORDdwCode,constvoid*lpData,DWORDcbData,DWORDdwParam);
  26. private:
  27. boolGetDefaultSubmitMsgCfg(RILMESSAGE&MsgItem);
  28. intWildChar2BYTE(BYTE*MsgToBeBuild,TCHAR*WideCharStr,constintWideMsgLen);
  29. intBuildWildChar(TCHAR*WideCharStr,BYTE*MsgToBeBuild,constintMsgLen);
  30. intSetDestValue(TCHAR*DestVal,TCHAR*temp);
  31. SMS_CodeDecodem_SMS_CodeDecode;
  32. DWORDconvertContext2UNICODE(TCHAR*pszOutUnicodeContext,BYTE*pszInrgbMsg,DWORDdwAlphabet,intcchMsgLength,BOOLisCbMsg=FALSE);
  33. };
  34. //////////////////////////////////////////////////////////////////////////
  35. //Filename:SMS_RIL.cpp
  36. //Author:houjiong
  37. //Date:2008-1-3
  38. //Description:封装RIL的短消息功能
  39. //
  40. //Update:
  41. //DateNameDescription
  42. //=================================================================
  43. //2008-1-3houjiongCreate
  44. //////////////////////////////////////////////////////////////////////////
  45. #include"stdafx.h"
  46. #include"SMS_RIL.h"
  47. #include"SMS_CodeDecode.h"
  48. //HRILSMS_RIL::m_hRil=NULL;
  49. //CList<CString,CString&>SMS_RIL::MsgList=NULL;
  50. SMS_RIL::SMS_RIL()
  51. {
  52. Initialize();
  53. }
  54. voidSMS_RIL::Initialize()
  55. {
  56. HRESULThr=RIL_Initialize(1,ResultCallback,NotifyCallback,RIL_NCLASS_MESSAGE/*RIL_NCLASS_ALL*/,(LPARAM)this,&m_hRil);
  57. if(FAILED(hr))
  58. {
  59. //MessageBox(NULL,_T(">>>>>CallingRIL_Initialize()Fail/r/n"),_T("Caption"),MB_OK);
  60. return;
  61. }
  62. }
  63. voidCALLBACKSMS_RIL::ResultCallback(DWORDdwCode,HRESULThrCmdID,constvoid*lpData,DWORDcbData,DWORDdwParam)
  64. {
  65. DWORD*dwNum;
  66. switch(dwCode)
  67. {
  68. caseRIL_RESULT_OK:
  69. dwNum=(DWORD*)lpData;
  70. break;
  71. caseRIL_RESULT_NOCARRIER:
  72. caseRIL_RESULT_NODIALTONE:
  73. caseRIL_RESULT_ERROR:
  74. caseRIL_RESULT_BUSY:
  75. break;
  76. }
  77. }
  78. voidCALLBACKSMS_RIL::NotifyCallback(DWORDdwCode,constvoid*lpData,DWORDcbData,DWORDdwParam)
  79. {
  80. //RILMESSAGE*pMessage=(RILMESSAGE*)lpData;
  81. switch(dwCode)
  82. {
  83. caseRIL_NOTIFY_CONNECT:
  84. caseRIL_NOTIFY_DISCONNECT:
  85. caseRIL_NOTIFY_RING:
  86. break;
  87. caseRIL_NOTIFY_MESSAGE://通知消息
  88. RILMESSAGE*NewMsg=(RILMESSAGE*)lpData;
  89. SMS_RIL*This=(SMS_RIL*)dwParam;
  90. //RIL_WriteMsg(This->m_hRil,NewMsg,RIL_MSGSTATUS_STOUNSENT);
  91. //This->MsgList.InsertAfter(,"houjiong!")
  92. //This->MsgList.AddTail(CString("XYZ"));
  93. //This->MsgList.AddTail(
  94. //pos=This->MsgList.InsertAfter(pos,CString("ABC"));
  95. //pos=This->MsgList.InsertAfter(pos,CString("123"));
  96. /*CStringmessage;
  97. WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
  98. NewMsg->msgInDeliver.rgbMsg
  99. NewMsg->msgInDeliver.raOrigAddress.wszAddress;
  100. This->MsgList.AddHead(CString(_T("world")));*/
  101. CStringstrMessage;
  102. TCHAR*WideCharStr=newTCHAR();
  103. //This->BuildWildChar(WideCharStr,NewMsg->msgInDeliver.rgbMsg,NewMsg->msgInDeliver.cchMsgLength);
  104. //memcpy((void*)&WideCharStr[0],NewMsg->msgInDeliver.rgbMsg,NewMsg->msgInDeliver.cchMsgLength);
  105. This->convertContext2UNICODE(WideCharStr,NewMsg->msgInDeliver.rgbMsg,NewMsg->msgInDeliver.rmdDataCoding.dwAlphabet,NewMsg->msgInDeliver.cchMsgLength);
  106. strMessage=(CString)WideCharStr;
  107. This->MsgList.AddHead(strMessage);
  108. break;
  109. }
  110. }
  111. HRESULTSMS_RIL::SmsSendMessage(TCHAR*tcharNumber,TCHAR*tcharInformation)
  112. {
  113. RILMESSAGE*pSimMsg=newRILMESSAGE;
  114. GetDefaultSubmitMsgCfg(*pSimMsg);
  115. //通常用Unicode编码
  116. pSimMsg->msgOutSubmit.rmdDataCoding.dwAlphabet=RIL_DCSALPHABET_UCS2;
  117. TCHAR*WideCharStr=NULL;
  118. //WideCharStr=_T("对方号码");
  119. WideCharStr=tcharInformation;
  120. //intMsglen=WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
  121. intMsglen=m_SMS_CodeDecode.WildChar2BYTE(pSimMsg->msgOutSubmit.rgbMsg,WideCharStr,0);
  122. pSimMsg->msgOutSubmit.cchMsgLength=Msglen;
  123. WideCharStr=tcharNumber;
  124. lstrcpy(pSimMsg->msgOutSubmit.raDestAddress.wszAddress,WideCharStr);//发送地址
  125. HRESULTlr=RIL_SendMsg(m_hRil,pSimMsg,0);
  126. returnlr;
  127. }
  128. //////////////////////////////////////////////////////////////////////////
  129. //Functionname:GetDefaultSubmitMsgCfg
  130. //Author:houjiong
  131. //Date:2008-1-4
  132. //Description:GetDefaultSubmitMsgConfig
  133. //
  134. //Input:arg0:RILMESSAGE:RILMESSAGE
  135. //Returnvalue:bool
  136. //Notes:
  137. //Update:
  138. //DateNameDescription
  139. //=================================================================
  140. //2008-1-3houjiongCreate
  141. //////////////////////////////////////////////////////////////////////////
  142. boolSMS_RIL::GetDefaultSubmitMsgCfg(RILMESSAGE&MsgItem)
  143. {
  144. memset((void*)&MsgItem,0x00,sizeof(RILMESSAGE));
  145. MsgItem.cbSize=sizeof(RILMESSAGE);
  146. 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;
  147. MsgItem.dwParams|=RIL_PARAM_M_VP|RIL_PARAM_M_MSG;
  148. MsgItem.dwType=RIL_MSGTYPE_OUT_SUBMIT;
  149. MsgItem.dwFlags=RIL_MSGFLAG_STATUSREPORTRETURNED;//RIL_MSGFLAG_STATUSREPORTRETURNED;//标识回复路径等信息
  150. MsgItem.msgOutSubmit.dwVPFormat=RIL_MSGVP_RELATIVE;//0x00000001;
  151. MsgItem.msgOutSubmit.dwProtocolID=RIL_MSGPROTOCOL_SMETOSME;//设置协议IDPID设置0x0001
  152. //信息中心
  153. MsgItem.raSvcCtrAddress.cbSize=sizeof(MsgItem.raSvcCtrAddress);
  154. MsgItem.raSvcCtrAddress.dwParams=RIL_PARAM_A_ALL;
  155. MsgItem.raSvcCtrAddress.dwType=RIL_ADDRTYPE_INTERNATIONAL;
  156. MsgItem.raSvcCtrAddress.dwNumPlan=RIL_NUMPLAN_TELEPHONE;
  157. lstrcpy(MsgItem.raSvcCtrAddress.wszAddress,_T("8613800280500"));
  158. //设置数据编码方案DCS
  159. MsgItem.msgOutSubmit.rmdDataCoding.cbSize=sizeof(RILMSGDCS);
  160. MsgItem.msgOutSubmit.rmdDataCoding.dwParams=RIL_PARAM_MDCS_TYPE|RIL_PARAM_MDCS_ALPHABET;
  161. MsgItem.msgOutSubmit.rmdDataCoding.dwType=RIL_DCSTYPE_GENERAL;
  162. MsgItem.msgOutSubmit.rmdDataCoding.dwFlags=0x00000000;
  163. MsgItem.msgOutSubmit.rmdDataCoding.dwMsgClass=0x00000000;
  164. MsgItem.msgOutSubmit.rmdDataCoding.dwAlphabet=RIL_DCSALPHABET_UCS2;
  165. MsgItem.msgOutSubmit.rmdDataCoding.dwIndication=0x00000000;
  166. MsgItem.msgOutSubmit.rmdDataCoding.dwLanguage=0x00000000;
  167. //设置有效时间设置ValidatePeriod,直接根据当前保存在pSmsList中值来设置
  168. SYSTEMTIMEcurTime;
  169. GetLocalTime(&curTime);
  170. MsgItem.msgOutSubmit.stVP.wYear=curTime.wYear;
  171. MsgItem.msgOutSubmit.stVP.wMonth=curTime.wMonth;
  172. MsgItem.msgOutSubmit.stVP.wDayOfWeek=curTime.wDayOfWeek;
  173. MsgItem.msgOutSubmit.stVP.wDay=curTime.wDay;
  174. MsgItem.msgOutSubmit.stVP.wHour=curTime.wHour;
  175. MsgItem.msgOutSubmit.stVP.wMinute=curTime.wMinute;
  176. MsgItem.msgOutSubmit.stVP.wSecond=curTime.wSecond;
  177. MsgItem.msgOutSubmit.stVP.wMilliseconds=curTime.wMilliseconds;
  178. //destaddress
  179. MsgItem.msgOutSubmit.raDestAddress.cbSize=sizeof(RILADDRESS);
  180. MsgItem.msgOutSubmit.raDestAddress.dwParams=RIL_PARAM_A_ADDRESS|RIL_PARAM_A_TYPE|RIL_PARAM_A_NUMPLAN;//AWI_PARAM_A_ALL
  181. MsgItem.msgOutSubmit.raDestAddress.dwType=RIL_ADDRTYPE_UNKNOWN;
  182. MsgItem.msgOutSubmit.raDestAddress.dwNumPlan=RIL_NUMPLAN_TELEPHONE;
  183. MsgItem.msgOutSubmit.raDestAddress.wszAddress[0]=0x0000;
  184. //lstrcpy(MsgItem.msgOutSubmit.raDestAddress.wszAddress,_T("8615928041614"));//发送地址
  185. returnTRUE;
  186. }
  187. //////////////////////////////////////////////////////////////////////////
  188. //Functionname:WildChar2BYTE
  189. //Author:houjiong
  190. //Date:2008-1-3
  191. //Description:把我们认识的Unicode编码转换为UCS2编码,用来发送短消息
  192. //
  193. //Input:arg0:BYTE*MsgToBeBuild
  194. //arg1:TCHAR*WideCharStr
  195. //arg2:constintWideMsgLen
  196. //Returnvalue:int
  197. //Notes:把UNICODE编码转换为UCS2编码,返回长度
  198. //Update:
  199. //DateNameDescription
  200. //=================================================================
  201. //2008-1-3houjiongCreate
  202. //////////////////////////////////////////////////////////////////////////
  203. intSMS_RIL::WildChar2BYTE(BYTE*MsgToBeBuild,TCHAR*WideCharStr,constintWideMsgLen)
  204. {
  205. intj=0;
  206. while(*WideCharStr!=0x0000)
  207. {
  208. BYTEtemp=0x00;
  209. j++;
  210. temp=(*WideCharStr&0xFF00)>>8;
  211. *MsgToBeBuild=temp;
  212. MsgToBeBuild++;
  213. temp=(*WideCharStr&0x00FF);
  214. *MsgToBeBuild=temp;
  215. MsgToBeBuild++;
  216. WideCharStr++;
  217. }
  218. *MsgToBeBuild=0x00;
  219. returnj;
  220. }
  221. intSMS_RIL::BuildWildChar(TCHAR*WideCharStr,BYTE*MsgToBeBuild,constintMsgLen)
  222. {
  223. inti,j;
  224. for(i=0,j=0;i<MsgLen;i+=2,j++)
  225. {
  226. TCHARtemp=0x0000;
  227. #if1
  228. {
  229. memcpy(&temp,&MsgToBeBuild[i],1);
  230. /*if((0x20==temp))
  231. {
  232. WideCharStr=WideCharStr+SetDestValue(WideCharStr,(TCHAR*)&temp);
  233. temp=0x0000;
  234. }
  235. */
  236. temp=temp<<8;
  237. memcpy(&temp,&MsgToBeBuild[i+1],1);
  238. WideCharStr=WideCharStr+SetDestValue(WideCharStr,(TCHAR*)&temp);
  239. /*
  240. if((0x000D==temp)||(0x000A==temp))
  241. {
  242. temp=0x000D;
  243. memcpy(WideCharStr,&temp,sizeof(TCHAR));
  244. WideCharStr++;
  245. temp=0x000A;
  246. memcpy(WideCharStr,&temp,sizeof(TCHAR));
  247. }
  248. else
  249. {
  250. memcpy(WideCharStr,&temp,sizeof(TCHAR));
  251. }
  252. */
  253. }
  254. #else
  255. *WideCharStr=(MsgToBeBuild[i]<<8)|MsgToBeBuild[i+1];
  256. #endif
  257. //WideCharStr++;
  258. //swscanf(&temp,_T("%x"),&WideCharStr[j]);
  259. //MsgToBeBuild=MsgToBeBuild+2;
  260. }
  261. *WideCharStr=0x00;
  262. returnj;
  263. }
  264. intSMS_RIL::SetDestValue(TCHAR*DestVal,TCHAR*temp)
  265. {
  266. TCHARadd=0x0000;
  267. intCount=1;
  268. //if((0x000D==*temp)||(0x000A==*temp))
  269. //{
  270. //add=0x000D;
  271. //memcpy(DestVal,&add,sizeof(TCHAR));
  272. //DestVal++;
  273. //add=0x000A;
  274. //memcpy(DestVal,&add,sizeof(TCHAR));
  275. //Count=2;
  276. //}
  277. if((0x000D==*temp)||(0x000A==*temp))
  278. {
  279. add=0x000A;
  280. memcpy(DestVal,&add,sizeof(TCHAR));
  281. }
  282. else
  283. {
  284. memcpy(DestVal,temp,sizeof(TCHAR));
  285. }
  286. returnCount;
  287. }
  288. //////////////////////////////////////////////////////////////////////////
  289. //Functionname:convertContext2UNICODE
  290. //Author:Huanglb
  291. //Date:2004-4-1
  292. //Description:转换信息内容
  293. //
  294. //Input:
  295. //arg0:pszOutUnicodeContext,转换结果:Unicode串
  296. //arg1:pszInrgbMsg,提供要进行转换的内容地址
  297. //arg2:dwAlphabet,编码方式
  298. //arg3:cchMsgLength,原信息长度
  299. //Returnvalue:DWORD
  300. //Notes:
  301. //Update:
  302. //DateNameDescription
  303. //=================================================================
  304. //2004-4-1huanglbCreate
  305. //////////////////////////////////////////////////////////////////////////
  306. DWORDSMS_RIL::convertContext2UNICODE(TCHAR*pszOutUnicodeContext,BYTE*pszInrgbMsg,DWORDdwAlphabet,intcchMsgLength,BOOLisCbMsg)
  307. {
  308. intWildchLen=0;
  309. switch(dwAlphabet)
  310. {
  311. caseRIL_DCSALPHABET_DEFAULT://(0x00000001)//@constdefineTBD
  312. {
  313. //先将7Bit编码转换成GSM0338编码;
  314. WildchLen=m_SMS_CodeDecode.UnpackSMS(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength,isCbMsg);
  315. m_SMS_CodeDecode.Gsm0338toUNICODE(&pszOutUnicodeContext[0],WildchLen);
  316. }
  317. break;
  318. caseRIL_DCSALPHABET_8BIT://(0x00000002)//@constdefineTBD
  319. {
  320. //每8位一个字符
  321. WildchLen=m_SMS_CodeDecode.Convert8Bit2UNICODE(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength);
  322. }
  323. break;
  324. caseRIL_DCSALPHABET_UCS2://Unicode编码
  325. {
  326. WildchLen=m_SMS_CodeDecode.BuildWildChar(&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength*sizeof(TCHAR));
  327. }
  328. break;
  329. default:
  330. memcpy((void*)&pszOutUnicodeContext[0],pszInrgbMsg,cchMsgLength);
  331. break;
  332. }
  333. returnWildchLen;
  334. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值