web server URL访问机制
http://{ip}:{port}/go?cmd={cmd}&code={code}&st={st}&md={md}
其中:
- {ip}:串口屏连接wifi时的IP,可以使用wifi_getinfo(7)来获取
- {port}:端口号,由wifi_httpser函数开启server时设定,=80时,url访问时可省略:{port}
- {cmd}:命令模式,目前只支持两种:
- run:执行code参数传入的命令串,相当于串口传入的命令串执行
- func:url访问后,系统会自动调用app.onWIFISER()函数来交给用户处理,这种方式方便传入采集参数;传入的code参数可以使用wifi_getinfo(101)来获取;
- {code}:传入的字符串,可以是命令字符串也可以自定义处理的数据字符串;
- {st}:生成url时的时间戳,用于放置网络嗅探获取的url,该时间戳用于标志该URL的生命周期,在wifi_httpser函数开启服务时,最后一个参数标识url有效时间(秒),当URL中的st时间戳与串口屏内部时间戳差异大于设置的有效事件后,本URL失效;调试模式时,本参数失效;
- {md}:cmd、code、st、pwd四个参数累加后经过md5运算后获取的字符串,一方面防止非法用户修改URL冒名访问,另一方面由于pwd在wifi_httpser函数开启服务时设定,外部非法用户无法通过网络嗅探获取,因此可以保证访问安全;本参数的具体计算方式参见下面单独讲述;调试模式下,本参数失效;
URL的合成算法
在上面已经讲述了URL中各参数的意义,下面讲述具体的合成算法:
- 调试模式合成URL
http://{ip}:{port}/go?cmd={cmd}&code={code}
直接合成即可;
- 安全模式合成URL
http://{ip}:{port}/go?cmd={cmd}&code={code}&st={st}&md={md}
下面以PHP合成URL的语句来讲述合成算法:
//给原始参数赋值
$ip = "192.168.8.126";
$port=80;
$cmd="run";
$code="cls(1);";
$pwd="abc";
$st=time();//获取当前时间戳
$mdstr=$cmd.$code.$st.$pwd;//将四个变量字符串累加起来
$code1=urlencode($code);//urlencode编码字符串
$url="http://{$ip}";
if ($port!=80) $url.=":".$port;
$url.="/go?cmd=$cmd&code=$code1&st=$st&md=".strtoupper(md5($mdstr));
//此时$url就是合成的url
首先,st变量获取当前时间戳;然后将$cmd+$code+$st+$pwd 这4个变量字符串累加起来(PHP中的字符串变量的累加是.;其中$st是数字变量在做字符串变量累加时会自动转成字符串);累加之后通过md5()函数变成一个32位16进制字符串,但是此时字符串中的字母是小写的,串口屏内部比对使用的是大写字母,因此需要过一遍函数strtoupper()将小写字符转成大写字母;另外由于是合成URL,因此code内部的字符串需要经过urlencode()函数进行url safe的转换再合成;
URL合成页面与合成样例
http://a-diy.cn/cmdcrc/wifimd.php
由于URL合成需要代码,为了方便调试和测试比对,我们在服务器端制作了一个辅助合成页面,是用浏览器访问上述地址:
也就是说:
参数 | 值 |
---|---|
ip | 192.168.8.126 |
port | 80 |
cmd | run |
code | cls(2); |
pwd | abc |
st | 1706244827 |
合成的URL:
http://192.168.8.126/go?cmd=run&code=cls%282%29%3B&st=1706244827&md=700EE997803F3F89708B9592CC9779EC
使用上面的URL可以让串口屏执行"cls(2);"这条语句,也就是清成绿色屏幕;