最終更新: llysfactoryll 2021年01月17日(日) 19:48:51履歴
(ファイルトランスポータプロトコル - 3)
デバイス(ESP32)側(EspFileTransporter)の実装を掲載します。
デバイス(ESP32)側(EspFileTransporter)の実装を掲載します。
// FTServer // 2020.10.17 - 2020.11.04 ysfactory static const int PORT = 50001; static WiFiServer __server(PORT); static list<ClientPath> __client_list; void FTServer_setup(void) { __server.begin(); } bool FTServer_GetClient(const char* path, ClientPath* ret_client) { for(auto client : __client_list) { if(client.path == string(path)) { *ret_client = client; return true; } } return false; } void FTServer_loop(void) { list<ClientPath>::iterator it_client = __client_list.begin(); while( it_client != __client_list.end() ) { //disconnect if( ! (*it_client).client.connected() ) { Serial.println("FTServer: disconnect."); it_client = __client_list.erase(it_client); continue; } //receive while( (*it_client).client.available() ) { FTReceive_OnReceiveByte( (*it_client).client.read(), *it_client ); } ++it_client; } //accept ClientPath client; client.client = __server.available(); if (client.client) { Serial.println("FTServer: connected."); __client_list.push_back(client); } }
// FTSession // 2020.11.01 - 2020.12.05 ysfactory const int SESSION_TIMEOUT = 3 * 10; enum FTSESSION_WAIT { FTSESSION_WAIT_NULL, FTSESSION_APPEND_WAIT, FTSESSION_BINARY_WAIT, FTSESSION_CLOSE_WAIT } FTSession_wait = FTSESSION_WAIT_NULL; int FTSession_status; bool FTSession_AppendStart(const char* path, ClientPath& client) { if( FTSession_wait != FTSESSION_WAIT_NULL ) { return false; } Timer100ms[TIMER_SESSION] = SESSION_TIMEOUT; FTSender_SendCommand("#append", path, client); FTSession_wait = FTSESSION_APPEND_WAIT; return true; } bool FTSession_BinaryStart(const unsigned char* data, unsigned size, ClientPath& client) { if( FTSession_wait != FTSESSION_WAIT_NULL ) { return false; } Timer100ms[TIMER_SESSION] = SESSION_TIMEOUT; FTSender_SendBinary(data, size, client); FTSession_wait = FTSESSION_BINARY_WAIT; return true; } bool FTSession_CloseStart(const char* path, ClientPath& client) { if( FTSession_wait != FTSESSION_WAIT_NULL ) { return false; } Timer100ms[TIMER_SESSION] = SESSION_TIMEOUT; FTSender_SendCommand("#close", path, client); FTSession_wait = FTSESSION_CLOSE_WAIT; return true; } void OnReceivedResponse(unsigned char* frame, char** tokens, int nof_token, ClientPath& client) { switch(FTSession_wait) { case FTSESSION_APPEND_WAIT: case FTSESSION_CLOSE_WAIT: case FTSESSION_BINARY_WAIT: //Append command response //Close command response //Binary data response if( (nof_token >= 2 ) && (strcmp(tokens[1],"OK") == 0) ) { FTSession_status = FT_RESPONSE_OK; } else { Serial.println("FTSession: receive error response !"); FTSession_status = FT_RESPONSE_ERROR; } FTSession_wait = FTSESSION_WAIT_NULL; break; } } bool FTSession_IsBusy(void) { return FTSession_wait != FTSESSION_WAIT_NULL; } int FTSession_GetStatus(void) { return FTSession_status; } void FTSession_loop(void) { if( FTSession_wait != FTSESSION_WAIT_NULL ) { if( Timer100ms[TIMER_SESSION] <= 0 ) { Serial.println("FTSession: response timeout !"); FTSession_status = FT_RESPONSE_TIMEOUT; FTSession_wait = FTSESSION_WAIT_NULL; } } }
コメントをかく