function send_post($postdata) {
//设置超时时间
set_time_limit(0);
//设置端口号
$com_port = 3;
//windows平台使用下面命令设置端口
exec('mode COM'.$com_port.': baud=9600 data=8 stop=1 parity=n xon=on');
//以读写不阻塞方式打开端口,
$fd = dio_open('COM'.$com_port.':', O_RDWR|O_NONBLOCK);
if(!$fd)
{
die('Error open COM'.$com_port.'.');
}
$url = 'http://www.shukeiot.cn/api';
//汉字用urlencode编码
$msg = urlencode('这里是汉字内容');
$postdata = array(
'uid' => '1',
'msg' => $msg,
);
$poststr = http_build_query($postdata);
$contentlength = strlen($poststr);
//组装AT指令
$at_command = array();
//设置APN
array_push($at_command, array('AT+SAPBR=3,1,"APN","UNINET"', 1));
//打开网络连接
array_push($at_command, array('AT+SAPBR=1,1', 1));
//初始化HTTP
array_push($at_command, array('AT+HTTPINIT', 1));
//设置使用的连接,对应上面的AT+SAPBR的第二个参数
array_push($at_command, array('AT+HTTPPARA="CID",1', 1));
//设置HTTP URL参数
array_push($at_command, array('AT+HTTPPARA="URL","'.$url.'"', 1));
//设置HTTP CONTENT参数,Post表单:application/x-www-form-urlencoded
array_push($at_command, array('AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"', 1));
//发送HTTP DATA,这里定义即将要发送的消息长度和超时时间
array_push($at_command, array('AT+HTTPDATA='.$contentlength.',5000', 1));
//回复DOWNLOAD的时候就可以写入POST请求字符串了
array_push($at_command, array($poststr, 1));
//正式提交请求,0是GET,1是POST,2是HEAD,这条指令有两条回复
array_push($at_command, array('AT+HTTPACTION=1', 2));
//关闭HTTP 连接
array_push($at_command, array('AT+HTTPTERM', 1));
//关闭网络
array_push($at_command, array('AT+SAPBR=0,1', 1));
//开始循环执行命令
foreach ($at_command as $key => $value)
{
@dio_write($fd, $at_command[$key][0].chr(13));
$num = 1;
$datastr = '';
//进循环读串口响应信息字节,每次一个
while(true){
$data = dio_read($fd, 1);
$datastr .= $data;
//用串口助手调试发现每次响应包含两个换行(chr(10))
if($data == chr(10))
{
if($num % 2 == 0){
//输出响应
//echo '---'.$datastr.'---
';
$datastr = '';
}
//AT+HTTPACTION=1有两个回复,指令接收回OK,完成请求以后会返回主机状态。601/302/200,一般200为正常响应
if($num >= $at_command[$key][1]*2) break;
$num ++;
}
//可以加入适当延时
usleep(1000);
}
}
dio_close($fd);
}