19,500
社区成员
发帖
与我相关
我的任务
分享
/*******************************************************************************************
函数名称: TEL_ReadPhoneBook
描 述: 读取指定位置的电话号码记录
输入参数: 电话号码的索引位置(SIM卡最多只支持250条记录,ME最多只支持200条记录。),
电话号码缓冲区以及姓名缓冲区
输出参数: 电话号码和姓名
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGsmModel::TEL_ReadPhoneBook(UINT index, WCHAR *wzNumber, WCHAR *wzName)
{
char szCmd[MAX_PATH] = {0};
sprintf(szCmd,"AT+CPBR=%u\r\n",index);
if(SendATCmd(szCmd))//取指定的号码
{
char *szBegin = strstr(m_strRespBuf, "CPBR");//移到CPBR
if(!szBegin) return FALSE;
szBegin = strchr(szBegin,'"');//移到号码前的引号
if(!szBegin) return FALSE;
szBegin++;//移到号码处,即移过号码前的引号
char *szEnd = strchr(szBegin,'"');//找到号码后的引号
if(!szEnd) return FALSE;
mbstowcs(wzNumber,szBegin,szEnd-szBegin);//取得电话号码,取到号码后都可以返回TRUE
szBegin = szEnd + 1;//移过号码后的引号
szBegin = strchr(szBegin,'"');//找到姓名编码前的引号
if(!szBegin) return TRUE;
szBegin ++;//移过姓名编码前的引号
szEnd = strchr(szBegin,'"');//找到姓名编码后的引号
if(!szEnd) return TRUE;
char szName[BUFF_SIZE] = {0};
strncpy(szName,szBegin,szEnd-szBegin);//取得姓名
Str_ConvertToUnicode(szName, wzName);
return TRUE;
}
return FALSE;
}
/*******************************************************************************************
函数名称: TEL_SetPhoneBookStorage
描 述: 设置当前的电话簿存储单元
输入参数: 电话簿存储单元名称
"ON" SIM卡(或ME)中的号码(MSISDN)清单(也可以使用+CNUM命令读出该存储器中的信息)
$(AT R97)$ "FD" SIM固定拨号号码电话簿(此功能开启及存储容量取决于SIM卡)
"DC" ME最近拨号号码电话簿(非标准的)
"RC" ME最近接听号码电话簿(非标准的)
"MC" ME最近未接号码电话簿(非标准的)
"MT" ME电话簿和缩位拨号电话簿的合并(非标准的)包括ME和SIM电话簿
(存储容量取决于SIM卡,事实上,EM310不存在ME电话簿)
"EN" 紧急呼叫号码电话簿(此功能开启及存储容量取决于SIM卡)
"BD" 被禁止的拨号号码电话簿(此功能开启及存储容量取决于SIM卡)
"SD" 服务拨号号码电话簿(此功能开启及存储容量取决于SIM卡)
输出参数:
返 回: TRUE: 成功 FALSE: 失败
N O T E : 传入参数不能带双引号,本函数会自动添加双引号
********************************************************************************************/
BOOL CGsmModel::TEL_SetPhoneBookStorage(char *szStorage)
{
char szCmd[MAX_PATH] = {0};
sprintf(szCmd,"AT+CPBS=\"%s\"\r\n",szStorage);
return SendATCmd(szCmd);
}
/*******************************************************************************************
函数名称: TEL_GetPhoneBookStorage
描 述: 取得当前的电话簿存储单元类型
输入参数: 存储电话簿存储单元名称的缓冲区
输出参数: 电话簿存储单元名称
"ON" SIM卡(或ME)中的号码(MSISDN)清单(也可以使用+CNUM命令读出该存储器中的信息)
$(AT R97)$ "FD" SIM固定拨号号码电话簿(此功能开启及存储容量取决于SIM卡)
"DC" ME最近拨号号码电话簿(非标准的)
"RC" ME最近接听号码电话簿(非标准的)
"MC" ME最近未接号码电话簿(非标准的)
"MT" ME电话簿和缩位拨号电话簿的合并(非标准的)包括ME和SIM电话簿
(存储容量取决于SIM卡,事实上,EM310不存在ME电话簿)
"EN" 紧急呼叫号码电话簿(此功能开启及存储容量取决于SIM卡)
"BD" 被禁止的拨号号码电话簿(此功能开启及存储容量取决于SIM卡)
"SD" 服务拨号号码电话簿(此功能开启及存储容量取决于SIM卡)
返 回: TRUE: 成功 FALSE: 失败
N O T E : 缓冲区请先清零,再传入
********************************************************************************************/
BOOL CGsmModel::TEL_GetPhoneBookStorage(char *szStorage)
{//+CPBS: "MT",3,250
if(SendATCmd("AT+CPBS?\r\n"))
{
char *szBegin = strstr(m_strRespBuf, "CPBS");//移到CPBS
if(!szBegin) return FALSE;
szBegin = strchr(szBegin,'"');
if(!szBegin) return FALSE;
szBegin++;//移过引号
char *szEnd = strchr(szBegin,'"');
if(!szEnd) return FALSE;
strncpy(szStorage,szBegin,szEnd-szBegin);
return TRUE;
}
return FALSE;
}
/*******************************************************************************************
函数名称: TEL_GetCnum
描 述: 取得本机号码(MSISDN)。存储容量取决于SIM卡,但每个SIM卡应该只使用一个号码,
所以此外只取第一个本机号码,通过AT+CPBR=?查询到可以记录两条
输入参数: wzNumber:电话号码缓冲区, wzName:姓名缓冲区
输出参数: 电话号码和姓名
返 回: TRUE: 成功 FALSE: 失败
N O T E : 取得本机号命令为AT+CNUM,返回值如下格式:
+CNUM: "004000520087007A004B0054005F007600E8006D","13145939103",129
因为AT+CNUM不支持中文,所以改为AT+CPBR命令查询
********************************************************************************************/
BOOL CGsmModel::TEL_GetCnum(WCHAR *wzNumber, WCHAR *wzName)
{//+CPBR: 1,"13145939103",129,"0054006500730074002000530049004D"
char szStorage[16] = {0};
if(!TEL_GetPhoneBookStorage(szStorage))//查询当前的存储单元
return FALSE;
if(strcmp(szStorage,"ON"))//如果不是本机号码的存储单元
{
if(!TEL_SetPhoneBookStorage("ON"))//设置到本机号码的电话簿存储单元
return FALSE;
}
BOOL bRet = TEL_ReadPhoneBook(1,wzNumber,wzName);//取得本机号码
if(strcmp(szStorage,"ON"))//如果不是本机号码的存储单元
{
while(!TEL_SetPhoneBookStorage(szStorage))//恢复为原来的电话簿存储单元
Sleep(0);
}
return bRet;
}
/*******************************************************************************************
函数名称: TEL_SetCnum
描 述: 设置本机号码(MSISDN)。存储容量取决于SIM卡,但每个SIM卡应该只使用一个号码,
所以此外只存储一个本机号码
输入参数: wzNumber:电话号码, wzName:姓名,如为空则自动设置为"Unknown Name"
输出参数: 无
返 回: TRUE: 成功 FALSE: 失败
********************************************************************************************/
BOOL CGsmModel::TEL_SetCnum(WCHAR *wzNumber, WCHAR *wzName)
{
char szStorage[16] = {0};
if(!TEL_GetPhoneBookStorage(szStorage))//查询当前的存储单元
return FALSE;
if(strcmp(szStorage,"ON"))//如果不是本机号码的存储单元
{
if(!TEL_SetPhoneBookStorage("ON"))//设置到本机号码的电话簿存储单元
return FALSE;
}
BOOL bRet = TEL_ModifyPhoneBook(1,wzNumber,wzName);//设置本机号码
if(strcmp(szStorage,"ON"))//如果不是本机号码的存储单元
{
while(!TEL_SetPhoneBookStorage(szStorage))//恢复为原来的电话簿存储单元
Sleep(0);
}
return bRet;
}