| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  | #include "asio.hpp"
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:44:31 +08:00
										 |  |  | #include "protocol_examples_common.h"
 | 
					
						
							|  |  |  | #include "esp_event.h"
 | 
					
						
							|  |  |  | #include "nvs_flash.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | using asio::ip::tcp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class session | 
					
						
							|  |  |  |   : public std::enable_shared_from_this<session> | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   session(tcp::socket socket) | 
					
						
							|  |  |  |     : socket_(std::move(socket)) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void start() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     do_read(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   void do_read() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     auto self(shared_from_this()); | 
					
						
							|  |  |  |     socket_.async_read_some(asio::buffer(data_, max_length), | 
					
						
							|  |  |  |         [this, self](std::error_code ec, std::size_t length) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (!ec) | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-11-21 00:44:31 +08:00
										 |  |  |             data_[length] = 0; | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  |             std::cout << data_ << std::endl; | 
					
						
							|  |  |  |             do_write(length); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void do_write(std::size_t length) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     auto self(shared_from_this()); | 
					
						
							|  |  |  |     asio::async_write(socket_, asio::buffer(data_, length), | 
					
						
							|  |  |  |         [this, self](std::error_code ec, std::size_t length) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (!ec) | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             do_read(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tcp::socket socket_; | 
					
						
							|  |  |  |   enum { max_length = 1024 }; | 
					
						
							|  |  |  |   char data_[max_length]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class server | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   server(asio::io_context& io_context, short port) | 
					
						
							|  |  |  |     : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     do_accept(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   void do_accept() | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     acceptor_.async_accept( | 
					
						
							|  |  |  |         [this](std::error_code ec, tcp::socket socket) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (!ec) | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             std::make_shared<session>(std::move(socket))->start(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           do_accept(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   tcp::acceptor acceptor_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 16:33:30 +07:00
										 |  |  | extern "C" void app_main(void) | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-21 00:44:31 +08:00
										 |  |  |     ESP_ERROR_CHECK(nvs_flash_init()); | 
					
						
							| 
									
										
										
										
											2019-09-04 13:58:29 +02:00
										 |  |  |     esp_netif_init(); | 
					
						
							| 
									
										
										
										
											2018-11-21 00:44:31 +08:00
										 |  |  |     ESP_ERROR_CHECK(esp_event_loop_create_default()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
 | 
					
						
							|  |  |  |      * Read "Establishing Wi-Fi or Ethernet Connection" section in | 
					
						
							|  |  |  |      * examples/protocols/README.md for more information about this function. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ESP_ERROR_CHECK(example_connect()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* This helper function configures blocking UART I/O */ | 
					
						
							|  |  |  |     ESP_ERROR_CHECK(example_configure_stdin_stdout()); | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     asio::io_context io_context; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     server s(io_context, std::atoi(CONFIG_EXAMPLE_PORT)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     io_context.run(); | 
					
						
							|  |  |  | } |