使用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;
}