Files
Mapo-IOB-WIN/IOB-WIN/IobWPS.cs
T
Samuele E. Locatelli d2f27ea717 Typo
2019-04-27 19:06:16 +02:00

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
}
}