没有合适的资源?快使用搜索试试~ 我知道了~
短信格式的编码主要是有两种一个是 text 格式的,明文不用解码一看就懂, 一个是 PDU 格式的, 国内的都是的 PDU 格式的。 以下分析的都是 PDU 格式数据包。 2.PDU 格式的数据包,发送的数据包和接收的数据包数据段是不一样的。相同是 一,他们都是把数据变成字符 0123456789ABCDEF 。二,都是 2 个字符算一个数, 除了电码号码其的数都是 16 进制的。
资源推荐
资源详情
资源评论
AT
AT
AT
AT 指令发送 PDU
PDU
PDU
PDU 短信详解
AT 指令发送 PDU 短信详解(支持发送到小灵通)
本文以一个实例来解说 AT 指令发送 PDU 短信的全过程,假如我要发送下面的短信:
接收号码:+ 8613602433649
短信内容:工作愉快!
短信中心号码:+ 8613800200500
一、短信中心号码处理:用字符串 addr 表示
1 、将短信息中心号码去掉 + 号,看看长度是否为偶数,如果不是,最后添加 F
即 addr = "+8613800200500"
=> addr = "8613800200500F"
2 、将奇数位和偶数位交换。
=> addr = "683108200005F0"
3 、将短信息中心号码前面加上字符 91 , 91 是国际化的意思
=> addr = "91683108200005F0"
4 、算出 addr 长度,结果除 2 ,格式化成 2 位的 16 进制字符串, 16 / 2 = 8 => "08"
=> addr = "0891683108200005F0"
二、手机号码处理:用字符串 phone
1 、将手机号码去掉 + 号,看看长度是否为偶数,如果不是,最后添加 F
即 ph
=> ph
2 、将手机号码奇数位和偶数位交换。
=> phone = "683106423346F9"
三、短信息部分处理:用字符串 msg 表示
1 、 转字符串转换为 Unicode
代码, 例如
“
工作愉快!
” 的 unicode 代码为 5DE54F5C61095FEBFF0 1
,
( 转换函数见最后附录 )
2 、将 msg 长度除 2 ,保留两位 16 进制数,即 5DE54F5C61095FEBFF01 = 20 / 2 => "0A" ,再 加
上 msg
=> msg = "0A5DE54F5C61095FEBFF01"
四、组合
1 、手机号码前加上字符串 11000D91 ( 1100 :固定, 0D :手机号码的长度,不算+号,十六进制
表示, 91 :发送到手机为 91 ,发送到小灵通为 81 ),
即 phone = "11000D91" + phone
=> 11000D91683106423346F9
2 、手机号码后加上 000800 和刚才的短信息内容, 000800 也写死就可以了
即 phone = phone + "000800" + msg
即 11000D91683106423346F9 + 000800 + 0A5DE54F5C61095FEBFF01
=> phone = 11000D91683106423346F90008000A5DE54F5C61095FEBFF01
3 、 phone 长度除以 2 ,格式化成 2 位的十进制数
即 11000D91683106423346F90008000A5DE54F5C61095FEBFF01 => 50 位 / 2 => 25
五、所以要发送的内容为
AT+CMGF=0 < 回车 >
OK
AT+CMGS=25< 回车 >
> addr+phone <Ctrl+Z 发送 >
六、如果返回不是 ERROR ,恭喜你,发送成功了 ^_^ //-----------------------------------------------------
// 7bit 编码
// 输入 : pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出 : pDst - 目标编码串指针
// 返回 : 目标编码串长度
int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nSrc; // 源字符串的计数值
int nDst; // 目标编码串的计数值
int nChar; // 当前正在处理的组内字符字节的序号,范围是 0-7
unsigned char nLeft; // 上一字节残余的数据 // 计数值初始化
nSrc = 0;
nDst = 0; // 将源串每 8 个字节分为一组,压缩成 7 个字节
// 循环该处理过程,直至源串被处理完
// 如果分组不到 8 字节,也能正确处理
while (nSrc < nSrcLength)
{
// 取源字符串的计数值的最低 3 位
nChar = nSrc & 7; // 处理源串的每个字节
if(nChar == 0)
{
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
nLeft = *pSrc;
}
else
{
剩余14页未读,继续阅读
资源评论
zmjyydk
- 粉丝: 5
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功