2016年6月30日,从淘宝上购得一款树莓派的sim800扩展板,在使用过程中遇到了一些问题,在此记录一下。

首先,由于该扩展板为针对树莓派2所定制的,所以在连接时可以直接插到树莓派2的40针引脚上,可以参看淘宝图片https://item.taobao.com/item.htm?spm=a1z09.2.0.0.abkx3G&id=523746851833&_u=3hajrts9146.

在测试过程中,参考的文章为bbs.raspifans.com/forum.php?mod=viewthread&tid=232&extra=page=1,在此专门说下这篇文章中需要注意的地方:

1、一定要注意,在使用树莓派串口时,不能如文章中那样直接通过raspi-config来关闭树莓派的串口登录功能,因为raspi-config会在禁用串口登录的同时,关闭串口,在重启系统后会造成/dev/AMA0丢失,因此,比较保险的做法是在/boot/cmdline.txt中删除console=serial0 115200,这样在启动时则不会关闭串口同时不会启用串口登录。

2、使用ATD命令进行拨号,ATA命令进行接电话,通话语音可通过扩展板的声音输出、输入接口来获得和读入。

3、在使用minicom进行连接时,具体使用AT的指令需要参考手册,但可以使用一些指令来检测设备是否能够正常使用。例如最简单的方法是可以使用其他手机拨打测试的sim卡号码,使用ATA指令来接听,如果手机能够接通,说明没问题。另外,可以使用发送短信的指令来测试发送短信的功能是否正常,可以参考www.lu-qi.com/103.html,该文章简单讲述了如何发送英文短信的方法,形式如下:

AT+CMGF=1                                                                       
OK

AT+CMGS="+8615335175013"                                                        
> test sms                                                                      
>                                                                               
+CMGS: 0                                                                        
                                                                                
OK       

若要发送中文短信,则需要使用PDU的形式,具体可参考blog.sina.com.cn/s/blog_631c18180100jmzs.html。

假如我要发送下面的短信:

接收号码:+8615163852156

短信:你好

短信中心号码:+8613800538500

 

一、短信中心号码处理:用字符串 addr表示

 

1、将短信息中心号码去掉+号,看看长度是不是偶数,如果不是,最后添加F

即 addr=”+8613800538500”

  Addr=” 8613800538500F”

2、将奇数位和偶数位交换。

  Addr=”683108508305F0”

3、将短信息中心号码前面加上字符91,91是国际化的意思

  Addr=”91683108508305F0”

4、算出addr长度,结果除2,格式化成两位的16进制字符串,16/2=8=>”08”

  addr=” 0891683108508305F0”

 

二、手机号码处理:用字符串phone

 

1、将手机号去掉+号,看看长度是不是偶数,如果不是,最后添加F

即phone=”+8615163852156”

  Phone=”8615163852156F”

2、将手机号码奇数位和偶数位交换。

  Phone=”685161832551F6”

 

三、短信息部分处理:用字符串msg表示

 

1、转字符串为Unicode代码,例如“你好”的Unicode代码为4F60597D

2、将msg长度除2,保留两位16进制数,即4F60597D=8/2=>“04”,再加上msg

=>msg=“044F60597D”

 

四、组合

1、手机号码前加上11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81。),

即phone=”11000D91”+phone

=>11000D91685161832551F6

2、手机号码后加上000800和刚才的短信息内容,000800也写死就可以了,具体含义我也不太清楚!

即phone=phone+”000800”+msg

即11000D91685161832551F6 + 000800 + 044F60597D

=>phone=11000D91685161832551F6000800044F60597D

3、Phone长度除以2,格式化成2位的十进制数

即11000D91685161832551F6000800044F60597D=>38位/2=>19

五、所以要发送的内容为

 

AT+CMGF=0<回车><换行>

OK

AT+CMGS=19<回车><换行>

>0891683108508305F011000D91685161832551F6000800044F60597D<Ctrl+Z><回车><换行>(注意:这里的Ctrl+Z的ASCII值是26,用16进制发送时是1A)

3、使用GPRS进行网络通信(重点来了)

当前时互联网时代,SIM800除了要用来发短信,还需要来进行在网络上传输数据,下面的实验就是来验证该功能的。

首先需要在一台有IP地址的服务器上开辟一个端口,来接收GPRS传输的数据。我是在服务器上使用netcat工具来实验的,命令如下:

# nc -l -p 2016  ----该命令开启本地2016端口进行监听。

下面就是要通过AT指令来发送数据给服务器了,命令过程如下:

AT+CIPMUX?
+CIPMUX: 0

OK
AT+CIPSTART="TCP","112.74.201.187",2016
OK

CONNECT OK
AT+CIPSEND=5
> Hello
SEND OK
AT+CIPCLOSE
CLOSE OK

这时,服务器端在接收到Hello数据后断开连接了,测试成功完成。