- Thank you received: 0
keywords: ip pbx voip gateway gsm gateway
# -*- coding: utf-8 -*-
#author's e-mail: [email protected]
import os
import codecs
import sys
def expand_to_16(ucode): #将ascii字符扩展到16-bit编码
for i in range(len(ucode)):
#print len(ucode[i])
if (len(ucode[i])==4):
ucode[i]= ucode[i][0:2]+"00"+ ucode[i][2:]
return ucode
def ucs2_encode(src): #将字符串转换为ucs2编码,其实就是unicod编码
decoder=codecs.getdecoder("utf-8")
ucs2=decoder(src)
#print ucs2
src_len=len(ucs2[0]) #原始字符串的长度,是字符数,而不是字节数
ucode=[]
result=""
for i in range(src_len):
ucode.append(hex(ord(ucs2[0][i])))
#print ucode
ucode=expand_to_16(ucode)
#print ucode
for item in ucode:
result=result+item[2:]
return result
def convertNumber(number): #将手机号码转换,如将8613800270500转为683108200705f0
number=number[1:] #去掉前面的“+”
length=len(number)
number2=""
for i in range(length):
if(i%2):
continue
else:
if(i+1>=length):
number2+="f" #不足偶数位的补F
else:
number2+=number[i+1]
number2+=number[i]
return number2
def PDUformat(des,smsc,content): #生成PDU format的短信
type_of_address="91" #SMSC和目标地址都默认用国际类型的地址,前面有“+”,中国的是“+86”
smsc_len="08" #SMSC地址信息的长度 共八字节,包括91
tp_mti="11" #这个参数我也不懂
tp_mr="00" #这个参数我也不懂
tp_pid="00" #默认为普通GSM类型,即点到点方式
des_len="0d" #目标地址数字个数 共13个十进制数(不包括91和‘F’)
alphabet_size="08" #默认用16-bit编码
validity="ff" #默认有效期为最长
result=""
result+=smsc_len
result+=type_of_address
smsc=convertNumber(smsc)
#print smsc
result+=smsc
result+=tp_mti
result+=tp_mr
result+=des_len
result+=type_of_address
des=convertNumber(des)
#print des
result+=des
result+=tp_pid
result+=alphabet_size
result+=validity
content_len=len(content)/2 #这里传进来的content是字符串,len(content)的话结果就是实际字符长度的2倍了
#比如4f在len(content)算长度2,但是在PDU编码里它是一个字节
result+=hex(content_len)[2:]
result+=content
return result
if __name__=="__main__":
des="+8615926226759"
smsc="+8613800270500"
content="你好啊openvox"
ucs2_content=ucs2_encode(content)
#print ucs2_content
print PDUformat(des,smsc,ucs2_content)