WiFi-ESP8266入门开发(六)-路由系统

来源:互联网 发布:淘宝打印画骗局 编辑:程序博客网 时间:2024/05/22 16:44
个人认为,赋予ESP8266最强大的功能莫过于HTTP路由,HTTP路由,根据不同的url响应不同的任务。在这里就类似于node.js的路由。

在教程里边已经展示了基本路由系统的使用,在我们访问ip的时候引导到了handleRoot上进行处理。

而在之后获取svg图形的时候也通过路由引导到了drawGraph上返回由ESP8266“亲手”绘制的svg图形。

此外,路由系统还提供了NotFound处理,这个可以用来处理不在预设中的页面,用于引导到404页面或者内置的html页面上。

本次教程的详细代码:

  1. #include <ESP8266WiFi.h>  
  2. #include <ESP8266WebServer.h>  
  3. ESP8266WebServer server ( 80 );  
  4. String ssid = ""// 需要连接的wifi热点名称  
  5. String password = ""// 需要连接的wifi热点密码  
  6. /* NotFound处理 
  7.  * 用于处理没有注册的请求地址 
  8.  * 一般是处理一些页面请求 
  9.  */  
  10. void handleNotFound() {   
  11.   String message = "File Not Found\n\n";  
  12.   message += "URI: ";  
  13.   message += server.uri();  
  14.   message += "\nMethod: ";  
  15.   message += ( server.method() == HTTP_GET ) ? "GET" : "POST";  
  16.   message += "\nArguments: ";  
  17.   message += server.args();  
  18.   message += "\n";  
  19.   for ( uint8_t i = 0; i < server.args(); i++ ) {  
  20.     message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";  
  21.   }  
  22.   server.send ( 404, "text/plain", message );  
  23. }  
  24. void handleMain() {  
  25.   /* 返回信息给浏览器(状态码,Content-type, 内容) 
  26.    * 这里是访问当前设备ip直接返回一个String 
  27.    */  
  28.   server.send ( 200, "text/html""Hello, this is handleMain.");  
  29. }  
  30. /* 引脚更改处理 
  31.  * 访问地址为htp://192.162.xxx.xxx/pin?a=XXX的时候根据a的值来进行对应的处理 
  32.  */  
  33. void handlePin() {  
  34.   if(server.hasArg("a")) { // 请求中是否包含有a的参数  
  35.     String action = server.arg("a"); // 获得a参数的值  
  36.     if(action == "on") { // a=on  
  37.       digitalWrite(2, LOW); // 点亮8266上的蓝色led,led是低电平驱动,需要拉低才能亮  
  38.       server.send ( 200, "text/html""Pin 2 has turn on"); return// 返回数据  
  39.     } else if(action == "off") { // a=off  
  40.       digitalWrite(2, HIGH); // 熄灭板载led  
  41.       server.send ( 200, "text/html""Pin 2 has turn off"); return;  
  42.     }  
  43.     server.send ( 200, "text/html""unknown action"); return;  
  44.   }  
  45.   server.send ( 200, "text/html""action no found");  
  46. }  
  47. void setup() {   
  48.   // 日常初始化网络  
  49.   pinMode(2, OUTPUT);  
  50.   Serial.begin ( 115200 );  
  51.   int connectCount = 0;  
  52.   WiFi.begin ( ssid.c_str(), password.c_str() );  
  53.   while ( WiFi.status() != WL_CONNECTED ) {  
  54.     delay ( 1000 );  
  55.     Serial.print ( "." );  
  56.     if(connectCount > 30) {  
  57.       Serial.println( "Connect fail!" );  
  58.       break;  
  59.     }  
  60.     connectCount += 1;  
  61.   }  
  62.   if(WiFi.status() == WL_CONNECTED) {  
  63.     Serial.println ( "" );  
  64.     Serial.print ( "Connected to " );  
  65.     Serial.println ( ssid );  
  66.     Serial.print ( "IP address: " );  
  67.     Serial.println ( WiFi.localIP() );  
  68.     connectCount = 0;  
  69.   }  
  70.   server.on ("/", handleMain); // 绑定‘/’地址到handleMain方法处理  
  71.   server.on ("/pin", HTTP_GET,  handlePin); // 绑定‘/pin’地址到handlePin方法处理  
  72.   server.onNotFound ( handleNotFound ); // NotFound处理  
  73.   server.begin();  
  74.   Serial.println ( "HTTP server started" );  
  75. }  
  76.   
  77. void loop() {  
  78.   /* 循环处理,因为ESP8266的自带的中断已经被系统占用, 
  79.    * 只能用过循环的方式来处理网络请求 
  80.    */  
  81.   server.handleClient();  
  82. }  

消息,连接成功之后可以看到返回有一个ip地址,使用浏览器方位这个ip地址就可以看到这个消息:

 

ESP8266-3-handleMain.png (6.43 KB, 下载次数: 0)

下载附件  保存到相册

2017-5-24 20:48 上传



这就是handleMain中返回给浏览器的String了。

然后可以访问控制引脚的地址:

 
点亮led

 
熄灭led

分别访问这两个地址可以看到板载的led点亮和熄灭。这个就是绑定了/pin的功能起的作用了。注意,在这里只允许使用GET方式来进行请求,因为在绑定的时候多输入了一个HTTP_GET参数,这个参数是指明了只绑定GET请求,同理也可以绑定POST等请求。

之后就是随便打个地址比如:

 

就会出现Not Found信息,在未绑路由之外的地方进行的请求一律会跳转到onNotFound绑定的方法中。

有没有感受到这个路由系统的魅力?因为8266本身是单线程运行,在Socket请求中并没有任何优势,在多个客户端同时请求的时候会造成数据错位等原因,所以平时个人都是使用http的形式进行请求来做数据交互。


原创粉丝点击