User Tools

Site Tools


integration_with_other_systems

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
integration_with_other_systems [2020/05/22 10:14] – [GET example] emozolyakintegration_with_other_systems [2024/04/04 10:18] (current) – [Troubleshooting CURL requests from WebHMI] emozolyak
Line 7: Line 7:
 ===== POST example ===== ===== POST example =====
  
-An example of a program executing an HTTPS request to send data as a file at URL https://demo.com/upload:+An example of a program executing an HTTPS request to send data as a file at URL https://example.com/upload:
  
 <code lua> <code lua>
Line 15: Line 15:
  
   c = cURL.easy_init()   c = cURL.easy_init()
-  c:setopt_url("https://demo.com/upload")+  c:setopt_url("https://example.com/upload")
   c:setopt_timeout(5)   c:setopt_timeout(5)
  
Line 56: Line 56:
 ===== Implementing other requests like PUT ===== ===== Implementing other requests like PUT =====
  
-To implement other requests, you can indicate for cURL call that you need custom request+To implement other requests, you can use special field in the cURL for the custom methods. 
 + 
 +Here is the example of PUT request to WebHMI itself from its Lua. 
  
 <code lua> <code lua>
 +
 function main (userId) function main (userId)
-  +  local new_value = "new string" 
-    INFO("Doing CURL"); +  write_reg_with_API(1, new_value
-  +end 
-  str = ''  + 
-  +function write_reg_with_API(reg_id, val_) 
 +    
   c = cURL.easy_init()   c = cURL.easy_init()
-  c:setopt_url("http://192.168.1.230:8000") 
-  c:setopt_timeout(15) 
-  c:setopt{[cURL.OPT_CUSTOMREQUEST] = "PUT" -- this is custom method 
      
-  c:setopt{ +  c:setopt_url("http://127.0.1.1/api/register-values/" .. reg_id)    -- local host addr indicated 
-        [cURL.OPT_POSTFIELDS] = 'Content-typetext/html+  c:setopt_timeout(2) 
-  } +   
-  c:post({'THIS IS CONTENT OF THE PUT'}) +  c:setopt{[cURL.OPT_CUSTOMREQUEST] = "PUT"} 
-  c:perform({writefunction = function(res) str = res end })+  c:setopt{[cURL.OPT_POSTFIELDS]    = '{"value":".. val_ .. '"}'  -- insert value here 
 +   
 +  c:setopt_httpheader({ 
 +      'Content-type: application/json'
 +      'Accept: application/json', 
 +      'X-WH-APIKEY: 976FA578CF3B11ADA06564464B1F01823AF81C3D'         -- check APIKEY 
 +  }) 
 +   
 +  c:perform({writefunction = function(res) str = res end })           -- you can print str for debug purposes 
   c:close()   c:close()
 +end 
  
-  INFO("CURL done\n" .. str); 
-end 
 </code> </code>
 ===== Example - connecting to a remote module via its web server ===== ===== Example - connecting to a remote module via its web server =====
Line 87: Line 95:
 For a example we have the UC20-FBC-xxx (any bus Modubs, Ethernet/IP, DeviceNet etc) remote I/O module from Weidmuller. The module has web server for diagnostinc and setup: For a example we have the UC20-FBC-xxx (any bus Modubs, Ethernet/IP, DeviceNet etc) remote I/O module from Weidmuller. The module has web server for diagnostinc and setup:
  
-{{ ::uremote_config_page.gif?direct&600 |}}+{{ network:uremote_config_page.gif?direct&600 |}}
  
 On this page you press **F12** to get necesssary information for the POST request: On this page you press **F12** to get necesssary information for the POST request:
  
-{{ ::post_info_out.png?direct&600 |}}+{{ network:post_info_out.png?direct&600 |}}
  
 Then, use this information for POST request in Lua script on the WebHMI: Then, use this information for POST request in Lua script on the WebHMI:
  
-{{ ::post_lua_example2.gif?direct&600 |}}+{{ network:post_lua_example2.gif?direct&600 |}}
  
 The function returns json object which you can then analize and check necessary fileds to read: The function returns json object which you can then analize and check necessary fileds to read:
  
-{{ ::json_viewer.png?direct&600 |}}+{{ network:json_viewer.png?direct&600 |}} 
 + 
 +===== Notes on cURL usage ===== 
 + 
 +<WRAP center round important 80%> 
 +In the fw of 4.0 version, the following issue was reported: 
 +When there are multiple cURL requests from the WebHMI to the unavailable resource, a system crash may happen. The timeout settings won't affect the sysem behaviour. Use this feature with care when you need cyclical calls of multiple cURLs in your scripts: 
 +  * use one script which detect availablity of the resource and locks following execution for a while 
 +  * use external watchdog circuit to reset WebHMI if you use it to control mission - critical system.  
 + 
 +If the curl stability is the issue in your project, you can implement HTTP requests using custom protocol. See the [[http_get_custom |example]] 
 +</WRAP> 
 + 
 +==== HTTP / HTTPS requests ==== 
 +<WRAP center round info 80%> 
 +Please note that HTTPS requests are only possible in **WebHMI Pro** version and virtualization images. 
 +</WRAP> 
 + 
 +==== Troubleshooting CURL requests from WebHMI ==== 
 + 
 +When troubleshooting your requests, you can turn on verbose information in your script. Please refer to the example below: 
 + 
 +<code lua> 
 +function main (userId) 
 +    local res = ""     
 +    local c = cURL.easy_init() 
 +    c : setopt{ url = 'http://danepubliczne.imgw.pl/api/data/hydro/id/153160210', 
 +              timeout = 30,  
 +              httpheader = {'Accept: application/json', 
 +                            'Content-Type: gzip, deflate, br', 
 +                            -- 'Host: <calculated when request is sent>', 
 +                        } 
 +             } 
 +      
 +     -- sw on verbose info  
 +     c : setopt{[cURL.OPT_VERBOSE] = 1}   
 +     c : setopt{[cURL.OPT_DEBUGFUNCTION] = function(...)  
 +                for i, v in pairs(arg) do DEBUG(i .. ' ' .. v) end  
 +                return 0 
 +         end }   
 +      
 +     c : perform{writefunction = function(str) 
 +                res = res .. str 
 +            end} 
 +        c : close() 
 +      
 +        INFO(res) 
 +        if (res == '') or (res == '%[%]')then  
 +            ERROR('No data in response!')  
 +        else  
 +            INFO('\n' .. res)  
 +        end 
 +end 
 +</code> 
 + 
 + 
  
integration_with_other_systems.1590142441.txt.gz · Last modified: 2020/05/22 10:14 by emozolyak

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki