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 @@
#include "curl/curl.h"
#include "utility/threadpool.h"
#include "utility/SQLiteModule.h"
#include "utility/iniOperation.h"
INITIALIZE_EASYLOGGINGPP
//using namespace cv;
using namespace std;
......@@ -51,10 +52,13 @@ using namespace std;
全局变量定义
****************************************/
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; //跟踪目标所在位置
CvxText text("kaiti.ttf"); //字库,否则不支持中文
int64 time_start = cv::getTickCount(), time_end; //时间戳,用于计算视频播放帧率
int fps = 0; //帧率
std::vector<adStruct> vecADInfos; //广告信息
std::string strDeviceId; //广告设备id
/****************************************
函数声明
......@@ -77,6 +81,11 @@ void reqUserInfoByImg(int index, string &imgPath);
//更新图片文字显示
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()
{
try
{
SQLite sqlite;
sqlite.initSQLite();
LOG(INFO) << "**************START PROCESS****************";
// 读取配置文件信息
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
curl_global_init(CURL_GLOBAL_ALL);
//std::string postAdResponseStr;
//curl_post_ad(strAdUrl,"6739c9fa37f547ef916d06d33a73331a","80052478", postAdResponseStr);
//LOG(INFO) <<"广告推送返回:" <<postAdResponseStr.data();
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
......@@ -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].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 @@
#include "utilCommonAPI.h"
#include "easylogging++.h"
#define BUFFER_SIZE 1024 //缓冲区大小
#define BUFFER_SIZE 1024 //缓冲区大小
SQLite::SQLite()
{
......@@ -17,17 +17,17 @@ SQLite::~SQLite()
bool SQLite::initSQLite()
{
std::string strDbFileName; //*.db 名称
std::string strDbFileName; //*.db 名称
std::string strPath = GetProcDir();
strPath.append("fmdata.db");
strDbFileName = strPath;
//打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件
//打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件
int res = sqlite3_open(strDbFileName.c_str(), &pDB);
LOG(INFO) << "DbFileName:" << strDbFileName.c_str();
if (res != SQLITE_OK)
{
LOG(ERROR) << "打开数据库失败:" << strDbFileName.data();
LOG(ERROR) << "打开数据库失败:" << strDbFileName.data();
return false;
}
try
......@@ -36,7 +36,7 @@ bool SQLite::initSQLite()
}
catch (std::exception &ex)
{
LOG(ERROR) << "创建表异常:" << ex.what();
LOG(ERROR) << "创建表异常:" << ex.what();
return false;
}
return true;
......@@ -44,32 +44,27 @@ bool SQLite::initSQLite()
bool SQLite::_createTable()
{
//插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息
//插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息
bool rlt = true;
std::string strTableName = "fmTest";
std::string strTableName = "fmAdInfo";
if (!isTableExist(pDB, strTableName)) {
char szCreate[1024] = { 0 };
sprintf_s(szCreate, "create table %s(fm_id varchar(50) NOT NULL,\
statusCode int, \
msg varchar(200),\
prompt bool,\
fm_open_id varchar(50),\
total_amount int,\
paid_total_amount int,\
invoice_amount int,\
incentives_amount int,\
logtime TIMESTAMP default (datetime('now', 'localtime')),\
PRIMARY KEY (fm_id))", strTableName.c_str());
sprintf_s(szCreate, "create table %s(id int NOT NULL,\
user_tag varchar(50),\
goods_id varchar(50),\
goods_name varchar(200),\
logtime TIMESTAMP default (datetime('now', 'localtime')),\
PRIMARY KEY (id))", strTableName.c_str());
if (!_execSql(szCreate)) {
//执行失败,退出
//执行失败,退出
exit(0);
}
}
else {
LOG(INFO) << "已存在表:" << strTableName.data() ;
LOG(INFO) << "已存在表:" << strTableName.data() ;
}
return rlt;
......@@ -81,7 +76,7 @@ void SQLite::closeSQLite()
sqlite3_close(pDB);
}
//查看表是否存在
//查看表是否存在
bool SQLite::isTableExist(sqlite3 *sqDb, std::string strTableName)
{
char szQuery[1024] = { 0 };
......@@ -99,7 +94,7 @@ bool SQLite::isTableExist(sqlite3 *sqDb, std::string strTableName)
int SQLite::isRecordExist(std::string strTable, std::string strKey)
{
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;
int nRow = 0;
int nCol = 0;
......@@ -119,7 +114,7 @@ bool SQLite::_execSql(const char* sql)
int res = sqlite3_exec(pDB, sql, 0, 0, &errMsg);
if (res != SQLITE_OK)
{
LOG(ERROR) << "执行sql失败:" << sql << " 失败信息:" << errMsg;
LOG(ERROR) << "执行sql失败:" << sql << " 失败信息:" << errMsg;
rlt = false;
}
return rlt;
......@@ -140,29 +135,53 @@ bool SQLite::remove(const char* 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)
{
try
{
std::string col0 = column_values[0];
std::string col1 = column_values[1];
std::string col2 = column_values[2];
LOG(INFO) << "column0:" << col0 << " column1:" << col1 << " column2:" << col2;
adStruct adInfo;
adInfo.userTag = UTF8ToASCII(column_values[1]);
adInfo.goodsId = column_values[2];
adInfo.goodsName = UTF8ToASCII(column_values[3]);
vecTempADInfo.push_back(adInfo);
}
catch (std::exception &ex)
{
LOG(ERROR) << "读取数据失败:" << ex.what();
LOG(ERROR) << "读取数据失败:" << ex.what();
return -1;
}
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);
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
#define SQLITE_MODULE_H
#include <iostream>
#include <vector>
#include "sqlite3.h"
//广告信息结构体
struct adStruct
{
std::string userTag; //用户标签
std::string goodsId; //商品广告ID
std::string goodsName; //商品名称
};
class SQLite
{
public:
......@@ -17,7 +26,7 @@ public:
bool insert(const char* sql);
bool update(const char* sql);
bool remove(const char* sql);
void query(const char* sql);
void query(const char* sql,std::vector<adStruct> &vecADInfos);
private:
bool _execSql(const char* sql);
bool _createTable();
......
// json.cpp : 定义控制台应用程序的入口点。
// json.cpp : 定义控制台应用程序的入口点。
//
#include "jsonAnalysis.h"
......@@ -47,9 +47,9 @@ std::string GetIdentityUserJson(const char* photo)
sServerResponse GetServerResultData(const char* json)
{
sServerResponse res;
rapidjson::Document document; // 定义一个Document对象
document.Parse(json); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
rapidjson::Document document; // 定义一个Document对象
document.Parse(json); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
{
std::cout<<"HasParseError11"<<std::endl;
}
......@@ -109,14 +109,14 @@ sServerResponse GetServerResultData(const char* json)
int SocketRequestJson(const char* json)
{
int result = 0;
rapidjson::Document document; // 定义一个Document对象
document.Parse(json); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
rapidjson::Document document; // 定义一个Document对象
document.Parse(json); // 解析,Parse()无返回值,也不会抛异常
if (document.HasParseError()) // 通过HasParseError()来判断解析是否成功
{
// 可通过GetParseError()取得出错代码,
// 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值
// 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写
// 函数GetErrorOffset()返回出错发生的位置
// 可通过GetParseError()取得出错代码,
// 注意GetParseError()返回的是一个rapidjson::ParseErrorCode类型的枚举值
// 使用函数rapidjson::GetParseError_En()得到错误码的字符串说明,这里的En为English简写
// 函数GetErrorOffset()返回出错发生的位置
//LOG_ERROR("GetTakeawayPrintInfo JSON parse error: (%d:%d)", document.GetParseError(), document.GetErrorOffset())
//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