linux下用GPRS模块发送POST请求

来源:互联网 发布:应届生java简历模板 编辑:程序博客网 时间:2024/06/03 20:15

GPRS模块发送POST请求

    相信大家只要是80、90后都知道GPRS是什么吧(啥?不记得了!)记不记得小时候偷偷用手机上网看学(you)习(xi)资料,手机最上面一个大写的’G‘在不停的闪,那个就是GPRS网络,后来又出现了E(EGPRS)、H也就是大家常说的几G网,现在发展到4G网速比当年玩小霸王手机的时候快了......不知多少倍。

    说了这么多废话,那我们到底问什么用这个GPRS通信呢(好像没有说POST请求,不知道的拿本计算机网络面壁去!),那就要说GPRS的优点了:

    1.传输速率相对较低。有人要问了,速率低还是优点?!那要看你用来干嘛了,传个几KB甚至几B的数据包用4G网简直浪费资源!

    2.入网速度快,而且网络覆盖广泛;

    3.资料内容相对较少,学习强度较低,也就是用起来方便。

AT指令

    我的项目用的是SIM900,GPRS模块都是通过向串口发送AT指令来达到各种操作目的的(不知道如何操作串口的请看我的另一篇文章),比如收发短信、接打电话、上网等等,这里只介绍如何建立TCP连接以及发送数据包。

    我这里将所有指令放到了一个指针数组中(注意和数组指针的区别),还有注意每个指令后面要加回车符("\r"),还有各种转意字符:

unsigned char *cmd[] = {"AT\r",  \     "AT+CCID\r", \"AT+CSQ\r", \"AT+CGCLASS=\"B\"\r", \"AT+CGDCONT=1,\"IP\",\"CMNET\"\r", \"AT+CGATT=1\r", \"AT+CIPCSGP=1,\"CMNET\"\r", \"AT+CIPSTART=\"TCP\",\"182.254.244.212\",\"80\"\r", \"AT+CIPSEND\r", \"AT+CIPCLOSE\r" \                        };
    发送:AT                        //初始化

    返回:OK

    发送:AT+CCID          //获取SIM卡标识

    返回:7454645646(我乱写的)

                OK

    发送:AT+CSQ           //获取信号强度

    返回:+CSQ:24,99

                OK

    发送:AT+CSCLASS="B"   //选择移动台类别B

                AT+CGDCONT=1,"IP","CMNET"      //设置上下文

                AT+CGATT=1         //附着GPRS业务

                AT+CIPCSGP=1,"CMNET"    //设置为GPRS连接模式

                AT+CIPSTART="TCP","182.254.144.232","80"     //与特定IP地址的特定端口建立TCP连接,由于是发POST请求,所以是80端口

               AT+SEND          //开始发送数据(具体用法后面说)

               AT+CIPCLOSE

AT+SEND

    当我们与IP+端口建立好了TCP连接后,就要开始真正的目的:发送数据了。

    AT+SEND的一种用法是:

    直接AT+SEND,返回的是'>'字符,也就是等待我们向这个缓冲区写入数据,当写完之后,我们要最后写如一个16进制数据0x1A(熟悉文件结构的就能想到这个是EOF文件结束符),注意是以16进制方式!然后就可以等待返回SEND OK了

     另一种用法是:

     AT+SEND=10,这里的10是举例。返回也是'>'字符,不同的是,这个缓冲区写满10个字节时自动发送。也就是说如果我们第一次写入hello!时不够10个,于是等待继续输入,然后我们再写入world?,好了以经超过10个了自动发送,但是你实际发送出去的绝对不是hello!(换行)world?,这个大伙可以自己测试。

发送POST数据包

    为什么我特地详细说了一下AT+SEND指令呢,因为我们要发送的POST数据包中什么空格、回车、换行各种乱,所以我目的是告诉大家一定要注意你要发送的字节数,不然就会像我一样收到了好多错误码返回。

    这是我的数据包(‘*’处是我隐藏的):

unsigned char *post[] = { "POST /rc/*.php/*/* HTTP/1.1\r\n", \    "Host: www.*.cn\r\n", \        "Content-Type: application/x-www-form-urlencoded\r\n", \    "Content-Length: *\r\n\r\n", \ "*=*&*=*&*=*"  \                         };
    大家也可以用别的格式发送数据包,不过最好是在服务器端抓下包,看看是不是我们想要的格式。


0 0
原创粉丝点击