如使用联通卡不能发短信发短信前面需要加什么符号

5421人阅读
LINUX(3)
用两条AT指令发中文短信
设置为PDU模式AT+CMGF=0或1回车 //设置短信编码方式& 0为PDU模式 1为TEXT模式 TEXT模式只支持字母或数字,要发中文短信,只能用PDU模式 C表达如下:"AT+CMGF=0/r/n"
发送短信"AT+CMGS="
pdu的编码格式08 //短消息中心长度 91 //短消息中心有国家编码 没有为8168 31 08 02 00 05 f0 //短消息中心31 //需要状态报告//不需为1100 //永远为00 //分割符0D //目标号码的长度14位91 //有国家编码//没有为8168 31 36 32 64 49 F0 //目标号码 +000 //TP-PID.协议标识,一般为00 是普通 GSM& 类型,点到点方式 08 //是否免提//是为18A7 //有效期标志04 //正文4字节4F 60 59 7D //你好 短消息内容
若没有短消息中心,编码为:00 //表示默认短消息中心31 //需要状态报告//不需为1100 //永远为00 //分割符0D //目标号码的长度14位91 //有国家编码//没有为8168 31 36 32 64 49 F0 //目标号码 +000& //TP-PID.协议标识, 是普通 GSM& 类型,点到点方式 08 //是否免提//是为18A7 //有效期标志04 //正文4字节4F 60 59 7D //你好 短消息内容
以上是有位兄台博客上写的,简单说,短信的PDU编码包格式如下短信中心号码 机器配置标志 目标电话号码 机器配置标志 短信内容
短信中心号码:&&&&& 短信中心号码长度:(连后面的91有没发送国家编码标示符一起算 字符总数除以2 的十六进制数的 ASCII码值) &&&&& 是否发送国家编码标示符(91为有发送 则电话号码前加86,81没有发送)&&&&& 短信中心号码:福州联通的为(各个地区不一样)如果前面的是否发送国家编码 标志 &&&&&&&&&& 为91则 号码前应加86(中国的国际编码) 即0& 如果号码的字符个数为奇数则号码最后要补个 F 来凑成偶数 即0F 最后把字符奇偶位对调 短信中心号码就变成这样 F0 && 是不是快晕了??幸运的是一般来说SIM卡出厂时会预先存好短信中心号码 用指令 AT+CSCA?回车 来获取短信中心号码看看就 知道了 如果看到返回如下 +CSCA: "+0",145 则已经存在& 如果没有,也可以用指令 AT+CSCA="+0"回车 来设置短信中心号码& 现在就可以用 00 代替上面那么麻烦的一串。机器配置标志:3100 或 1100目标电话号码:&&&& 目标电话号码长度:目标电话号码(不包含 91哦!)的字符数 的十六进制数的ASCII码值&&&& 是否发送国家编码标示符:91&&&& 目标电话号码:打包方式和上面短信中心一样&& 比如我我的电话 打包好就成了 0D63F4& 目标电话号码是不能省的,当然如果你要发给自己的话,也可以用 00 代替上面这么麻烦的一串,呵呵。机器配置标示:000800短信内容:&&&& 短信长度:短信内容的UNICODE编码(Big-Endian的哦)十六进制数 的ASCII字符长度 除以2(即短信字数乘于2 也就是短信占用的字节数 UNICODE编码一个字符占两个字节) 的十六进制数 的ASCII码值&&&& 短信内容:你要说的话的UNICODE编码十六进制数 的ASCII字符& 比如 我想你 F60
发送一条短信的过程大致如下:AT指令& 短信字节数&& 换行符 /r&& 短信的PDU编码包&& 十六进制数0x1A(就是Ctrl+Z的码值)具体说 发送过程是这样的:1.发AT指令 AT+CMGS= 的字符串(即ASCII码值)2.发短信PDU编码包的长度(PDU编码包 除短信中心外 的字符个数除以2) 的BCD码 的ASCII码值 3.发'/r'4.发上面打包好的短信PDU编码包5.发0x1A现在你可以试试了,接好手机打开串口调试助手选好串口 然后发送下面的AT+CMGF=0AT+CMGS=21F160F34F60发给我,内容 我想你啊!我会那么的受宠若惊。。。
下面是短信发送的C程序//打包目标电话号码void GSM_PackPhone(uchar *str){&uchar count=0,i=0,j=0,
&strcpy_f(gsm.set,Gsm_Phpre);&if(*str=='1')//手机号码前加&86&&&{&&&gsm.phone[0]='8';&&&gsm.phone[1]='6';&&&count=2;&&}&while(*str)&{&&gsm.phone[count]=*str++;&&count++;&}
&gsm.phonelen[0]=pgm_read_byte(ASC_NUM+(count&&4));//电话号码长度的ASC码值&gsm.phonelen[1]=pgm_read_byte(ASC_NUM+(count&0x0F));
&if(count%2)//个数为奇 补一个'F'&&gsm.phone[count]='F';&for(i=0;i&i+=2)//奇偶位对调&{&&tmp=gsm.phone[i];&&gsm.phone[i]=gsm.phone[i+1];&&gsm.phone[i+1]=&}&gsm.phone[count+1]=0;}void GSM_PackMess(uchar *mess){
//因为项目是做短信报警,内容相对固定,所以短信内容已经转换打包好做为常数变量
}//设置为PDU模式void GSM_SetPDUmode(void){&uchar atcmd[]={"AT+CMGF=0/r/n"};&U1_TxOpen(0);&U1_SendStr(atcmd);}//判断是否返回OKuchar GSM_IsOK(void){&uchar i=0;&while(U1_Buf[i])&{&&if(U1_Buf[i]=='O'&&U1_Buf[i+1]=='K')&&{&&&cldata(U1_Buf,sizeof(U1_Buf));&&&return OK;&&}&&i++;&&if(i&sizeof(U1_Buf))&&&&}&return ERROR;}
//发信息void GSM_SendMess(uchar *phone,uchar *mess){&&uchar atcmd[]={"AT+CMGS="};&uchar mspre[]={"000800"};&uchar *str="AT+CMGS=15";&GSM_PackPhone(phone);&strl=(strlen(gsm.set)+strlen_f(Gsm_Mspre)+strlen(mess)-2);//&strl=(strlen(gsm.set)+strlen_f(Gsm_Mspre)+strlen_f(mess)-2);//除短信中心外的短信长度 16进制数 &strl /=2;&strl=tobcd(strl);//转换为bcd码10进制数&gsm.messlen[0]=pgm_read_byte(ASC_NUM+(strl&&4));&gsm.messlen[1]=pgm_read_byte(ASC_NUM+(strl&0x0F));&U1_TxOpen(0);&U1_SendStr(atcmd);//发CMGS 指令&U1_SendData_C(gsm.messlen,sizeof(gsm.messlen));//发 短信总长度&U1_SendByte('/r');//发0x0D&U1_SendStr(gsm.set);//发短信中心及目标电话号码&U1_SendStr(mspre);//发信息前缀&U1_SendStr(mess);//发短信内容&U1_SendByte(0x1A);//发Ctrl+Z
&GsmState.GSM_SED=1;//短信已经发送}
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:207248次
积分:2570
积分:2570
排名:第13038名
原创:28篇
转载:97篇
评论:25条
(1)(1)(2)(4)(1)(2)(2)(4)(1)(4)(11)(14)(9)(7)(7)(2)(13)(23)(17)

我要回帖

更多关于 联通网上发短信 的文章

 

随机推荐