2013-12-13 3 views
1

Ruby novice. Первый пост так извините за недостатки любого коммуникационного протокола :)отправить xml данные через гнездо с сообщением (VLI) Ruby

Этот сайт был большой помощью и «ОГРОМНЫМ !!!». крик благодарности всем.

Мне нужно подключить свое приложение для рельсов к поставщикам электроэнергии, чтобы я мог продавать электроэнергию своим веб-клиентам. Я нуждающихся в помощи, чтобы просто получить первоначальный запрос, отправленный на API

IP: 41.204.194.188 Порт: 8945

Первый блок: Что такое сообщение индикаторная переменная длина (ВЛИ)?

«2 байта предшествует каждому сообщению, отправленному в/из BizSwitch. 2 байта называются индикаторами переменной длины. Байты 1-2 указывают количество байтов в сообщении (исключая первые 2 байта). байты представляют собой 16-битное целое число без знака в сетевом байтовом порядке. Обратите внимание, что если отправляется сжатое сообщение, сообщение должно быть сначала сжато для определения его длины перед отправкой ».

Игнорировать сжатие.

ссылка апи документ: https://dl.dropboxusercontent.com/u/3815995/Ipay-prepaidElecTransactionSpec.pdf

Простой пример Венд Запрос:

<ipayMsg client="ipay" term="1" seqNum="0" time="2002-05-16 10:55:30 +0200"> 
<elecMsg ver="2.37"> 
<vendReq> 
<ref>136105500001</ref> 
<amt cur="ZAR">11400</amt> 
<numTokens>1</numTokens> 
<meter>A12C3456789</meter> 
<payType>cash</payType> 
</vendReq > 
</elecMsg> 
</ipayMsg> 

Простой Венд Response Пример

<ipayMsg client="ipay" term="1" seqNum="0" time="2002-05-16 10:55:35 +0200"> 
<elecMsg ver="2.37" 
<vendRes> <ref>136105500001</ref> 
<res code="elec000">OK</res> 
<util addr="Megawatt Park, Contact Centre tel 086-003-7566" taxRef="4740101508" distId="6004708001509">Eskom Online</util> 
<stdToken units="346.34" rctNum="12345678" amt="10000" tax="1400">123456789</stdToken> 
<rtlrMsg>060000 Warning: This meter is not configured for FBE.</rtlrMsg> 
<customerMsg>Meter not registered for Free Basic Electricity. Please apply at your local office.</customerMsg> 
</vendRes> 
</elecMsg> 
</ipayMsg> 

Я получил это далеко, и я, кажется, связан, но как Я действительно отправляю и получаю ответы? Я пробовал поиск в Google, но еще не нашел, как отправить XML-пакет, а затем получить ответ.

#!/usr/bin/env ruby 
require 'socket' 

begin 
socket = TCPSocket.new('41.204.194.188', 8945) 
rescue => e 
puts "error: #{e}" 
else 
puts "connected" 
end 
socket.close 

Поблагодарили бы за помощь или подталкивание в правильном направлении.

С наилучшими пожеланиями,

Джейми

ответ

0

Great я понял это. Основная проблема, связанная с сообщением в сокете, заключалась в отправке индикатора переменной длины сообщения. Это StackOverflow вопрос поставил меня на путь записи «Ruby - How to represent message length as 2 binary bytes»

Шаг 1: определить длину моего XML длина сообщения = message.size

Первое поле в заголовке должно быть длина сообщения, которое определяется как длина двоичного байта 2 в байтовом порядке сети.

Шаг 2: message_variable_length_indicator = [длина] .pack ("п")

Шаг 3: Подключение к гнезду streamSock = TcpSocket :: новый ('41 .204.194.188' , 8945)

Шаг 4 : streamSock.write (message_variable_length_indicator)

Шаг 5: streamSock.write (сообщение)

Шаг 6: получить ответ Str = streamSock.recvfrom (1000)

Теперь дело с тайм-аутом, но по крайней мере я подключение :)

0

Я сделал это в PHP может быть, вы получите представление из ниже кода работаю отлично его для моей просьбы.

function sendSocketRequest($XmlString, $Socket_Request) { 
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) { 
     $errorcode = socket_last_error(); 
     $errormsg = socket_strerror($errorcode); 
     die("Couldn't create socket: [$errorcode] $errormsg \n"); 
    } 

    if (!socket_connect($sock, $Socket_Request['HostName'], $Socket_Request['Port'])) { 
     $errorcode = socket_last_error(); 
     $errormsg = socket_strerror($errorcode); 
     die("Could not connect: [$errorcode] $errormsg \n"); 
    } 

    $status = socket_write($sock, pack_int32be(strlen($XmlString)), 4); 
    $status = socket_write($sock, $XmlString, strlen($XmlString)); 
    $response = socket_read($sock, $this->_socketReadLength); 

    socket_close($sock); 
    return substr($response, 2); 
} 

function pack_int32be($i) { 
    if ($i < -2147483648 || $i > 2147483647) { 
     die("Out of bounds"); 
    } 
    return pack('C4', ($i >> 24) & 0xFF, ($i >> 16) & 0xFF, ($i >> 8) & 0xFF, ($i >> 0) & 0xFF 
    ); 
} 
$socketResponse = sendSocketRequest($yourXMLString, array('HostName'=>'<HostName>','Port'=>'<Port>'); 
Смежные вопросы