215 lines
7.0 KiB
C#
215 lines
7.0 KiB
C#
using IOB_UT;
|
|
using Newtonsoft.Json;
|
|
using OpenQA.Selenium;
|
|
using OpenQA.Selenium.Firefox;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Net.NetworkInformation;
|
|
//using OpenQA.Selenium.Chrome;
|
|
|
|
namespace IOB_WIN
|
|
{
|
|
/// <summary>
|
|
/// Generica classe per implementare WebPageScraping (scaricamento web pages anche js-based x recupero informazioni)
|
|
/// </summary>
|
|
public class IobWPS : IobGeneric
|
|
{
|
|
/* --------------------------------------------------------------------------------
|
|
* Controlli dotati di GENERICA pagina WEB in cui cercare e recuperare informazioni
|
|
*
|
|
* - il file di conf deve contenere l'URL di base
|
|
* - il file di conf deve contenere COSA cercare (es il "contenitore" del dato da estrarre)
|
|
*
|
|
* -------------------------------------------------------------------------------- */
|
|
|
|
/// <summary>
|
|
/// Pagina web da scaricare
|
|
/// </summary>
|
|
protected string baseUri = "http://192.168.1.55";
|
|
/// <summary>
|
|
/// Array di configurazione degli oggetti da cercare x decodifica e recupero info
|
|
/// </summary>
|
|
protected Dictionary<string, string> dataLocatorLUT;
|
|
/// <summary>
|
|
/// Driver per gestione chiamate crawling/scraping
|
|
/// </summary>
|
|
protected FirefoxDriver driver;
|
|
|
|
/// <summary>
|
|
/// Oggetti decodificati da pagina
|
|
/// </summary>
|
|
protected MonitoredItemsConf monitoredItems;
|
|
/// <summary>
|
|
/// Elementi da recuperare nella apgina web
|
|
/// </summary>
|
|
protected IWebElement element;
|
|
|
|
/// <summary>
|
|
/// Estende l'init della classe base...
|
|
/// </summary>
|
|
/// <param name="caller"></param>
|
|
/// <param name="adpConf"></param>
|
|
public IobWPS(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
|
|
{
|
|
// preparo opzione headless x firefox
|
|
var o = new FirefoxOptions();
|
|
o.AddArgument("-headless");
|
|
driver = new FirefoxDriver(Environment.CurrentDirectory, o);
|
|
// aggiungo timeout x JScripts
|
|
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);
|
|
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(15);
|
|
// impostazione URI di base
|
|
baseUri = $"http://{IOBConf.cncIpAddr}";
|
|
#if DEBUG
|
|
// test completo funzionalità, da TOGLIERE in prod...
|
|
baseUri = "https://www.plus2net.com/javascript_tutorial/clock.php";
|
|
#endif
|
|
// imposto pagina di acquisizione
|
|
driver.Navigate().GoToUrl(baseUri);
|
|
|
|
// inizializzo LUT decodifica
|
|
string jsonConf = getOptPar("LUT_CONF");
|
|
if (jsonConf != "")
|
|
{
|
|
StreamReader reader = new StreamReader($"DATA/CONF/{jsonConf}");
|
|
string jsonData = reader.ReadToEnd();
|
|
if (jsonData != "")
|
|
{
|
|
try
|
|
{
|
|
monitoredItems = JsonConvert.DeserializeObject<MonitoredItemsConf>(jsonData);
|
|
}
|
|
catch(Exception exc)
|
|
{
|
|
lgError(exc, "Eccezione in decodifica conf json");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Override x chiusura driver...
|
|
/// </summary>
|
|
/// <param name="tryRestart"></param>
|
|
/// <param name="forceDequeue"></param>
|
|
public override void stopAdapter(bool tryRestart, bool forceDequeue)
|
|
{
|
|
// in primis chiudo driver...
|
|
driver.Quit();
|
|
// continuo
|
|
base.stopAdapter(tryRestart, forceDequeue);
|
|
}
|
|
|
|
public override void tryConnect()
|
|
{
|
|
// controllo ping --> segno connected...
|
|
connectionOk = (testPing() == IPStatus.Success);
|
|
// se debug --> true!
|
|
}
|
|
|
|
public override void tryDisconnect()
|
|
{
|
|
connectionOk = false;
|
|
}
|
|
|
|
|
|
#region Metodi specifici (da verificare/completare in implementazione)
|
|
|
|
/// <summary>
|
|
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
|
|
/// </summary>
|
|
public override void processOverride()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Recupero dati dinamici in formato dictionary
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public override Dictionary<string, string> getDynData()
|
|
{
|
|
lgInfo("Chiamata getDynData x IOB WebPageScraping!");
|
|
Dictionary<string, string> outVal = new Dictionary<string, string>();
|
|
try
|
|
{
|
|
/* ----------------------------------------------------------
|
|
* Recupero dalla TUTTE le chiavi richieste...
|
|
* */
|
|
|
|
// recupero pagina base
|
|
//driver.Navigate().GoToUrl(baseUri);
|
|
|
|
string cKey = "";
|
|
string cVal = "";
|
|
// processo tutti i DynData...
|
|
foreach (var item in monitoredItems.DynData)
|
|
{
|
|
// cerco elemento indicato
|
|
element = driver.FindElement(By.Id(item.val));
|
|
cVal = element.Text;
|
|
// verifico nome o key...
|
|
if(item.name!="")
|
|
{
|
|
cKey= item.name;
|
|
}
|
|
else
|
|
{
|
|
element = driver.FindElement(By.Id(item.key));
|
|
cKey = element.Text;
|
|
}
|
|
// accodo!
|
|
outVal.Add(cKey, cVal);
|
|
}
|
|
#if false
|
|
double pressCamFilt = S7.Net.Types.Double.FromByteArray(RawInput.Skip(6).Take(4).ToArray());
|
|
double pressLinUt = S7.Net.Types.Double.FromByteArray(RawInput.Skip(10).Take(4).ToArray());
|
|
double tempH2O = S7.Net.Types.Double.FromByteArray(RawInput.Skip(14).Take(4).ToArray());
|
|
|
|
if (utils.CRB("enableTSVC"))
|
|
{
|
|
// salvo in stack le VC rilevate
|
|
bool scad01 = stackVal_TSVC("pressCamFilt", pressCamFilt);
|
|
bool scad02 = stackVal_TSVC("pressLinUt", pressLinUt);
|
|
bool scad03 = stackVal_TSVC("tempH2O", tempH2O);
|
|
|
|
// verifico SE devo riportare dati VC
|
|
if (scad01 || scad02 || scad03)
|
|
{
|
|
pressCamFilt = getVal_TSVC("pressCamFilt", scad01);
|
|
pressLinUt = getVal_TSVC("pressLinUt", scad02);
|
|
tempH2O = getVal_TSVC("tempH2O", scad03);
|
|
outVal.Add("DYNDATA", $"pressCamFilt {pressCamFilt:N6} | pressLinUt {pressLinUt:N6} | tempH2O {tempH2O:N3}");
|
|
outVal.Add("pressCamFilt", $"{pressCamFilt:N6}");
|
|
outVal.Add("pressLinUt", $"{pressLinUt:N6}");
|
|
outVal.Add("tempH2O", $"{tempH2O:N3}");
|
|
// salvo!
|
|
LastTSVC["pressCamFilt"] = pressCamFilt;
|
|
LastTSVC["pressLinUt"] = pressLinUt;
|
|
LastTSVC["tempH2O"] = tempH2O;
|
|
}
|
|
else
|
|
{
|
|
outVal.Add("DYNDATA", $"pressCamFilt {LastTSVC["pressCamFilt"]:N6} | pressLinUt {LastTSVC["pressLinUt"]:N6} | tempH2O {LastTSVC["tempH2O"]:N3}");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
outVal.Add("pressCamFilt", $"{pressCamFilt:N6}");
|
|
outVal.Add("pressLinUt", $"{pressLinUt:N6}");
|
|
outVal.Add("tempH2O", $"{tempH2O:N3}");
|
|
outVal.Add("DYNDATA", $"pressCamFilt {pressCamFilt:N3} | pressLinUt {pressLinUt:N3} | tempH2O {tempH2O:N3}");
|
|
}
|
|
#endif
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
lgError(exc, "Errore in getDynData x IOB WPS");
|
|
}
|
|
return outVal;
|
|
}
|
|
|
|
|
|
#endregion
|
|
}
|
|
}
|