快速开发关于SP程序
第一次接触SGIP协议 来发短消息 看了两天,一头雾水,还好,网络时代,在网上收集到大量的资料,其中还有关于CMPP的
SGIP是联通的 CMPP是移动的 两者差别不大.
在网上也搜索到一些现成的开发库,试用版的,正式使用是要花钱的,
而且我也不敢使用它的开发库,万一那里有后门怎么办,
因为我做程序经常为了方便调试有一些后面,只是在正式交付时将这些后面去掉.
开发条件
1.SGIP协议 说明(网上有很多)
2.SGIP模拟网关(网上有很多)
3.掌握一种编程语言,包括掌握这种语言如何进行socket通讯
4.UltraEdit 这太重要了,分析数据包的时候使用
快速开发条件
1.我写了一个程序A 功能 监听一个端口 接收这个端口的数据并保存成文件,我要使用UltraEdit分析数据包.
2.随便找一个开发库,还有要带个使用开发库的例子.
3.拿笔和笔记本,可不是电脑笔记本,是可以使用笔写字的笔记本.我们随时要记录一些数据格式.
开始拿到SGIP协议,联通的协议实在是不是很规范,例如 1位的integer,这句话就是错的 integer是4位的.我们不管它了认为它是char 正好是1位的.
开始动手吧
一.启动SGIP模拟网关 配置 因为是模拟的地址设置为127.0.0.1,端口采用的是默认的
二.编译那个使用开发库的例子 并且安装说明配置它,让后执行.一般来说SGIP模拟网关就会接到短消息了.OK
三.将SGIP模拟网关停掉,启动程序A,监听端口8801,然后再运行那个使用开发库的例子,程序A此时会接到数据
四.分析数据
五.第一个数据包是进行身份校验的 就是Bind包,具体格式看SGIP协议好了,使用UltraEdit打开数据包,要以Hex看要.
和SGIP协议里的Bind包对照看,第一位是00 00 00 3D是integer的4位,16进制的3D就是10进制的61,说明Bind包数据长度是61个(char).以后的数据您一点一点对照SGIP协议就是了
六.然后知道我要干什么了吧,(我真的很坏吗:-)),我们现在还没有编程呢,那我们就写个程序 组包 将这个截获的数据包发出去,之前要启动模拟网关哟,网关没有反映,将用户名和密码改一下,重发,模拟网关显示密码错误,哈,成功了.
七.由于是长连接,发出数据后,模拟网关是有数据返回的,你也要了解SGIP协议里返回包的格式
八.改程序A 如果收到Bind包数据发出返回包,告诉客户端认证成功.
九.以后的工作就是比较繁杂的数据包组包了
写到这里,我就不多写了,
注意一点 integer的4位数据是右对齐的一下是将 int型的转换为右对齐的char[5],这是c语言的,其它语言请自行编写
#define HIGH_PRIORITY 1
#define LOW_PRIORITY 0
int HostByteOrder()
{
union {
unsigned char c[2];
unsigned short int i;
}CharToInt;
CharToInt.i=0x35ca;
if(CharToInt.c[0]==0x35) return LOW_PRIORITY;
else return HIGH_PRIORITY;
}
void __stdcall sputl(const long lngDataLen,char *lBuf)
{/*将整型数转换为4字节的网络字节序*/
union {
char c[4];
long l;
}LongToChar;
int i;
LongToChar.l=lngDataLen;
if((HostByteOrder())==HIGH_PRIORITY)
{
for(i=0;i<4;i++)
{
lBuf[i]=LongToChar.c[4-i-1];
}
}
else
{
for(i=0;i<4;i++)
{
lBuf[i]=LongToChar.c[i];
}
}
lBuf[4]=0x00;
return;
}
我一直提到程序A ,这个一个十分简单的程序 就是socket监听端口 的程序 我使用BCB5写的如果你不会写请联系我
其它程序,可以到网上去搜索,暂不提供
(版权所有,转载时请注明作者和出处)
王一冰
wangyb@51.net
wyb45@sohu.com
bing-a@tom.com
2004-4-19