<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to HTTP_Client connect to remote site (working code)</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/</id><updated>2020-02-27T13:50:37.728000Z</updated><subtitle>Recent posts to HTTP_Client connect to remote site (working code)</subtitle><entry><title>HTTP_Client connect to remote site (working code)</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/?limit=25#0292" rel="alternate"/><published>2020-02-27T13:50:37.728000Z</published><updated>2020-02-27T13:50:37.728000Z</updated><author><name>tjarcoboerkoel</name><uri>https://forge.codesys.com/u/tjarcoboerkoel/</uri></author><id>https://forge.codesys.comc25414f97bf780264e2a87b61df9b4e479d7e15e</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Oke well I found the bug. The HTTP protocol is very strict and needs multiple CR+LF characters.&lt;br/&gt;
So, for the people who need an HTTP header for simple GET requests.&lt;br/&gt;
You may split up the url into document and arguments, but I didn't need that.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;FUNCTION_BLOCK&lt;/span&gt; &lt;span class="nv"&gt;HttpHeader&lt;/span&gt;
&lt;span class="nv"&gt;VAR_INPUT&lt;/span&gt;
   &lt;span class="nv"&gt;URL&lt;/span&gt;         : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;255&lt;/span&gt;]    :&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/data.xml?arg1=1&amp;amp;arg2=John&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;;  &lt;/span&gt;
   &lt;span class="nv"&gt;HOST&lt;/span&gt;         : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;255&lt;/span&gt;]   :&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;subdomain.domain.org&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="c1"&gt;; &lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR_OUTPUT&lt;/span&gt;
   &lt;span class="nv"&gt;HttpReq&lt;/span&gt;       : &lt;span class="nv"&gt;ARRAY&lt;/span&gt;[&lt;span class="mi"&gt;1&lt;/span&gt;..&lt;span class="mi"&gt;255&lt;/span&gt;] &lt;span class="nv"&gt;OF&lt;/span&gt; &lt;span class="nv"&gt;BYTE&lt;/span&gt;&lt;span class="c1"&gt;;  //Might be changed to a pointer to write to&lt;/span&gt;
   &lt;span class="nv"&gt;HttpReqSize&lt;/span&gt;    : &lt;span class="nv"&gt;UDINT&lt;/span&gt;            :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="c1"&gt;;            //Size of data in HttpReq       &lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;VAR&lt;/span&gt;   
   &lt;span class="nv"&gt;sHttpReq&lt;/span&gt;   : &lt;span class="nv"&gt;STRING&lt;/span&gt;[&lt;span class="mi"&gt;255&lt;/span&gt;]&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;END_VAR&lt;/span&gt;
&lt;span class="nv"&gt;StrToLowerA&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;      //convert to lowercase characters&lt;/span&gt;
&lt;span class="nv"&gt;StrToLowerA&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;      //convert to lowercase characters&lt;/span&gt;
 
&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Standard&lt;/span&gt;.&lt;span class="nv"&gt;CONCAT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GET &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;, &lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Standard&lt;/span&gt;.&lt;span class="nv"&gt;CONCAT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; , &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt; HTTP/1.1$0D$0A&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Standard&lt;/span&gt;.&lt;span class="nv"&gt;CONCAT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; , &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Host: &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Standard&lt;/span&gt;.&lt;span class="nv"&gt;CONCAT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; , &lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Standard&lt;/span&gt;.&lt;span class="nv"&gt;CONCAT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; , &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;$0D$0A&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;  //first CR+LN&lt;/span&gt;
&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Standard&lt;/span&gt;.&lt;span class="nv"&gt;CONCAT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt; , &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;$0D$0A&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;  //second CR+LF (indicates end of feed)&lt;/span&gt;
&lt;span class="nv"&gt;HttpReqSize&lt;/span&gt; :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;DINT_TO_UINT&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;StrLenA&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;ADR&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;HttpReq&lt;/span&gt;      :&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;String_TO_ArrayOfByte&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sHttpReq&lt;/span&gt;, &lt;span class="nv"&gt;TRUE&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Just open a TCP connection to the servers IP where it's hosted at port 80, TCP_send the HttpReq and TCP_read back data (may take some time for the server to respond &amp;gt;500ms).&lt;br/&gt;
You may read twice, because the server will first send the 400 OK header, followed by the requested data/page/file/...&lt;br/&gt;
The Server will shutdown the connection when it's finished (and you know all data has been transferred).&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>HTTP_Client connect to remote site (working code)</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/?limit=25#5408" rel="alternate"/><published>2020-02-27T13:50:37.591000Z</published><updated>2020-02-27T13:50:37.591000Z</updated><author><name>dFx</name><uri>https://forge.codesys.com/u/dfx/</uri></author><id>https://forge.codesys.coma5daf5f11deaa62e54b30f1b6be59a3957ff6e79</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tjarcoboerkoel hat geschrieben:&lt;/strong&gt;&lt;br/&gt;
&lt;span&gt;[…]&lt;/span&gt; and setup the HOST name in the HTTP header.&lt;span&gt;[…]&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Could you detail this ? (I'm not familliar with HTTP)&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>HTTP_Client connect to remote site (working code)</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/?limit=25#1b67" rel="alternate"/><published>2020-02-27T13:50:37.439000Z</published><updated>2020-02-27T13:50:37.439000Z</updated><author><name>tjarcoboerkoel</name><uri>https://forge.codesys.com/u/tjarcoboerkoel/</uri></author><id>https://forge.codesys.com699e0a1a3c1153a7bebafcd188771965fcd3dcdc</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Thnx for your reply.&lt;br/&gt;
No I connect to the IP directly and setup the HOST name in the HTTP header.&lt;br/&gt;
So, I don't need the DNS.&lt;/p&gt;
&lt;p&gt;I am able to connect to the IP from a computer using Putty (Raw TCP) and when I send the content of the HTTP header I DO get the response form the webserver.&lt;/p&gt;
&lt;p&gt;This does not work form the controller, while when I connect to a local webserver it does work.&lt;/p&gt;
&lt;p&gt;I just can;t connect to a public IP-address.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>HTTP_Client connect to remote site (working code)</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/?limit=25#4507" rel="alternate"/><published>2020-02-27T13:50:36.915000Z</published><updated>2020-02-27T13:50:36.915000Z</updated><author><name>dFx</name><uri>https://forge.codesys.com/u/dfx/</uri></author><id>https://forge.codesys.comac6a5c662a608b4e554884135cb9f9bf8b9475e8</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;DNS settings ?&lt;br/&gt;
Gateway allows your PLC to ask for a unknown IP, but not for a name.&lt;br/&gt;
If you use a url with a name (ex: google.com) then it needs to be resolved by a DNS server. &lt;br/&gt;
Use your ISP DNS one or google's one (primary 8.8.8.8, secondary 8.8.4.4)&lt;/p&gt;
&lt;p&gt;Http should correctly passthrough your ISP router.&lt;br/&gt;
Maybe you need a proxy configuration ?&lt;br/&gt;
Check it from a computer accessing internet on the same router.&lt;/p&gt;
&lt;p&gt;Last but not least, start by issuing a ping (from your plc) to check if the service is available.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>HTTP_Client connect to remote site (working code)</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/3335040699/?limit=25#1cdd" rel="alternate"/><published>2020-02-27T13:50:36.777000Z</published><updated>2020-02-27T13:50:36.777000Z</updated><author><name>tjarcoboerkoel</name><uri>https://forge.codesys.com/u/tjarcoboerkoel/</uri></author><id>https://forge.codesys.com09618cedd42a443041ed124d07b7113df89de0b7</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Dear reader,&lt;/p&gt;
&lt;p&gt;I've implemented a HTTP web client for requesting info from public online services.&lt;br/&gt;
As test I'm able to connect to the webserver of a local LAN device and retrieve its webpage by sending a HTTP GET header, works fine.&lt;/p&gt;
&lt;p&gt;Then I tried to connect to a public weather service on apixu.com by setting up a TCP connection to its webserver on 94.237.49.36 port 80.&lt;br/&gt;
But on the public service the code times-out after hanging in the "connecting" state for 5 seconds and never gets connected.&lt;/p&gt;
&lt;p&gt;Is there a route or firewall rule that I need to set?&lt;/p&gt;
&lt;p&gt;The M251 controller interface is configured correctly :&lt;br/&gt;
IP         : 192.168.2.5&lt;br/&gt;
Subn     : 255.255.255.0&lt;br/&gt;
Gateway: 192.168.2.254  (ISP modem)&lt;br/&gt;
Controller    : M251&lt;br/&gt;
Somachine  : 4.1 SP2 (codesys 3.5.3)&lt;br/&gt;
TCP lib used: TcpUdpCommunication (Schneider electric)&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>