使用http协议post上传数据
void app.onWIFI32(int m){
str s;
if (m==4){
s=wifi_getinfo(12);
echo(s);
}
}
void s4.onclick()
{ wifiup_clear(0);
wifiup_addstr("name","张三");
psram_sv(0x1000,0x1234,4);psram_sv(0x1004,0x2567,4);psram_sv(0x1008,0x6452,4);
wifiup_addbin("data",0x1000,12);
wifi_httpdnbin("http://a-diy.cn/pp/a.php",0x0000,16384,1);
}
正常情况,服务器上传数据有两种方式,GET方式和POST方式,使用GET方式完全可以使用wifi_httpget语句通过URL下载完成数据上传;
但是很多情况下,比如有二进制采集数据需要上传到服务器,URL有长度限制,无法通过GET方式上传数据,因此就必须使用POST数据;
使用POST功能时,需要先使用wifiup_clear()初始化post区域,通过wifiup_addstr、wifiup_addbin语句完成数据添加;最后通过wifi_httpdnbin上传数据,具体代码如下:
无验证模式:
wifiup_clear(0); //初始化上传区,无验证模式
wifiup_addstr("name","张三"); //添加一个字符串
psram_sv(0x1000,0x1234,4);
psram_sv(0x1004,0x2567,4);
psram_sv(0x1008,0x6452,4); //设置一些测试数据
wifiup_addbin("data",0x1000,12); //添加一个二进制数
wifi_httpdnbin("http://a-diy.cn/pp/a.php",0x0000,16384,1);
以上代码会产生以下POST数据:
name=%D5%C5%C8%FD&data=BAAAAAQAAAAEAAAA
服务器获取后产生POST数组(PHP代码)
$_POST=array(2) {
["name"]=>
string(4) "张三"
["data"]=>
string(16) "BAAAAAQAAAAEAAAA"
}
可以看到data数据是通过base64转换过来的,可以在服务器端转换成二进制数据,详细参见:wifiup_addbin
带字段验证
对于一些安全度较高的项目,不带post验证模式的传输方式,可以通过修改post上传数据来恶意修改服务器端数据(url中的md5只验证了url内的参数,未能保证post数据不能被修改)
在验证模式下,wifiupaddstr和wifiup_addbin语句会在post数据中加一个_pd{field}字段用于传输md5数据;
对于field=val这样一个post字段结构,该字段的MD5计算方式如下:
_pd_{field}=md5(field+val+npwd);
其中npwd是设备对应的用户密码,存储与user表的npwd字段;是由创建用户时由串口屏客户端getsn(0x1F40)这种方式产生;
wifiup_clear(0x1F40); //初始化上传区,带验证模式
wifiup_addstr("name","张三"); //添加一个字符串
psram_sv(0x1000,0x1234,4);
psram_sv(0x1004,0x2567,4);
psram_sv(0x1008,0x6452,4); //设置一些测试数据
wifiup_addbin("data",0x1000,12); //添加一个二进制数
wifi_httpdnbin("http://a-diy.cn/pp/a.php",0x0000,16384,1);
以上代码会产生以下POST数据:
_pd_name=A639927C21F469DBAB8E43B4E85AEF38&name=%D5%C5%C8%FD&data=BAAAAAQAAAAEAAAA&_pd_data=214E279DB31ABC6AA37FF577771DE86D
服务器获取后产生POST数组(PHP代码)
$_POST=array(4) {
["_pd_name"]=>
string(32) "A639927C21F469DBAB8E43B4E85AEF38"
["name"]=>
string(4) "张三"
["data"]=>
string(16) "BAAAAAQAAAAEAAAA"
["_pd_data"]=>
string(32) "214E279DB31ABC6AA37FF577771DE86D"
}
在服务器端如果使用PHP代码可以通过下面函数来验证:
function ChkPostFieldMd5($field,$npwd){
//检测POST字段的MD5是否合标,符合则返回true ;当_pd_field如果不存在,则返回true 表示无验证
$m=$field.$_POST[$field].$npwd;
$md5=strtoupper(md5($m));
//echo ("\r\nCHKF:$field:md5('$m')=$md5; _p='{$_POST["_pd_$field"]}'\r\n");
if (isset($_POST["_pd_$field"])==false){
return true;
}
if ($_POST["_pd_$field"]==$md5){
return true;
}
return false;
}