Commit d7f9856a by guanghui.cui

1、广告写入到sqlite数据库

2、广告接口对接
parent 2624bad5
/relyLibrarys/
/ipch/
*.tlog
*.log
*.obj
*.iobj
*.pdb
*.ipdb
*.pch
*.ilk
*.suo
*.idb
\ No newline at end of file
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "curl/curl.h" #include "curl/curl.h"
#include "utility/threadpool.h" #include "utility/threadpool.h"
#include "utility/SQLiteModule.h" #include "utility/SQLiteModule.h"
#include "utility/iniOperation.h"
INITIALIZE_EASYLOGGINGPP INITIALIZE_EASYLOGGINGPP
//using namespace cv; //using namespace cv;
using namespace std; using namespace std;
...@@ -51,10 +52,13 @@ using namespace std; ...@@ -51,10 +52,13 @@ using namespace std;
全局变量定义 全局变量定义
****************************************/ ****************************************/
std::string strUrl = "http://139.196.195.9:8788/facesearch/search4File"; //接口URL std::string strUrl = "http://139.196.195.9:8788/facesearch/search4File"; //接口URL
std::string strAdUrl = "http://www.eastjw.com:7000/FamilyInterfaceProject/familyInterface/addFamilyData"; //广告URL
std::vector<TargetInfo> track_dets; //跟踪目标所在位置 std::vector<TargetInfo> track_dets; //跟踪目标所在位置
CvxText text("kaiti.ttf"); //字库,否则不支持中文 CvxText text("kaiti.ttf"); //字库,否则不支持中文
int64 time_start = cv::getTickCount(), time_end; //时间戳,用于计算视频播放帧率 int64 time_start = cv::getTickCount(), time_end; //时间戳,用于计算视频播放帧率
int fps = 0; //帧率 int fps = 0; //帧率
std::vector<adStruct> vecADInfos; //广告信息
std::string strDeviceId; //广告设备id
/**************************************** /****************************************
函数声明 函数声明
...@@ -77,6 +81,11 @@ void reqUserInfoByImg(int index, string &imgPath); ...@@ -77,6 +81,11 @@ void reqUserInfoByImg(int index, string &imgPath);
//更新图片文字显示 //更新图片文字显示
void update_img_text(cv::Mat &image, int iframe, int target); void update_img_text(cv::Mat &image, int iframe, int target);
//获取广告信息,缓存到本地
void get_adInfo(std::vector<adStruct> &vecInfo);
// 广告播放推送
CURLcode curl_post_ad(const string &url, const string equipmentId,const string productId, string &response);
/**************************************** /****************************************
主函数 主函数
...@@ -85,11 +94,22 @@ int main() ...@@ -85,11 +94,22 @@ int main()
{ {
try try
{ {
SQLite sqlite; LOG(INFO) << "**************START PROCESS****************";
sqlite.initSQLite(); // 读取配置文件信息
std::string strIniPath= GetProcDir();
strIniPath.append("config.ini");
strDeviceId = ZIni::readString("SYS", "device_id", "", strIniPath.c_str());
LOG(INFO) << "device id:" << strDeviceId.data();
get_adInfo(vecADInfos);
// global init curl // global init curl
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
//std::string postAdResponseStr;
//curl_post_ad(strAdUrl,"6739c9fa37f547ef916d06d33a73331a","80052478", postAdResponseStr);
//LOG(INFO) <<"广告推送返回:" <<postAdResponseStr.data();
cv::VideoCapture cap(0); cv::VideoCapture cap(0);
if (!cap.isOpened()) if (!cap.isOpened())
{ {
...@@ -391,4 +411,56 @@ void update_img_text(cv::Mat &image, int iframe, int target) ...@@ -391,4 +411,56 @@ void update_img_text(cv::Mat &image, int iframe, int target)
text.putText(&IplImage(image), track_dets[i].strPhone.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 45), CV_RGB(255, 0, 0)); text.putText(&IplImage(image), track_dets[i].strPhone.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 45), CV_RGB(255, 0, 0));
text.putText(&IplImage(image), track_dets[i].strConfidence.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 75), CV_RGB(255, 0, 0)); text.putText(&IplImage(image), track_dets[i].strConfidence.data(), cvPoint(track_dets[i].rc.right() + 5, track_dets[i].rc.top() + 75), CV_RGB(255, 0, 0));
} }
}
void get_adInfo(std::vector<adStruct> &vecInfo)
{
SQLite sqlite;
sqlite.initSQLite();
sqlite.query("select * from fmAdInfo", vecInfo);
sqlite.closeSQLite();
}
CURLcode curl_post_ad(const string &url, const string equipmentId, const string productId, string &response)
{
// init curl
CURL *curl = curl_easy_init();
// res code
CURLcode res;
if (curl)
{
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "userId", CURLFORM_COPYCONTENTS, "0ec78ea9ce9f4c3392399b663a5865cc", CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "passWord", CURLFORM_COPYCONTENTS, "cf79ae6addba60ad018347359bd144d2", CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "equipmentId", CURLFORM_COPYCONTENTS, equipmentId.data(), CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "productId", CURLFORM_COPYCONTENTS, productId.data(), CURLFORM_END);
// set params
struct curl_slist *head = NULL;
head = curl_slist_append(head, "Content-Type:multipart/form-data");
//head = curl_slist_append(head, "Content-Type:application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, head);
curl_easy_setopt(curl, CURLOPT_POST, 1); // post req
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
//curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postParams.c_str()); // params
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // if want to use https
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); // set peer and host verify false
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
// start req
res = curl_easy_perform(curl);
}
// release curl
curl_easy_cleanup(curl);
return res;
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include "utilCommonAPI.h" #include "utilCommonAPI.h"
#include "easylogging++.h" #include "easylogging++.h"
#define BUFFER_SIZE 1024 //缓冲区大小 #define BUFFER_SIZE 1024 //缓冲区大小
SQLite::SQLite() SQLite::SQLite()
{ {
...@@ -17,17 +17,17 @@ SQLite::~SQLite() ...@@ -17,17 +17,17 @@ SQLite::~SQLite()
bool SQLite::initSQLite() bool SQLite::initSQLite()
{ {
std::string strDbFileName; //*.db 名称 std::string strDbFileName; //*.db 名称
std::string strPath = GetProcDir(); std::string strPath = GetProcDir();
strPath.append("fmdata.db"); strPath.append("fmdata.db");
strDbFileName = strPath; strDbFileName = strPath;
//打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件 //打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件
int res = sqlite3_open(strDbFileName.c_str(), &pDB); int res = sqlite3_open(strDbFileName.c_str(), &pDB);
LOG(INFO) << "DbFileName:" << strDbFileName.c_str(); LOG(INFO) << "DbFileName:" << strDbFileName.c_str();
if (res != SQLITE_OK) if (res != SQLITE_OK)
{ {
LOG(ERROR) << "打开数据库失败:" << strDbFileName.data(); LOG(ERROR) << "打开数据库失败:" << strDbFileName.data();
return false; return false;
} }
try try
...@@ -36,7 +36,7 @@ bool SQLite::initSQLite() ...@@ -36,7 +36,7 @@ bool SQLite::initSQLite()
} }
catch (std::exception &ex) catch (std::exception &ex)
{ {
LOG(ERROR) << "创建表异常:" << ex.what(); LOG(ERROR) << "创建表异常:" << ex.what();
return false; return false;
} }
return true; return true;
...@@ -44,32 +44,27 @@ bool SQLite::initSQLite() ...@@ -44,32 +44,27 @@ bool SQLite::initSQLite()
bool SQLite::_createTable() bool SQLite::_createTable()
{ {
//插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息 //插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串 //函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数 //第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息 //中的第一个参数,第五个为出错信息
bool rlt = true; bool rlt = true;
std::string strTableName = "fmTest"; std::string strTableName = "fmAdInfo";
if (!isTableExist(pDB, strTableName)) { if (!isTableExist(pDB, strTableName)) {
char szCreate[1024] = { 0 }; char szCreate[1024] = { 0 };
sprintf_s(szCreate, "create table %s(fm_id varchar(50) NOT NULL,\ sprintf_s(szCreate, "create table %s(id int NOT NULL,\
statusCode int, \ user_tag varchar(50),\
msg varchar(200),\ goods_id varchar(50),\
prompt bool,\ goods_name varchar(200),\
fm_open_id varchar(50),\ logtime TIMESTAMP default (datetime('now', 'localtime')),\
total_amount int,\ PRIMARY KEY (id))", strTableName.c_str());
paid_total_amount int,\
invoice_amount int,\
incentives_amount int,\
logtime TIMESTAMP default (datetime('now', 'localtime')),\
PRIMARY KEY (fm_id))", strTableName.c_str());
if (!_execSql(szCreate)) { if (!_execSql(szCreate)) {
//执行失败,退出 //执行失败,退出
exit(0); exit(0);
} }
} }
else { else {
LOG(INFO) << "已存在表:" << strTableName.data() ; LOG(INFO) << "已存在表:" << strTableName.data() ;
} }
return rlt; return rlt;
...@@ -81,7 +76,7 @@ void SQLite::closeSQLite() ...@@ -81,7 +76,7 @@ void SQLite::closeSQLite()
sqlite3_close(pDB); sqlite3_close(pDB);
} }
//查看表是否存在 //查看表是否存在
bool SQLite::isTableExist(sqlite3 *sqDb, std::string strTableName) bool SQLite::isTableExist(sqlite3 *sqDb, std::string strTableName)
{ {
char szQuery[1024] = { 0 }; char szQuery[1024] = { 0 };
...@@ -99,7 +94,7 @@ bool SQLite::isTableExist(sqlite3 *sqDb, std::string strTableName) ...@@ -99,7 +94,7 @@ bool SQLite::isTableExist(sqlite3 *sqDb, std::string strTableName)
int SQLite::isRecordExist(std::string strTable, std::string strKey) int SQLite::isRecordExist(std::string strTable, std::string strKey)
{ {
char* lpSql = new char[BUFFER_SIZE]; char* lpSql = new char[BUFFER_SIZE];
sprintf_s(lpSql, BUFFER_SIZE, "select * from %s where trans_id = '%s'", strTable.c_str(), strKey.c_str()); sprintf_s(lpSql, BUFFER_SIZE, "select * from %s where user_tag = '%s'", strTable.c_str(), strKey.c_str());
char** pResult; char** pResult;
int nRow = 0; int nRow = 0;
int nCol = 0; int nCol = 0;
...@@ -119,7 +114,7 @@ bool SQLite::_execSql(const char* sql) ...@@ -119,7 +114,7 @@ bool SQLite::_execSql(const char* sql)
int res = sqlite3_exec(pDB, sql, 0, 0, &errMsg); int res = sqlite3_exec(pDB, sql, 0, 0, &errMsg);
if (res != SQLITE_OK) if (res != SQLITE_OK)
{ {
LOG(ERROR) << "执行sql失败:" << sql << " 失败信息:" << errMsg; LOG(ERROR) << "执行sql失败:" << sql << " 失败信息:" << errMsg;
rlt = false; rlt = false;
} }
return rlt; return rlt;
...@@ -140,29 +135,53 @@ bool SQLite::remove(const char* sql) ...@@ -140,29 +135,53 @@ bool SQLite::remove(const char* sql)
return _execSql(sql); return _execSql(sql);
} }
std::string UTF8ToASCII(const char* utf8)
{
std::string strUtf8;
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
strUtf8=str;
if(str) delete[] str;
return strUtf8;
}
std::vector<adStruct> vecTempADInfo;
int callbackQuery(void* data, int n_columns, char** column_values, char** column_names) int callbackQuery(void* data, int n_columns, char** column_values, char** column_names)
{ {
try try
{ {
std::string col0 = column_values[0]; adStruct adInfo;
std::string col1 = column_values[1]; adInfo.userTag = UTF8ToASCII(column_values[1]);
std::string col2 = column_values[2]; adInfo.goodsId = column_values[2];
LOG(INFO) << "column0:" << col0 << " column1:" << col1 << " column2:" << col2; adInfo.goodsName = UTF8ToASCII(column_values[3]);
vecTempADInfo.push_back(adInfo);
} }
catch (std::exception &ex) catch (std::exception &ex)
{ {
LOG(ERROR) << "读取数据失败:" << ex.what(); LOG(ERROR) << "读取数据失败:" << ex.what();
return -1; return -1;
} }
return 0; return 0;
} }
void SQLite::query(const char* sql) void SQLite::query(const char* sql, std::vector<adStruct> &vecADInfos)
{ {
vecTempADInfo.clear();
int rlt = sqlite3_exec(pDB, sql, callbackQuery, 0, &errMsg); int rlt = sqlite3_exec(pDB, sql, callbackQuery, 0, &errMsg);
if (rlt != SQLITE_OK) if (rlt != SQLITE_OK)
{ {
LOG(ERROR) << "查询数据失败:" << errMsg; LOG(ERROR) << "查询数据失败:" << errMsg;
}
else {
vecADInfos.assign(vecTempADInfo.begin(), vecTempADInfo.end());
} }
} }
\ No newline at end of file
#ifndef SQLITE_MODULE_H #ifndef SQLITE_MODULE_H
#define SQLITE_MODULE_H #define SQLITE_MODULE_H
#include <iostream> #include <iostream>
#include <vector>
#include "sqlite3.h" #include "sqlite3.h"
//广告信息结构体
struct adStruct
{
std::string userTag; //用户标签
std::string goodsId; //商品广告ID
std::string goodsName; //商品名称
};
class SQLite class SQLite
{ {
public: public:
...@@ -17,7 +26,7 @@ public: ...@@ -17,7 +26,7 @@ public:
bool insert(const char* sql); bool insert(const char* sql);
bool update(const char* sql); bool update(const char* sql);
bool remove(const char* sql); bool remove(const char* sql);
void query(const char* sql); void query(const char* sql,std::vector<adStruct> &vecADInfos);
private: private:
bool _execSql(const char* sql); bool _execSql(const char* sql);
bool _createTable(); bool _createTable();
......
// json.cpp : 定义控制台应用程序的入口点。 // json.cpp : 定义控制台应用程序的入口点。
// //
#include "jsonAnalysis.h" #include "jsonAnalysis.h"
...@@ -47,9 +47,9 @@ std::string GetIdentityUserJson(const char* photo) ...@@ -47,9 +47,9 @@ std::string GetIdentityUserJson(const char* photo)
sServerResponse GetServerResultData(const char* json) sServerResponse GetServerResultData(const char* json)
{ {
sServerResponse res; sServerResponse res;
rapidjson::Document document; // 定义一个Document对象 rapidjson::Document document; // 定义一个Document对象
document.Parse(json); // 解析,Parse()无返回值,也不会抛异常 document.Parse(json); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功 if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
{ {
std::cout<<"HasParseError11"<<std::endl; std::cout<<"HasParseError11"<<std::endl;
} }
...@@ -109,14 +109,14 @@ sServerResponse GetServerResultData(const char* json) ...@@ -109,14 +109,14 @@ sServerResponse GetServerResultData(const char* json)
int SocketRequestJson(const char* json) int SocketRequestJson(const char* json)
{ {
int result = 0; int result = 0;
rapidjson::Document document; // 定义一个Document对象 rapidjson::Document document; // 定义一个Document对象
document.Parse(json); // 解析,Parse()无返回值,也不会抛异常 document.Parse(json); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功 if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
{ {
// 可通过GetParseError()取得出错代码, // 可通过GetParseError()取得出错代码,
// 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值 // 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值
// 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写 // 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写
// 函数GetErrorOffset()返回出错发生的位置 // 函数GetErrorOffset()返回出错发生的位置
//LOG_ERROR("GetTakeawayPrintInfo JSON parse error: (%d:%d)", document.GetParseError(), document.GetErrorOffset()) //LOG_ERROR("GetTakeawayPrintInfo JSON parse error: (%d:%d)", document.GetParseError(), document.GetErrorOffset())
//return false; //return false;
} }
......
[SYS]
device_id = 6739c9fa37f547ef916d06d33a73331a
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment