自造星球-创客空间  - 讨论区

标题:使用SIM900A模块发送短信

2015年06月26日 星期五 10:46

SIM900A是一款国内常见的GSM\GPRS模块,可以用来发送短信、打电话、连接GPRS网络等。淘宝上搜索SIM900A可以找到一大堆开发板,价格也有高有低。我主要用于发短信,所以就买了一块最简单的,价格在70块钱左右,看上去质量还不错。

我们可以使用USB-TTL转换器连接SIM900A模块,可选5V和3.3V电平,注意电源接口和RX、TX接口是分开的,下图供参考:

我是在一台台式电脑上进行测试的,系统是CentOS Linux,USB-TTL接口在电脑中表现为一个串口设备,设备名称是/dev/ttyUSB0。

在Linux下读写串口设备,其实很简单,不需要任何特殊的Library,我们只需要像正常文件或者Socket那样读写即可。在读写之前,需要进行简单的设置(波特率等参数)。

设置参数的命令如下:

stty -F /dev/ttyUSB0 cs8 115200 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

其实我也不是很精确的指导上述命令到底干了些什么,我也是从网上找来的,经过我的测试,确实能用,所以就分享给大家。

我使用PHP语言编写了发送短信的测试程序,可以发送中英文短信,大家可以参考:

<?php

/*
We should execute the command below to set option of the serial device.
stty -F /dev/ttyUSB0 cs8 115200 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
*/

$debug=true;

function debug($str) {
	global $debug;
	if($debug) echo "debug: $str\n";
}

function send_ctrl_z($fp) {
	fwrite($fp,"\x1A");
}

function send_end($fp) {
	send_ctrl_z($fp);
	fread($fp,1024);
	die();
}

function read_result($fp){
	$crlf=fread($fp,2);
	if($crlf!= "\r\n") {
		debug("protocol error, should begin with \\r\\n.");
		return false;
	}
	$line=fgets($fp,1024);
	if(substr($line,-2) != "\r\n") {
		debug("protocol error, should end with \\r\\n.");
		return false;
	}
	$result=substr($line,0,-2);
	debug("<== " . $result);
	return $result;
}

function ucs2($str){
        $ustr=iconv("utf8","ucs2",$str);
        $hexstr=bin2hex($ustr);
        $result="";
        for($i=0;$i<strlen($hexstr);$i+=4){
                $result .= $hexstr[$i+2] . $hexstr[$i+3] . $hexstr[$i] . $hexstr[$i+1];
        }
        return strtoupper($result);
}

function open_serial_port() {
	$fp =fopen("/dev/ttyUSB0", "w+");
	if( !$fp) {
		debug("Can not open serial device.");
        	return false;
	}
	if(false === simple_cmd($fp,"ATE0&W")) {
		return false;
	}
	if(false === simple_cmd($fp,"AT")) {
		return false;
	}
	return $fp;
}

function simple_cmd($fp,$cmd){
	debug("==> " . $cmd);
	sleep(0.1);

	if(strlen($cmd) == 0) return false;

	if($cmd[strlen($cmd)-1] != '\r') {
		$cmd.="\r";
	}
	$ncmd=strlen($cmd);
 
	$nw=fwrite($fp, $cmd);
	if($nw != $ncmd) {
		debug("send command error: $cmd .");
		return false;
	}
	sleep(0.1);
	$result = read_result($fp);
	return $result;
}

function send_sms($fp,$phone,$content){
	debug("==> " . "send sms: $phone, $content");
	sleep(0.1);
	if( false === simple_cmd($fp,"AT+CMGF=1")){
		return false;
	}
	if( false === simple_cmd($fp,"AT+CSCS=\"GSM\"")){
		return false;
	}

	$cmd="AT+CMGS=\"$phone\"\r";
	$ncmd=strlen($cmd);
	$nw=fwrite($fp, $cmd);
	if($nw != $ncmd) {
		debug("send command error: $cmd .");
		return false;
	}
	sleep(0.1);
	$str=fread($fp,4);
	if($str != "\r\n> ") {
		debug("protocol error: should got \\r\\n> ");
		return false;
	}
	$content.="\x1A";
	fwrite($fp,$content);
	if(false === read_result($fp)){
		return false;
	}
	if(false === read_result($fp)){
		return false;
	}
	return true;
}

function send_chinese_sms($fp,$phone,$content){
	debug("==> " . "send sms: $phone, $content");
	sleep(0.1);
	if(false === simple_cmd($fp,"AT+CSMP=17,167,2,225")){
		return false;
	}
	if(false === simple_cmd($fp,"AT+CSCS=\"UCS2\"")){
		return false;
	}

	$phone=ucs2($phone);
	$content=ucs2($content);

	$cmd="AT+CMGS=\"$phone\"\r";
	$ncmd=strlen($cmd);
	$nw=fwrite($fp, $cmd);
	if($nw != $ncmd) {
		debug("send command error: $cmd .");
		return false;
	}
	sleep(0.1);
	$str=fread($fp,4);
	if($str != "\r\n> ") {
		debug("protocol error: should got \\r\\n> ");
		return false;
	}
	$content.="\x1A";
	fwrite($fp,$content);
	if(false === read_result($fp)){
		return false;
	}
	if(false === read_result($fp)){
		return false;
	}
	return true;
}

$fp=open_serial_port();
//send_end($fp);
//simple_cmd($fp,"ATI");
send_sms($fp,"+8618601350000","Good Luck!");
send_chinese_sms($fp,"+8618601350000","好大的风!");

SIM900A的功能非常丰富,更多的信息可以参考官方的文档,链接如下:

http://wm.sim.com/product.aspx?id=1007

 

 

 

 

 

 

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号