/******************************************************************* 作 者: 麦浩卿 版 权: 深圳新国都股份有限公司 函数功能:bcd金额转成字符串金额 入口参数: 返 回 值: 备 注: ********************************************************************/ s32 BcdAmount2AscAmount(u8 *heBcdAmount, u8 *asAmount) { s32 i = 0; u8 asTmp[14] = { 0 }; u8 asPoint[4] = "."; memset(asAmount, 0x00, 14); while (i < 5) { if (heBcdAmount[i] != 0x00) break; i++; } //Trace("Mai","1、金额: %s \r\n", asAmount); if (i != 5) { sdkBcdToAsc(asTmp, &heBcdAmount[i], 5 - i); if (asTmp[0] == '0') strcpy(asAmount, &asTmp[1]); else strcpy(asAmount, asTmp); } else { asAmount[0] = '0'; } //Trace("Mai","2、金额: %s \r\n", asTmp); //Trace("Mai","2、金额: %s \r\n", asAmount); //if(heBcdAmount[5] != 0x00) //{ sdkBcdToAsc(&asPoint[1], &heBcdAmount[5], 1); strcat(asAmount, asPoint); //} //Trace("Mai","3、金额: %s \r\n", asAmount); return SDK_OK; }
/***************************************************************************** ** Descriptions: ** Parameters: u8 *asTag u8 *pbuf u16 len ** Returned value: ** Created By: huacong 2016.03.11 ** Remarks: *****************************************************************************/ void DebugPrint(u8 *asTag, u8 *pbuf, u16 len) { u16 i = 0; u8 temp[512]; if (sdkIsVisibleStr(pbuf, len)) { Log(asTag, "[%s]", pbuf); } else { memset(temp, 0, sizeof(temp)); sdkBcdToAsc(temp, pbuf, len); Log(asTag, "[%s]", temp); } }
/***************************************************************************** ** Descriptions: 回写发送包 ** Parameters: SDK_8583_ST8583 *pst8583Bag ** Returned value: ** Created By: huacong 2016.03.04 ** Remarks: *****************************************************************************/ s32 WriteSendBag(char *strTag, SDK_8583_ST8583 *pstBag8583) { u8 outdata[2048] = { 0 }; u8 aucTempData[8] = { 0 }; if (pstBag8583 == NULL) { return false; } Log("zbq", "pstBag8583->nBagLen = %d", pstBag8583->nBagLen); // sdkU16ToBcd(&outdata, pstBag8583->nBagLen, 2); sdkU16ToHex(outdata, pstBag8583->nBagLen, 2); memcpy(&outdata[0] + 2, pstBag8583->ucBagData, pstBag8583->nBagLen); memset(aucTempData, 0, 8); sdkBcdToAsc(aucTempData, outdata, 2); Log("zbq", "BcdToAsc len = %s", aucTempData); // ProviderSetTagValue(TAG_8583_SENDBAG,outdata,pstBag8583->nBagLen+2); if (ProviderSetTagValue(strTag, outdata, pstBag8583->nBagLen + 2) != 1) { return SDK_ERR; } return SDK_OK; }
/***************************************************************************** 函 数 名 : Trace8583Bag 功能描述 : 显示8583报文域信息 输入参数 : u8 *asTitle SDK_8583_ST8583 *pstBag8583 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年12月25日 作 者 : zj 修改内容 : 新生成函数 *****************************************************************************/ void Trace8583Bag(u8 *asTitle, SDK_8583_ST8583 *pstBag8583) { #ifndef XGD_SDK_DEBUG return; #else u32 i; u8 asBuf[STOREBAGLEN]; u8 asBuf1[STOREBAGLEN * 2]; s32 siLen = 0; for (i = 0; i <= 64; i++) { if (sdk8583IsDomainExist(pstBag8583, i)) { memset(asBuf, 0, sizeof(asBuf)); siLen = 0; siLen = GetFieldData(pstBag8583, i, asBuf, sizeof(asBuf)); if (siLen > 0) { if (sdkIsVisibleStr(asBuf, siLen)) { // Trace(asTitle, "[%03u][%03d][%s]\r\n", i, siLen, asBuf); } else { //可能是不是ASCII内容,转换为HEX显示,最后标注*号区分 memset(asBuf1, 0, sizeof(asBuf1)); sdkBcdToAsc(asBuf1, asBuf, siLen); // Trace(asTitle, "[%03u][%03d][%s]*\r\n", i, siLen, asBuf1); } } } } #endif }
/***************************************************************************** ** Descriptions: 组定位报文 ** Parameters: struct _TradeData *pstSaleData u8 *pheSendData ** Returned value: ** Created By: lilin2012.08.01 ** Remarks: *****************************************************************************/ s32 FormLocationBag(SDK_8583_ST8583 *pstSendBag8583) { u8 ucTradeId;//消息ID u8 buf[64] = {0}; int nRet; s32 len = 0,i=0; u16 length = 0; s32 tmplen = 0; u8 temp[256] = {0}; u8 str[256] = {0}; u8 aucTempData[256] = { 0 }; // 暂存数据 struct _KeySystemParam *pst_KeySystemParam = &gstAppSetting.stKeySystemParam; struct _SYS *pst_SYS = &gstSys; struct _TradeData *pstTradeData = &gstTradeData; ucTradeId = pstTradeData->ucTradeId; if (pstSendBag8583 == NULL || pstTradeData == NULL) { return false; } nRet = FormPublicSend(pstSendBag8583,pstTradeData, "0020000000C00052"); if(nRet <= 0) return nRet; SetFieldData(pstSendBag8583, SDK_8583_FIELD_MSG, "0800", 4); //58域 定位 memset(str, 0, sizeof(str)); length = 0; memset(temp, 0, sizeof(temp)); if ((len = ProviderGetTagValue(TAG_JINGDU, temp)) > 0) { memcpy(str, "GA", 2); Log("zbq","11111"); length = length + 2; sprintf(str+length,"%03d", len); Log("zbq","22222"); length = length + 3; memcpy(str+length, temp, len); Log("zbq","33333"); length = length + len; } else { return SDK_ERR; } memset(temp, 0, sizeof(temp)); if ((len = ProviderGetTagValue(TAG_WEIDU, temp)) > 0) { memcpy(str+length, "GB", 2); Log("zbq","44444"); length = length + 2; sprintf(str+length,"%03d", len); Log("zbq","55555"); length = length + 3; memcpy(str+length, temp, len); Log("zbq","666666"); length = length + len; } else { return SDK_ERR; } memset(temp,0,256); sdkBcdToAsc(temp,str,length); Log("zbq","58域 = %s ", temp); SetFieldData(pstSendBag8583, 58, str, length); //60域 { // Log("wangb","pstTradeData->stSysParam.asBatchNo is %s ",pstTradeData->stSysParam.asBatchNo); memset(temp, 0, sizeof(temp)); strcat(temp, "00"); //60.1 strcat(temp,gstSys.asBatchNo); //60.2批次号 //60.3网络管理信息码 strcat(temp, "998"); SetFieldData(pstSendBag8583, 60, temp, strlen(temp)); } //63域 memset(temp, 0, sizeof(temp)); sprintf(temp, "%03d", gstTradeData.usManNo); i = strlen(temp); // if (i < 3) // { // temp[2] = 0x20; // } /*=======BEGIN: huangxin 2015.01.25 13:7 modify=========== 在密钥下载交易中,上送终端型号(厂商名|型号)。 该域由两个子域构成,具体描述如下: 63.2.1 保留域 固定值" " 63.2.2 终端型号信息 ANS20 命名规范 厂商缩写+"|"+产品型号,总长度不超过20位,其中字符要求为英文 和数字,不予许其他字符,以竖线分割。 例如:00LANDI |EPT5630 ============================== END======================== */ memcpy(temp+i, " XGD|", 5); i += 5; // rlt = sdkSysGetMachineCode(NULL); // ConverMachineCode(rlt, &temp[i]); memcpy(temp+i, "G870 ", 5); Log("zbq","63 Filed = %s",temp); SetFieldData(pstSendBag8583, 63, temp, strlen(temp)); //重新改写报文头 ReConfigBag8583(pstSendBag8583); #ifdef EncriptBagControl nRet = WriteSendBag(TAG_8583_SENDBAG,pstSendBag8583); //全报文加密 EncryptAllMsgByHX(1, pstSendBag8583->ucBagData, &pstSendBag8583->nBagLen); #endif return pstSendBag8583->nBagLen; }
/**************************************************************************** *Descriptions:just like main face,Standby interface.show welcome infomation *Input:void *Output:void *Return:void *Date:20140423 *Author:song *Remark:none ****************************************************************************/ void DemoABFCardModule(void) { s32 siRet = 0; u8 ucInCardType = 0x01|0x02|0x04;//01:A/B 02:M 04:C u8 szcardtype[4] = {0}; u8 szserialnum[32] = {0}; u8 szcid[12] = {0}; u8 szother[32] = {0}; u8 szbuf[32] = {0}; s32 timerid = 0; s32 TimerOver = AUTORET_TIME; s32 key = 0; u32 len = 0; sdkRfSetType(1);//set internal RF device status siRet = sdkRfPowerOn();//power on if(SDK_OK != siRet) { DemoDisplayInfo(SDK_LCD_LINE3, (u8 *)"RF POWER ON ERROR", M_UCTR); } siRet = sdkRfReset();//reset if(SDK_OK != siRet) { DemoDisplayInfo(SDK_LCD_LINE3, (u8 *)"RF RESET ERROR", M_UCTR); } timerid = sdkSysGetTimerCount(); while(1) { DemoDisplayInfo(SDK_LCD_LINE3, (u8 *)"PLS WAVE CARD:", L_UCTR); if(sdkRfSearchCard(ucInCardType, szcardtype, szserialnum, szcid, szother)== SDK_OK) { sdkLcdClear(); sprintf((s8 *)szbuf,"CARD TYPE:%s",szcardtype); sdkLcdFillRow(SDK_LCD_LINE2, 0, szbuf, L_UCTR); memset(szbuf,0,sizeof(szbuf)); sdkBcdToAsc(&szserialnum[1], szserialnum[0], szbuf); sdkLcdFillRow(SDK_LCD_LINE3, 0, (u8 *)"SERIAL NUMBER:", L_UCTR); sdkLcdFillRow(SDK_LCD_LINE4, 0, szbuf, R_UCTR); sdkLcdFillRow(SDK_LCD_LINE5, 0, (u8 *)"[ENTER]->NEXT", M_UCTR); sdkLcdBrushScreen(); key = sdkKbWaitKey(SDK_KEY_MASK_ENTER | SDK_KEY_MASK_CANCEL, AUTORET_TIME); if(key != SDK_KEY_ENTER) { return DemoEnterCardModule(); } else { break; } } if (sdkSysGetTimerEnd(timerid, TimerOver)) { DemoShowMainMenu(); return; } } memset(szbuf,0,sizeof(szbuf)); siRet = sdkRfSendData((u8 *)"\x06\x00\xFF\xFF\x01\x00", 6, szbuf, &len); if(SDK_OK == siRet) { sdkLcdClear(); sdkLcdFillRow(SDK_LCD_LINE3, 0, (u8 *)"SEND DATA OK!", M_UCTR); sdkLcdFillRow(SDK_LCD_LINE4, 0, (u8 *)"PLS MOVE YOUR CARD!", M_UCTR); sdkLcdFillRow(SDK_LCD_LINE5, 0, (u8 *)"[ENTER]->NEXT", M_UCTR); sdkLcdBrushScreen(); } else { sdkLcdClear(); sdkLcdFillRow(SDK_LCD_LINE3, 0, (u8 *)"SEND DATA ERROR!", M_UCTR); sdkLcdFillRow(SDK_LCD_LINE4, 0, (u8 *)"PLS MOVE YOUR CARD!", M_UCTR); sdkLcdFillRow(SDK_LCD_LINE5, 0, (u8 *)"[ENTER]->NEXT", M_UCTR); sdkLcdBrushScreen(); } key = sdkKbWaitKey(SDK_KEY_MASK_ENTER | SDK_KEY_MASK_CANCEL, AUTORET_TIME); if(key != SDK_KEY_ENTER) { return DemoEnterCardModule(); } else { siRet = sdkRfPowerDown(); if(SDK_OK == siRet) { sdkLcdClear(); sdkLcdFillRow(SDK_LCD_LINE5, 0, (u8 *)"POWER DOWN OK!", M_UCTR); sdkLcdBrushScreen(); } else { sdkLcdClear(); sdkLcdFillRow(SDK_LCD_LINE5, 0, (u8 *)"POWER DOWN ERROR!", M_UCTR); sdkLcdBrushScreen(); } } return DemoWaitKeyToBack(DemoEnterCardModule); }
/***************************************************************************** 函 数 名 : EncryptMagData 功能描述 : 磁道数据加密 输入参数 : u8 *pheDataBuf s32 *iDataLen 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年12月26日 作 者 : wuzhonglin 修改内容 : 新生成函数 *****************************************************************************/ s32 EncryptMagData(struct _TradeData *pstTradeData, SDK_8583_ST8583 *pstSendBag) { u8 tmp[256], buf[128], outbuf[128] = { 0 }; s32 iLen, pOutLen; s32 slt = SDK_OK; u8 *pBuf; bool bIsEncryp = false; // && pstTradeData->stKeySystemParam.bIsMk3Des // iLen = GetFieldData(pstSendBag, 35, tmp, sizeof(tmp)); // && pstTradeData->stKeySystemParam.bIsMk3Des if (gstAppSetting.stKeySystemParam.bIsSupportTdk && (sdk8583IsDomainExist(pstSendBag, 35) || sdk8583IsDomainExist(pstSendBag, 36))) { memset(tmp, 0, sizeof(tmp)); iLen = GetFieldData(pstSendBag, 35, tmp, sizeof(tmp)); Log("wangb", "Field35_1=%s", tmp); if (iLen > 16) { // sdkAscToBcd(buf, tmp, iLen); // pBuf = &buf[(iLen + 1) / 2 - 9]; //加密 // slt = sdkPEDWkDes(pstTradeData->stKeySystemParam.uiTdkIndex, SDK_PED_DES_TRIPLE, SDK_PED_ENCRYPT, pBuf, pBuf); slt = ProviderTrackDataEncrypt(tmp, outbuf, &pOutLen); //Fixme if (slt != SDK_OK) { return SDK_ERR; } // sdkBcdToAsc(tmp, outbuf, (pOutLen + 1) / 2); sdkBcdToAsc(tmp, outbuf, pOutLen); Log("wangb", "Field35_2 %s", tmp); sdk8583ClrField(pstSendBag, 35); SetFieldData(pstSendBag, 35, tmp, iLen); bIsEncryp = true; } memset(tmp, 0, sizeof(tmp)); memset(outbuf, 0, sizeof(outbuf)); iLen = GetFieldData(pstSendBag, 36, tmp, sizeof(tmp)); if (iLen > 16) { // // sdkAscToBcd(buf, tmp, iLen); // pBuf = &buf[(iLen + 1) / 2 - 9]; //加密 // slt = sdkPEDWkDes(pstTradeData->stKeySystemParam.uiTdkIndex, SDK_PED_DES_TRIPLE, SDK_PED_ENCRYPT, pBuf, pBuf); slt = ProviderTrackDataEncrypt(tmp, outbuf, &pOutLen); if (slt != SDK_OK) { return SDK_ERR; } // sdkBcdToAsc(tmp, buf, (iLen + 1) / 2); sdkBcdToAsc(tmp, outbuf, pOutLen); sdk8583ClrField(pstSendBag, 36); SetFieldData(pstSendBag, 36, tmp, iLen); bIsEncryp = true; } } if (bIsEncryp) { //重新设置53域TRACK-ENCRYPTION-USED iLen = 0; memset(tmp, 0, sizeof(tmp)); iLen = GetFieldData(pstSendBag, 53, tmp, sizeof(tmp)); if (iLen >= 3) { tmp[2] = '1'; sdk8583ClrField(pstSendBag, 53); SetFieldData(pstSendBag, 53, tmp, iLen); } else { strcpy(tmp, "001"); if (gstAppSetting.stKeySystemParam.bIsMk3Des) // 3des { tmp[1] = '6'; } SetFieldData(pstSendBag, 53, tmp, strlen(tmp)); } } Log("wangb", "pucMacBuf3 is %s", tmp); return SDK_OK; }