www.alientek.com
ALIENTEK STM32 开发板
AN1414
AN1414 ATK-SIM900(A) GSM/GPRS 模块彩信使用说明
本文档分为如下几部分:
1, 适用范围
2, 彩信收发的使用说明
1、适用范围
本文详细介绍了如何通过 AT 命令来使用 SIM900A 的彩信收发功能,由于 ATK-SIM900A 的固
件版本不同,可能导致部分模块并不支持彩信收发。因此,在使用此功能之前,请先确定
ATK-SIM900A 的固件版本,查询以及升级固件的详细步骤请参考文档《ATK-SIM900(A)模块升级
说明_AN1413.pdf》,只有在版本号是:1137B01SIM900A64_ST_ENHANCE,或更高版本时才
能完成以下功能。(特别注意:本文档的 彩信收发教程不仅适用于 ATK-SIM900A 模块,同
样也适用于 ATK-SIM900 模块,指令和操作步骤完全兼容,这里仅以 ATK-SIM900A 为例讲解。)
2、彩信收发的使用说明
2.1 硬件连接
在使用 ATK-SIM900A 模块的彩信发送和接收功能之前,请先准备好必要的硬件设备,并且
按照如下操作做好准备:
1, 使用一个外部直流电源给 ATK-SIM900A 模块供电(推荐我们的 12V 1A 电源)。
2, 使用一根 USB 转 RS232 串口线连接 ATK-SIM900A 模块与电脑(推荐我们的 USB 转串
口线)。
3, 请按照文档《ATK-SIM900A 模块升级说明_AN1413》的内容查询并升级 ATK-SIM900A 的
固件版本(若已经升级固件,此步骤可以忽略)。
4, 给 ATK-SIM900A 模块上电(按 K1,蓝色电源指示灯亮)。
5, ATK-SIM900A 模块开机(长按 PWR_KEY 键开机,红色 NET_STA 指示灯闪烁)。
6, 准备一部能够正常使用的移动手机设备(已开通 GPRS 业务、彩信业务)。
要完成本文档例程的所有功能测试,请大家务必准备好以上硬件,否则彩信的发送和接收
功能可能无法实现。
2.2 发送/接收彩信的指令讲解
本节,我们将介绍如何使用 ATK-SIM900A 模块进行发送和接收彩信,接下来需要用到的指
令有:AT+CMMSINIT/AT+CMMSCURL/AT+CMMSCID/AT+CMMSPROTO/AT+CMMSSENDCFG/ AT+
SAPBR/AT+CMMSEDIT/AT+CMMSDOWN/AT+CMMSRECP/AT+CMMSSEND/AT+CMMSRECV/AT+CMMS
READ/ AT+CMGD/ AT+CMMSTERM 等 14 条 AT 指令,下面我们分别介绍这些指令。
AT+CMMSINIT,用于初始化彩信功能,如返回 OK,则初始化成功,否则请关机重启后再
设置。
AT+CMMSCURL,用于配置彩信中心地址,格式为:AT+CMMSCURL=, 若 SIM
卡是移动运营商,则发送:AT+CMMSCURL="mmsc.monternet.com"配置;若 SIM 卡是联通运
www.openedv.com 开源电子网 2014-09-13
www.alientek.com
ALIENTEK STM32 开发板
AN1414
营商,则发送 AT+CMMSCURL="mmsc.myuni.com.cn" 配置。返回 OK 即成功。
AT+CMMSCID,用于承载上下文 ID,通过发送 AT+CMMSCID=1,返回 OK 则使能成功。
AT+CMMSPROTO,用于配置彩信 IP 地址和端口号,格式为:AT+CMMSPROTO=,<端口号>,由于移动和联通的彩信 IP 地址都是"10.0.0.172",且端口也都相同是 80,因此,
可以发送:AT+CMMSPROTO="10.0.0.172",80,配置地址和代理服务器端口。返回 OK 则配置
成功。
AT+CMMSSENDCFG , 用 于 设 置 彩 信 功 能 的 参 数 , 格 式 为 : AT+CMMSSENDCFG =
[valid],[pri],[sendrep],[readrep],[visible],[class] 。 在 这 里 我 们 都 取 默 认 值 即 可 , 发 送 指 令 :
AT+CMMSSENDCFG=6,3,0,0,2,4 即可设定完所有的基本参数。返回 OK 则设置成功。
AT+SAPBR,用于 IP 应用设置,格式为:AT+SAPBR=,[,],[],
其中 cmd_type 表示 0 关闭、1 打开、2 请求、3 设置和 4 获取承载的参数;cid 是承载文件标
示,固定为 1;ConT 和 ConV 是承载参数。该指令用来激活承载,整个激活过程需要发送 4
次该指令,带不同参数实现,如下:
AT+SAPBR=3,1,"Contype","GPRS" //激活承载
AT+SAPBR=3,1,"APN","CMWAP"
AT+SAPBR=1,1
AT+SAPBR=2,1
以上四条指令,对移动联通的 GSM 卡都适用。
AT+CMMSEDIT,用于开启或者禁止编辑,当发送 AT+CMMSEDIT=1,则开启编辑模式;
当发送 AT+CMMSEDIT=0,则禁止编辑模式,同时可以清空 Buff。
AT+CMMSDOWN,用于上传文件到缓存,标准格式为:AT+CMMSDOWN=<"type">,,
www.alientek.com
ALIENTEK STM32 开发板
AN1414
那么,我们直接读取第二个文件就可以了。
AT+CMMSREAD,用于读取彩信的文件信息,格式为:AT+CMMSREAD=,num 指
的是指令 AT+CMMSRECP 返回的信息中需要读取的文件编号,例如上一条指令返回的信息中
image0.jpg 文件在第二个位置,若想读取该图片文件,则 num 值取 2 即可,若想读取 smil.xml,
则 num 值应该取 1。
+CMTI: "SM",N,"MMS PUSH",这是一条彩信提示的返回命令,其中参数 N 代表这是接收
到的第 N 条彩信。然后通过上述指令 AT+CMMSRECV=N,即可获得该彩信的具体信息。
AT+CMGD,用于删除彩信信息,由于 SIM 标准格式最多只能存储 10 个文件,为了便于存
储和读取,应该及时的删除读取过了的彩信,格式为:AT+CMGD=,表示删除第 num 条
彩信。返回 OK 则删除成功。
AT+CMMSTERM,用于退出彩信模式,返回 OK 则退出成功,否则可能之前就已经退出了。
注意:对于 ATK-SIM900A 模块,发送完成之后可以接收,接收完成之后也可以发送。但
是在发送之前需要配置 AT+CMMSEDIT=1,允许编辑彩信内容;在接收读取内容之前需要配置
AT+CMMSEDIT=0,不允许编辑(该指令同时清空 buff)。同时也支持使用移动手机设备接收和
发送。只是手机自带了解码的步骤,接收彩信更加方便清晰。对于以上指令如有不理解的地方,
在操作过程中遇到一些 error 可以参考文档《SIM900_MMS_AT Command Manual_V1.00.pdf》,
文件路径:ATK-SIM900A 模块资料\4,SIM900A 模块资料。
2.3、基于 ATK-SIM900A 使用串口通信的实例验证
2.3.1 基本设置
首先打开串口助手 XCOM,文件路径在:ATK-SIM900A 模块资料\3,配套软件\串口调试助
手,设置好 COM 口(连接到 ATK-SIM900A 模块的 COM 端口,我电脑是 COM4),设置好波特
率 115200,勾选发送新行(必选!即 XCOM 自动添加回车换行功能),如下图 2.3.1.1 所示。然
后根据 2.2 节中的指令讲解,给 ATK-SIM900A 模块发送以下指令进行网络配置和参数设定,如
图 2.3.1.1 所示。
AT+CMMSINIT //初始化彩信
AT+CMMSCURL="mmsc.monternet.com"//配置中国移动手机彩信中心地址
AT+CMMSCID=1//设置承载上下文 ID
AT+CMMSPROTO="10.0.0.172",80 //配置网络 IP 和代理服务端口
AT+CMMSSENDCFG=6,3,0,0,2,4 //设置彩信参数
AT+SAPBR=3,1,"Contype","GPRS" //激活承载
AT+SAPBR=3,1,"APN","CMWAP"
AT+SAPBR=1,1
AT+SAPBR=2,1
www.openedv.com 开源电子网 2014-09-13
www.alientek.com
ALIENTEK STM32 开发板
AN1414
图 2.3.1.1 配置网络和参数
2.3.2 发送彩信
先按照 2.3.1 小节配置好之后,先发送:AT+CMMSEDIT=1,进入编辑模式。然后,按照
表 2.2.1 设置好指令 AT+CMMSDOWN 的参数值,确定需要发送的文件大小和类型,并发送该
指令,这里我们随以一张小的图片:keil.png 为例,该文件大小是 6186 字节,所以在 CMMSDOWN
指令参数设置的时候,第一个参数是“PIC”,即发送图片彩信,第二个参数是 6186,即我们
要发送的图片文件大小,第三个参数我们设置 40000 即可,如图 2.3.2.1 所示。
www.openedv.com 开源电子网 2014-09-13
www.alientek.com
ALIENTEK STM32 开发板
AN1414
图 2.3.2.1 彩信发送设置
上图中,在等待 SIM900A 返回 CONNECT 之后(图中①处),利用串口助手 XCOM 打开需要发送
的文件,按照如图 2.3.2.1 中所示的②-③-④步骤依次操作,打开、选择、发送文件。
接下来发送指令:AT+CMMSRECP="1343781****",这里的手机号码没有写全是为了避免
您把彩信发到我的手机上来了,设置完移动手机的手机号之后(或者可以再使用另外一个
ATK-SIM900A 模块作为接收端,但是需要事先按照 2.3.1 小节配置好网络和参数),再给发送指
令“AT+CMMSSEND”,根据发送文件大小及网络信号质量的好坏,发送时间会有所不同,请
耐心等待,直至返回 OK 即可。至此,我们才算成功完成了一条彩信的发送。1343781****的手
机上有彩信提醒,可以读取收到的彩信图片内容。
最后在发送端发送:
AT+CMMSEDIT=0
AT+SAPBR=0,1
//退出配置模式,
//退出承载
//退出彩信功能
AT+CMMSTERM
退出彩信功能,如图 2.3.2.2 所示:
www.openedv.com 开源电子网 2014-09-13
www.alientek.com
ALIENTEK STM32 开发板
AN1414
最后,在彩信发送部分,发出的指令如下:
图 2.3.2.2 目的号码设定以及退出模式
AT+CMMSEDIT=1
AT+CMMSDOWN="PIC",6168,40000 //例程是使用 png 格式图片,参数各人因情况而定
//允许编辑 MMS
AT+CMMSRECP="1343781****"
AT+CMMSSEND
退出彩信功能指令如下:
AT+CMMSEDIT=0
AT+SAPBR=0,1
AT+CMMSTERM
2.3.3 接收彩信
//设置目标手机号
//开始发送
//退出配置和编辑模式
//退出承载
//退出彩信功能
在接收端首先是按照 2.3.1 小节配置好网络和各个参数。然后使用移动手机(或者使用另一
个 ATK-SIM900A 模块作为发送端,按照 2.3.1 节和 2.3.2 节指令操作)发送一条格式为.png 的图
片彩信之后,接收端会有信息提示,提示收到第 N 条彩信,发送查询指令 AT+CMMSRECV=N 获
取彩信地址信息,再根据串口返回的信息,选择自己需要读取的第 N 条彩信的 M 个文件,使用
AT+CMMSREAD=M 命令来读取该文件内容即可。由于 MMS 标准版本最多可以接收 10 个文件,
为了方便存储和读取,应及时的使用指令 AT+CMGD=N 删除接收到的第 N 条彩信。实例操作如
图 2.3.3.1 所示:
www.openedv.com 开源电子网 2014-09-13
www.alientek.com
ALIENTEK STM32 开发板
AN1414
其中红色框框内,我们先发送了:AT+CMMSEDIT=0,退出编辑模式,然后模块在收到彩信
图 2.3.3.1 接收彩信信息
后,会提示:
+CMTI: "SM",2,"MMS PUSH"
表示收到了一条彩信。然后,发送指令:AT+CMMSRECV=2,获取 MMS 并查询其地址信
息,这里的参数 2 是根据彩信提示处的参数而定,千万不要照搬我的参数值,每个 SIM 卡所包
含的彩信数目不同,其值也就不相同。再根据这条指令返回值:
+CMMSRECV: "13437811134","2014-09-13,04:58:37","",6566
1,"smil.xml",10,251
2,"IMAGE_1410584439843.jpg",7,6186
可知,我们的图片以 jpg 文件形式接收的(注意,这里 SIM900A 显示的 jpg 格式不一定正
确,以返回的数据内容为准),前面的标号是 2,所以该文件存储在第 2 个位置,因此再使用
AT+CMMSREAD=2 来读取这个图片文件,读到如图 2.3.3.1 中蓝色框内的内容。
在 蓝 色 框 框 内 我 们 可 以 看 到 一 大 堆 的 乱 码 , 是 不 是 很 头 疼 ? 别 急 , 这 是 由 指 令
AT+CMMSREAD 读取的文件内容。但是由于没有选择 16 进制显示,所有的数据 0,都会丢失,
导致数据不完整。如果接收到的彩信是文本文件,我们读到的信息将是简短且清晰的文本内容,
文本彩信的发送和接收与图片彩信的发送接收步骤完全一样,只需要注意指令 AT+CMMSDOWN
的参数有所不同而已, 这里不再演示。
对于 2.3.3.1 最后得到的图片信息,需要使用 WinHex 软件(路径:SIM900A 模块资料\3,
配套软件\winhex\WinHex.exe)将其转换成 png 或 JPEG 图片文件,才可查看。利用 WinHex,我
们可以将十六进制格式的文件另存为.png/.jpg 格式,然后就可看到之前发送的图片了。
大家一定要特别注意:如果不选择 16 进制显示,串口助手会将接收到的数据 0 全部过滤掉,
所以在读取彩信内容之前,一定要选择 16 进制显示,这个必选,然后再发送指令:AT+CMMSREAD
=读取第 num 个位置的文件,即图片内容,只有这样我们才能读取到完整的图片信息。
否则会有数据 0 丢失,导致图片内容不完整。正确操作步骤如图 2.3.3.2 中的①-②-③顺序操作:
www.openedv.com 开源电子网 2014-09-13
www.alientek.com
ALIENTEK STM32 开发板
AN1414
图 2.3.3.2 读取内容步骤
下面的图 2.3.3.3 就是我们读取到完整数据后的界面,按照上图 2.3.3.2 的步骤,内容中应该
会有较多的数据 0 出现。否则,你读取的数据可能会有丢失。同时,这里也不能取消 16 进制显
示,否则同样会丢失数据 0,导致数据信息不完整
图 2.3.3.3 完整数据复制
对于 png 格式的图片,则前 4 个字节是:89 50 4E 47,而对于 JPEG 格式的图片,则前四个
字节是:FF D8 FF E0。模块在发送完图片数据之后,会返回:OK,且最后的 OK 之前会有一个回
车,即十六进制的:0D 0A,因此,我们可以通过这个回车符来判断文件的结束位置。
www.openedv.com 开源电子网 2014-09-13