Linux下用C语言实现手机短信发送
编
智慧密集
Linux下用C语考察豫机矩秸笈馑
李清陈超华
摘要本文简要介绍了发送SMS的PDU命令,并在文章中重点介绍了在Linux环境下,用C语
言实现十六进制编码PDU的过程.
关键词PDU模式,半8_bit表示法(mioctetreprentation),GSMT_bit缺省字母表(GSM7_bit
defaultalphabet)
病人图片
一
编发造型
,引言
短信息服务SMS已经在不少国家发展成为一种流行的通
信方式,可提供多种类型的服务.通常,对SMS的控制有三
嘱咐造句种实现途径:
①Block摸式;
②基于AT命令的Text模式;
③基于AT命令的PDU摸式.
第一种模式是早期为控制SMS而开发的协议,已经逐渐
不用了现在主要运用后两种模式来控制SMS.本文主要讨
论在Linux下用C语言来实现PDU模式的SMS发送.
二,PDU模式下SMS发送的原理
所谓PDU摸式就是将消息正文经过十六进制编码后进行
传送的一种手机短信的收发方式.基本的PDU命令是AT
CMGR.AT+CMGL和AT+CMGS
PDU模式发送SMS的命令格式为:
AT+CMGF:0
长春大学分数线
AT+CMGS=<length><CR><pdu><Ctfl/Z> 其中<pan>;包括SMSC(短信服务中心)地址信息与TPDU (传输协议数据单元)信息,这两部分信息均按照十六进制
进行编码;
<length>;是TPDU信息中8_bits字节的长度.
三,PDU模式下发送sMs的具体实现
1.主程序流程
2程序实现的技术关键
整个程序的实现重点就是对信息进行十六进制的编码
该编码过程可分为三个步骤来实现:
28毫腑辅羟境舀每替妒;:啦
(1)特地址信息按GSMRecommendationPha2的规定进
行转换协议中规定,SMSC地址值(SMSCAd&e~Value)及TPDU目标地址值(TP_DAV alue)以半8—bit表示法(Sell~#clet reprentation)表示,而在程序中输^的地址值是以字符串的形
式表示的,因此需要将输人的地址值转换成半8-bn的形式,
具体定义如下:
intSetPhoneNumber(byte十bytes,intbytesJen.char phonenum)
水样年华/by~s:保存转换后的字节而:bytesJen:待转换的字符串长
度.phonenum:待转换的字符串/
年度考核个人总结byte._o,b_hi;
intl:
forii=0:i<bytes_len:l++)
{
._o={phonenum++)一0./计算数字字符表示的
数字,字节的0~3位/
bhi=f}Phonenum==\0}70x0f{phonenum++)
一
0./}宝节的4~7位/
cbytes++)={b_hi<<4}l._0/}棒bJo及bh
组合成一字节
(2)将SMSC及TPDU信息转换成8上il字节流的形式
1)将以7_bit字节表示的信息转换成8_bit字节的形式TPDU中的用户信息是按照GSM7-bit缺省字母表(GSM
7上ildefaaltalphabet)编码的.实现时应采用文字数字表示法(Al#anumefiereprentation)将它封装成8上il字节数组的形式.具体实现如下:
#defineDEFAULTLPHASET—BITLEN7
制eliReBYTE_BITLEN8
实用第一一集,——
编
intGSM-Defau!LIphaSetEneode(bytebytes.sizetby[es IencharstrsizetstrJenj
{
/bytes:保存转换后白℃Bbit字节荒bytesJenbytes串中剩亲空间白勺长度,str:7bit编码的字符串.sttJer,:字符串的长襄/ intbytes]ndex:0./字节数组当前的位置/
JntbJtsjndex:O:/{当前处理的8bit宇节中已处理过的bl1
的最高位置/
lf{strJen}DEFAULTLPHASET-BITLEN>bytes/en BYTEBITLEN}
return
bytes:0
whlIe{errI=\0
ietbbits]ndex;
/当前的7bit字符中已处理过bn的最高位置/
byteb
b=[byte1str;
b_bitsjndex=0
/棒一个7_bit字符保存于8__bit字节数组由
whi~e{bbitsj~ex<DEFAULTLPHASET_吕~TLEN)
{
intleftbits;/当前的8_bit字节中还未处理过自勺blt煎数{/
ln!bJeftbits;/当前的7bit字符中还未处理过的bit位数.
intcopy-bits;/}将要处理的blt位数长/
/8J)it字节中来处理的位数/
leftbits=BYTEBITLEN——bitsjndex;
/7bit字符中未处理的位数/
DIeftbits=DEFAULT-ALPHASET_BGLEN—b_bitsjndex;
/精要处理的位数/
cop!,_bits=Min{bJeft-bits.1eftbitsJ
SetBits(bytes+bytes_inde~bitsindex.b.bbitsjnaex.
copybits】:
十Ibytes4-bytesjndex}I=I(b)>b_bitsindex)&(IOx01<< copybits)一1)】<<bits_index
bitsjndex+:copybits;
b_bits]ndex+:copy_bits;
fbitsindex>=B'tq'El__BITLEN
bytesI++bytes_index】=0
bitsJndex=0.
str++
}
returnfbytesjndex),
f
小朋友讲故事
2)组合离散信息
经过前面的处理以后.所有的信息均转化成8bit字节的
形式,现需要将这些离散的8.bit字节信息组合为一个字节流,即将单字节或多字节加入到字节流具体实现如下: tpdubyte将荤字节加人到字节流中.
ettpdubyte{byte…ssizetslen.bytetI
{
/s字节流:slen:字节丽中的剩糸空间:t:待托A的字节/ 【sten(sizeof{byte)I
{
returnf0)
}
}s=t
(e}十+
(elen)一一,
return【1),
函数tpdubytes将多字节加入到字节流中.
,nttpdubytes{bytessizetsJenbytetsizettJen)
{
/s:字节流,slen:字节滴中的剖余空间.tlen:特加,^,的字节串:den:待加,的字节串长度/'
lfIslen<genl
{
return{0l:
}
一年级数学思维训练题100道merncpyce.t,tlen).
(e)+=tien.
{elen)一=tien:
returnf1)
l