1 概述
关于本章
营帐系统与infoX AAA的MML Server之间的接口。
1.1 接口描述
营帐系统与infoX AAA的MML Server之间的接口。
infoX AAA与营帐系统在网络中的位置如图1-1所示。
在infoX AAA中,WMAS为运营商提供一个Web方式的营业管理接口,运营商可以通过Web浏览器访问WMAS,实现业务的远程管理。MML Server(Man Machine Language Server)是业务管理的服务器端,与WMAS配合提供Web方式的业务管理功能。
MML Server对外提供MML接口和基于该接口的管理功能,使第三方(例如营帐系统)设备可以通过MML接口实现对用户数据的管理功能,如开户、销户和密码修改等。
营帐系统(Billing)作为第三方设备,是负责用户入网、变更、收费、帐务以及智能卡管理、积分管理、资源管理、系统管理、报表、联机指令等综合的营业系统。
营帐系统可以作为MML Server的客户端,通过MML消息与MML Server交互,管理用户数据。
为了更好的理解MML消息交互过程,需要预先了解以下概念:
l 连接
营帐系统与MML Server采用TCP/IP传输层协议创建连接,并进行信息交互。
l 会话
会话是营帐系统与MML Server之间的一个虚拟连接(逻辑连接)。
会话标识了操作员到MML Server的一次有效登录。操作员登录时,营帐系统和MML Server为该操作员建立一个会话;操作员退出登录后会话被释放。如果操作员在登录后连续空闲时间超过1个小时,则MML Server自动将会话释放。
在一条连接上可以有多个会话即同时有多个操作员登录MML Server,但同一连接上不能同时存在两个相同的会话ID。
会话ID是营帐系统操作员登录到MML Server中的唯一标识,由营帐系统指定,取值为整数。
l 事务
事务是指为了完成某项任务而进行的一系列串行操作。事务中的各个操作依次执行以完成一个任务。
在infoX AAA系统中,一个事务仅可包括一个操作,即一条MML命令。
1.2 消息描述
营帐系统与MML Server之间交互的消息分类,包括普通消息和心跳消息。
1.2.1 消息分类
营帐系统与MML Server之间交互的消息分类,包括普通消息和心跳消息。
营帐系统和MML Server之间通过MML消息进行交互,MML消息分为如下两类:
l 普通消息
l 心跳消息
infoX AAA支持两种消息格式:
l AAA MML消息
l IIN(Integrated Intelligent Network)MML消息
二者的区别仅在于消息开始标志和校验和。
infoX AAA支持两种格式的MML消息,旨在为开发者提供更多的选择。例如,在营帐系统既要对接infoX AAA又要对接IIN时,可以将营帐系统开发成仅支持IIN格式MML命令,仅需要在infoX AAA侧做相应的配置即可。
系统对于两种MML消息格式的支持可以通过在/export/home/ismpmml/sms_run/shell/env.rc中配置MMLMSGTYPE的值来实现。MMLMSGTYPE的值为0时,系统支持AAA格式的MML命令,值为1时,系统支持IIN格式的MML命令。
更改配置后需要执行以下命令使环境变量生效,并重启MML Server:
<8 info131 :/export/home/ismpmml/sms_run/shell>source env.rc
<9 info131 :/export/home/ismpmml/sms_run/shell>restart.sh
1.2.2 消息格式
普通消息报文用于营帐系统和MML Server之间的信息交互,AAA格式和IIN格式的普通消息报文分别如图1-2所示和图1-3所示。
一条完整的普通消息报文=消息开始标志(4B)+消息长度(4B)+消息头(20B)+会话头(18B)+事务头(18B)+操作信息(N×4B)+校验和(4B或8B)
l 消息长度=从消息头到操作信息结束(包括填充的空格)的长度,16进制字符(0-F)表示的16位整数(4B),取值范围为56到65000(10进制)
l 消息头=版本号(4B)+终端标识(8B)+服务名(8B)
l 会话头=会话ID(8B)+会话控制字(6B)+会话保留字(4B)
l 事务头=事务ID(8B)+事务控制字(6B)+事务保留字(4B)
l 操作信息=命令码[:命令参数];命令码[:命令参数];……;
l 校验和=对“消息头+会话头+事务头+操作信息”组成的字符数组按32位分段后异或所得的结果再取反得到的值
具体格式的说明请参见表1-1。
心跳消息报文用于监测营帐系统到MML Server之间的通信是否处于正常状态,AAA格式的心跳消息和IIN格式的心跳消息分别如图1-4和图1-5所示。
营帐系统与MML Server之间需定时(系统规定为60秒)相互发送心跳消息,如果连续10次接收不到对方发送的心跳消息响应,就认定营帐系统与MML Server的连接失败。
一条完整的心跳消息报文=消息开始标志(4B)+消息长度(4B)+内容(“HBHB”)+校验和
具体的格式说明请参见表1-2。
域名称 | 说明 | 取值范围 |
消息开始标志 | 消息开始的标识,底层通讯用,对于上层透明。 | 采用AAA格式时固定为“/x1C/x1D/x1E/x1F”。 采用IIN格式时固定为“/x60/x53/x43/x60”。 |
消息长度 | 心跳消息内容(HBHB)的长度,底层通讯用,对于上层透明。16进制字符(0-F)表示的16位整数(4B),即先将16位二进制数表示成4位16进制数,再对这4位数字(0-F)依次进行ASCII编码。例如,10进制数4转成16进制为0004,再ASCII编码得“/x30/x30/x30/x34”。 | 因为心跳消息内容固定,所以消息长度也是固定的。固定为4(/x30/x30/x30/x34)。 |
内容 | 心跳消息传递的内容。 | 固定为“HBHB”(/x48/x42/x48/x42)。 |
校验和 | 内容(HBHB)按位取反得到的值。IIN格式的校验码则是在AAA格式的校验码基础上按每个字节的高4位低4位分别扩展成一个字节的方式获得。 | 在AAA格式的心跳消息中是“/xB7/xBD/xB7/xBD”。 在IIN格式的心跳消息中是“/x0B/x07/x0B/x0D/x0B/x07/x0B/x0D”。 |
关于本章
MML接口的客户端开发实例及客户端与MML Server之间对接调试指导。
2.1 开发概述
实现MML接口客户端即营帐系统与MML Server之间的通信。
在开发MML接口客户端前,需要了解MML Server所在服务器的IP地址和端口号。默认情况下MML Server的端口号为19999。
营帐系统在MML Server处对应一个超级管理员,管理员的登录名为“billopr”“cdmaopr”“wimaxopr”“wcdmaadm”,初始密码为TELLIN。
营帐系统的操作流程如图2-1所示。
具体操作流程如下所示。
1. 营帐系统向MML Server发送login消息请求登录。
2. MML Server接收login消息,对营帐系统进行身份验证,并返回login ACK消息。
3. 如果营帐系统通过身份验证,则可以通过发送operation消息,向MML Server发送相应的操作请求。
4. MML Server根据营帐系统发送的消息执行内部操作,操作完成后返回operation ACK消息。
6. MML Server接收logout消息,并返回logout ACK消息。
operation消息是营帐系统发起的操作消息,由营帐系统指定消息的数量,可以重复发送操作请求。
如果操作员在登录后连续空闲时间超过1个小时,则MML Server自动将会话释放。
2.2 开发实例
操作步骤
步骤 1 连接到MML Server。
营帐系统建立MML客户端到MML Server服务端口的Socket连接。
代码如下所示(以下为C语言代码,仅供参考)。
//建立Socket连接的函数。
void connectMML(Int& m_sockfd, Int& m_ip, Int& m_port)
{
struct sockaddr_in m_server_addr;
Int m_result;
memset((char*)&m_server_addr,'/0',(int)sizeof(m_server_addr));
m_server_addr.sin_family = AF_INET;
m_server_addr.sin_addr.s_addr = m_ip;
m_server_addr.sin_port = htons( m_port );
m_sockfd = socket( AF_INET, SOCK_STREAM, 0 );
if (0 >= m_sockfd)
{
printf("socket creat failed/n");
exit(0);
}
//Socket的内部函数,建立客户端到服务器的连接
m_result = connect(m_sockfd, (struct sockaddr * ) & m_server_addr
, sizeof( m_server_addr ));
if (0 != m_result)
{
printf("connect server failed/n");
exit(0);
}
}
步骤 2 编码。
MML客户端通过编码过程将需要发送的内容封装成一个符合MML接口规范的消息。
MML客户端需要支持编码普通消息和心跳消息。
编码的参考代码如下所示。
//宏定义
#define MAX_LEN_VERSION 4
#define MAX_LEN_TERMINAL 8
#define MAX_LEN_SERVNAME 8
#define MAX_LEN_DLGCTRL 6
#define MAX_LEN_TXID 8
#define MAX_LEN_TXCTRL 6
#define MAX_LEN_TXRSVD 4
#define MAX_MSG_LEN 65536
#define MAX_HEAD_LEN 56
#define MSG_STARTTAG_LEN 4
#define MSG_INFOLEN_LEN 4
#define MSG_CHKSUM_LEN 4
#define MSG_COMM_LEN 12
#define MAX_HB_MSG_LEN 4
#define MAX_HB_CONTENT_LEN 4
#define MAX_HB_CHCKSUM 4
#define HB_MSG_LEN 16
#define MAX_LEN_DLGID 8
#define MAX_LEN_DLGRSVD 4
#define MSG_STARTTAG "/x1C/x1D/x1E/x1F"
#define MSG_VERSION "1.00"
#define MSG_TERMINAL "internal"
#define MSG_TXRSVD " "
#define MSG_DLGRSVD " "
#define HB_CONTENT "HBHB"
//Encode 函数
EnRet Encode(MsgInfo & sendMsg,char * sendBuff, int & sendLen, int send_type)
{
//此处省略异常处理过程
......
//如果是心跳消息,编码方式如下
if (TYPE_OF_HB_MSG == send_type)
{
int temp_len;
char * p_num, hb_checksum [MAX_HB_CHCKSUM];
temp_len = 0;
strncpy(sendBuff+ temp_len,MSG_STARTTAG, MSG_STARTTAG_LEN);
temp_len += MSG_STARTTAG_LEN;
p_num = Int2ToHex(HB_MSG_LEN);
strncpy(sendBuff + temp_len, p_num, MAX_HB_MSG_LEN);
temp_len += MAX_HB_MSG_LEN;
strncpy (sendBuff + temp_len, HB_CONTENT, MAX_HB_CONTENT_LEN);
temp_len = MSG_STARTTAG_LEN + MAX_HB_MSG_LEN;
GetChkSum(MAX_HB_MSG_LEN,sendBuff + temp_len,hb_checksum);
temp_len = HB_MSG_LEN - MAX_HB_CHCKSUM;
strncpy(sendBuff + temp_len, hb_checksum, MAX_HB_CHCKSUM);
printf("/ncode HB secceed!/n%s",sendBuff);
return Success;
}
//如果是普通消息,编码如下
Int msglen,cmdlen,len;
char *p,chksum[MSG_CHKSUM_LEN];
char *pTx[ ] = { "TXBEG" , "TXCON" , "TXCAN" , "TXEND" };
char *pDlg[ ] = { "DLGLGN" , "DLGBEG" , "DLGCON" , "DLGEND" };
//打印发送的消息
PrintMsg(sendMsg);
//计算消息长度
cmdlen=strlen(sendMsg.cmd);
msglen=MAX_HEAD_LEN+cmdlen;
len=(4 - msglen % 4);
msglen+=len;
sendLen=msglen+MSG_COMM_LEN;
memset(sendBuff,' ',MAX_MSG_LEN);
len=0;
//拼装消息开始标志
strncpy(sendBuff+len, MSG_STARTTAG, MSG_STARTTAG_LEN);
len+=MSG_STARTTAG_LEN;
//拼装消息长度
p=Int2ToHex(msglen);
strncpy(sendBuff+len, p, MSG_INFOLEN_LEN);
len+=MSG_INFOLEN_LEN;
//拼装消息头
strncpy(sendBuff+len, MSG_VERSION, MAX_LEN_VERSION);
len+=MAX_LEN_VERSION;
strncpy(sendBuff+len, MSG_TERMINAL, MAX_LEN_TERMINAL);
len+=MAX_LEN_TERMINAL;
strncpy(sendBuff+len,sendMsg.service, strlen(sendMsg.service));
len+=MAX_LEN_SERVNAME;
//拼装会话头
p=Int4ToHex(sendMsg.snLogin);
strncpy(sendBuff+len, p, MAX_LEN_DLGID);
len+=MAX_LEN_DLGID;
strncpy(sendBuff+len,pDlg[sendMsg.dlgCtrl],strlen(pDlg[sendMsg.dlgCtrl]));
len+=MAX_LEN_DLGCTRL;
strncpy(sendBuff+len, MSG_DLGRSVD, MAX_LEN_DLGRSVD);
len+=MAX_LEN_DLGRSVD;
//拼装事务头
p=Int4ToHex(sendMsg.sequence);
strncpy(sendBuff+len, p, MAX_LEN_TXID);
len+=MAX_LEN_TXID;
strncpy(sendBuff+len,pTx[sendMsg.txCtrl],strlen(pTx[sendMsg
.txCtrl]));
len+=MAX_LEN_TXCTRL;
strncpy(sendBuff+len, MSG_TXRSVD, MAX_LEN_TXRSVD);
len+=MAX_LEN_TXRSVD;
//拼装操作信息
strncpy(sendBuff+len, sendMsg.cmd, cmdlen);
//拼装校验和
len=MSG_STARTTAG_LEN + MSG_INFOLEN_LEN;
GetChkSum(msglen,sendBuff+len,chksum);
len=sendLen-MSG_CHKSUM_LEN;
strncpy(sendBuff+len, chksum, MSG_CHKSUM_LEN);
return Success;
}
GetChkSum()函数的具体内容请参见“附录 A”。
步骤 3 解码。
客户端通过解码过程从MML Server接口返回的消息中获取具体内容。
客户端需要支持解码普通消息和心跳消息。
解码的参考代码如下所示。
//Decode 函数
EnRet Decode(MsgInfo &recMsg,char * recBuff,Int & recLen, int recv_type)
{
//此处省略异常处理过程
......
int msglen,len,tmpInt;
char chksum[MSG_CHKSUM_LEN],tmpStr[MAX_MSG_LEN];
char *pTx[ ] = { "TXBEG" , "TXCON" , "TXCAN" , "TXEND" };
char *pDlg[ ] = { "DLGLGN" , "DLGBEG" , "DLGCON" , "DLGEND" };
len=0;
//解码消息开始标志
strncpy(tmpStr, recBuff+len, MSG_STARTTAG_LEN);
tmpStr[MSG_STARTTAG_LEN]='/0';
len+=MSG_STARTTAG_LEN;
if(strncmp(tmpStr,MSG_STARTTAG,MSG_STARTTAG_LEN) != 0)
{
printf("Msg head error.");
return NotCMD;
}
//解码消息长度
strncpy(tmpStr, recBuff+len, MSG_INFOLEN_LEN);
tmpStr[MSG_INFOLEN_LEN]='/0';
len+=MSG_INFOLEN_LEN;
HexToInt2(tmpStr,tmpInt);
msglen=tmpInt;
if ( recv_type == TYPE_OF_CMD_MSG )
{
if(msglen+MSG_COMM_LEN != recLen)
{
printf("Msg length error.");
return Failure;
}
}
//如果是心跳消息,解码方式如下
if ( recv_type == TYPE_OF_HB_MSG )
{
tmpInt=HB_MSG_LEN;
char HBtempStr[HB_MSG_LEN],HBStr[HB_MSG_LEN];
strncpy(HBtempStr, recBuff, tmpInt);
HBtempStr[tmpInt]='/0';
StrTrim(HBtempStr);
strcpy(HBStr,"HBHB");
for (int i=0; i<4; i++)
{
if( recBuff[MSG_STARTTAG_LEN+MAX_HB_MSG_LEN+i]!=HBStr[i])
{
return Failure;
}
}
return Success;
}
//如果是普通消息,解码如下
//解码消息头
strncpy(tmpStr, recBuff+len, MAX_LEN_VERSION);
tmpStr[MAX_LEN_VERSION]='/0';
len+=MAX_LEN_VERSION;
StrTrim(tmpStr);
strncpy(tmpStr, recBuff+len, MAX_LEN_TERMINAL);
tmpStr[MAX_LEN_TERMINAL]='/0';
len+=MAX_LEN_TERMINAL;
StrTrim(tmpStr);
strncpy(tmpStr, recBuff+len, MAX_LEN_SERVNAME);
tmpStr[MAX_LEN_SERVNAME]='/0';
len+=MAX_LEN_SERVNAME;
StrTrim(tmpStr);
strcpy(recMsg.service,tmpStr);
//解码会话头
strncpy(tmpStr, recBuff+len, MAX_LEN_DLGID);
tmpStr[MAX_LEN_DLGID]='/0';
len+=MAX_LEN_DLGID;
HexToInt4(tmpStr,tmpInt);
recMsg.snLogin=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_DLGCTRL);
tmpStr[MAX_LEN_DLGCTRL]='/0';
len+=MAX_LEN_DLGCTRL;
StrTrim(tmpStr);
for(tmpInt=0;tmpInt<4;tmpInt++) if(strcmp(pDlg[tmpInt],tmpStr)==0) break;
recMsg.dlgCtrl=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_DLGRSVD);
tmpStr[MAX_LEN_DLGRSVD]='/0';
len+=MAX_LEN_DLGRSVD;
//解码事务头
strncpy(tmpStr, recBuff+len, MAX_LEN_TXID);
tmpStr[MAX_LEN_TXID]='/0';
len+=MAX_LEN_TXID;
HexToInt4(tmpStr,tmpInt);
recMsg.sequence=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_TXCTRL);
tmpStr[MAX_LEN_TXCTRL]='/0';
len+=MAX_LEN_TXCTRL;
StrTrim(tmpStr);
for(tmpInt=0;tmpInt<4;tmpInt++) if(strcmp(pTx[tmpInt],tmpStr)==0) break;
recMsg.txCtrl=tmpInt;
strncpy(tmpStr, recBuff+len, MAX_LEN_TXRSVD);
tmpStr[MAX_LEN_TXRSVD]='/0';
len+=MAX_LEN_TXRSVD;
//解码操作信息
tmpInt=msglen-(MAX_HEAD_LEN);
strncpy(tmpStr, recBuff+len, tmpInt);
tmpStr[tmpInt]='/0';
len+=tmpInt;
StrTrim(tmpStr);
strcpy(recMsg.cmd, tmpStr);
//解码校验和
strncpy(tmpStr, recBuff+len, MSG_CHKSUM_LEN);
tmpStr[MSG_CHKSUM_LEN]='/0';
len=MSG_STARTTAG_LEN + MSG_INFOLEN_LEN;
GetChkSum(msglen,recBuff+len,chksum);
if(strncmp(tmpStr,chksum,MSG_CHKSUM_LEN) != 0)
{
printf("Msg chksum error.");
return Failure;
}
//解码完毕,打印消息
PrintMsg(recMsg);
return Success;
}
步骤 4 发送消息/接收系统返回响应。
客户端发送消息到MML Server,并接收MML Server的返回结果。
参考代码如下所示。
//此处省略与发送消息和接收无关的内容
......
//发送消息
send(m_sockfd,sendBuff,sendLen,0);
outp_strm(sendBuff);
//接收消息
while(1)
{
recLen=recv( m_sockfd, recBuff, sizeof(recBuff),0 );
if(recLen>0)
{
printf("/nreceive login ack message.../n/n");
outp_strm(recBuff);
//解码消息并获取相应的操作结果
Decode(recMsg,recBuff,recLen,TYPE_OF_CMD_MSG);
break;
}
}
营帐系统与MML Server之间需定时(系统规定为60秒)相互发送心跳消息,如果连续10次接收不到对方发送的心跳消息,就认定营帐系统与MML Server断连,需要释放原来的连接,并尝试重新连接。
----结束
2.3 对接调试
MML接口的客户端与MML Server之间对接调试前的配置。
MML接口的客户端与MML Server之间对接调试的方法。
MML接口客户端与MML Server之间对接调试的过程指导。
2.3.1 调试准备
MML接口的客户端与MML Server之间对接调试前的配置。
infoX AAA的MML Server默认不接受外部客户端连接,需要执行如下操作,注册客户端IP。
操作步骤
步骤 1 修改配置文件。
1. 以ismpmml用户登录infoX AAA服务器。
2. 进入目录/export/home/ismpmml/sms_run/cfg。
3. 修改配置文件caa.cfg。
#whether or not limit client ip,1 is to limit,0 is not limit
LIMITIP=1
#Max access number
MAXACCESSNUM=100
[WWW SERVER IP]
#authorized IP address list
IP=127.0.0.1
IP=info131
IP= //将此IP设置为需要与MML Server连接的客户端的IP地址。
如果LIMITIP设置为0,则不限制连接MML Server的客户端的IP地址。
步骤 2 重启MML Server。
在单机环境下,执行如下命令,重启MML Server。
restart.sh
在双机环境下,如果双机管理软件为SUN Cluster,重启过程如下。
1. 以root用户登录ismswork应用所在的双机节点,默认为主节点itellin1。
2. 执行如下命令停止应用。
scswitch -n -j app_isms
3. 执行如下命令启动应用。
scswitch -e -j app_isms
在双机环境下,如果双机管理软件为VCS,重启过程如下。
1. 以root用户登录ismswork应用所在的双机节点,默认为主节点itellin1。
2. 执行如下命令停止应用。
hares -offline app_isms -sys 主机名
3. 执行如下命令启动应用。
hares -online app_isms -sys 主机名
----结束
2.3.2 调试方法
MML接口的客户端与MML Server之间对接调试的方法。
在调试MML接口的客户端程序时,主要使用“snoop”命令进行抓包,并对抓包结果进行分析。
例如:snoop命令格式为snoop -d hme0 -t a -x 54 port 19999。其中“hme0”为网卡名,“19999”为端口号即在该端口进行抓包操作。
如果网卡名未知,可通过“ifconfig -a”命令查看网卡信息。
snoop是Solaris的内部命令,该命令的具体使用方法请参考相关的Solaris资料。
当服务器操作系统为Suse时,使用“tcpdump”进行抓包,命令的具体使用方法请参见相关Suse资料。
2.3.3 调试过程
MML接口客户端与MML Server之间对接调试的过程指导。
通过对抓包结果的分析,达到判断调试过程是否成功的目的。
调试过程分以下两种情况:
l 如果某一操作的抓包结果不存在,则表明营帐系统没有将命令发送到MML Server或营帐系统与MML Server之间没有连接。
l 如果某一操作的抓包结果存在,则查看该抓包结果中的MML命令是否正确,由此判断该操作发送是否正确执行。
下面以一个营帐操作员登录操作为例介绍如何进行抓包分析。
操作步骤
步骤 1 以root用户登录MML Server所在服务器。
步骤 2 执行如下命令获取抓包信息。
snoop -d hme0 -t a -x 54 port 19999
抓包结果如下所示。
0: 1c1d 1e1f 3030 3730 312e 3030 696e 7465 ....00701.00inte
16: 726e 616c 5352 564d 2020 2020 3030 3030 rnalSRVM 0000
32: 3030 3037 444c 474c 474e 3030 3030 3030 0007DLGLGN000000
48: 3030 3030 3033 5458 4245 4720 3030 3030 000003TXBEG 0000
64: 4c4f 4749 4e3a 5553 4552 3d63 646d 6161 LOGIN:USER=cdmaa
80: 646d 2c50 5357 443d 3443 4337 4232 3041 dm,PSWD=4CC7B20A
96: 4341 3439 4144 3535 3832 3141 3243 3537 CA49AD55821A2C57
112: 3031 3141 4146 3335 fce5 aa95 011AAF35..?
0: 1c1d 1e1f 3031 6163 312e 3030 696e 7465 ....01ac1.00inte
16: 726e 616c 2020 4143 4b4c 474e 3030 3030 rnal ACKLGN0000
32: 3030 3037 444c 4743 4f4e 3030 3030 3030 0007DLGCON000000
48: 3030 3030 3033 2054 5845 4e44 3030 3030 000003 TXEND0000
64: 4143 4b3a 4c4f 4749 4e3a 2052 4554 4e3d ACK:LOGIN: RETN=
80: 302c 2044 4553 433d 5375 6363 6573 732c 0, DESC=Success,
96: 2041 5454 523d 524f 4c45 4944 2026 2052 ATTR=ROLEID & R
112: 4f4c 454e 414d 4520 2620 4352 4541 544f OLENAME & CREATO
128: 5220 2620 4147 454e 5449 4420 2620 4147 R & AGENTID & AG
144: 454e 544e 414d 4520 2620 5345 5256 4b45 ENTNAME & SERVKE
160: 5920 2620 5553 4552 2026 204c 564c 4944 Y & USER & LVLID
176: 2026 2053 4350 4944 2026 2050 5357 4445 & SCPID & PSWDE
192: 5850 4420 2620 4c41 5354 4c4f 4749 4e54 XPD & LASTLOGINT
208: 494d 4520 2620 5041 5353 574f 5244 4849 IME & PASSWORDHI
224: 5354 4f52 5920 2620 4348 4750 5357 4454 STORY & CHGPSWDT
240: 494d 452c 2052 4553 554c 543d 2231 347c IME, RESULT="14|
256: 4344 4d41 2053 7570 6572 204f 7065 7261 CDMA Super Opera
272: 746f 7220 526f 6c65 7c73 6572 7661 646d tor Role|servadm
288: 7c32 3430 3030 307c 4344 4d41 2041 6765 |240000|CDMA Age
304: 6e74 7c32 3730 7c63 646d 6161 646d 7c31 nt|270|cdmaadm|1
320: 347c 3130 307c 3230 3038 3032 3234 7c32 4|100|20080224|2
336: 3030 3731 3232 3331 3831 3334 387c 6561 0071223181348|ea
352: 6361 3166 3638 6338 3838 3263 3464 3735 ca1f68c8882c4d75
368: 3233 6366 3261 6436 3535 3531 6166 2061 23cf2ad65551af a
384: 3435 3531 3631 3236 3366 6562 6333 6330 455161263febc3c0
400: 3836 3536 6365 3631 6336 6436 3631 397c 8656ce61c6d6619|
416: 3230 3037 3131 3236 3136 3035 3034 222c 20071126160504",
432: 3b20 2020 e0d6 8fd0 ; ....
抓包结果的分析及说明如下:
l 第1段中第1行的加粗字节“1c1d 1e1f”,表示营帐操作员登录消息的消息开始标识。
l 第1段中5到8行的加粗部分表示营帐操作员登录操作的MML命令。
l 第2段中第1行的加粗字节“1c1d 1e1f”,表示营帐操作员登录响应消息的消息开始标识。
l 第2段中的5到6行的加粗部分,为MML Server对营帐系统的登录消息结果,由此可知营帐操作员登录成功。
其它标识的具体含义请参考表1-1。
----结束
2.4 FAQ
2.4.2 MML Server返回“语法错误或命令码非法”错误
2.4.1 连接MML Server失败
营帐系统作为客户端与MML Server对接调试过程中,连接MML Server失败。
检查MML Server的配置文件caa.cfg中的IP地址。如果IP地址配置错误,修改配置文件并重启MML Server应用所在的双机,然后重新连接。
2.4.2 MML Server返回“语法错误或命令码非法”错误
营帐系统与MML Server调试过程中,MML Server返回“语法错误或命令码非法”错误。
关于本章
3.1 功能简介
操作员管理的MML接口是infoX AAA系统对外开放的用于管理操作员的接口,通过该接口营帐操作员可以进行登录、注销和修改密码操作。
在操作员管理MML接口中,修改密码命令和修改密码ACK命令的服务名为OPRM,其它命令无服务名。
l ACK命令是infoX AAA系统对普通MML命令执行后的响应命令,例如:登录ACK命令,即infoX AAA系统对登录命令的响应命令。
l 操作员密码传输之前经过AES算法加密(存储之前先AES解密,再使用MD5算法加密)。AES加密算法原理请参见“附录 B加密简介”。
3.2 MML命令参考
3.2.1 登录命令
LOGIN
该命令用于操作员登录infoX AAA系统。
登录命令的参数说明表3-1所示。
参数 | 说明 | 是否可省略 | 是否可为空 | 取值范围 |
USER | 操作员登录名。 | No | No | 1~16个字节的字符串,可以包括字母、数字、点号、减号、下划线,首字符必须为字母。 |
PSWD | 操作员登录密码。 | No | No | 系统配置为操作员密码不加密时,操作员密码为6~16个字节的字符串,可以包括字母、数字、点号、减号、下划线。 系统配置为操作员密码加密时,操作员密码为32或64个字节的16进制的大写字符串(加密后的密码)。 |
下面以一个实例介绍登录命令的使用方法。
− 系统配置为操作员密码不加密。
− 营帐操作员名称为billoprcdmaoprwimaxoprwcdmaadm。
− 营帐操作员登录密码为TELLIN。
login:user="billoprcdmaoprwimaxoprwcdmaadm",pswd="TELLIN"