当前位置:首页 > 代码 > 正文

pdu格式c代码(pdu报文格式)

admin 发布:2022-12-19 19:09 144


今天给各位分享pdu格式c代码的知识,其中也会对pdu报文格式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

android直接发送pdu编码后的短信

实现过程:

1初始化:ATZ\r

2设置文本模式:AT+CMGF=0\r(0:pdu模式,1:text模式)

3设置PDU头:

typedef struct {

char SCA[16]; // 短消息服务中心号码(SMSC地址)

char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)

char TP_PID; // 用户信息协议标识(TP-PID)

char TP_DCS; // 用户信息编码方式(TP-DCS)

char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到

char TP_UD[16]; // 原始用户信息

char index; //短消息序号,在读取时用到

}SM_PARAM;

// SMSC地址信息段

memset(buf, 0, sizeof(buf));

nLength = strlen(pSrc-SCA); // SMSC地址字符串的长度

buf[0] = (char)((nLength 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度

buf[1] = 0x91; // 固定: 用国际格式号码

nDstLength = gsmBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串

nDstLength += gsmInvertNumbers(pSrc-SCA, pDst[nDstLength], nLength); // 转换SMSC到目标PDU串

// TPDU段基本参数、目标地址等

memset(buf, 0, sizeof(buf));

nLength = strlen(pSrc-TPA); // TP-DA地址字符串的长度

buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)

buf[1] = 0; // TP-MR=0

buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)

buf[3] = 0x91; // 固定: 用国际格式号码

nDstLength += gsmBytes2String(buf, pDst[nDstLength], 4); // 转换4个字节到目标PDU串

nDstLength += gsmInvertNumbers(pSrc-TPA, pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串

// TPDU段协议标识、编码方式、用户信息等

//nLength = strlen(pSrc-TP_UD); // 用户信息字符串的长度

memset(buf, 0, sizeof(buf));

buf[0] = pSrc-TP_PID; // 协议标识(TP-PID)

buf[1] = pSrc-TP_DCS; // 用户信息编码方式(TP-DCS)

buf[2] = 1; // 有效期(TP-VP)为5分钟

buf[3] = str2hex(user_pdu, pSrc-TP_UD); //用户信息的长度

nDstLength += gsmBytes2String(buf, pDst[nDstLength], 4); // 转换该段数据到目标PDU串

strcat(pdu, "\x01a"); //以CTRL-A结束

gsmString2Bytes(pdu, nSmscLength, 2); // 取PDU串中的SMSC信息长度

4发送信息长度:AT+CMGS=长度,这步重要长度不对是发不出去的。

5发送用户信息

1、目前,发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。

1使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;

2使用PDU模式不仅支持中文短信,也能发送英文短信。

2、PDU模式收发短信可以使用3种编码:

17-bit(用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可 “压缩”成7个)

28-bit(通常用于发送数据消息,如:图片了,铃声等等)

3UCS2编码(用于发送Unicode字符)

英博尔can通讯的表现形式

英博尔(控制器-仪表)CAN通讯协议的表现形式,协议规定汽车CAN网络中电机控制器向仪表发送的信息。

英博尔CAN引用标准:SAE J1939-21。

物理接口:采用CAN2.0B标准,通讯波特率为250kbps,数据中未使用或者保留的字节约定为0x00。

协议数据单元协议数据单元((PDU)格式:

SAE J1939-21规范规定两种PDU格式:PDU1格式(PS为目标地址)和PDU2格式(PS为组扩展),PDU2为不指定特定目标地址的传输,本标准选用PDU2格式。

长短信 PDU编码

PDU编码有Unicode编码和7bit与8bit编码,具体根据得到数据的格式来解码,unicode编码稍微简单,7bit编码复杂些

VB发送短信使用PDU方式,高手进!

用VB6.0编写手机短信发送,因为手机短消息的发送是以PDU串的形式发送出去的,中文字符以Unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为Unicode码,下面的函数将实

因为手机短消息的发送是以PDU串的形式发送出去的,中文字符以Unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为Unicode码,下面的函数将实现这个功能。这个函数主要应用到VB自带的一个格式转换函数:ChrW()将中文转换为Unicode码。 

PublicFunctionchg(rmsgAsString)AsString

DimtepAsString

DimtempAsString

DimiAsInteger

DimbAsInteger

tep=rmsg

i=Len(tep)

b=i/4

Ifi=b*4Then

b=b-1

tep=Left(tep,b*4)

Else

tep=Left(tep,b*4)

EndIf

chg=""

Fori=1Tob

temp="H"Mid(tep,(i-1)*4 1,4)

chg=chgChrW(CInt(Val(temp)))

Nexti

EndFunction

同上,为了发送以PDU模式发送短消息,必须将手机号码和对方手机号码也转换为PDU格式,下面的函数就是为了实现这种转换: 

PublicFunctiontelc(numAsString)AsString

DimtlAsInteger

Dimltem,rtem,ttemAsString

DimtiAsInteger

ttem=""

tl=Len(num)

Iftl<>11Andtl<>13Then

MsgBox"wrongnumber."tl

ExitFunction

EndIf

Iftl=11Then

tl=tl 2

num="86"num

EndIf

Forti=1TotlStep2

ltem=Mid(num,ti,1)

rtem=Mid(num,ti 1,1)

Ifti=tlThenrtem="F"

ttem=ttemrtemltem

Nextti

telc=ttem

EndFunction

手机号码有两种表示方法:11位和13位(带国家码86),一般手机发送时都是以13位形式表示的,所以以上的函数还有一个功能是自动将11位格式手机号码转换为13位形式,然后再转换为PDU串。

手机短信的发送主要借助于VB的Mscomm控件实现,关于Mscomm控件,前面的技术介绍部分有详细介绍。短信的发送是由AT CMGS指令完成的,采用PDU模式发送,函数代码如下:

Constprex="0891"

Constmidx="11000D91"

Constsufx="000800"

PublicFunctionSendsms(cscaAsString,numAsString,msgAsString)As_Boolean

Dimpdu,psmsc,pnum,pmsgAsString

DimlengAsString

DimlengthAsInteger

length=Len(msg)

length=2*length

leng=Hex(length)

Iflength<16Thenleng="0"leng

psmsc=Trim(telc(csca))

pnum=Trim(telc(num))

pmsg=Trim(ascg(msg))

pdu=prexpsmscmidxpnumsufxlengpmsg

sleep(1)

mobcomm.Output="AT CMGF=0" vbCr

mobcomm.Output="AT CMGS="Str(15 length) vbCr

mobcomm.Output=pduChr$(26)

sleep(1)

Sendsms=True

EndFunction

因为手机同一时间只能处理一件事情,因此这个函数只负责发送短信,关于短信发送成功与否以及阅读短信的部分集中在一起处理。判断手机短信发送成功与否主要由AT CMGS命令执行以后的返回码来决定(可参见前文的AT指令介绍部分)。

为了防止手机因过于繁忙而出错,这里采取了一定的方法让手机有充分的时间处理发送和接收及删除等操作。Sleep()函数正是为此而设计的,在发送及删除操作后都会让程序暂停一秒,这样就不至于使得手机过于繁忙。

Unicode码解码函数

相比于手机短信的发送而言,手机短信的接收主要的工作正好与之相反。手机短信的发送需要将待发送的短信内容转换为Unicode码,而短信的接收则需要将接收到的Unicode码转换成中文字符。下面的函数将实现解码功能。同手机短信发送的编码函数一样,这里也应用了一个VB内置的函数AscW()函数来将Unicode码转换为中文:

PublicFunctionascg(smsgAsString)AsString

Dimsi,sbAsInteger

DimstmpAsInteger

DimstempAsString

sb=Len(smsg)

ascg=""

Forsi=1Tosb

stmp=AscW(Mid(smsg,si,1))

IfAbs(stmp)<127Then

stemp="00"Hex(stmp)

Else

stemp=Hex(stmp)

EndIf

ascg=ascgstemp

Nextsi

ascg=Trim(ascg)

EndFunction 

2手机短信接收函数 

相对于短信的发送函数而言,短信的接收相当简单,只需要以下的三行代码就完成了。但是它使用的技术却决不比短信的发送少,这里主要用到了Mscomm控件的Output属性和AT CMGR指令。 

PublicSubreadsms(rnumAsString)

mobcomm.Output="AT CMGF=1" vbCr

mobcomm.Output="AT CMGR="rnum vbCr

EndSub

如何把短信中心号码转成PDU格式呢?

进入这个网站:,在页面下面找到界面:

在SMSC框中输入你的短信中心号码,然后点下面的Convert,则PDU格式会在右边框中生成,然后取前18位,如我的短信中心号码的PDU格式为:0891683108501505F0,再把这18位字符输入到 手机 中的SMSC框中,点后面的“更新”即可。

text模式和pdu模式的区别

发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。

1.Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区。

2.PDU Mode被所有手机支持,可以使用任何字符集,这也是手机默认的编码方式。Text Mode比较简单,而且不适合做自定义数据传输,

关于pdu格式c代码和pdu报文格式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/19547.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载