整个文章从我学校的论坛转载:http://www.cqutlab.cn/thread-116-1-1.html 这里是复制粘贴的,可能有些有错误。。
既刚才我用C写的POST例程,测试可以过后,又用了很多时间来研究这个SIM808怎么利用POST提交数据到我后台来。
首先选择需要post的网页,我这里是开的webservice,以我的webservice为例,上面写清楚了提交的方法,当然这里只是个hello world示例
![](https://i-blog.csdnimg.cn/blog_migrate/97db7a987774d09fb51eb851ff8e3abc.gif)
图1
然后在SIM808输入一下截图的指令(这里千万记住,实际情况是需要轮询的机制,保持数据网络的畅通,一旦检测到网络不畅通,就要视图重新连接数据网络,战舰的sim900里面有例程讲怎么建立轮询保护机制)
![](https://i-blog.csdnimg.cn/blog_migrate/0c035765a510a4439b0c3e2632e7481d.gif)
图2
然后执行以下流程 串口给808发AT指令,下图3中 蓝色是808的返回值,切记一定要等它返回OK,自己在程序里面做判断,一旦不返回OK,那么就要有个轮询机制,继续发送设置,判断到多次不行,就要发送AT+HTTPTERM 关闭HTTP 再来,不然就会出错哦
![](https://i-blog.csdnimg.cn/blog_migrate/be108ee99beedacdab3f0993c0b0e170.gif)
图3
根据图3的流程,我们来做,但是实际流程情况和图3有时候有点出入
例如如果已经执行了AT+HTTPINIT 那么它会返回ERROR,这个时候有两种方式,一种就是去使用AT+HTTPSTATUS=?去查当前的状态,另外一个就是使用AT+HTTPTERM把HTTP关一下再开。总之不行了就关下,再开
下面给SIM808设置我WEBSERVICE的地址 根据图1,给出的POST相对地址,我们给它组合成绝对地址:“ http://125.83.116.37/WebService1.asmx/HelloWorld”(双引号以内的内容)
然后写入sim的URL里面
下图4就是给出关了再开,然后执行整个设置的过程
其中URL使用: AT+HTTPPARA="URL","http://125.83.116.37/WebService1.asmx/HelloWorld" 这个是根据webservice的方法组合起来的
根据webservice的要求,还需要设置:AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"
由于从方法上面来看,这个返回helloworld的例子没有数据内容(参数),所以 设置就这样了
![](https://i-blog.csdnimg.cn/blog_migrate/e9dcf0edb5f576737dad90d7171ee535.gif)
然后串口发送: AT+HTTPACTION=1 ,其中1就是POST方式。发送过后,808会马上回复OK,但是由于由于网络延迟等,下面那个 +HTTPACTION: 1,200,96 才是从服务器返回的值,所以这里单片机要做个延迟处理,建议等30秒,不行就宣告失败,关闭连接。其中1是表示POST方式,200代表这次访问成功,(只有看到200才行啊,其他的都是错的。具体哪个值对应哪个,可以看808手册AT+HTTPACTION命令)。96表示返回96个字节
然后串口发送 : AT+HTTPREAD=1,96 表示从第1个字节读取,一直读到96个字节 ,读取刚才POST过后 ,服务器返回给808的数据,从这个里面我看到 服务器返回Hello world了
最后执行:AT+HTTPTERM 关闭HTTP 为下一次做准备
![](https://i-blog.csdnimg.cn/blog_migrate/e9612c65a1b3a313b5f35f16f2c617e2.gif)
整个流程结束
下面紧接着来一个提交带参数的例程
同样给出webservice里面POST的方法
![](https://i-blog.csdnimg.cn/blog_migrate/ce522fcf348795c3559d30a13616b8b2.gif)
图1
然后给出我网站后台怎么调用这个方法的
[WebMethod]
public string userLogin(string loginName, string password)
{
//password为loginName与实际的password一起加密后的值
string key = MD5.CurKey();
password = MD5.EncryptString(loginName + password, key);
string[] prototype = new string[] { "operatorID", "loginName", "name", "disabled", "role", "companyID" };
List<Dictionary<string, object>> list = basedao.findMapByProperties("T_P_Operator", prototype, "loginName='" + loginName + "' and password = '" + password + "'");
if (list.Count == 0)
{
return "0";//用户名或者密码错误
}
else
{
if (Int32.Parse(list[0]["disabled"] + "") == 1)
{
return "1";//登录成功
}
else
{
return "2";//用户被禁用
}
}
看到了吧 ,只要输入用户名密码正确,就返回1,否则返回0,
下面给出一个用户名:23123 ,密码: 123456 ,的用户,用808试返回值
这个就涉及到发送数据了
我们根据 本楼的图1 构造数据”loginName=23123&password=123456“ ,这就是我们要向服务器提交的字符,这个加上末尾的“\r\n",有33个字节
其中AT+HTTPDATA=0,1000 意思就是把现在缓存区里面的东西先清空
然后AT+HTTPDATA=33,20000 ,意思是需要填入缓冲器33个字节(这个就要每次提交的时候算一下了),并且最大在20秒内结束填充,当然你在变成的时候,9600的波特率,1000个字节内,后面那个写成2000足够了,因为这个808会检测,当你提交到33个字节后,会自动完成提交,不管时间到没到,都会显示OK。并且这个提交完了只会显示OK,不会回显你提交的内容。
为了保险,我们用AT+HTTPREAD 来看看刚才在缓冲区里面提交的什么,最后同样的调用AT+HTTPACTION=1 来POST
(细心的同学会发现,在webservice要求里面 不是要求要有Content-Length: length,这个length参数么?我之前写的C语言提交版本确实要这个参数,但是这个808里面不必管它,它会自动算出,并且提交,所以提交的DATA里面也不用写这一行)
同样 POST过后 单片机要写等待机制,等服务器返回信息 同样的 一定要等到返回200 才算正确啊
最后用AT+HTTPREAD来查看服务器返回的信息 我们可以看到确实返回了个1,当然还包含其他<>的标签内容。这个时候,单片机也要做相应的解析
![](https://i-blog.csdnimg.cn/blog_migrate/cd4edc8b8b528e1540fa593938bf0a0d.gif)