SIM808 执行HTTP POST 例程【全网首发】

整个文章从我学校的论坛转载:http://www.cqutlab.cn/thread-116-1-1.html  这里是复制粘贴的,可能有些有错误。。


既刚才我用C写的POST例程,测试可以过后,又用了很多时间来研究这个SIM808怎么利用POST提交数据到我后台来。

首先选择需要post的网页,我这里是开的webservice,
以我的webservice为例,上面写清楚了提交的方法,当然这里只是个hello world示例

图1
然后在SIM808输入一下截图的指令(这里千万记住,实际情况是需要轮询的机制,保持数据网络的畅通,一旦检测到网络不畅通,就要视图重新连接数据网络,战舰的sim900里面有例程讲怎么建立轮询保护机制)

图2

然后执行以下流程 串口给808发AT指令,下图3中 蓝色是808的返回值,切记一定要等它返回OK,自己在程序里面做判断,一旦不返回OK,那么就要有个轮询机制,继续发送设置,判断到多次不行,就要发送AT+HTTPTERM 关闭HTTP 再来,不然就会出错哦

图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的例子没有数据内容(参数),所以 设置就这样了

然后串口发送: 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 为下一次做准备

整个流程结束





下面紧接着来一个提交带参数的例程
同样给出webservice里面POST的方法

图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,当然还包含其他<>的标签内容。这个时候,单片机也要做相应的解析






  









  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值