#include "DebugNetwork.h"
|
|
#include <stdio.h>
|
#include <sys/socket.h>
|
#include <arpa/inet.h>
|
#include <stdlib.h>
|
#include <string.h>
|
#include <unistd.h>
|
#include <netinet/in.h>
|
|
#include "pthread.h"
|
|
#include <logger.h>
|
#include <MaterialBuffer.h>
|
|
#include "ev_proto.h"
|
#include "face_daemon_proto.h"
|
|
#define STFACE_SERVER_IP "52.79.232.163"
|
#define STFACE_SERVER_PORT "15432"
|
#define STFACE_RECV_BUFFER_SIZE 1024
|
#define STFACE_DEBUG_NETWORK_SYNC false
|
|
std::string g_dbgLog;
|
|
struct SocketClientContext
|
{
|
pthread_t daemon_thid;
|
uint8_t* buffer;
|
size_t buffSize;
|
|
SocketClientContext() : daemon_thid(0), buffer(nullptr), buffSize(0)
|
{
|
}
|
|
~SocketClientContext()
|
{
|
//pthread_join(daemon_thid, NULL);
|
|
delete[] buffer;
|
buffer = nullptr;
|
buffSize = 0;
|
}
|
|
static void* daemon_thd(void* arg)
|
{
|
SocketClientContext* ctx = (SocketClientContext*)arg;
|
|
//g_dbgLog = "";
|
|
int clientfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
if (clientfd < 0)
|
{
|
LOG_WARN << "socket create error errno=" << errno << LOG_ENDL;
|
delete ctx;
|
return nullptr;
|
}
|
|
struct sockaddr_in servaddr;
|
memset(&servaddr, 0, sizeof(servaddr));
|
servaddr.sin_family = AF_INET;
|
servaddr.sin_addr.s_addr = inet_addr(STFACE_SERVER_IP);
|
servaddr.sin_port = htons(atoi(STFACE_SERVER_PORT));
|
/* Establish connection */
|
if (connect(clientfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
|
{
|
LOG_WARN << "socket connect error errno=" << errno << LOG_ENDL;
|
close(clientfd);
|
delete ctx;
|
return nullptr;
|
}
|
|
if (send(clientfd, ctx->buffer, ctx->buffSize, 0) != ctx->buffSize)
|
{
|
LOG_WARN << "Mismatch in number of sent bytes" << LOG_ENDL;
|
}
|
|
int recvSize = recv(clientfd, ctx->buffer, STFACE_RECV_BUFFER_SIZE, 0);
|
|
ctx->buffer[recvSize] = '\0';
|
g_dbgLog = (char*)ctx->buffer;
|
LOG_NOTICE << "face detect result: " << ctx->buffer << LOG_ENDL;
|
|
close(clientfd);
|
delete ctx;
|
}
|
|
void sendBuff(uint8_t* _buffer, size_t _buffSize)
|
{
|
if (_buffer != nullptr)
|
{
|
buffer = new uint8_t[_buffSize + STFACE_RECV_BUFFER_SIZE]; // more for receive
|
memcpy(buffer, _buffer, _buffSize);
|
buffSize = _buffSize;
|
}
|
|
if(STFACE_DEBUG_NETWORK_SYNC)
|
{
|
|
}
|
else
|
{
|
int ret = pthread_create(&daemon_thid, NULL, daemon_thd, this);
|
if(ret != 0)
|
{
|
LOGP(ERROR, "pthread_create: %s/n", strerror(ret));
|
delete this;
|
return;
|
}
|
}
|
}
|
};
|
|
void dbgSendFaceDetect(uint8_t* buffer, size_t buffSize)
|
{
|
SocketClientContext* ctx = new SocketClientContext;
|
ctx->sendBuff(buffer, buffSize);
|
// delete ctx itself
|
}
|
|
void dbgSendFaceAdd(const NativeImgIdx& imgidx, uint8_t* buffImg)
|
{
|
SocketClientContext* ctx = new SocketClientContext;
|
|
ctx->buffer = new uint8_t[sizeof(EVPHeader) + sizeof(FDP_Image) + imgidx.size + STFACE_RECV_BUFFER_SIZE]; // more for receive
|
|
EVPHeader* evpHeader = new (ctx->buffer) EVPHeader;
|
FDP_Image* fdpImage = new (ctx->buffer + sizeof(EVPHeader)) FDP_Image;
|
|
evpHeader->proto = EVPProto::EVPP_RAW_BIN;
|
evpHeader->cmd = FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_SAVE;
|
evpHeader->size = sizeof(EVPHeader) + sizeof(FDP_Image) + imgidx.size;
|
|
fdpImage->db_id = 1001;
|
fdpImage->mb_type = imgidx.type;
|
fdpImage->width = imgidx.width;
|
fdpImage->height = imgidx.height;
|
fdpImage->size = 0;//#todo
|
|
memcpy(fdpImage->buff, buffImg, imgidx.size);
|
ctx->buffSize = evpHeader->size;
|
|
evpHeader->hton();
|
fdpImage->hton();
|
|
ctx->sendBuff(nullptr, 0);
|
// delete ctx itself
|
}
|