15.11.2017 17:06
Пытаюсь опросить СП802-Ф и вытащить длину очереди неотправленных документов. Зацепляюсь, читаю - все ок. Но скрипт потом зависает: такое ощущение, что ожидает от ФР-а EOF, а его все нет и нет...
Что неправильно делаю?
SQL код:
<?php
/* посылает по адресу запрос статуса и получает ответ */
    $Port = 6667;  //порт кассы
    $IpAddr = '192.168.128.172'; //адрес кассы
    $fp = fsockopen($IpAddr, $Port, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br>\n";
    } else {
        
        socket_set_blocking($fp,FALSE);
        $out = '<?xml version="1.0" encoding="UTF-8"?> 
                <ArmRequest><RequestBody><ProtocolLabel>OFDFNARMUKM</ProtocolLabel><ProtocolVersion>10.7</ProtocolVersion><RequestId>{48b9bd0c-a368-4aab-83ec-ba393e90d194}</RequestId> 
                <DateTime>2017-01-19 11:46:20</DateTime><Command>2</Command></RequestBody><RequestData><![CDATA[]]></RequestData></ArmRequest>';
        
        fwrite($fp, $out);
        while (!feof($fp)) {
            echo fgets($fp);
        }
        fclose($fp);
    }    
?>
socket_set_blocking($fp,FALSE); - пробовал и TRUE - нет эффекта...
15.11.2017 17:10
Я с сокетами не работал, там точно не через CURL надо делать?
15.11.2017 17:15
Цитата:
УКМ_эксплуатант_2 что ожидает от ФР-а EOF, а его все нет и нет.
а кто сказал что он там должен быть ?
проверяй в цикле на приход </ArmResponse>

просмотрел сейчас что с сокета приходит - там последние 2-а символа ">" и перевод строки (код 10)
15.11.2017 18:12
Как правильно Олег спросил: зачем геморроиться, если можно курлом?
16.11.2017 11:09
Курл не сработал
SQL код:
<?php
    $url = "http://192.168.128.172:6667";
    $out = '<?xml version="1.0" encoding="UTF-8"?> 
                <ArmRequest><RequestBody><ProtocolLabel>OFDFNARMUKM</ProtocolLabel><ProtocolVersion>10.7</ProtocolVersion><RequestId>{48b9bd0c-a368-4aab-83ec-ba393e90d194}</RequestId> 
                <DateTime>2017-01-19 11:46:20</DateTime><Command>2</Command></RequestBody><RequestData><![CDATA[]]></RequestData></ArmRequest>';
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $result = curl_exec($ch);
    $json=json_decode($result,true);
    print_r($json);    
    curl_close($ch);
?>
16.11.2017 12:20
Что-то я не понял судьбу $out... Присвоил значение и?
16.11.2017 12:34
Цитата:
УКМ_эксплуатант_2 Курл не сработал
ну почему же :) все работает (проверял с командной строки)
надо только на него в опциях таймаут устанавливать на операцию иначе возврата не будет - почему так - х\з

трассировка ответа
12:28:36.359000 == Info: Rebuilt URL to: 192.168.10.30:6667/
12:28:36.359000 == Info: Trying 192.168.10.30...
12:28:36.375000 == Info: Connected to 192.168.10.30 (192.168.10.30) port 6667 (#0)
12:28:36.437000 => Send header, 212 bytes (0xd4)
0000: POST / HTTP/1.1
0011: Host: 192.168.10.30:6667
002b: User-Agent: curl/7.45.0
0044: Accept: */*
0051: Content-Length: 594
0066: Expect: 100-continue
007c: Content-Type: multipart/form-data; boundary=--------------------
00bc: ----f46ae6990e41a956
00d2:
12:28:36.734000 <= Recv data, 531 bytes (0x213)
0000: <?xml version="1.0" encoding="UTF-8"?><ArmResponse><ResponseBody
0040: ><ProtocolLabel>OFDFNARMUKM</ProtocolLabel><ProtocolVersion>10.9
0080: </ProtocolVersion><RequestId>{3ed7bfee-f2fd-4c57-8462-271a32e2d0
00c0: 15}</RequestId><Result>1</Result><ErrorCategory>5</ErrorCategory
0100: ><ErrorSource>POS_CONTROLLER</ErrorSource><ErrorCode>5003</Error
0140: Code><ErrorDescription>Incorrect KKT command protocol data: Inc
0180: omplete data - start tag &quot;&lt;?xml version=&quot;1.0&quot;
01c0: encoding=&quot;UTF-8&quot;?&gt;&quot; not found . xml data:&quo
0200: t;POST / HTTP/1.1
12:28:36.734000 <= Recv data, 314 bytes (0x13a)
0000: Host: 192.168.10.30:6667
001a: User-Agent: curl/7.45.0
0033: Accept: */*
0040: Content-Length: 594
0055: Expect: 100-continue
006b: Content-Type: multipart/form-data; boundary=--------------------
00ab: ----f46ae6990e41a956
00c1:
00c3: &quot;</ErrorDescription><Command>1006</Command></ResponseBody><
0103: ResponseData><![CDATA[]]></ResponseData></ArmResponse>.
12:28:38.437000 == Info: Done waiting for 100-continue
12:28:38.453000 => Send data, 144 bytes (0x90)
0000: --------------------------f46ae6990e41a956
002c: Content-Disposition: form-data; name="xml_file"; filename="1.xml
006c: "
006f: Content-Type: application/xml
008e:
12:28:38.453000 => Send data, 402 bytes (0x192)
0000: ...<?xml version="1.0" encoding="UTF-8"?>
002c: <ArmRequest>
003b: <RequestBody>
004d: <ProtocolLabel>OFDFNARMUKM</ProtocolLabel>
007e: <ProtocolVersion>10.9</ProtocolVersion>
00ac: <RequestId>{48b9bd0c-a368-4aab-83ec-ba393e90d194}</RequestId
00ec: >
00f0: <DateTime>2017-01-19 11:46:20</DateTime>
011f: <Command>2</Command>
013a: </RequestBody>
014d: <RequestData>
015f: <![CDATA[]]>
0172: </RequestData>
0185: </ArmRequest>
12:28:38.453000 => Send data, 48 bytes (0x30)
0000:
0002: --------------------------f46ae6990e41a956--
12:28:38.859000 <= Recv data, 1475 bytes (0x5c3)
0000: <?xml version="1.0" encoding="UTF-8"?><ArmResponse><ResponseBody
0040: ><ProtocolLabel>OFDFNARMUKM</ProtocolLabel><ProtocolVersion>10.9
0080: </ProtocolVersion><RequestId>{48b9bd0c-a368-4aab-83ec-ba393e90d1
00c0: 94}</RequestId><Result>0</Result><ErrorCategory>0</ErrorCategory
0100: ><ErrorSource>FN_CONTROLLER</ErrorSource><ErrorCode>0</ErrorCode
0140: ><ErrorDescription></ErrorDescription><Command>3</Command></Resp
0180: onseBody><ResponseData><![CDATA[<ArmGetStatus><LastCommand>33423
01c0: 84</LastCommand><LastCommandStatus>55</LastCommandStatus><LastCo
0200: mmandExecTime>2687026</LastCommandExecTime><NetworkInterface>eth
0240: 0 MAC=B8:27:EB:11:62:AC IP=192.168.10.30</NetworkInterface><
0280: PaperWidth>63</PaperWidth><KKTFWVersion>008.18.262</KKTFWVersion
02c0: ><FNStatus><LifePhase>3</LifePhase><CurrentDocType>0</CurrentDoc
0300: Type><CurrentDocData>0</CurrentDocData><ShiftState>1</ShiftState
0340: ><StatusNeedChange>0</StatusNeedChange><StatusEndingResource>0</
0380: StatusEndingResource><StatusOverflow>0</StatusOverflow><StatusOv
03c0: erdueSending>0</StatusOverdueSending><LastDocDateTime></LastDocD
0400: ateTime><LastDocNumber>1322</LastDocNumber><FactoryNum>999907890
0440: 0005220</FactoryNum><ExpirationDate>2018-04-04 00:00:00</Expirat
0480: ionDate><FWVersion>fn debug v 1.33</FWVersion></FNStatus><OFDSta
04c0: tus><ExchangeStatus>1</ExchangeStatus><MessageReadStarted>0</Mes
0500: sageReadStarted><QueueLength>0</QueueLength><FirstQueueDocNumber
0540: >0</FirstQueueDocNumber><FirstQueueDocDateTime></FirstQueueDocDa
0580: teTime></OFDStatus></ArmGetStatus>]]></ResponseData></ArmRespons
05c0: e>.
12:29:16.359000 == Info: Operation timed out after 40000 milliseconds with 2320 bytes received
12:29:16.359000 == Info: Closing connection 0
20.11.2017 13:32
Сделал по рекомендации student:
SQL код:
проверяй в цикле на приход </ArmResponse> 
Теперь проблема с разбором ответа:
Делаю так:
SQL код:
//$Stroka - ответ, полученный от ФР-а
$xml = simplexml_load_string($Stroka);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
var_dump($array); print "\n\n\n"; 
Показывает:
SQL код:
array(2) {
  ["ResponseBody"]=>
  array(9) {
    ["ProtocolLabel"]=>
    string(11) "OFDFNARMUKM"
    ["ProtocolVersion"]=>
    string(4) "10.7"
    ["RequestId"]=>
    string(38) "{993C603A-48A5-45F7-9C44-10E6A5CB81CA}"
    ["Result"]=>
    string(1) "0"
    ["ErrorCategory"]=>
    string(1) "0"
    ["ErrorSource"]=>
    string(13) "FN_CONTROLLER"
    ["ErrorCode"]=>
    string(1) "0"
    ["ErrorDescription"]=>
    array(0) {
    }
    ["Command"]=>
    string(1) "3"
  }
  ["ResponseData"]=>
  array(0) {
  }
} 
ResponseData - пустой, хотя данные точно есть.
Неужели придется "лапками" вырезать?

З.Ы. А тут есть возможность "сворачивать" длинные исходники под спойлер?
20.11.2017 13:59
ты не
Цитата:
УКМ_эксплуатант_2 $array
покажи а сам ответ целиком
Цитата:
УКМ_эксплуатант_2 //$Stroka - ответ, полученный от ФР-а
возможно что твои енкод и декод не так как надо отрабатывают :)
20.11.2017 14:06
Цитата:
УКМ_эксплуатант_2 ...
З.Ы. А тут есть возможность "сворачивать" длинные исходники под спойлер?
Минимум два варианта:

[spl=Опция]значение[/spl]
Пример [spl=End of the Game]Cloud kills Sepiroth[/spl]
End of the Game:
Cloud kills Sepiroth


[off]значение[/off]
Пример [off]Пример[/off]
скрытое
Часовой пояс GMT +3, время: 07:48.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.