2015-08-13 3 views
0

Я хочу использовать порт Ethernet для отправки данных с помощью создания сокета.Отправка данных через порт Ethernet (verifone vx520)

Как я могу открыть порт Ethernet и установить IP, NETMASK и GateWay? Я могу использовать эти функции, но я не знаю, как открыть порт Ethernet или как настроить эти функции.

ceSETNWParamValue(); 
ceGetNWParamValue(); 
ceSetDDParamValue(); 

ответ

2

Ну, «Verix Эво Том II OS и связь Руководство Программисты» (особ. В главе 5) может помочь вам немного, но прежде чем мы получим в том, что есть одна важная вещь, чтобы consider-- если вы используете эту программу, которую вы пишете на vx520, вы, скорее всего, захотите ее в другом терминальном типе в какой-то момент в будущем. С этой целью вы можете использовать CommServer. CommServer - это программа, которая помогает абстрагировать различные типы оборудования из вашего кода, чтобы вы могли отправлять одни и те же команды любому типу терминала и определять, как выполнять ваши запросы на основе того, какое оборудование оно использует. Он существует уже некоторое время и был перенесен на большинство типов терминалов VerFone. Он предоставляется (и поддерживается) VeriFone бесплатно. Есть несколько минусов к нему:

  • Он просто добавляет еще 1 программу, вы должны загрузить (и это большое)
  • Это требует от вас отправки запросов через Flexi Records, который может быть немного запутанным, чтобы установить сначала.
  • Это добавляет еще 1 слой движущихся частей, которые могут осложнить отладку
  • Если вы не были перед использованием VMAC, вы должны будете использовать его сейчас (это еще одна программа и более сложности)

Однако, как только вы получите это работает, это очень приятно:

  • используйте один и тот же код для всех аппаратных
  • Если имеется несколько приложений, работающих на терминале, что все нужно использовать IP-связь, вам не нужно TCP/IP li в любом из приложений, которые часто могут привести к меньшему размеру.

Существует хороший шанс, что в какой-то момент вам нужно будет поделиться своим терминалом с другим третьим лицом. Если это так, вам нужно, чтобы ваша программа работала поверх VMAC, и есть хорошие шансы, что они тоже будут использовать CommServer. Если это когда-либо, 2 из «CON» просто исчезли, и один из «PRO» был просто подчеркнут.

Итак, теперь вам нужно выбрать CommServer или CommServer.

Если вы выберете CommServer, вам нужно хорошо ознакомиться с тем, как FlexiRecords работают в качестве предварительного условия. Предлагаю вам прочитать главу 7 «Руководство программистов дирижеров Verix eVo Multi-App».Далее, поток программы будет идти что-то вроде этого:

1) Инициализация буфера событий с

// Initializes the buffer provided to store a new flexi-record structure. 
// This is a flexirecord public interface function. 
vVarInitRecord(buffer, sizeof(buffer), 0); 

// Assigns the buffer passed as a parameter to the global space of the Extended 
// Flexi-record API.This is a mandatory function call for the rest of the Extended 
// Flexi-record APIs.The buffer should be initialized using vVarInitRecord() 
// function before calling this API. 
ushInitStandardFlexi(buffer); 

//send the event (you'll need some other boiler plate code) 
// you'll probably want to turn this into a "SendEvent" method 
EESL_send_event("COMMSVR", VCS_EVT_INIT_REQ, buffer, bufferSize); 

// read the response from CommSever (again, this is a skeletal sample) 
// This will become a "ReadEvent" method 
while(strcmp(sendername, "COMMSVR") || eventID != VCS_EVT_INIT_RESP) 
    eventID = EESL_read_cust_evt(buffer, sizeof(buffer), &bufferSize, sendername); 

2) Подключите

vVarInitRecord(eco->Buffer, sizeof(buffer), 0); 
ushInitStandardFlexi(buffer); 

// shVarAddData will add an un-typed field to a variable record 
// The field VCS_FLD_CONN_URL is defined as a URL or an IP address to connect to. 
// All syntax validation of URL or IP address is performed by the TCP/IP library. 
shVarAddData(VCS_FLD_CONN_URL, hostip, strlen(hostip)); 

// shVarAddUnsignedInt adds (unsurprisingly) an unsigned int to the Flexi-record. 
// The constant VCS_FLD_CONN_PORT defines the TCP/IP port number 
shVarAddUnsignedInt(VCS_FLD_CONN_PORT, port); 

// The value VCS_FLD_CONN_HOSTSSL represents a flag that indicates whether SSL 
// is supported or not: (1 - SSL supported, 0 - SSL not supported) 
shVarAddUnsignedInt(VCS_FLD_CONN_HOSTSSL, useSSL); 
// (if you are going to use SSL, you'll need to add some other values, too) 

//Honestly, I don't know what this is, but I don't think it works without it 
shVarAddUnsignedInt(VCS_FLD_CONN_HOSTCTX, (unsigned short)0); 

//send the event (you'll need some other boiler plate code) 
EESL_send_event("COMMSVR", VCS_EVT_CONN_REQ, buffer, bufferSize); 

// read the response from CommSever (use the same "receive" code from above, 
// but you are looking for the response "VCS_EVT_CONN_RESP" 
EESL_read_cust_evt(buffer, sizeof(buffer), &bufferSize, sendername); 

3) Убедитесь, вы подключены

vVarInitRecord(buffer, sizeof(buffer), 0); 
ushInitStandardFlexi(buffer); 
// Add Status ID buffer to the parameter list 
shVarAddData(VCS_FLD_STATUS_IDS, (unsigned char*)statusIDs, (sizeof(int) * 2)); 

// do your "sendEvent" from above with the event VCS_EVT_STATUS_REQ 
SendEvent(VCS_EVT_STATUS_REQ); 

// do your "ReceiveEvent" from above, looking for VCS_EVT_STATUS_RESP 
ReadEvent(VCS_EVT_STATUS_RESP); 

// Extract data from event buffer 
ushInitStandardFlexi(buffer); 

//This is the eVo (520) version: 
shVarGetUnsignedInt(VCS_FLD_CONN_STATUS, (unsigned short*)&connStatus); 
//This is the Verix/Vx version 
//shVarGetData(VCS_FLD_CONN_STATUS, (unsigned char*)&connStatus, 
       sizeof(unsigned short), &dataLength); 

if (connStatus == 1) {/* you are connected */} 

4) Отправить

vVarInitRecord(eco->Buffer, sizeof(buffer), 0); 
ushInitStandardFlexi(buffer); 

//Add length parameter to the data stack. 
shVarAddUnsignedInt(VCS_FLD_SEND_BUFSIZE, p_size); 

// Send Event to server. Note that this doesn't actually send the data, it simply 
// tells CommServer that data will be coming shortly. It also advises the length 
// of the data to be sent 
SendEvent(VCS_EVT_SEND_REQ); // this is your function, remember? 


/* Send the raw data to the host via Comm Server */ 
EESL_send_event("COMMSVR", VCS_EVT_DATA_RAW, buffer, sendLength); 


// Read Comm Server's response message. Note that this isn't yet the host response 
// message. We're simply checking to make sure that our data was delivered correctly 
// to Comm Server. We'll get the actual response later... 
ReadEvent(VCS_EVT_SEND_RESP); // your function 

5) Получение

vVarInitRecord(buffer, sizeof(buffer), 0); 
ushInitStandardFlexi(buffer); 

/* Add parameters to send to server */ 
shVarAddUnsignedInt(VCS_FLD_RECV_BUFSIZE, p_size); 
shVarAddUnsignedInt(VCS_FLD_RECV_TIMEOUT, p_timeout); 


// Send Event to server. Again, note that this doesn't actually receive any data, 
// it simply prepares comm server for sending us the raw data and will 
// tell us how many bytes we should be expecting 
SendEvent(VCS_EVT_RECV_REQ); 

// Read event from server 
ReadEvent(VCS_EVT_RECV_RESP); 

// Extract data from event buffer. We're particularly interested in the number 
// total of bytes available to read. Note that we haven't actually read anything 
// at this point. We simply got the number of bytes AVAILABLE to read 
ushInitStandardFlexi(eco->Buffer); 

//Now do the actual read 
EESL_send_event("COMMSVR", VCS_EVT_DATA_RAW, (unsigned char *)buffer, readSize); 

5) Отсоедините

vVarInitRecord(buffer, sizeof(buffer), 0); 
ushInitStandardFlexi(buffer); 
SendEvent(VCS_EVT_DISC_REQ) 
ReadEvent(VCS_EVT_DISC_RESP); 

Там будет больше, чем это, но это суть его.


На данный момент, вы, вероятно, думаете, «Это выглядит сложным - как я могу это сделать без CommServer» Итак, теперь мы вступаем в сферу, с которой я менее знаком, и я, вероятно, не буду так полезен, но у меня есть образец кода, который делает следующие вызовы (обратите внимание, что мой пример кода составляет более 1500 строк, поэтому Я не могу включать все это здесь):

//important includes: 
#include <ctype.h> 
#include <svc_net.h> 
#include <ceif.h> 
#include <vos_ddi_ini.h> 

// Init Comm Engine 
ceRegister(); 

// Subscribe to notification events from CommEngine 
ceEnableEventNotification(); 


// Check how many network interfaces (NWIF) are available and store in stNIInfo 
g_NICount=ceGetNWIFCount(); 
g_NIInfo = (unsigned char*) malloc (g_NICount * sizeof (stNIInfo)); 
ceGetNWIFInfo((stNIInfo*)g_NIInfo, g_NICount, &nwInfoCount); 
FillNWIF ((stNIInfo*)g_NIInfo, g_NICount); 

// Check the link speed 
ceGetDDParamValue (g_currMediaInfo.niHandle, "GET_LINK_SPEED", 
      sizeof (szLinkSpeed), szLinkSpeed, &linkValueLen); 

Где FillNWIF определяется как

void FillNWIF (stNIInfo stArray[], int arrayCount) 
{ 
    int cntr = 0; 
    for (cntr = 0; cntr < arrayCount; cntr++) 
    { 
    if (strcmp (stArray [cntr].niCommTech, CE_COMM_TECH_ETH) == 0) 
     g_Devices.devEthernet.iDevHandle = stArray [cntr].niHandle; 
    else if (strcmp (stArray [cntr].niCommTech, CE_COMM_TECH_PPPDIAL) == 0) 
     g_Devices.devDialPPP.iDevHandle = stArray [cntr].niHandle; 
    else if (strcmp (stArray [cntr].niCommTech, CE_COMM_TECH_DIALONLY) == 0) 
     g_Devices.devDial.iDevHandle = stArray [cntr].niHandle; 
    } 
} 

фактическое подключение и отправить это, в общем, выглядит следующим образом:

struct sockaddr_in sockHost; 

memset (&sockHost, 0, sizeof (struct sockaddr_in)); 
memset (&timeout, 0, sizeof (struct timeval)); 

sockHost.sin_family = AF_INET; 
sockHost.sin_addr.s_addr = htonl (inet_addr (g_AppConfig.szHostIP)); 
sockHost.sin_port = htons (g_AppConfig.iPort); 

sockType = SOCK_STREAM; 
sockHandle = socket (AF_INET, sockType, 0); 

connect (sockHandle, (struct sockaddr*)&sockHost, sizeof (struct sockaddr_in)); 

send (iSockHandle, szSendBuff, uiSendSize, 0); 
recv (iSockHandle, szRecvBuff, sizeof (szRecvBuff), 0); 

Другие API Вы можете найти полезным:

//get network interface start mode 
ceGetNWIFStartMode (g_currMediaInfo.niHandle); 

// Get the total number of network interface from this terminal 
g_NICount=ceGetNWIFCount(); 

//Get network interfaces 
ceGetNWIFInfo((stNIInfo*)g_NIInfo, g_NICount, &nwInfoCount); 

// only open the NWIF 
ceStartNWIF (g_currMediaInfo.niHandle, CE_OPEN); 

//close NWIF 
ceStopNWIF (g_currMediaInfo.niHandle, CE_CLOSE); 

// connect 
ceStartNWIF (g_currMediaInfo.niHandle, CE_CONNECT); 

//get connection status 
ceGetNWParamValue (iNWIFHandle, IP_CONFIG, &ipConfig, sizeof (stNI_IPConfig), &pLen); 

//link up 
ceStartNWIF (g_currMediaInfo.niHandle, CE_LINK) 

//network up 
ceStartNWIF (g_currMediaInfo.niHandle, CE_NETWORK); 

//network down 
ceStopNWIF (g_currMediaInfo.niHandle, CE_NETWORK); 

//link down 
ceStopNWIF (g_currMediaInfo.niHandle, CE_LINK); 

//Disconnect 
ceStopNWIF (g_currMediaInfo.niHandle, CE_DISCONNECT); 

// Get the version; 
ceGetVersion (CE_VER_VXCE, sizeof (g_szVXCEVersion), g_szVXCEVersion); 
ceGetVersion (CE_VER_CEIF, sizeof (g_szCEIFVersion), g_szCEIFVersion); 

Для устранения замечаний сделайте файл ниже, файл сделайте должны иметь линию, которая является чем-то вроде следующего:

$(EVOSDK)\bin\vrxcc $(COptions) $(Includes) $(AppObjects) $(Libs) -o $(OutDir)\Project.out`. 

Выше, что каждый из COptions , Includes, AppObjects и Libs необходимо определить.

COptions

COptions являются опции компилятора, которые вы хотите использовать. Несколько возможных вариантов в вашем «Verix Эво Том III инструменты программирования OS справочное руководство», но в качестве примера, вы можете установить его:

COptions = -p -DLOGSYS_FLAG -DLOGSYS_NEW_API_STYLE 
  • -p указывает, что для процессора ARM11 (т.е.Этот код предназначен для 520, а не 570)
  • -DLOGSYS_FLAG говорит, что вы хотите включить заявления LOG_PRINTF и
  • -DLOGSYS_NEW_API_STYLE указует на то, что вы хотите использовать новые макросы (которые не требуют двойной скобки)

Включает

Includes как компилятору, где искать для заголовка (.h) файлов. Каждый раз, когда вы используете оператор #include, вам необходимо убедиться, что каталог, в котором находится этот файл .h, представлен в вашем списке Includes. Например, если вы хотите #include <ceif.h>, то вам необходимо убедиться, что у вас есть -I$(EOSSDK)\include как часть вашего пути. Пример того, как вы можете установить ваш Includes может быть:

Includes = -I.\include -I$(EVOSDK)\include -I$(EOSSDK)\include -I$(EVOACT)\include -I$(EVOVCS)include -I$(EVOVMAC)include 
  • Обратите внимание, что есть перед каждым -I. Это говорит компилятору, что это Include, а не файл библиотеки.
  • .\include указывает на мои файлы .h, которые я сделал. Обратите внимание, что он использует относительный каталог и поэтому предполагает, что моя включает в себя папку, которая видна из того же места, что и мой файл make.
  • Каждый из EVOSDK, EOSSDK и EVOACT, вероятно, будет использоваться во всех ваших проектах
  • EVOVCS, если вы используете CommServer
  • EVOVMAC, если вы используете VMAC (который вы будете, если вы используете CommServer)
  • Если вы не используете VMAC или CommServer, оставьте последние 2.

AppObjects

Для каждого .c файла у вас есть, вы должны скомпилировать его в объект (.o) файл. Вы можете технически свернуть это с помощью Libs ниже, поскольку это действительно то же самое. Единственное различие заключается в том, что вы сделали это; они не являются частью SDK или чего-то еще.

Libs

Libs может выглядеть примерно так:

Libs = $(EOSSDK)\lib\svc_net.o \ 
     $(EOSSDK)\lib\ssl.o \ 
     $(EOSSDK)\lib\ceif.o \ 
     $(EOSSDK)\lib\elog.o \ 
     $(EVOACT)\Output\RV\Files\Static\Release\act2000.a 
  • ceif.o является объектный файл, который вы должны будете использовать вещи, которые определены в ceif.h.
  • Обратите внимание, что в конце каждой строки (кроме последней) есть \. Это просто сказать, что эта линия продолжается. Вы можете так же правильно удалить каждый \ и поместить все это на 1 строку. Это просто для удобства чтения.

Последняя часть, -o $(OutDir)\Project.out просто говорит, где вы хотите вывести результат вашей компиляции.

+0

Когда я включаю '' или '' или '' и компилируем мой код, тогда возникает ошибка при использовании этих библиотек. как я могу добавить эту библиотеку? (я использую эту команду для компиляции моего кода: vrxcc -p test.c, и ошибка не может открыть исходный входной файл «ceif.h»: нет такого файла или каталога) – farshid

+0

спасибо за ваши несколько подсказок, могу ли я получить ваш адрес электронной почты вы хотите отправить мне электронное письмо для получения более подробной информации и ...? – farshid

+0

Как я могу добавить библиотеку ceif.h в свою программу? i включает в мою программу, но это ошибка. – farshid

Смежные вопросы