1.前言
最近迷恋WEB方面的技术,虽然自己是一个嵌入式工程师,但是我深知若需要把传感器终端的数据推送至“平台”必然会和WEB技术打交道。在工作中发现嵌入式工程师喜欢 二进制形式的协议,例如MODBUS。虽然这些协议使用广泛,但是使用这些协议需要在服务器侧专门做一个复杂的解析程序,之后再把数据搬入数据库,这便带来了升级或修改的风险。如果可以使用现有的 HTTP 表单手段或 JSON+RESTFUL手段,是不是可以简化嵌入式推送数据至互联网的过程。答案是可以,那就从PHP表单开始“复习”吧。
2.最简单PHP表单
在这里创建一个welcome.html的文件,文件内容如下:
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
在这个非常简单的HTML文件中具有两个文本框,两个的名称分别是name和age,该表单的提交方法为POST,welcome.php会处理该提交内容,或通过网页显示或通过存储至数据库。
再创建一个welcome.php的文件,文件内容如下:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.
</body>
</html>
提交的表单有两个内容,一个名称为name另一个名称为age。在PHP中可以通过全局数据$_POST["name"]或$_POST["age"]表示,例如$_POST["name"]表示xukai,$_POST["age"]表示26。运行一下welcome.html那么整个过程和结果也就一目了然了。(但是这之前需要安装apache和PHP,如果是windows平台的话可以使用wampserver这样的集成安装包)。
图1 welcome.html
图2 welcome.php执行结果
3.使用cURL提交表单
如果只运行welcome.html,查看welcome.php的运行结果那么整个表单处理过程依然显得非常模糊。此时可使用cURL工具手动提交表单,这相当于代替welcome.html直接提交表单内容。提交表单需要通过HTTP协议的POST方法,使用cURL工具时默认为GET方法,使用其他方法需要使用-X修饰符,之后跟上HTTP方法名称,例如POST或PUT。另外表单的内容通过&连接,例如name=xukai&age=26。cURL命令具体内容
curl -X POST --data "name=xukai&age=26"
http://localhost/welcome.php
http://localhost/welcome.php
执行结果:
<html>
<body>
Welcome xukai.<br />
You are 26 years old.
</body>
</html>
4.HTTP通信抓包分析
通过cURL工具可以熟悉表单的提交方法,但是除了表单内容之外还包括了HTTP请求头和HTTP请求属性等部分。通过网络抓包工具,HTTP请求和响应的具体内容如下:
<Http请求>
POST /welcome.php HTTP/1.1
User-Agent: curl/7.29.0
Host: localhost
Accept: */*
Content-Length: 17
Content-Type: application/x-www-form-urlencoded name=xukai&age=26
<Http响应>
HTTP/1.1 200 OK
Date: Wed, 18 Dec 2013 13:49:15 GMT
Server: Apache/2.4.4 (Win32) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Content-Length: 81
Content-Type: text/html <html>
<body>
Welcome xukai.<br />
You are 26 years old.
</body>
</html>
在HTTP请求中
POST /welcome.php HTTP/1.1中POST为请求方法,/welcome.php为文件地址,HTTP/1.1为HTTP协议版本编号。User-Agent: curl/7.29.0表示代理器的名称,该属性非必须。Host: localhost为远程主机名称,在这里在localhost意为本机,此处也可以为192.168.1.106或者example.com等合法地址或域名,该属性为必须。Accept: */*表示接受内容,该属性非必须。Content-Length: 17表示被提交表单的长度,该属性为必须。Content-Type: application/x-www-form-urlencoded表示表单的编码格式,该属性为必须。name=xukai&age=26为表单内容,属于HTTP请求内容部分。HTTP请求属性和HTTP请求内容之间存在一个空行。
在HTTP响应中
HTTP/1.1 200 OK表示请求成功。
5.总结
通过一个简单的例子复习PHP表单技术,通过cURL工具和HTTP抓包工具分析HTTP请求和响应,为MCU提交表单做技术准备。