急求通过pc的com口连接手机收发中英文短信源码,那位高手手上有源码的给小弟发一份,100分相送,不够的可以再加~
可以发到
可以发到
解决方案 »
- delphi 判断数据库主键是否重复。id.text,user.text中文提示不能为空
- 请问在OnMouseMove事件响应中,如何判断鼠标的左键是否按下?
- 请教一个小问题
- 用IP代理服务器,可以瞒过服务器启动多个副本嘛?(比如棋牌游戏)
- 请问各位大虾:哪种控件可以做出金山毒霸的那种主菜单呢?实在是急啊!
- 关于在DBGrid中锁定光标在当前记录上,
- speedbutton按钮,怎样让文字显示在图标的下面呀?
- 如何让程序运行后自己放到系统托盘里?
- 请一个问题:我在菜单中有一个功能是:edit,我以给它添加了代码,事件是editclick,就可对窗体中内容可编辑了,可我的工具栏也有一个edit,我想
- 请问,考高级程序员要几分才能过啊?我想去考
- 一个表中有40多个字段,用fastreport怎么打印
- 如何dephi在界面下做sqlsever数据库备份
SendSMS (新浪短信网关发送短信)
http://www.delphibox.com/article.asp?articleid=228
华为cmpp协议短信网关Delphi源码
http://www.delphibox.com/article.asp?articleid=561
unit SMSUnit;interfaceuses
SysUtils;type
TSMS = class
private
function str_Gb2UniCode(text: string): string;
function ConvertL2R(sMsg: string): string;
function ConvertR2L(sMsg: string): string;
function Decode(s:string): string;
public
function TextToPdu(sCenter, sPhone, sMsg: string; var a: string; var b: string): boolean;
Function DecodeRecSMS(SMSInfo:String;var SMSTime:string;Var SMSNumber:String;Var SMSMsg:String):boolean;
end;
var
USMS: TSMS;
implementation//编码PDU{-----------------------------------------------------------
GB 代码转 UniCode
-----------------------------------------------------------
//功能:中文字符串变化到Unicode字符串
//输入: txt-中文字符串
//输出: 转化成Unicode的字符串}function TSMS.str_Gb2UniCode(text: string): string;
var
i, j, len: Integer;
cur: Integer;
t: string;
ws: WideString;
begin
Result := '';
ws := text;
len := Length(ws);
i := 1;
j := 0;
while i <= len do
begin
cur := ord(ws[i]);
FmtStr(t, '%4.4X', [cur]); //BCD转换
Result := Result + t;
inc(i);
//移位计数达到7位的特别处理
j := (j + 1) mod 7;
end;
end;//将一个字符串在位置上进行奇数位与偶数位的交换,字符串长度为奇数位时自动补F
//如果12345转换后为 2143F5function TSMS.ConvertL2R(sMsg: string): string;
var i: Integer;
cTmp: Char;
sRe: string;
begin
sRe := Trim(sMsg);
i := Length(sRe);
if i = 0 then
begin
Result := '';
Exit;
end; if i mod 2 = 1 then
sRe := sRe + 'F'; i := 1;
while i < Length(sRe) do
begin
cTmp := sRe[i];
sRe[i] := sRe[i + 1];
sRe[i + 1] := cTmp;
i := i + 2;
end; Result := sRe;
end;//txt转换为pdu格式
//不带加号短信息中心号码、手机号码、短信内容
//如 sms := TextToPdu( '8613800755500', '13682570067', '你好',a,b );
//返回可直接发送的字符串代码function TSMS.TextToPdu(sCenter, sPhone, sMsg: string; var a: string; var b: string): boolean;
var sAddr, sBody: string;
LCenter, LMsg, LBody: string;
begin
sCenter := '91' + ConvertL2R(sCenter);
FmtStr(LCenter, '%2.2X', [Length(sCenter) div 2]);
sAddr := LCenter + sCenter; sPhone := ConvertL2R(sPhone);
sMsg := str_Gb2UniCode(sMsg);
FmtStr(LMsg, '%2.2X', [Length(sMsg) div 2]); sBody := '11000D9168' + sPhone + '000800' + LMsg + sMsg;
FmtStr(LBody, '%2.2D', [Length(sBody) div 2]);
a := 'AT+CMGS=' + LBody + #13; //要发送的长度
b := sAddr + sBody + #26 + #13; //要发送的pdu代码
Result := true;
end;//解码PDU
function TSMS.ConvertR2L(sMsg: string): string;
var i: Integer;
cTmp: Char;
sRe: string;
begin
sRe := Trim(sMsg);
i := Length(sRe);
if i = 0 then
begin
Result := '';
Exit;
end;
// 肯定是偶数个
// if i mod 2 = 1 then
// sRe := sRe + 'F'; i := 1;
while i < Length(sRe) do
begin
cTmp := sRe[i];
sRe[i] := sRe[i + 1];
sRe[i + 1] := cTmp;
i := i + 2;
end;
if sRe[Length(sRe)] = 'F' then
sRe := Copy(sRe,1,Length(sRe)-1);
Result := sRe;
end;
function TSMS.Decode(s:string): string; //解码PDU
var
i, len: Integer;
begin
Result := '';
len := Length(s);
i := 0;
while i < round(len/4) do
begin
Result := Result + WideChar(Strtoint('0x'+s[i*4+1]+s[i*4+2]+s[i*4+3]+s[i*4+4]));
inc(i);
end;
end;
Function TSMS.DecodeRecSMS(SMSInfo:String;var SMSTime:string;Var SMSNumber:String;Var SMSMsg:String):boolean;
var
SMSStr:string;
tmpstr,timestr:string;
Pos ,NumberLen: integer;
begin
SMSStr := SMSInfo;
//Pos := 5; //开始SMSC号码
//tmpStr := copy(SMSstr,Pos,14);
//RecSMS.SMSC := '+' + ConvertR2L(tmpstr);
Try
Pos := 21; //开始发送方号码长度
tmpstr:= copy(SMSstr,Pos,2);
if Tmpstr = '0A' then NumberLen := 10
else if Tmpstr = '0B' then NumberLen := 11
else if Tmpstr = '0C' then NumberLen := 12
else if Tmpstr = '0D' then NumberLen := 13
else if Tmpstr = '0E' then NumberLen := 14
else if Tmpstr = '0F' then NumberLen := 15
else
NumberLen := StrToInt(tmpstr);
if NumberLen mod 2 = 1 then
NumberLen := NumberLen +1;
Pos := 25;
tmpstr:= copy(SMSstr,Pos,NumberLen);
SMSNumber := ConvertR2L(tmpstr);
Pos := 29 + NumberLen ;
tmpstr:= ConvertR2L(copy(SMSstr,Pos,12));
timestr := copy(tmpStr,1,2) + '年'
+ copy(tmpStr,3,2) + '月'
+ copy(tmpStr,5,2) + '日 '
+ copy(tmpStr,7,2) + '时'
+ copy(tmpStr,9,2) + '分'
+ copy(tmpStr,11,2) + '秒';
SMSTime := timestr;
Pos := 45 + NumberLen;
tmpstr:= copy(SMSstr,Pos,Length(SMSstr)-Pos + 1);
SMSMsg := Decode(tmpstr);
Result := True;
Except
Result := False;
end;
end;end.
//发送时调用:
USMS.TextToPdu('8613800592500',Copy(Number,0,11),Msg,StrLength,StrMsg); try
if Strtoint(Copy(StrLength,9,Length(StrLength)- 9)) > 150 then
begin
//UWait(1000);
Result := 3; //信息太长
Exit;
end;
Except
end;
//写入COM口
Comm.WriteCommData(Pchar(StrLength),Length(StrLength));
Uwait(500);
Comm.WriteCommData(Pchar(StrMsg),Length(StrMsg));