开源第七周 GPRS模块+yeelink+nginx服务器数据传输测试

来源:互联网 发布:微页制作软件 编辑:程序博客网 时间:2024/05/05 18:42

    开源第七周:

    现在这个项目也进入了尾声,前期数据也基本处理完成,现在只差最后一步--将数据传送到服务器之上。现在我打算暂时将数据通过GPRS模块上传到yeelink平台,将我所需要的数据全部进行处理。下一周再构建服务器和上传数据到构建的服务器。

    GPRS模块现在基本上是没有问题了,可以通过设置GPRS模块的目标IP和端口来设定目标网络。当然也可以使用域名透析,使用ip+端口的方式相对要简单一丁点,只需要获取服务器的ip地址,在获得相应的传输通信端口就可以直接向服务器上传数据。而使用域名解析还要对SIM900模块进行设置,设置为URL域名透析模式,而且还有有域名才可以。不过域名解析也有一个比IP+端口传输更好的好处:如果服务器拥有公网ip,那么它的ip并不会有任何的变化,而如果服务器处于网络的内层,通过nat向上层传输数据,那么服务器的公网IP则有可能发生变化,所以还得多次获取服务器的公网IP并在SIM900程序中做出相应的设置修改。

    在阶段测试的时候如果没有服务器可以自己构建一个虚拟服务器,也可以只构建一个映射,在本地建立一个TCP/UDP service来监控数据。



一、数据发送:












源代码在此:

#include<SoftwareSerial.h>SoftwareSerial serial1(6,7);long previousMillis = 0;        // will store last time LED was updatedlong interval = 17000;           // interval at which to get (milliseconds)String a = "";void setup() {  Serial.begin(9600);  serial1.begin(9600);  serial1.listen();    while(!gprsINI());}void loop(){  unsigned long currentMillis = millis();      while(serial1.available())    {      char c =serial1.read();      Serial.print(c);    }    if(currentMillis - previousMillis > interval)   {    previousMillis = currentMillis;           sim800MSG("AT+CIPSTART=\"TCP\",\"api.yeelink.net\",\"80\"");    delay(3500);        sim800MSG("AT+CIPSEND");    delay(200);    int i=a.length()+12;    String ss;    ss= "POST /v1.1/device/13452/sensor/22398/datapoints HTTP/1.1\r\n";    ss += "Host: api.yeelink.net\r\n";    ss += "Accept: *";    ss += "/";    ss += "*\r\n";    ss += "U-ApiKey:075e0a5ec9ed624a65678f424f1d3427\r\n";    ss += "Content-Length: ";    ss += i;    ss += "\r\n";    ss += "Content-Type: application/x-www-form-urlencoded\r\n";    ss += "Connection: close\r\n\r\n";    ss += "{\"value\":\"";    ss += a;    ss += "\"}\r\n";    ss += "\x1A";    Serial.println(sim800MSG(ss));  }}boolean gprsINI(){  String msg;  msg = sim800MSG("AT+SAPBR=2,1");    Serial.println(msg);  sim800MSG("ATE");  if(msg.indexOf("OK") > 0)  if(msg.indexOf("0.0.0.0") > 0)  {    sim800MSG("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");    sim800MSG("AT+SAPBR=3,1,\"APN\",\"CMNET\"");    sim800MSG("AT+SAPBR=1,1");  }   else return 1;  delay(2000);  return 0;}String sim800MSG(String msg){  String str;  boolean ActionFlag = false;    if(msg.indexOf("HTTPACTION")>0)  ActionFlag = true;    serial1.println(msg);  while(!serial1.available())  delay(10);  while(serial1.available())  {    char c = serial1.read();    str += c;    delayMicroseconds(1200);   // delay(2);  }    if(ActionFlag)  {    while(!serial1.available())    delay(10);          while(serial1.available())      {        char c = serial1.read();        str += c;        delay(2);      }  }//  Serial.println(str);  return str;}



二、服务器端:

   现在服务器端口也有了,可以初步考虑向自己的服务器传送数据了, 由于服务器还需要框架和数据库的相关处理,所以我暂时只是把数据传输到服务器,并不对数据进行处理。
   
   因为涉及到了服务器的数据传输,而数据传输也是一个重要的方面,所以就必须得谈到Http传输协议,HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
   由于数据的传输依靠HTTP协议,所以相应的请求格式也有必要了解一下。发出的请求信息包括以下几个:
●请求行,例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件。
●(请求)头,例如Accept-Language: en
●空行
●可选的消息体 请求行和标题必须以<CR><LF>作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1协议中,所有的请求头,除host外,都是可选的。

    因为数据需要上传到服务器进行处理,所以HTTP的请求方式就非常的重要了,当编写服务器端响应程序需要知道数据好似使用哪种方法传输而来进而建立相应的处理机制。
下面是HTTP请求方式:
 HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
OPTIONS - 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD- 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET - 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST - 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT - 向指定资源位置上传其最新内容。
DELETE - 请求服务器删除Request-URI所标识的资源。
TRACE- 回显服务器收到的请求,主要用于测试或诊断。
CONNECT - HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
PATCH - 用来将局部修改应用于某一资源,添加于规范RFC5789。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。

而服务器传请求方法则是get和post,服务器建立get或者post相应机制。这里看一下get和post的区别:
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:
1、如果希望获得最佳表单传输性能,可以采用 GET 方法发送只有少数简短字段的小表单。
一些服务器操作系统在处理可以立即传递给应用程序的命令行参数时,会限制其数目和长度,在这种情况下,对那些有许多字段或是很长的文本域的表单来说,就应该采用 POST 方法来发送。
2、如果你在编写服务器端的表单处理应用程序方面经验不足,应该选择 GET 方法。如果采用 POST 方法,就要在读取和解码方法做些额外的工作,也许这并不很难,但是也许你不太愿意去处理这些问题。
3、如果安全性是个问题,那么我们建议选用 POST 方法。GET 方法将表单参数直接放在应用程序的 URL 中,这样网络窥探者可以很轻松地捕获它们,还可以从服务器的日志文件中进行摘录。如果参数中包含了信用卡帐号这样的敏感信息,就会在不知不觉中危及用户的安全。而 POST 应用程序就没有安全方面的漏洞,在将参数作为单独的事务传输给服务器进行处理时,至少还可以采用加密的方法。
4、如果想在表单之外调用服务器端的应用程序,而且包括向其传递参数的过程,就要采用 GET 方法,因为该方法允许把表单这样的参数包括进来作为 URL 的一部分。而另一方面,使用 POST 样式的应用程序却希望在 URL 后还能有一个来自浏览器额外的传输过程,其中传输的内容不能作为传统 <a> 标签的内容。
    我现在只选择GET或者POST其中一项作传输请求方法。由于我的数据传输和处理量相对较小,但是考虑到后期的可延展性,所以我选择了POST座为传输方式

下面是GSM900通过arduino控制器控制向服务器请求的指令和返回符。此次测试时在nginx服务器上做的测试。采用的是POST请求方法,在控制程序里将各组数据进行分组,在进行处理。


这里就是服务器上收到的数据:

   117.136.62.114 - - [20/Aug/2014:12:25:11 +0800] "POST/v1.1/DH22TemperatureC/12.3/DH22Humidity/23/Light/123/ultraviolet/0/temperature/23/humidity/25/dewpoint/28/Wind/2.3/Dust/234.5/" 400 166 "-" "-" -

这里由于我只是做一个数据上传的测试,所以用的'/'做数据提示分割,并没有用分割参数,如果要使用分割参数,最好在数据里对分割参数做好处理,因为分隔参数所用的 & 符号也是字符实体中的插入符号。如果在 <a> 标签的 href 属性中放入一个 & 符号,浏览器就会将其后面的字符替换成相应的字符实体。可以用其他的符号如';'代替&或者用它的实体对等物来替换 & 符号,也就是用 "&" 或 "&" 来替换。


0 0
原创粉丝点击