RIL SMS

2024-02-07 17:18
文章标签 sms ril

本文主要是介绍RIL SMS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#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;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hou_jiong/archive/2008/03/11/2167722.aspx

这篇关于RIL SMS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688396

相关文章

Android RIL的java框架

Android RIL的Java部分也被分为了两个模块,RIL模块与Phone模块。其中RIL模块负责进行请求以及相应的处理,它将直接与RIL的原声代码进行通信。而Phone模块则向应用程序开发者提供了一系列的电话功能接口。 1.RIL模块结构   在RIL.java中实现了几个类来进行与下层rild的通信。   它实现了如下几个类来完成操作:      RILRequest:代表

Android RIL结构分析与移植

介绍 本文档对Android RIL部分的内容进行了介绍,其重点放在了Android RIL的原生代码部分。包括四个主题:   1.Android RIL框架介绍 2.Android RIL与 WindowsMobile RIL 3.Android RIL porting 4.Android RIL的java框架   在本文档中将Android代码中的重要模块列出进行分析,并给出了相关的程序

SMS垃圾短信集F1指标分析

一、任务 SMS垃圾短信集是一组为研究SMS垃圾短信而收集数据集合,每条短信有两个信息,分别是标签信息label,其中spam为垃圾短信,ham为正常短信。以及message信息为短信内容。现在有训练集,训练集保存在E:\自然语言处理\train.csv和测试集,测试集保存在E:\自然语言处理\test.csv。现在综合利用所学的文本预处理、特征提取、文本向量化等技术对其进行分析。建立机器学习模

OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

市面上关于终端(手机)操作系统在 3GPP 协议开发的内容太少了,即使 Android 相关的学习文档都很少,Android 协议开发书籍我是没有见过的。可能是市场需求的缘故吧,现在市场上还是前后端软件开发从业人员最多,包括我自己。 基于我曾经也在某手机协议开发团队干过一段时间,协议的 AP 侧和 CP 侧开发都整过,于是想尝试下基于 OpenAtom OpenHarmony(以下简称“Open

【故障排除】修复SCCM SMS_HIERARCHY_MANAGER错误3353

📌此报错发现于SCCM收集软件清单时。 SMS_HIERARCHY_MANAGER组件:它是负责管理站点层次结构之间的通信和数据复制 ☘️解决方案: 📌在SCCM控制台中已显示报错“端口1433,4022对防火墙例外无效” 查看hman.log日志文件也印证了此观点 为什么会出现这个问题? 当启用windows防火墙时,未添加与SQL Server端口相关的例

四--RIL层代码分析--整个电话来访过程

最近公司开发一个几百万的项目,要求重写系统RIL层,看了几个招聘信息,只要你会RIL层开发的,工资上w每个月不是梦,这是几天研究的成果,希望对大家有所帮助,兄弟们加油吧!  先来一个总的流程图:   拨出电话流程: 1 在系统源码这个路径下/packages/apps/Phone/src/com/android/phone/DialtactsActivity.ja

Fake-SMS恶意软件混淆分析——低代码的时代来了

写在前面的话 在安全社区中,只要聊到开源代码使用方面的话题,就肯定会聊到安全问题。虽然使用开源代码通常会被认为是安全的,但我们需要清楚的是,与非FOSS(自由与开源软件)解决方案相比,开源软件解决方案并不能保证完全的可信任度或更好的安全性。那么关键问题就出现了:即使代码经过了混淆处理,我们是否仍应该使用FOSS?答案肯定是否定的,而且这样的代码并不应该被视为FOSS。 先让我们一起回头看看恶意

深圳神秘顾客(SMS)公司:你想知道如何成为一名神秘顾客吗?

成为神秘顾客的流程通常包括以下步骤: 1、注册与报名:首先,你需要在相关平台或机构进行注册,并完善个人信息。这有助于系统进行任务匹配,确保你能够接收到符合你条件和能力的任务。注册完成后,你可以浏览并报名参加神秘顾客的活动或任务。 2、培训与准备:报名成功后,你将接受相关的培训。培训内容包括了解神秘顾客的角色和职责、评估标准、任务和行为准则等。这有助于你明确任务要求,提升观察力和沟通能力,确保评

一些常见的神秘顾客问题和陷阱—深圳神秘顾客(SMS)公司

神秘顾客(Mystery Shopper)是一种常用的市场调查手段,旨在通过模拟普通消费者的购物过程来评估商家的服务质量、环境氛围、商品陈列等方面。然而,在进行神秘顾客调查时,可能会遇到一些常见的问题和陷阱,以下是一些例子: 1、识别问题:神秘顾客需要确保自己不被店员识别出来,否则调查结果的客观性会受到影响。然而,有些店员可能经过培训,能够识别出神秘顾客的特征,或者通过某些行为模式识别出他们

Android中SMS的接收处理

田海立2012-02-22   在解析WAP PUSH over SMS时,看了一下Android里SMS接收的流程,并按照自己需要的流程记录,其他分支的详细处理并未讲述。PDU数据的encode/decode也并未在本文中进行解析,有兴趣的读者可以到相应的代码处自己解读一下。   Android中,RIL用RILReciever接收SMS pdu,并根据不同的信息类型用相应函数来处理