Scada Desenvolvedores

16
- CERTI SCADABR Página inicial minicursos Desenvolvimento API ScadaBR Checklist ScadaBR 0.8 Distribuição GUI Infra de TI Middleware Protocolos Testes de Performance Utilização dos CLPs Video Aulas Documento de Referência do ScadaBR Glossário Mango Outros Scada's Open Source Mango OpenScada Testes Mango Sitemap Página inicial > minicursos > 2 - desenvolvedores - scadabr Abrindo o ScadaBR para desenvolvimento (Eclipse - Java) Desenvolvimento de protocolos 1. Introdução 1.1 Informações gerais A arquitetura do ScadaBR não oferece uma maneira totalmente flexível de se adicionar novos protocolos no sentido de que, além de adicionar as classes do novo protocolo em si, outras classes gerais e também alguns arquivos de configuração devem ser modificados, de modo que uma nova compilação do sistema é exigida. As alterações nos arquivos compartilhados, no entanto, são simples e as classes que dão apoio à implementação do protocolo em si estão muito bem arranjadas de modo que as funcionalidades comuns a todos os protocolos estão centralizadas em superclasses e evitam a repetição de código, fazendo com que seja necessário apenas codificar aquilo que é específico ao protocolo em si. O desenvolvimento de um novo protocolo para o ScadaBR envolve duas partes bem distintas: a implementação do código Java e a implementação da interface gráfica. Estas duas partes serão abordadas separadamente. 1.2 Requisitos 1.3 Este documento Parte 1 - Implementando o código JAVA 2. O modelo de objetos O ScadaBR faz uma separação clara entre as classes necessárias na implementação de um protocolo: VO (Virtual Object) e RT (Runtime Object). As classes VO se encontram nos pacotes br.org.scadabr.vo.dataSource (e com.serotonin.mango.vo.dataSource) e são responsáveis pelas características estáticas de um protocolo, como as suas propriedades, métodos de validação, métodos de configuração dos alarmes e de serialização/desserialização dos parâmetros para persistência no banco de dados. As classes RT se encontram nos pacotes br.org.scadabr.rt.dataSource (e com.serotonin.mango.rt.dataSource) e são responsáveis pela implementação das funcionalidades dinâmicas dos protocolos, como a forma de polling e atualização dos dados e o método de escrita de valores. Outra separação feita entre as classes é em relação aos datasources e aos datapoints, isto é: existem classes que representam os datasources e suas configurações gerais e classes que representam os datapoints associados. O desenvolvimento do protocolo no ScadaBR exige, portanto, a implementação de 4 tipos de classes: NovoDataSourceVO e NovoDataSourceRT e NovoPointVO e NovoPointRT. 2.1. Os objetos VO (Virtual Objects) Os objetos do tipo NovoDataSourceVO possuem métodos simples de configuração de suas características (parâmetros, alarmes, eventos) e devem conter os parâmetros específicos de cada datasource, com os gets e set associados. Os objetos do tipo NovoPointVO são similares, devendo também conter os parâmetros específicos de cada datapoint do protocolo sendo implementado. Os objetos VO é que realizarão a persistência do datasource (e datapoints) quando configurado e salvo no ScadaBR. Esta persistência se dá nas tabelas datasources e datapoints. Pesquisar o site Page 1 / 16 scadabr-desenvolvedores-2 - CERTI - SCADABR 13/12/2012 https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Transcript of Scada Desenvolvedores

Page 1: Scada Desenvolvedores

-CERTISCADABR

Página inicialminicursos

DesenvolvimentoAPI ScadaBR

Checklist ScadaBR0.8

DistribuiçãoGUI

Infra de TI

MiddlewareProtocolos

Testes dePerformance

Utilização dos CLPsVideo Aulas

Documento deReferência doScadaBR

Glossário

Mango

Outros Scada's OpenSource

MangoOpenScada

Testes Mango

Sitemap

Página inicial > minicursos >

2-desenvolvedores-scadabr

Abrindo o ScadaBR para desenvolvimento (Eclipse - Java)

Desenvolvimento de protocolos

1. Introdução

1.1 Informações geraisA arquitetura do ScadaBR não oferece uma maneira totalmente flexível de se adicionar novos protocolos

no sentido de que, além de adicionar as classes do novo protocolo em si, outras classes gerais e tambémalguns arquivos de configuração devem ser modificados, de modo que uma nova compilação do sistema éexigida.

As alterações nos arquivos compartilhados, no entanto, são simples e as classes que dão apoio àimplementação do protocolo em si estão muito bem arranjadas de modo que as funcionalidades comuns atodos os protocolos estão centralizadas em superclasses e evitam a repetição de código, fazendo com queseja necessário apenas codificar aquilo que é específico ao protocolo em si.

O desenvolvimento de um novo protocolo para o ScadaBR envolve duas partes bem distintas: aimplementação do código Java e a implementação da interface gráfica. Estas duas partes serão abordadasseparadamente.

1.2 Requisitos

1.3 Este documento

Parte 1 - Implementando o código JAVA

2. O modelo de objetosO ScadaBR faz uma separação clara entre as classes necessárias na implementação de um protocolo:

VO (Virtual Object) e RT (Runtime Object).As classes VO se encontram nos pacotes br.org.scadabr.vo.dataSource (e

com.serotonin.mango.vo.dataSource) e são responsáveis pelas características estáticas de um protocolo,como as suas propriedades, métodos de validação, métodos de configuração dos alarmes e deserialização/desserialização dos parâmetros para persistência no banco de dados.

As classes RT se encontram nos pacotes br.org.scadabr.rt.dataSource (ecom.serotonin.mango.rt.dataSource) e são responsáveis pela implementação das funcionalidadesdinâmicas dos protocolos, como a forma de polling e atualização dos dados e o método de escrita devalores.

Outra separação feita entre as classes é em relação aos datasources e aos datapoints, isto é: existemclasses que representam os datasources e suas configurações gerais e classes que representam osdatapoints associados. O desenvolvimento do protocolo no ScadaBR exige, portanto, a implementação de 4 tipos de classes:NovoDataSourceVO e NovoDataSourceRT e NovoPointVO e NovoPointRT.

2.1. Os objetos VO (Virtual Objects)Os objetos do tipo NovoDataSourceVO possuem métodos simples de configuração de suas

características (parâmetros, alarmes, eventos) e devem conter os parâmetros específicos de cadadatasource, com os gets e set associados. Os objetos do tipo NovoPointVO são similares, devendotambém conter os parâmetros específicos de cada datapoint do protocolo sendo implementado.

Os objetos VO é que realizarão a persistência do datasource (e datapoints) quando configurado e salvono ScadaBR. Esta persistência se dá nas tabelas datasources e datapoints.

Pesquisar o site

Page 1 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 2: Scada Desenvolvedores

Como não existem tabelas "personalizadas" para cada protocolo, que sempre possui configuraçõesespecíficas, estas informações são serializadas e persistidas em um campo do tipo BLOB nas tabelas. Osmétodos de serialização e desserialização devem ser escritos pelo desenvolvedor do protocolo, como serávisto adiante, e requerem muito cuidado em sua implementação.

2.2. Os objetos RT (Runtime Objects)Os objetos do tipo NovoDataSourceRT e NovoPointRT apenas implementam os métodos que fazem

parte da dinâmica do funcionamento do protocolo.Os métodos que iniciam e param o datasource deverão ser implementados nesses objetos. As ações

que cada datasource realizará para atualizar o valor de seus pontos (requisição dos dados e atualizaçãodos valores) também se encontram nestes objetos, bem como o método que será requisitado ao se realizarum comando de escrita.

2.3 As superclassesOs parâmetros e comportamentos que são comuns a todos os datasources bem como os métodos que

devem obrigatoriamente ser implementados estão localizados nas superclasses principais:com.serotonin.mango.vo.dataSource.DataSourceVO,com.serotonin.mango.vo.dataSource.AbstractPointLocatorVO,com.serotonin.mango.rt.dataSource.PollingDataSource ecom.serotonin.mango.rt.dataSource.PointLocatorRT.

Na prática, a classe NovoDataSourceVO deverá estender DataSourceVO, NovoPointVO estenderAbstractPointLocatorVO, NodoDataSourceRT estender PollingDataSource e NovoPointRT estenderPointLocatorRT.

3 Outras alterações necessáriasalterações em MangoContextListener e DataSourceVO

Parte 2 - Implementando a Interface Gráfica (GUI)

IntroduçãoO ScadaBR utiliza diversas tecnologias e frameworks em sua implementação. As ferramentas

envolvidas na interface gráfica são: Java/JSP, Ajax/DWR, Spring MVC, JavaScript/Dojo e HTML.Para criar interfaces gráficas é recomendado que se tenha boas noções sobre desenvolvimento WEB,

com foco em HTML, para criar a tela, e JavaScript para realizar a comunicação com o servidor. Um entendimento de todo o funcionamento desse sistema não é necessário. Recomenda-se copiar osarquivos (.jsp) de implementações de outro protocolo e apenas alterar o que for necessário.

Assim como na criação do código Java para um determinado protocolo, o ScadaBR também ofereceuma arquitetura que facilita (em partes) a criação de interfaces gráficas, com várias das funcionalidadescomuns já implementadas. A seguir serão detalhados os principais componentes envolvidos nesteprocesso.

Configurações geraiscomo configurar em dataSourceList, avisar que em DataSourceVO tem que estar como true para

aparecer na lista.quais pastas os arquivos (web-inf/jsp/datasources.), etc

A lista de protocolos que aparece na interface gráfica do ScadaBR está definida no arquivoWebContent/WEB-INF/jsp/dataSourceEdit.jsp.

. . .<c: when t est =" ${ dat aSour ce. t ype. i d == appl i cat i onScope[ ' const ant s. Dat aSour ceVO. Types. M_BUS' ] } " >

<j sp: i nc l ude page=" dat aSour ceEdi t / edi t MBus. j sp" / ></ c: when><c: when t est =" ${ dat aSour ce. t ype. i d == appl i cat i onScope[ ' const ant s. Dat aSour ceVO. Types. OPEN_V_4_J ' ] } " >

<j sp: i nc l ude page=" dat aSour ceEdi t / edi t OpenV4J. j sp" / ></ c: when><c: when t est =" ${ dat aSour ce. t ype. i d == appl i cat i onScope[ ' const ant s. Dat aSour ceVO. Types. DNP3_I P' ] } " >

<j sp: i nc l ude page=" dat aSour ceEdi t / edi t Dnp3. j sp" / ></ c: when>. . .

Observe que os valores como dataSource.type.id estão definidos no enum Type da classeDataSourceVO. É importante frisar que o terceiro parâmetro na instanciação dos componentes desseenum indica se o novo datasource deve ou não estar na lista. (utilizado para desabilitar temporariamenteprotocolos ainda em desenvolvimento ou instáveis)

Page 2 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 3: Scada Desenvolvedores

HTTP_I MAGE( 15, " dsEdi t . ht t pI mage" , t r ue) {@Over r i de

publ i c Dat aSour ceVO<?> cr eat eDat aSour ceVO( ) {r et ur n new Ht t pI mageDat aSour ceVO( ) ;

}} ,M_BUS( 20, " dsEdi t . mbus" , f al se) {

@Over r i de publ i c Dat aSour ceVO<?> cr eat eDat aSour ceVO( ) {

r et ur n new MBusDat aSour ceVO( ) ;}

}

Os arquivos .jsp que de cada protocolo estão em WebContent/WEB-INF/jsp/dataSourceEdit/ e são, naverdade, apenas fragmentos que serão incluídos em um arquivo .jsp "pai": WebContent/WEB-INF/jsp/dataSourceEdit.jsp.

Assim como o código Java utiliza herança e classes abstratas para definir o comportamento dosprotocolos que serão implementados (e também centralizar o comportamento que é comum a todos), odesenvolvimento de interfaces no ScadaBR também se utiliza desse método, centralizando ocomportamento comum das interfaces de todos os protocolos no arquivo dataSourceEdit.jsp e apenasexigindo que os fragmentos (como se fossem subclasses) implementem os métodos JavaScript queexecutem ações que são específicas a cada datasource. O maior problema dessa abordagem é a confusãocausada pelo fato de que os métodos que precisam ser implementados pelas "subclasses" não serãoindicados por nenhum ambiente de desenvolvimento, pois métodos abstratos (sem corpos) e herança nãosão mecanismos previstos em JSP e JavaScript.

A "classe abstrata" dataSourceEdit.jspComo dito acima, este arquivo é a base de todas as páginas de configuração de protocolo, e contém o

código comum a todas as implementações. É importante conhecer as funções que "não tem corpo" e quedevem ser implementadas por cada protocolo:

f unct i on i ni t I mpl ( ) {/ / f uncao que é chamada ao ent r ar na t el a.

}

f unct i on saveDat aSour ceI mpl ( ) {/ / f uncao chamada quando o usuár i o sal va o dat asour ce, deve env i ar os

dados ao ser vi dor par a i nser i - / / l o/ al t er á- l o./ / os dados par a envi ar ao ser v i dor devem ser r ecuper ados dos campos

pr eenchi dos.}

f unct i on edi t Poi nt CBI mpl ( l ocat or ) {/ / f uncao chamada quando o usuár i o cl i ca par a al t er ar um dat apoi nt

ex i s t ent e. Deve l i s t ar os dados do / / dat apoi nt ( que j á vemcomo par amet r o ' l ocat or ' ) nos campos na t el a.}

f unct i on savePoi nt I mpl ( l ocat or ) {/ / f uncao chamada quando o usuar i o sal va o dat apoi nt . deve envi ar os

dados ao ser vi dor par a i nser i - l o/ al t er a- l o./ / os dados que devem ser env i ados est ao no obj et o l ocat or r ecebi do como

par amet r o.}

f unct i on appendPoi nt Li st Col umnFunct i ons( poi nt Li st Col umnHeader s,poi nt Li st Col umnFunct i ons) {

/ / f uncao ut i l i zada caso sej a necessár i o adi c i onar novas col unas nat abel a que l i s t a os dat apoi nt s de um / / dat asour ce.}

Noções sobre DWR e a classe DataSourceEditDwr

O framework DWR, simplificadamente, provê uma camada de abstração de modo que se possa chamaros métodos em Java a partir do Javascript. Para o caso dos protocolos, todas funcionalidades no servidorchamadas pelo cliente utilizando o DWR estão na classecom.serotonin.mango.web.dwr.DataSouceEditDwr.

Na prática, os métodos que deverão ser chamados no servidor ao, por exemplo, salvar um datasource(function saveDataSourceImpl()), serão definidos nesta classe.

f unct i on saveDat aSour ceI mpl ( ) {Dat aSour ceEdi t Dwr . saveVi r t ual Dat aSour ce( $get ( " dat aSour ceName" ) , $get

( " dat aSour ceXi d" ) , $get ( " updat ePer i ods" ) ,$get ( " updat ePer i odType" ) , saveDat aSour ceCB) ;

}

Page 3 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 4: Scada Desenvolvedores

Qualquer tipo de método pode ser definido na classe DataSourceEditDwr e ser acessada de formasemelhante via Javascript. Observe que no exemplo acima há um último parâmetro que se chamasaveDataSourceCB (e sempre há um parâmetro a mais em todas as funções sendo acessadas via DWR).Este parâmetro define uma função callback (CB) que será chamada quando a funçãosaveVirtualDataSource terminar sua execução, recebendo como parâmetro o retorno da função executadano servidor. Esta idéia é importante no desenvolvimento da interface. Para fixar, veja o exemplo abaixo:

f unct i on scanCancel ( ) {Dat aSour ceEdi t Dwr . cancel Test i ngUt i l i t y( scanBut t ons) ;

}

f unct i on scanBut t ons( scanni ng) {set Di sabl ed( " scanBt n" , scanni ng) ;set Di sabl ed( " scanCancel Bt n" , ! scanni ng) ;

}

No caso acima, a função cancelTestingUtility está definida no servidor sem parâmetros de entrada. Aoser chamada via DWR no código Javascript é necessário que se passe no mínimo um parâmetro queindica a função callback que será chamada quando o método retornar (scanButtons).

A função scanButtons é chamada e recebe como parâmetro (scanning) o retorno de cancelTestingUtility(), que é um boolean.

Arquivos de ajudaonde colocar, como configurar. (manifest.xml em dox).As janelas de ajuda dos datasources são configuradas através de uma variável chamada dsHelpId.

<c: set var =" dsHel pI d" val ue=" modbusSer i al DS" / >

Para este caso acima, a variável tem como valor "modbusSerialDS" que deve referenciar um id definidono arquivo: WebContent/WEB-INF/dox/manifest.xml.

O arquivo de ajuda deverá estar nas pastas do idioma desejado e conter o mesmo nome do idcomentado, como por exemplo: WebContent/WEB-INF/dox/en/modbusSerialDS.htm.

Para o caso dos arquivos de ajuda dos datapoints, os ids e arquivos devem ser configurados da mesmaforma citada acima, porém a referência a ajuda se dará na tag customizada pointList que é usada em todasas telas para configuração dos datapoints.

<t ag: poi nt Li st poi nt Hel pI d=" v i r t ual PP" >

No caso acima, pointHelpId referencia o id virtualPP, que deve estar definido em manifest.xml, e que iráreferenciar o arquivo dox/idioma/virtualPP.htm.

Parte 3 - Exemplo

Passos para a implementação

Passo 1: Criar os objetos VO2 classes devem ser criadas:- ProtocoloDataSourceVO (extends DataSourceVO): deve conter as propriedades (atributos) do

protocolo, método de validação, configuração dos eventos associados a este datasource e métodos deserialização dos atributos.

- ProtocoloPointLocatorVO (extends AbstractPointLocatorVO): deve conter as propriedades (atributos)dos datapoints do protocolo, método de validação e métodos de serialização dos atributos.

Passo 2: Criar os objetos RT2 classes devem ser criadas:- ProtocoloDataSource (extends PollingDataSource): deve conter os métodos de inicialização e

finalização, realização do polling e atualização dos datapoints e método de escrita (envio de comandos).- ProtocoloPointLocatorRT (extends PointLocatorRT): deve conter atributos do ponto em runtime, se

necessário.

Passo 3: Adicionar o novo protocolo em DataSourceVO e MangoContextListener

Page 4 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 5: Scada Desenvolvedores

O novo protocolo deve ser adicionado no enum Type em DataSourceVO e no método constantsInitialize() em MangoContextListener.

Passo 4: Criar o arquivo JSP do protocolo em jsp/dataSourceEdit/Crie a JSP do novo protocolo (protocolo.jsp) e coloque-o na pasta especificada acima.

Passo 5: Adicionar a referência para a nova página em jsp/DataSourceEdit.jsp.A nova página criada deve constar no arquivo dataSourceEdit.jsp para que apareça na lista de

protocolos.

Passo 6: Implementar os métodos necessários em Java em DataSourceEditDwrNo mínimo os métodos para inserir/editar datasources e datapoints deverão ser implementados nesta

classe.

Passo 7: Implementar os métodos necessários em JavaScript no arquivo jsp.Implementar as funções Javascript como saveDataSourceImpl(), editPointCBImpl(), etc.

Passo 8: Criar e configurar os arquivos de ajuda.Criar os arquivos de ajuda em dox/idioma e adicionar as referências em dox/manifest.xml.

Executando

ExemploPara exemplificar, a criação de um novo protocolo seguindo os passos citados será detalhada.O protocolo se chamará ProtocoloTemplate. Terá como configurações (do datasource) apenas 2

propriedades: propriedadeTexto e propriedadeInteiro.Os datapoints deste protocolo terão apenas uma propriedade que será chamada numeroPonto.

Implementação

Passo 1: Criar os objetos VO

1.1 Crie duas classes: ProtocoloTemplateVO e ProtocoloTemplatePointLocatorVO.

1.2 Faça a classe ProtocoloTemplateVO estender DataSourceVO e adicione os métodos que devemser implementados.

pr ot ect ed voi d addEvent Types( Li st <Event TypeVO> event Types) { . . . } pr ot ect ed voi d addPr oper t i esI mpl ( Li st <Local i zabl eMessage> l i st ) { . . . }

pr ot ect ed voi d addPr oper t yChangesI mpl ( Li st <Local i zabl eMessage>l i st , Dat aSour ceVO<?> f r om) { . . . }

publ i c Dat aSour ceRT cr eat eDat aSour ceRT( ) { . . . }publ i c Poi nt Locat or VO cr eat ePoi nt Locat or ( ) { . . . }publ i c Local i zabl eMessage get Connect i onDescr i pt i on( ) { . . . }publ i c Expor t Codes get Event Codes( ) { . . . }publ i c com. ser ot oni n. mango. vo. dat aSour ce. Dat aSour ceVO. Type get Type( )

{ . . . }

1.3 O método de validação, 2 métodos de serialização (para persistir no banco de dados) e mais 2métodos para conversão em JSON (para utilização com o DWR) devem ser adicionados manualmente,como abaixo.

publ i c voi d val i dat e( Dwr ResponseI 18n r esponse) {super . val i dat e( r esponse) ;

}

pr i vat e st at i c f i nal i nt ver si on = 1;

pr i vat e voi d wr i t eObj ect ( Obj ect Out put St r eam out ) t hr ows I OExcept i on {out . wr i t eI nt ( ver si on) ;

}

pr i vat e voi d r eadObj ect ( Obj ect I nput St r eam i n) t hr ows I OExcept i on { i nt ver = i n. r eadI nt ( ) ;

}

publ i c voi d j sonDeser i al i ze( JsonReader r eader , JsonObj ect j son) t hr ows JsonExcept i on {super . j sonDeser i al i ze( r eader , j son) ;

}

publ i c voi d j sonSer i al i ze( Map<St r i ng, Obj ect > map) {super . j sonSer i al i ze( map) ;

}

Page 5 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 6: Scada Desenvolvedores

1.4 Adicione os dois atributos: String propriedadeTexto e int propriedadeInteiro. Adicione também osmétodos getters e setters.

1.5 Adicione também mais 2 atributos: int updatePeriodType e int updatePeriods, que irão indicar operíodo de polling e sua unidade (segundos, minutos, etc...)

1.6 Supondo que a propriedadeTexto não possa ser nula e que a propriedadeInteiro sempre tenhaque ser maior que zero, preencha o método de validação conforme abaixo.

publ i c voi d val i dat e( Dwr ResponseI 18n r esponse) {super . val i dat e( r esponse) ;

i f ( pr opr i edadeI nt ei r o <= 0)r esponse. addCont ext ual Message( "pr opr i edadeI nt ei r o" ,

"val i dat e. gr eat er ThanZer o") ;

i f ( St r i ngUt i l s. i sEmpt y( pr opr i edadeText o) )r esponse. addCont ext ual Message( "pr opr i edadeText o" ,

"val i dat e. i nval i dVal ue" ) ;}

Atenção: O primeiro argumento de addContextualMessage indica o ID do campo em que deverá serapresentada a mensagem (validate.invalidValue, por exemplo) na interface gráfica. Isto é, ao ocorrer umerro de validação da propriedadeInteiro, por exemplo, o sistema irá procurar pelo campo na interface quepossui id "propriedadeInteiro" e adicionar a mensagem "validate.greaterThanZero" próximo a ele.

1.7 Implemente os métodos writeObject e readObject. Eles deverão "serializar" todos os atributos doprotocolo em questão, como abaixo:

pr i vat e st at i c f i nal i nt ver si on = 1;

pr i vat e voi d wr i t eObj ect ( Obj ect Out put St r eam out ) t hr ows I OExcept i on {out . wr i t eI nt ( ver si on) ;out . wr i t eI nt ( updat ePer i odType) ;out . wr i t eI nt ( updat ePer i ods) ;

Ser i al i zat i onHel per . wr i t eSaf eUTF( out , pr opr i edadeText o) ;out . wr i t eI nt ( pr opr i edadeI nt ei r o) ;

}

pr i vat e voi d r eadObj ect ( Obj ect I nput St r eam i n) t hr ows I OExcept i on { i nt ver = i n. r eadI nt ( ) ;

i f ( ver == 1) { updat ePer i odType = i n. r eadI nt ( ) ;

updat ePer i ods = i n. r eadI nt ( ) ; pr opr i edadeText o = Ser i al i zat i onHel per . r eadSaf eUTF( i n) ;

pr opr i edadeI nt ei r o = i n. r eadI nt ( ) ;}

}

Atenção: os métodos devem ser escritos e recuperados na mesma ordem. Atente também para amaneira diferente de serializar atributos String.

1.8 Os métodos de serialização JSON já serializam os parâmetros "básicos" automaticamente nassuperclasses. Apenas o atributo updatePeriodType (que é serializado de forma diferente) deve seradicionado nestes métodos, como abaixo:

publ i c voi d j sonDeser i al i ze( JsonReader r eader , JsonObj ect j son) t hr ows JsonExcept i on {

super . j sonDeser i al i ze( r eader , j son) ; I nt eger val ue = deser i al i zeUpdat ePer i odType( j son) ;

i f ( val ue ! = nul l ) updat ePer i odType = val ue;

}

publ i c voi d j sonSer i al i ze( Map<St r i ng, Obj ect > map) {super . j sonSer i al i ze( map) ;

ser i al i zeUpdat ePer i odType( map, updat ePer i odType) ;}

1.9 Faça a classe ProtocoloTemplatePointLocatorVO estender AbstractPointLocatorVO e adicione osmétodos que devem ser implementados.

2.0 Adicione a propriedade int numeroPonto, também mais duas propriedades "comuns" a todosdatapoints: int dataTypeId e boolean settable.

2.1 Adicione também os mesmos 5 métodos adicionados manualmente em ProtocoloTemplateVO epreencha-os de forma similar. (para este caso, os métodos de serialização JSON não precisam terimplementação)

2.2 A implementação de alguns métodos desta classe como "createDataSourceRT()" emProtocoloTemplateVO, por exemplo, dependem de passos que serão abordados adiante, portanto nãoserão implementados agora.

Page 6 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 7: Scada Desenvolvedores

Alguns outros métodos como addPropertiesImpl não serão abordados aqui por não seremobrigatórios ou serem de implementação fácil, bastando analisar implementações já feitas em outrosprotocolos.

Passo 2: Criar os objetos RT2.1 Crie duas classes: ProtocoloTemplateDataSource e ProtocoloTemplatePointLocatorRT

2.2 Faça a classe ProtocoloTemplateDataSource estender PollingDataSource e adicione os métodos

que devem ser implementados.

publ i c Pr ot ocol oTempl at eDat aSour ce( Dat aSour ceVO<?> vo) { . . . }pr ot ect ed voi d doPol l ( l ong t i me) { . . . }

publ i c voi d set Poi nt Val ue( Dat aPoi nt RT dat aPoi nt , Poi nt Val ueTi meval ueTi me, Set Poi nt Sour ce sour ce) { . . . }

2.3 Adicione manualmente os métodos de inicialização e finalização do datasource

publ i c voi d i ni t i al i ze( ) {super . i ni t i al i ze( ) ;

}publ i c voi d t er mi nat e( ) {

super . t er mi nat e( ) ;}

2.3 Adicione o ProtocoloTemplateVO como atributo da classe ProtocoloTemplateDataSource. Altere oconstrutor.

pr i vat e f i nal Pr ot ocol oTempl at eVO<?> vo;

publ i c Pr ot ocol oTempl at eDat aSour ce( Pr ot ocol oTempl at eVO<?> vo) {super ( vo) ;

t hi s . vo = vo;set Pol l i ngPer i od( vo. get Updat ePer i odType( ) , vo. get Updat ePer i ods( ) ,

f al se) ; }

2.4 Implemente os métodos de ProtocoloTemplateDataSource. Segue uma descrição da função decada um deles:

doPoll(long time)Este método será chamado pelo runtime do ScadaBR periodicamente (de acordo, claro, com o

tempo de polling especificado para o datasource). Portanto, é neste método que o datasource deveráenviar a requisição, por exemplo, para o dispositivo escravo, receber os valores e atualizar os datapoints.

setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source)Este método será chamado quando um comando de escrita for requisitado. As informações de qual

datapoint, qual valor e outros estão nos parâmetros recebidos.initialize()Este método será chamado ao iniciar (habilitar) o datasource. Deverá executar todos os comandos

necessários para iniciar uma comunicação.terminate()

Este método será chamado ao terminar (desabilitar) o datasource. Deverá executar todos os

comandos necessários para finalizar uma comunicação.

2.5 Faça a classe ProtocoloTemplatePointLocatorRT estender PointLocatorRT e adicione os métodosque devem ser implementados. Adicione também outros métodos e atributos, como abaixo:

publ i c c l ass Pr ot ocol oTempl at ePoi nt Locat or RT ext ends Poi nt Locat or RT {pr i vat e f i nal Pr ot ocol oTempl at ePoi nt Locat or VO vo;

publ i c Pr ot ocol oTempl at ePoi nt Locat or RT( Pr ot ocol oTempl at ePoi nt Locat or VO vo) {

t hi s . vo = vo;}

@Over r i depubl i c bool ean i sSet t abl e( ) {

r et ur n vo. i sSet t abl e( ) ;}

publ i c Pr ot ocol oTempl at ePoi nt Locat or VO get Vo( ) {r et ur n vo;

}}

2.6 Termine de implementar os métodos que ficaram faltando em ProtocoloTemplateVO

@Over r i depubl i c Dat aSour ceRT cr eat eDat aSour ceRT( ) {

r et ur n new Pr ot ocol oTempl at eDat aSour ce( t hi s) ;}

Page 7 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 8: Scada Desenvolvedores

@Over r i depubl i c Poi nt Locat or VO cr eat ePoi nt Locat or ( ) {

r et ur n new Pr ot ocol oTempl at ePoi nt Locat or VO( ) ;}

2.7 Termine de implementar o método em ProtocoloTemplatePointLocatorVO

@Over r i de publ i c Poi nt Locat or RT cr eat eRunt i me( ) {

r et ur n new Pr ot ocol oTempl at ePoi nt Locat or RT( t hi s) ;}

Passo 3: Adicionar o novo protocolo em DataSourceVO e MangoContextListener3.1 Na classe com.serotonin.mango.vo.dataSource.DataSourceVO, adicione o novo protocolo:

PROTOCOLO_TEMPLATE( 99, " dsEdi t . pr ot ocol oTempl at e" , t r ue) {@Over r i de

publ i c Dat aSour ceVO<?> cr eat eDat aSour ceVO( ) {r et ur n new Pr ot ocol oTempl at eVO( ) ;

}}

3.2 Na classe com.serotonin.mango.MangoContextListener, adicione o novo protocolo no método

constantsInitialize():

ct x. set At t r i but e( " const ant s. Dat aSour ceVO. Types. PROTOCOLO_TEMPLATE" ,Dat aSour ceVO. Type. PROTOCOLO_TEMPLATE. get I d( ) ) ;

3.3 Adicione o atributo TYPE em ProtocoloTemplateVO e implemente o método getType()

publ i c st at i c f i nal Type TYPE = Type. PROTOCOLO_TEMPLATE; publ i c com. ser ot oni n. mango. vo. dat aSour ce. Dat aSour ceVO. Type get Type( ) { r et ur n TYPE;

}

Passo 4: Criar o arquivo JSP do protocolo em jsp/dataSourceEdit/4.1 Crie o arquivo editProtocoloTemplate.jsp em WEB-INF/jsp/dataSourceEdit

4.2 Implemente o arquivo editProtocoloTemplate.jsp da seguinte forma:

<%@ i ncl ude f i l e=" / WEB- I NF/ j sp/ i ncl ude/ t ech. j sp" %>

<scr i pt t ype=" t ext / j avascr i pt " >

f unct i on i ni t I mpl ( ) { / / f uncao que é chamada ao ent r ar na t el a.}

f unct i on saveDat aSour ceI mpl ( ) { / / f uncao chamada quando o usuár i o sal va o dat asour ce, deve envi ar os dados ao ser vi dor par a

i nser i -/ / l o/ al t er á- l o.

/ / os dados par a envi ar ao ser vi dor devem ser r ecuper ados dos campos pr eenchi dos.}

f unct i on edi t Poi nt CBI mpl ( l ocat or ) { / / f uncao chamada quando o usuár i o c l i ca par a al t er ar um dat apoi nt exi st ent e. Deve l i st ar os

dados do/ / dat apoi nt ( que j á vem como par amet r o ' l ocat or ' ) nos campos na t el a.

}

f unct i on savePoi nt I mpl ( l ocat or ) { / / f uncao chamada quando o usuar i o sal va o dat apoi nt . deve envi ar os dados ao ser vi dor par a

i nser i - l o/ al t er a- l o. / / os dados que devem ser envi ados est ao no obj et o l ocat or r ecebi do como par amet r o.}

f unct i on appendPoi nt Li st Col umnFunct i ons( poi nt Li st Col umnHeader s, poi nt Li st Col umnFunct i ons) { / / f uncao ut i l i zada caso sej a necessár i o adi ci onar novas col unas na t abel a que l i s t a os

dat apoi nt s de um/ / dat asour ce.

}</ scr i pt >

<c: set var =" dsDesc" > Pr ot ocol o Templ at e</ c: set ><c: set var =" dsHel pI d" val ue=" pr ot ocol oTempl at eDS" / >

<%@ i ncl ude f i l e=" / WEB- I NF/ j sp/ dat aSour ceEdi t / dsHead. j spf " %>

<t r > <t d cl ass=" f or mLabel Requi r ed" ><f mt : message key=" dsEdi t . updat ePer i od" / ></ t d>

<t d cl ass=" f or mFi el d" ><i nput t ype=" t ext " i d=" updat ePer i ods" val ue=" ${ dat aSour ce. updat ePer i ods} " c l ass=" f or mShor t " / >

<sst : sel ect i d=" updat ePer i odType" val ue=" ${ dat aSour ce. updat ePer i odType} " >

Page 8 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 9: Scada Desenvolvedores

<t ag: t i mePer i odOpt i ons sst =" t r ue" ms=" t r ue" s=" t r ue" mi n=" t r ue" h=" t r ue" / ></ sst : sel ect >

</ t d></ t r >

<t r > <t d cl ass=" f or mLabel Requi r ed" >Pr opr i edade Text o</ t d> <t d cl ass=" f or mFi el d" ><i nput t ype=" t ext " i d=" pr opr i edadeText o"val ue=" ${ dat aSour ce. pr opr i edadeText o} " / ></ t d>

</ t r >

<t r > <t d cl ass=" f or mLabel Requi r ed" >Pr opr i edade I nt ei r o</ t d> <t d cl ass=" f or mFi el d" ><i nput t ype=" t ext " i d=" pr opr i edadeI nt ei r o"val ue=" ${ dat aSour ce. pr opr i edadeI nt ei r o} " / ></ t d>

</ t r >

<%@ i ncl ude f i l e=" / WEB- I NF/ j sp/ dat aSour ceEdi t / dsEvent sFoot . j spf " %>

<t ag: poi nt Li st poi nt Hel pI d="pr ot ocol oTempl at ePP">

<t r > <t d cl ass=" f or mLabel Requi r ed" ><f mt : message key=" dsEdi t . set t abl e" / ></ t d>

<t d c l ass=" f or mFi el d" ><i nput t ype=" checkbox" i d=" set t abl e" / ></ t d></ t r >

<t r > <t d cl ass=" f or mLabel Requi r ed" ><f mt : message key=" dsEdi t . poi nt Dat aType" / ></ t d>

<t d cl ass=" f or mFi el d" ><sel ect i d=" dat aTypeI d" >

<t ag: dat aTypeOpt i ons excl udeI mage=" t r ue" / ></ sel ect >

</ t d></ t r >

<t r > <t d cl ass=" f or mLabel Requi r ed" >Númer o do Pont o</ t d> <t d cl ass=" f or mFi el d" ><i nput t ype=" t ext " i d=" numer oPont o" / ></ t d>

</ t r >

</ t ag: poi nt Li st >

* esta implementação acima é um bom modelo para implementar a interface de qualquer protocolo.

Passo 5: Adicionar a referência para a nova página em jsp/DataSourceEdit.jsp.5.1 Adicione o seguinte trecho em WEB-INF/jsp/dataSourceEdit.jsp

<c: when t est =" ${ dat aSour ce. t ype. i d == appl i cat i onScope[ ' const ant s. Dat aSour ceVO. Types. PROTOCOLO_TEMPLATE' ] } " >

<j sp: i ncl ude page=" dat aSour ceEdi t / edi t Pr ot ocol oTempl at e. j sp" / ></ c: when>

Passo 6: Implementar os métodos necessários em Java em DataSourceEditDwr5.2 Implemente os métodos como abaixo:

@Met hodFi l t erpubl i c Dwr ResponseI 18n savePr ot ocol oTempl at eDat aSour ce( St r i ng name,

St r i ng x i d, i nt updat ePer i ods, i nt updat ePer i odType, St r i ng pr opr i edadeText o, i nt pr opr i edadeI nt ei r o) {

Pr ot ocol oTempl at eVO ds = ( Pr ot ocol oTempl at eVO) Common. get User ( ). get Edi t Dat aSour ce( ) ;

ds. set Xi d( xi d) ;ds. set Name( name) ;ds. set Updat ePer i ods( updat ePer i ods) ;ds. set Updat ePer i odType( updat ePer i odType) ;ds. set Pr opr i edadeText o( pr opr i edadeText o) ;ds. set Pr opr i edadeI nt ei r o( pr opr i edadeI nt ei r o) ;

r et ur n t r yDat aSour ceSave( ds) ;}

@Met hodFi l t er publ i c Dwr ResponseI 18n savePr ot ocol oTempl at ePoi nt Locat or ( i nt i d,

St r i ng x i d, St r i ng name, Pr ot ocol oTempl at ePoi nt Locat or VO l ocat or ) { r et ur n val i dat ePoi nt ( i d, x i d, name, l ocat or , nul l ) ;

}

Passo 7: Implementar os métodos necessários em JavaScript no arquivo jsp.

7.1 Implemente as funções Javascript no JSP:

f unct i on i ni t I mpl ( ) {}

f unct i on saveDat aSour ceI mpl ( ) {Dat aSour ceEdi t Dwr . savePr ot ocol oTempl at eDat aSour ce( $get ( " dat aSour ceName" ) , $get

( " dat aSour ceXi d" ) , $get ( " updat ePer i ods" ) ,$get ( " updat ePer i odType" ) , $get ( " pr opr i edadeText o" ) , $get ( " pr opr i edadeI nt ei r o" ) ,

saveDat aSour ceCB) ;}

Page 9 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 10: Scada Desenvolvedores

f unct i on edi t Poi nt CBI mpl ( l ocat or ) { $set ( " set t abl e" , l ocat or . set t abl e) ; $set ( " dat aTypeI d" , l ocat or . dat aTypeI d) ; $set ( " numer oPont o" , l ocat or . numer oPont o) ;}

f unct i on savePoi nt I mpl ( l ocat or ) { l ocat or . set t abl e = $get ( " set t abl e" ) ; l ocat or . dat aTypeI d = $get ( " dat aTypeI d" ) ; l ocat or . numer oPont o = $get ( " numer oPont o" ) ;

Dat aSour ceEdi t Dwr . savePr ot ocol oTempl at ePoi nt Locat or ( cur r ent Poi nt . i d, $get ( " x i d" ) , $get( " name" ) , l ocat or , savePoi nt CB) ;

}

f unct i on appendPoi nt Li st Col umnFunct i ons( poi nt Li st Col umnHeader s, poi nt Li st Col umnFunct i ons) {}

Passo 8: Criar e configurar os arquivos de ajuda.

8.1 Na pasta dox/pt (ou idioma de preferência), crie os dois arquivos de ajuda:protocoloTemplateDS.htm e protocoloTemplatePP.htm e coloque neles os textos de ajuda.

8.2 Insira no arquivo dox/manifest.xml a referência para os dois arquivos de ajuda:

<i t em i d=" pr ot ocol oTempl at eDS" ><r el at i on i d=" pr ot ocol oTempl at ePP" / >

</ i t em>

<i t em i d=" pr ot ocol oTempl at ePP" ><r el at i on i d=" pr ot ocol oTempl at eDS" / >

</ i t em>

* Atenção: o id da tag <item> deve ser igual aos id referenciado no JSP e também igual ao nomedos arquivo de ajuda criado.

lembrar:- implementar alguma simulacao no método doPoll- implementar a funcao para adicionar uma coluna na tabela de datapoints

Extensão da API

1. Introdução

1.1 Informações gerais

A API do ScadaBR é um serviço web (web-service) implementado utilizando a tecnologia SOAP.Sua implementação foi realizada com a utilização de uma ferramenta chamada Axis1, da Apache, que

se encontra embarcado na aplicação.O desenvolvimento da API se deu por uma abordagem top-down, no sentido de que primeiramente se

escreveu o WSDL (descritor dos serviços), e com isso as classes que fazem a comunicação via SOAP(skeletons, para o caso do servidor) foram geradas utilizando ferramentas do Axis1 (wsdl2java), para quefinalmente os serviços fossem implementados.

Todas as classes referentes a API se encontram no pacote br.org.scadabr.api, sendo sua maioriagerada automaticamente pelas ferramentas utilizadas, como dito acima.

As duas principais classes são: br.org.scadabr.api.ScadaBRAPIImpl ebr.org.scadabr.api.AuthenticationHandler. A primeira contem a implementação de todos os métodos quesão atualmente disponibilizados como serviços e a segunda é uma classe que intercepta todas asrequisições para verificar a autenticação no cabeçalho (header) das mensagens.

Page 10 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 11: Scada Desenvolvedores

1.2 Requisitos

- Conhecimentos básicos em Java.- Eclipse Helios (ou Galileo) instalado.- Projeto ScadaBR (código fonte) configurado no Eclipse.- Apache Tomcat configurado no Eclipse.

1.3 Este documento

Seção 1: Introdução

Seção 2: Breve descrição do Apache Axis1 no ScadaBRSeção 3: Visão geral dos passos necessários para se inserir um novo método na API.Seção 4: Exemplo de implementação de um método (readData) seguindo os passos acima.Seção 5: Informações para ajudar na implementação dos serviços.

2. Apache Axis1

O Axis1 oferece duas maneiras de se disponibilizar serviços utilizando sua arquitetura:- básica: envolve o deploy de arquivos .java (JWS) apenas, sem maiores configurações.- avançada: envolve um arquivo de configuração geral dos serviços (arquivo WSDD), que permite que

configurações mais avançadas sejam incluídas.

No ScadaBR optou-se por utilizar o método avançado. Os arquivos envolvidos na implementação da APIno ScadaBR, portanto, são:

- classes dos skeletons, implementação dos serviços e outras que se encontram no pacotebr.org.scadabr.api, já comentadas anteriormente.

- server-config.wsdd: descritor dos serviços, que detém configurações gerais do Axis1 embarcado e dosserviços disponibilizados no ScadaBR.

Todos os arquivos envolvem complexidades, porém, como será visto adiante, as ferramentas utilizadaspara implementação da API no ScadaBR (Axis1 e Eclipse) geram tudo o que é necessário para que odesenvolvedor se preocupe apenas com a implementação dos serviços em si.

3. Como estender a API

Para a inclusão de novos métodos na API, utiliza-se a IDE Eclipse (para JEE: Galileo ou Helios), que jávem com o Axis1 configurado internamente, de modo que se possa gerar serviços e clientes facilmente.

Segue abaixo uma breve descrição de cada um dos passos necessários para se disponibilizar um novoserviço:

Passo 1: Realizar um backup da classe ScadaBRAPIImpl, para não perder as implementações dosantigos métodos.

É importante realizar um backup da classe que contém a implementação dos serviços atuais, para queem caso de quaisquer problemas ela possa ser recuperada. (como será visto mais adiante, esta será a

Page 11 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 12: Scada Desenvolvedores

única classe que não deverá ser substituída após gerar as novas implementações com o novo serviço)

Passo 2: Realizar um backup do arquivo server-config.wsdd, para posteriormente reconfigurar oHandler da autenticação.

Como dito no passo 2, o server-config.wsdd envolve configurações complexas, porém é geradoautomaticamente pelo Eclipse/Axis1. Há, no entanto, uma única configuração que foi feita manualmenteque consiste na configuração do Handler de autenticação. Ao ser gerado novamente este arquivo pelasferramentas, essa configuração manual será perdida e deverá ser recuperada.

Passo 3: Alterar o WSDL da API de modo a incluir o novo método e os objetos necessários.Neste passo que se inicia a implementação de fato do novo serviço. Embora configurar o WSDL envolva

certa complexidade, todos os métodos se implementam de forma parecida, de modo que se possa copiaros métodos já definidos e apenas alterar os nomes e parâmetros.

Passo 4: Em um projeto WEB temporário, utilizar o Eclipse (que já possui o Axis1 internamente)para gerar novamente o serviço. (gera todas as classes do skeleton e o arquivo de configuraçãoserver-config.wsdd).

Após incluir no WSDL o novo serviço, basta gerar os arquivos necessários (skeletons e server-config.wsdd) utilizando as ferramentas já citadas (Eclipse/Axis1). (em um novo projeto temporário, paraevitar conflitos)

Passo 5: Substituir os arquivos no ScadaBR.Após a criação dos arquivos com o novo método, deve-se substituir os arquivos do ScadaBR por estes.

Copie primeiramente todo* o código fonte gerado e depois substitua também o arquivo server-config.wsdd.

* Não substitua apenas o arquivo ScadaBRAPIImpl. Após a cópia, basta incluir nele o novo métodomanualmente. Dessa forma as antigas implementações não serão perdidas.

Passo 6: Recuperar a configuração no server-config.wsdd do Handler de Autenticação.Como dito, deve-se recuperar a única configuração manual feita no arquivo server-config.wsdd.

Passo 7: Implementar o novo serviço em ScadaBRAPIImplO novo serviço já estará disponível ao iniciar o ScadaBR. Basta agora realizar sua implementação na

classe ScadaBRAPIImpl.

4. Exemplo (implementando o readData)A seguir, será mostrado o exemplo de implementação de um dos métodos já existentes na API seguindo

os passos acima:

Passo 1: Realizar um backup da classe ScadaBRAPIImpl, para não perder asimplementações dos antigos métodos.

Passo 2: Realizar um backup do arquivo server-config.wsdd, paraposteriormente reconfigurar o Handler da autenticação.

Copie os dois arquivos para uma pasta qualquer de backup.

Passo 3: Alterar o WSDL da API de modo a incluir o novo método e os objetosnecessários.

3.1 Primeiramente, crie todos os objetos que serão utilizados em seu novo método, nos parâmetros ouem seus retornos.

Veja o exemplo de como definir o objeto ItemValue no WSDL:

<compl exType name=" I t emVal ue" ><sequence>

<el ement name=" i t emName" ni l l abl e=" t r ue" t ype=" xsd: st r i ng" / > <el ement name=" dat aType" ni l l abl e=" t r ue" t ype=" const : Dat aType" / > <el ement name=" val ue" ni l l abl e=" t r ue" t ype=" xsd: anyType" / > <el ement name=" qual i t y" ni l l abl e=" t r ue" t ype=" const : Qual i t yCode" / > <el ement name=" t i mest amp" ni l l abl e=" t r ue" t ype=" xsd: dat eTi me" / ></ sequence>

</ compl exType>

Como o parâmetro e o retorno do método readData são objetos, eles devem ser definidos também:

<xsd: el ement name=" ReadDat aPar ams" ><compl exType>

<sequence><el ement maxOccur s=" unbounded" name=" i t emPat hLi st "

t ype=" xsd: st r i ng" / >

Page 12 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 13: Scada Desenvolvedores

<el ement name=" opt i ons" ni l l abl e=" t r ue"t ype=" da: ReadDat aOpt i ons" / >

</ sequence></ compl exType>

</ xsd: el ement >

<xsd: el ement name=" ReadDat aResponse" ><compl exType>

<sequence><el ement maxOccur s=" unbounded" mi nOccur s=" 0" name=" er r or s"

t ype=" vo: API Er r or " / > <el ement maxOccur s=" unbounded" mi nOccur s=" 0" name=" i t emsLi s t "

t ype=" vo: I t emVal ue" / > <el ement name=" r epl yBase" t ype=" vo: Repl yBase" / >

</ sequence></ compl exType>

</ xsd: el ement >

* observe que os parâmetros, embora sejam objetos normais, foram definidos como "<xsd:element>" eos outros objetos como "<complexType>". Isso se deu porque as mensagens ("<wsdl:message>") sãodefinidas referenciando "elements", como será visto abaixo:

3.2 Após definir os objetos que serão utilizados, deve-se definir as "mensagens" no WSDL, que indicama requisição e o retorno do método sendo implementado:

<! - - Requi s i ção do Mét odo: i ndi ca que t em como par âmet r o o obj et oReadDat aPar ams - - ><wsdl : message name=" ReadDat aPar ams" >

<wsdl : par t el ement =" da: ReadDat aPar ams" name=" par amet er s" / ></ wsdl : message>

<! - - Ret or no do Mét odo: i ndi ca que t em como r et or no o obj et oReadDat aResponse - - ><wsdl : message name=" ReadDat aResponse" >

<wsdl : par t el ement =" da: ReadDat aResponse" name=" r esponse" / ></ wsdl : message>

3.3 Defina agora o método (operação) em si: associe a ele como input a mensagem criada acima querepresenta a requisição e como output a mensagem criada para representar o retorno:

<wsdl : oper at i on name=" r eadDat a" ><wsdl : i nput message=" sbr : ReadDat aPar ams" name=" r eadDat aRequest " / ><wsdl : out put message=" sbr : ReadDat aResponse" name=" r eadDat aResponse" / >

</ wsdl : oper at i on>

3.4 Crie agora os "bindings", que serão configurações mais específicas do protocolo em relação a cadaoperação definida anteriormente:

<wsdl : oper at i on name=" r eadDat a" ><soap: oper at i on/ ><wsdl : i nput name=" r eadDat aRequest " >

<soap: body use=" l i t er al " / ><soap: header message=" sbr : header RQ" par t =" header " use=" l i t er al " / >

</ wsdl : i nput ><wsdl : out put name=" r eadDat aResponse" >

<soap: body use=" l i t er al " / ></ wsdl : out put >

</ wsdl : oper at i on>

* Observe que é neste ponto que é associado o header de autenticação a cada método

Passo 4: Em um projeto WEB temporário, utilizar o Eclipse (que já possui o Axis1internamente) para gerar novamente o serviço. (gera todas as classes do Skeletone o arquivo de configuração server-config.wsdd).

4.1 Crie um novo "Dynamic Web Project" que será usado temporariamente no Eclipse.4.2 Copie o novo WSDL para uma pasta qualquer neste projeto.4.3 Clique com o botão direito sobre o WSDL, navegue até Web Services -> Generate Java Bean

Skeleton

4.4 Confira as configurações e clique em Finish

Page 13 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 14: Scada Desenvolvedores

4.5 Os arquivos necessários para o Serviço serão criados automaticamente:

Passo 5: Substituir os arquivos no ScadaBR.5.1 Copie todos os arquivos criados no pacote br.org.scadabr.api, com exceção da classe

ScadaBRAPIImpl.5.2 Copie também o arquivo server-config.wsdd para WEB-INF/

Page 14 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 15: Scada Desenvolvedores

Passo 6: Recuperar a configuração no server-config.wsdd do Handler deAutenticação.

6.1 Veja no arquivo antigo (server-config.wsdd) o trecho em que está configurado o handler(<requestFlow> ... </requestFlow>) e transcreva para o novo server-config.wsdd.

. . .<ns1: ser vi ce name=" API " pr ovi der =" j ava: RPC" s t y l e=" document " use=" l i t er al " >

<r equest Fl ow><handl er t ype=" j ava: br . or g. scadabr . api . Aut hent i cat i onHandl er " / >

</ r equest Fl ow><ns1: par amet er name=" al l owedMet hods" val ue=" * " / >...

Passo 7: Implementar o novo serviço em ScadaBRAPIImplS ScadaBRAPIImpl estará informando um erro, pois o novo método adicionado (que consta na interface

ScadaBRAPI) não estará sendo implementado. Basta fazê-lo.

5. Dicas para a implementação dos serviços

5.1 DAOs do ScadaBR

Os DAOs (Data Access Objects) são os objetos que oferecem métodos para acesso ao banco de dados

do ScadaBR, sendo úteis na implementação do seus serviços.Segue abaixo uma lista dos principais DAOs do sistema:

DataPointDao: operações CRUD (create, retrieve, update e delete) dos Data Points ePointEventDetectors do sistema.

DataSourceDao: operações CRUD dos Data Sources do sistema.EventDao: operações CRUD dos Alarmes e Tratadores de Eventos (EventHandlers) do sistema.PointValueDao: operações CRUD a respeito dos VALORES dos data points. Métodos muito úteis para

a aquisição de valores (passados) dos pontos.

UserDao: operações CRUD dos usuários do sistema.

Os DAOs se encontram no pacote com.serotonin.mango.db.dao.

5.2 Outras classes e métodos úteis

Outras classes do ScadaBR oferecem funcionalidades que podem ser importantes na implementaçãodos serviços:

Classe com.serotonin.mango.rt.RuntimeManager

Page 15 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada

Page 16: Scada Desenvolvedores

Oferece importantes funcionalidades de runtime do sistema: métodos para iniciar e parar data sources edata points, para escrever valores nos data points, etc.

Classe com.serotonin.mango.rt.EventManagerFuncionalidades a respeito dos eventos do sistema: métodos para iniciar, reconhecer e "retornar ao

normal" os alarmes.

Fazer login | Denunciar abuso | Imprimir página | Remover acesso | Tecnologia Google Sites

Comentários

Você não tem permissão para adicionar comentários.

Page 16 / 16scadabr-desenvolvedores-2 - CERTI - SCADABR

13/12/2012https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada