transferServiceExe/transferServiceExe.cpp

688 lines
16 KiB
C++

// transferServiceExe.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "transferServiceExe.h"
#include "json/json.h"
int _tmain(int argc, CHAR* argv[])
{
printf("start transferServiceExe\n");
if (argc <= 1) {
printf("exit \n");
return 1;
}
for (int i = 0; i < argc; i++){
printf("%s ", argv[i]);
}
printf("\n");
if (strcmp(argv[1], "readWeight") == 0){
readWeight(argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else if (strcmp(argv[1], "manualTrigger") == 0) {
manualTrigger(argv[2], atoi(argv[3]));
}
else if (strcmp(argv[1], "captureImageV2") == 0) {
captureImageV2(argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
}
else if (strcmp(argv[1], "displayInfoV2") == 0) {
displayInfoV2(argv[2], atoi(argv[3]), argv[4], argv[5], argv[6], atoi(argv[7]));
}
else if (strcmp(argv[1], "openDoorV1") == 0){
openDoorV1(argv[2], atoi(argv[3]), atoi(argv[4]));
}
else if (strcmp(argv[1], "playVoiceV3") == 0) {
playVoiceV3(argv[2], argv[3], atoi(argv[4]),atoi(argv[5]));
}
return 0;
}
double readWeight(char * pPort, unsigned long BaudRate, unsigned char ByteSize, unsigned char Parity, unsigned char StopBits) {
HANDLE hCom;
BOOL bRet = FALSE;
double dRet = 0.0;
hCom = CreateFile(pPort,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hCom == (HANDLE)-1)
{
printf("failure %s\n", pPort);
return dRet;
}
printf("open %s\n", pPort);
struct _DCB m_dcb;
GetCommState(hCom, &m_dcb);
m_dcb.BaudRate = BaudRate;
m_dcb.ByteSize = ByteSize;
m_dcb.Parity = Parity;
m_dcb.StopBits = ONESTOPBIT;
bRet = SetCommState(hCom, &m_dcb);
COMMTIMEOUTS comTimeOut;
comTimeOut.ReadIntervalTimeout = 10;
comTimeOut.ReadTotalTimeoutMultiplier = 10;
comTimeOut.ReadTotalTimeoutConstant = 8;
comTimeOut.WriteTotalTimeoutMultiplier = 0;
comTimeOut.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hCom, &comTimeOut);
char str[12] = { '\0' };
unsigned long wCount;
int i = 0;
int j = 0;
int t = 0;
int weight = 0;
int w1 = 0;
int w2 = 0;
int w3 = 0;
int w4 = 0;
int w5 = 0;
int w6 = 0;
int w7 = 0;
int decimalSize = 0;
int lastWeitht = 0;
bRet = false;
Sleep(16);
// i don't know why, without Sleep(16), PurgeComm function below
// can't work. maybe it's a timing problem. and "16" is the minimum
// value that make it works.
// discards all characters in the input buffer
if (!PurgeComm(hCom, PURGE_RXCLEAR))
{
printf("clear serial buffer error");
}
int k = 0;
bool bFlag = false;
while (true){
if (j >= 100){
break;
}
memset(str, 0, 12);
bRet = ReadFile(hCom, str, 12, &wCount, NULL);
if (wCount == 12){
if (bFlag == false) {
bFlag = true;
j = 0;
}
//printf("i=%d,j=%d,port=%s\n", i, j, pPort);
//for (int k = 0; k < 12; k++){
// printf("%02X", str[k]);
//}
//printf("\n");
w1 = (str[2] - '0') * 100000;
w2 = (str[3] - '0') * 10000;
w3 = (str[4] - '0') * 1000;
w4 = (str[5] - '0') * 100;
w5 = (str[6] - '0') * 10;
w6 = (str[7] - '0');
w7 = (str[8] - '0');
decimalSize = 1;
for (int l = 0; l < w7; l++){
decimalSize *= 10;
}
weight = w1 + w2 + w3 + w4 + w5 + w6;
printf("weight=%d,lastWeitht=%d,i=%d,j=%d,port=%s\n", weight, lastWeitht, i,j,pPort);
if (weight != lastWeitht){
i = 0;
if (weight > 0)
{
lastWeitht = weight;
}
}
else{
if (weight > 0)
{
i++;
}
if (i >= 20){
break;
}
}
//
if (weight == 0){
if (t >= 50){
break;
}
t++;
}
if (decimalSize != 0){
dRet = lastWeitht / decimalSize;
}
else{
dRet = lastWeitht;
}
}
SYSTEMTIME st;
GetLocalTime(&st);
printf("%d-%d-%d %d:%d:%d:%d,port=%s\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, pPort);
Sleep(200);
fflush(stdout);
j++;
}
printf("weight:%lf\n", dRet);
CloseHandle(hCom);
return dRet;
}
//void initIntegrated(char * ip) {
//#ifdef _QI_LI
// printf("openDoorV4 start\n");
//
// E_ReturnCode eCode = DC_NO_ERROR;
// Net_Init();
//
// DCHANDLE handle = Net_AddCamera(ip);
//
// if (handle == -1) {
// printf("init camera error\n");
//
// return;
// }
// eCode = Net_ConnCamera(handle, 30000, 5);
// int nConn = 0;
// if (eCode != DC_NO_ERROR) {
// printf("connect camera error,error code %d\n", eCode);
// while (nConn < 3) {
//
// }
// Net_DelCamera(handle);
// Net_UNinit();
//
// return;
// }
//
// T_ControlGate ControlGate;
// memset(&ControlGate, 0, sizeof(ControlGate));
// ControlGate.ucState = 1;
//
// eCode = Net_GateSetup(handle, &ControlGate);
// if (eCode != DC_NO_ERROR) {
// for (int i = 0; i < 3; i++) {
//
// }
// printf("open door error,error code %d\n", eCode);
// }
//
// Net_DisConnCamera(handle);
// Net_DelCamera(handle);
//
// Net_UNinit();
//
// printf("openDoorV4 end\n");
//#endif
//}
//海康摄像机
bool captureImageV2(char *ip, char *fileName, unsigned short pPort, char *userName, char *password) {
#ifdef _HK_CAMERA
NET_DVR_Init(); //Init SDK
//NET_DVR_SetLogToFile(3, "d:\\capture", 0);
DWORD err = GetLastError();
NET_DVR_DEVICEINFO_V30 DeviceInfoTmp;
memset(&DeviceInfoTmp, 0, sizeof(NET_DVR_DEVICEINFO_V30));
LONG lLoginID = NET_DVR_Login_V30(ip, pPort, userName, password, &DeviceInfoTmp);
printf("%s,%d,%s,%s\n", ip, pPort, userName, password);
if (lLoginID == -1)
{
err = GetLastError();
printf("NET_DVR_Login_V30 error %d,%s\n", err, ip);
return false;
}
else{
printf("%s\n", ip);
}
NET_DVR_CLIENTINFO ClientInfo;
ClientInfo.hPlayWnd = NULL;
ClientInfo.lChannel = 1;
ClientInfo.lLinkMode = 0;
ClientInfo.sMultiCastIP = NULL;
//TRACE("Channel number:%d\n", ClientInfo.lChannel);
long m_lPlayHandle = NET_DVR_RealPlay_V30(lLoginID, &ClientInfo, NULL, NULL, TRUE);
if (-1 == m_lPlayHandle)
{
DWORD err = NET_DVR_GetLastError();
//CString m_csErr;
//MessageBox(m_csErr);
printf("NET_DVR_RealPlay_V30 error %d\n", err);
return false;
}
NET_DVR_JPEGPARA JpgPara = { 0 };
JpgPara.wPicSize = 0xff;
JpgPara.wPicQuality = 0;
LONG iCurChan = 1;
if (!NET_DVR_CaptureJPEGPicture(lLoginID, iCurChan, &JpgPara, fileName))
{
DWORD err = NET_DVR_GetLastError();
printf("NET_DVR_CaptureJPEGPicture error %d,%s\n", err, ip);
return false;
}
NET_DVR_StopRealPlay(lLoginID);
NET_DVR_Logout_V30(lLoginID);
NET_DVR_Cleanup();
printf("captureImage:success");
#endif
return true;
}
//先科网络音柱
void playVoiceV3(char * ip, char *json, int port,int maxVol) {
CNetSocket socket;
string strBody;
char *buffer = new char [MAX_CMD_SIZE];
int size = strlen(json);
size = base64_decode_gbk((uint8*)json, size, buffer);
buffer[size] = 0;
printf("%s\n", buffer);
char *ipVoiceBoxParam = new char[MAX_CMD_SIZE];
//弘盛发专用
//sprintf(ipVoiceBoxParam,"{\"loop\":{\"gap\":2,\"times\":2},\"prompt\":false,\"queue\":false,\"rcn\":\"0\",\"rdn\":\"0\",\"reg\":0,\"speed\":50,\"sync\":false,\"text\":\"%s\",\"vcn\":\"xiaoyan\",\"volume\":100}", json);
sprintf(ipVoiceBoxParam, "{\"loop\":{\"gap\":2,\"times\":2},\"prompt\":false,\"queue\":false,\"rcn\":\"0\",\"rdn\":\"0\",\"reg\":0,\"speed\":50,\"sync\":false,\"text\":\"%s\",\"vcn\":\"xiaoyan\",\"volume\":%d}", buffer, maxVol);
//printf("json=%s\n", json);
//string decodeJson = json;
string decodeJson((char *)ipVoiceBoxParam);
//printf("%s", decodeJson.c_str());
socket.PostJson(ip, port, "/v1/speech", decodeJson, strBody);
printf("voice dev return %s\n", strBody.c_str());
delete[] ipVoiceBoxParam;
delete[] buffer;
}
void manualTrigger(char * ip, int port){
CNetSocket socket;
string retData;
char cmd[] = "{\n" \
"\"cmd\":\"trigger\"\n" \
"}";
socket.sendCmd(ip, port, cmd, retData);
printf("manual trigger dev return %s\n", retData.c_str());
}
//多奥通设备
void resetDevTimeV2(char * ip, int port,int rs485Port){
CNetSocket socket;
string retData;
char *cmd = new char[MAX_CMD_SIZE];
char *szTime = new char[MAX_CMD_SIZE];
SYSTEMTIME st;
//set display time
createDateTimeData(cmd, rs485Port);
socket.sendCmd(ip, port, cmd, retData);
GetLocalTime(&st);
sprintf(szTime, "%d-%d-%d %d:%d:%d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
//set All-in-one machine time
ZeroMemory(cmd, MAX_CMD_SIZE);
sprintf(cmd, "{\n" \
"\"cmd\" : \"set_time\",\n" \
"\"id\" : \"132156\",\n" \
"\"timestring\" : \"%s\"\n" \
"}", szTime);
retData = "";
socket.sendCmd(ip, port, cmd, retData);
sprintf(cmd, "{\n" \
"\"cmd\": \"get_device_timestamp\",\n" \
"\"id\" : \"999999\"\n" \
"}");
retData = "";
socket.sendCmd(ip, port, cmd, retData);
delete[] szTime;
delete[] cmd;
}
//多奥通设备
void openDoorV1(char * ip, int port,int ioPort){
CNetSocket socket;
string retData;
char *cmd = new char[MAX_CMD_SIZE];
sprintf(cmd, "{" \
"\"cmd\" : \"ioctl_resp\"," \
"\"id\" : \"1111\"," \
"\"io\" : %d," \
"\"value\" : 2," \
"\"delay\" : 1500" \
"}",ioPort);
socket.sendCmd(ip, port, cmd, retData);
printf("dev return %s\n", retData.c_str());
delete[] cmd;
}
//多奥通设备
void displayInfoV2(char * ip, int port, char * szCarPlate, char * szWeight, char * szAmount, int rs485Port) {
CNetSocket socket;
string retData;
int nCarPlate = 0;
int nWeight = 0;
int nAmount = 0;
char *cmd = new char[MAX_CMD_SIZE];
printf("displayInfo start\n");
if (szCarPlate != NULL) {
nCarPlate = strlen(szCarPlate);
//printf("nCarPlate is %d\n", nCarPlate);
}
if (szWeight != NULL) {
nWeight = strlen(szWeight);
//printf("nWeight is %d\n", nWeight);
}
if (szAmount != NULL) {
nAmount = strlen(szAmount);
//printf("nAmount is %d\n", nAmount);
}
//printf("create displayInfo info\n");
//
char buff[256] = { 0 };
if (nCarPlate > 0) {
createDisplayData(szCarPlate, nCarPlate, 1, cmd, rs485Port);
//printf("cmd is %s\n", cmd);
socket.sendCmd(ip, port, cmd, retData);
}
//
if (nWeight > 0) {
createDisplayData(szWeight, nWeight, 2, cmd, rs485Port);
//printf("cmd is %s\n", cmd);
socket.sendCmd(ip, port, cmd, retData);
}
//
if (nAmount > 0) {
createDisplayData(szAmount, nAmount, 3, cmd, rs485Port);
//printf("cmd is %s\n", cmd);
socket.sendCmd(ip, port, cmd, retData);
}
printf("display dev return %s\n", retData.c_str());
delete[]cmd;
}
void createDisplayData(char * text, int textLen, int line,char * cmd, int rs485Port){
char* packet = NULL;
try {
byte header[] = { 0xA5, 0x01, 0x01, 0x3D, 0x3D, 0, 0, 0x3A };
byte data[] = { 0x00, 0x01, 0x00, 0x30, 0x40, 0x40, 0x0F, 0x64, 0x03, 0x0A, 0x01, 0x02, 0x02, 0x00 };
int headerLen = sizeof(header);
int dataLen = sizeof(data);
memset(cmd, MAX_BUF_SIZE, 0);
uint8_t* packet = new uint8_t[headerLen + dataLen + textLen + 2];
data[0] = (byte)line;
switch (line){
case 1:
data[2] = 0x00;
data[3] = 0x30;
data[4] = 0x40;
data[5] = 0x40;
break;
case 2:
data[2] = 0x00;
data[3] = 0x20;
data[4] = 0x40;
data[5] = 0x30;
break;
case 3:
data[2] = 0x00;
data[3] = 0x10;
data[4] = 0x40;
data[5] = 0x20;
break;
}
header[5] = (byte)(dataLen + 2 + textLen);
header[6] = (byte)(dataLen + 2 + textLen);
data[1] = (byte)line;
byte len = 4;
for (int i = 0; i < headerLen; i++) {
packet[i] = header[i];
}
for (int i = 0; i < dataLen; i++) {
packet[headerLen + i] = data[i];
}
packet[headerLen + dataLen] = (byte)textLen;
for (int i = 0; i < textLen; i++) {
packet[headerLen + dataLen + i + 1] = text[i];
}
packet[headerLen + dataLen + textLen + 1] = (byte)0xC1;
string strBase64 = "";
uint8 buffer[1024] = {0};
base64Encode(packet, headerLen + dataLen + textLen + 2,buffer);
memset(cmd, 0, MAX_CMD_SIZE);
sprintf(cmd, "{\n" \
"\"cmd\":\"ttransmission\",\n" \
"\"id\":\"100001\",\n" \
"\"subcmd\":\"send\",\n" \
"\"datalen\":%d,\n" \
"\"data\":\"%s\",\n" \
"\"comm\":\"rs485-%d\"\n" \
"}", (headerLen + dataLen + textLen + 2), buffer, rs485Port);
if (packet != NULL){
delete[]packet;
}
}
catch(...){
if (packet != NULL){
delete[]packet;
}
//e.printStackTrace();
}
}
void createVoiceData(char * text, int textLen, char * cmd,int rs485Port) {
printf("text is %s\n", text);
printf("textLen is %d\n", textLen);
char* packet = NULL;
try {
byte header[] = { 0xA5, 0x01, 0x01, 0x3D, 0x3D, 0, 0, 0x30 ,0x01 };
int headerLen = sizeof(header);
memset(cmd, MAX_BUF_SIZE, 0);
uint8_t* packet = new uint8_t[headerLen + textLen + 2];
byte len = 4;
header[5] = (byte)(4 + textLen);
header[6] = (byte)(4 + textLen);
for (int i = 0; i < headerLen; i++) {
packet[i] = header[i];
}
packet[headerLen] = (byte)textLen;
for (int i = 0; i < textLen; i++) {
packet[headerLen + i + 1] = text[i];
}
packet[headerLen + textLen + 1] = (byte)0xC1;
for (int i = 0; i < headerLen + textLen + 2;i++) {
printf("%02X", packet[i]);
}
printf("\n");
string strBase64 = "";
uint8 buffer[1024] = { 0 };
int size = base64_encode(packet, headerLen + textLen + 2, buffer);
memset(cmd, 0, MAX_CMD_SIZE);
sprintf(cmd, "{\n" \
"\"cmd\":\"ttransmission\",\n" \
"\"id\":\"100001\",\n" \
"\"subcmd\":\"send\",\n" \
"\"datalen\":%d,\n" \
"\"data\":\"%s\",\n" \
"\"comm\":\"rs485-%d\"\n" \
"}", (headerLen + textLen + 2), buffer, rs485Port);
if (packet != NULL) {
delete[]packet;
}
}
catch (...) {
if (packet != NULL) {
delete[]packet;
}
//e.printStackTrace();
}
}
void createDateTimeData(char * cmd,int rs485Port) {
try {
byte header[] = { 0xA5, 0x01, 0x01, 0x3D, 0x3D, 0, 0, 0x05 };
byte data[] = { 0x00, 0x01, 0x00, 0x30, 0x40, 0x40, 0x0F, 0x64 };
int headerLen = sizeof(header);
int dataLen = sizeof(data);
uint8_t* packet = new uint8_t[headerLen + dataLen + 1];
time_t t = time(NULL);
struct tm *local_time = localtime(&t);
int nYear = local_time->tm_year + 1900;
uint8_t * bYear = new uint8_t[2];
for (int i = 0; i < 2; i++) {
bYear[2 - i - 1] = (byte)((nYear >> 8 * i) & 0xff);
}
int nMonth = local_time->tm_mon + 1;
byte bMonth = (byte)nMonth;
int nDay = local_time->tm_mday;
byte bDay = (byte)nDay;
int nHour = local_time->tm_hour;
byte bHour = (byte)nHour;
int nMinute = local_time->tm_min;
byte bMinute = (byte)nMinute;
int nSecond = local_time->tm_sec;
byte bSecond = (byte)nSecond;
byte bWeek = local_time->tm_wday;
data[0] = bYear[1];
data[1] = bYear[0];
data[2] = bMonth;
data[3] = bDay;
data[4] = bHour;
data[5] = bMinute;
data[6] = bSecond;
data[7] = bWeek;
header[5] = (byte)(dataLen + 2);
header[6] = (byte)(dataLen + 2);
for (int i = 0; i < headerLen; i++) {
packet[i] = header[i];
}
for (int i = 0; i < dataLen; i++) {
packet[headerLen + i] = data[i];
}
packet[headerLen + dataLen] = (byte)0xC1;
uint8 *buffer = new uint8[MAX_CMD_SIZE];
int size = base64_encode(packet, headerLen + dataLen + 1, buffer);
for (int i = 0; i < headerLen + dataLen; i++) {
printf("%02X", packet[i]);
}
printf("\n");
sprintf(cmd, "{\n" \
"\"cmd\":\"ttransmission\",\n" \
"\"id\":\"100001\",\n" \
"\"subcmd\":\"send\",\n" \
"\"datalen\":%d,\n" \
"\"data\":\"%s\",\n" \
"\"comm\":\"rs485-%d\"\n" \
"}", (headerLen + dataLen + 2), buffer, rs485Port);
delete[]buffer;
delete[]bYear;
delete[]packet;
}
catch (...) {
}
}
void saveBase64ToFile(char * fileName,string retData) {
FILE *fp = fopen(fileName, "wb");
if (fp == NULL) {
printf("Error! Could not open file\n");
return;
}
uint8 *buffer = new uint8[10 * MAX_CMD_SIZE * MAX_CMD_SIZE];
int size = strlen(retData.c_str());
printf("size is %d\n", size);
int newsize = base64_decode((uint8*)retData.c_str(), size, buffer);
printf("size is %d\n", newsize);
fwrite(buffer, newsize, 1, fp);
// 关闭文件
fclose(fp);
delete[]buffer;
}