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", \
"*=*&*=*&*=*" \
};
大家也可以用别的格式发送数据包,不过最好是在服务器端抓下包,看看是不是我们想要的格式。