Você está na página 1de 16

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 1 / 16

CERTI SCADABR
Pgina inicial minicursos Desenvolvimento API ScadaBR Checklist ScadaBR 0.8 Distribuio GUI Infra de TI Middleware Protocolos Testes de Performance Utilizao dos CLPs Video Aulas Documento de Referncia do ScadaBR Glossrio Mango Outros Scada's Open Source Mango OpenScada Testes Mango Sitemap

Pesquisar o site

Pgina inicial > minicursos >

scadabr-desenvolvedores-2
Abrindo o ScadaBR para desenvolvimento (Eclipse - Java)

Desenvolvimento de protocolos
1. Introduo
1.1 Informaes gerais A arquitetura do ScadaBR no oferece uma maneira totalmente flexvel de se adicionar novos protocolos no sentido de que, alm de adicionar as classes do novo protocolo em si, outras classes gerais e tambm alguns arquivos de configurao devem ser modificados, de modo que uma nova compilao do sistema exigida. As alteraes nos arquivos compartilhados, no entanto, so simples e as classes que do apoio implementao do protocolo em si esto muito bem arranjadas de modo que as funcionalidades comuns a todos os protocolos esto centralizadas em superclasses e evitam a repetio de cdigo, fazendo com que seja necessrio apenas codificar aquilo que especfico ao protocolo em si. O desenvolvimento de um novo protocolo para o ScadaBR envolve duas partes bem distintas: a implementao do cdigo Java e a implementao da interface grfica. Estas duas partes sero abordadas separadamente. 1.2 Requisitos 1.3 Este documento

Parte 1 - Implementando o cdigo JAVA


2. O modelo de objetos O ScadaBR faz uma separao clara entre as classes necessrias na implementao 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 so responsveis pelas caractersticas estticas de um protocolo, como as suas propriedades, mtodos de validao, mtodos de configurao dos alarmes e de serializao/desserializao dos parmetros para persistncia no banco de dados. As classes RT se encontram nos pacotes br.org.scadabr.rt.dataSource (e com.serotonin.mango.rt.dataSource) e so responsveis pela implementao das funcionalidades dinmicas dos protocolos, como a forma de polling e atualizao dos dados e o mtodo de escrita de valores. Outra separao feita entre as classes em relao aos datasources e aos datapoints, isto : existem classes que representam os datasources e suas configuraes gerais e classes que representam os datapoints associados. O desenvolvimento do protocolo no ScadaBR exige, portanto, a implementao 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 mtodos simples de configurao de suas caractersticas (parmetros, alarmes, eventos) e devem conter os parmetros especficos de cada datasource, com os gets e set associados. Os objetos do tipo NovoPointVO so similares, devendo tambm conter os parmetros especficos de cada datapoint do protocolo sendo implementado. Os objetos VO que realizaro a persistncia do datasource (e datapoints) quando configurado e salvo no ScadaBR. Esta persistncia se d nas tabelas datasources e datapoints.

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 2 / 16

Como no existem tabelas "personalizadas" para cada protocolo, que sempre possui configuraes especficas, estas informaes so serializadas e persistidas em um campo do tipo BLOB nas tabelas. Os mtodos de serializao e desserializao devem ser escritos pelo desenvolvedor do protocolo, como ser visto adiante, e requerem muito cuidado em sua implementao. 2.2. Os objetos RT (Runtime Objects) Os objetos do tipo NovoDataSourceRT e NovoPointRT apenas implementam os mtodos que fazem parte da dinmica do funcionamento do protocolo. Os mtodos que iniciam e param o datasource devero ser implementados nesses objetos. As aes que cada datasource realizar para atualizar o valor de seus pontos (requisio dos dados e atualizao dos valores) tambm se encontram nestes objetos, bem como o mtodo que ser requisitado ao se realizar um comando de escrita. 2.3 As superclasses Os parmetros e comportamentos que so comuns a todos os datasources bem como os mtodos que devem obrigatoriamente ser implementados esto localizados nas superclasses principais: com.serotonin.mango.vo.dataSource.DataSourceVO, com.serotonin.mango.vo.dataSource.AbstractPointLocatorVO, com.serotonin.mango.rt.dataSource.PollingDataSource e com.serotonin.mango.rt.dataSource.PointLocatorRT. Na prtica, a classe NovoDataSourceVO dever estender DataSourceVO, NovoPointVO estender AbstractPointLocatorVO, NodoDataSourceRT estender PollingDataSource e NovoPointRT estender PointLocatorRT. 3 Outras alteraes necessrias alteraes em MangoContextListener e DataSourceVO

Parte 2 - Implementando a Interface Grfica (GUI)


Introduo O ScadaBR utiliza diversas tecnologias e frameworks em sua implementao. As ferramentas envolvidas na interface grfica so: Java/JSP, Ajax/DWR, Spring MVC, JavaScript/Dojo e HTML. Para criar interfaces grficas recomendado que se tenha boas noes sobre desenvolvimento WEB, com foco em HTML, para criar a tela, e JavaScript para realizar a comunicao com o servidor. Um entendimento de todo o funcionamento desse sistema no necessrio. Recomenda-se copiar os arquivos (.jsp) de implementaes de outro protocolo e apenas alterar o que for necessrio. Assim como na criao do cdigo Java para um determinado protocolo, o ScadaBR tambm oferece uma arquitetura que facilita (em partes) a criao de interfaces grficas, com vrias das funcionalidades comuns j implementadas. A seguir sero detalhados os principais componentes envolvidos neste processo. Configuraes gerais como 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 grfica do ScadaBR est definida no arquivo WebContent/WEB-INF/jsp/dataSourceEdit.jsp. ... <c : when t est =" ${ dat aSour c e. t y pe. i d == appl i cat i onSc ope [ ' cons t ant s. Dat aSour c eVO. Ty pes. M _BUS' ] } " > <j sp: i nc l ude page=" dat aSour ceEdi t / edi t M Bus. j s p" / > </ c: when> <c : when t est =" ${ dat aSour c e. t y pe. i d == appl i cat i onSc ope [ ' cons t ant s. Dat aSour c eVO. Ty pes. 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 c e. t y pe. i d == appl i cat i onSc ope [ ' cons t ant s. Dat aSour c eVO. Ty pes. DNP3_I P' ] } " > <j sp: i nc l ude page=" dat aSour ceEdi t / edi t Dnp3. j s p" / > </ c: when> ... Observe que os valores como dataSource.type.id esto definidos no enum Type da classe DataSourceVO. importante frisar que o terceiro parmetro na instanciao dos componentes desse enum indica se o novo datasource deve ou no estar na lista. (utilizado para desabilitar temporariamente protocolos ainda em desenvolvimento ou instveis)

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 3 / 16

HTTP_I M AGE( 15, " dsEdi t . ht t pI m age" , 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 m ageDat aSour c eVO( ) ; } }, M _BUS( 20, " dsEdi t . m bus" , f al s e) { @ Over r i de publ i c Dat aSour ceVO<?> cr eat eDat aSour ceVO( ) { r et ur n new M Bus Dat aSour ceVO( ) ; } } Os arquivos .jsp que de cada protocolo esto em WebContent/WEB-INF/jsp/dataSourceEdit/ e so, na verdade, apenas fragmentos que sero includos em um arquivo .jsp "pai": WebContent/WEBINF/jsp/dataSourceEdit.jsp. Assim como o cdigo Java utiliza herana e classes abstratas para definir o comportamento dos protocolos que sero implementados (e tambm centralizar o comportamento que comum a todos), o desenvolvimento de interfaces no ScadaBR tambm se utiliza desse mtodo, centralizando o comportamento comum das interfaces de todos os protocolos no arquivo dataSourceEdit.jsp e apenas exigindo que os fragmentos (como se fossem subclasses) implementem os mtodos JavaScript que executem aes que so especficas a cada datasource. O maior problema dessa abordagem a confuso causada pelo fato de que os mtodos que precisam ser implementados pelas "subclasses" no sero indicados por nenhum ambiente de desenvolvimento, pois mtodos abstratos (sem corpos) e herana no so mecanismos previstos em JSP e JavaScript. A "classe abstrata" dataSourceEdit.jsp Como dito acima, este arquivo a base de todas as pginas de configurao de protocolo, e contm o cdigo comum a todas as implementaes. importante conhecer as funes que "no tem corpo" e que devem ser implementadas por cada protocolo:

f unc t i on i ni t I m pl ( ) { / / f uncao que c ham ada ao ent r ar na t el a. } f unc t i on saveDat aSour ceI m pl ( ) { / / f uncao cham ada quando o us ur i o sal v a o dat asour ce, deve env i ar os dados ao s er 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 dev em s er r ec uper ados dos c am pos pr eenc hi dos. } f unc t / ex i s t com o } i on edi t Poi nt CBI m pl ( l ocat or ) { / f uncao cham ada quando o us ur i o cl i c a par a al t er ar um dat apoi nt ent e. Dev e l i s t ar os dados do / / dat apoi nt ( que j v em par am et r o ' l oc at or ' ) nos c am pos na t el a.

f unc t i on savePoi nt I m pl ( l ocat or ) { / / f uncao cham ada quando o us uar i o sal v a o dat apoi nt . dev e envi ar os dados ao s er vi dor par a i nser i - l o/ al t er a- l o. / / os dados que dev em s er env i ados es t ao no obj et o l ocat or r ecebi do c om o par am et r o. } f unc t i on appendPoi nt Li st Col um nFunct i ons( poi nt Li st Col um nHeader s, poi nt Li st Col um nFunct i ons) { / / f uncao ut i l i zada c as o sej a nec es sr i o adi c i onar novas col unas na t abel a que l i s t a os dat apoi nt s de um / / dat asour ce. }

Noes sobre DWR e a classe DataSourceEditDwr O framework DWR, simplificadamente, prov uma camada de abstrao de modo que se possa chamar os mtodos em Java a partir do Javascript. Para o caso dos protocolos, todas funcionalidades no servidor chamadas pelo cliente utilizando o DWR esto na classe com.serotonin.mango.web.dwr.DataSouceEditDwr. Na prtica, os mtodos que devero ser chamados no servidor ao, por exemplo, salvar um datasource (function saveDataSourceImpl()), sero definidos nesta classe. f unc t i on saveDat aSour ceI m pl ( ) { Dat aSour ceEdi t Dwr . s av eVi r t ual Dat aSour ce( $get ( " dat aSour c eNam e" ) , $get ( " dat aSour ceXi d" ) , $get ( " updat ePer i ods" ) , $get ( " updat ePer i odType" ) , s av eDat aSour c eCB) ; }

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 4 / 16

Qualquer tipo de mtodo pode ser definido na classe DataSourceEditDwr e ser acessada de forma semelhante via Javascript. Observe que no exemplo acima h um ltimo parmetro que se chama saveDataSourceCB (e sempre h um parmetro a mais em todas as funes sendo acessadas via DWR). Este parmetro define uma funo callback (CB) que ser chamada quando a funo saveVirtualDataSource terminar sua execuo, recebendo como parmetro o retorno da funo executada no servidor. Esta idia importante no desenvolvimento da interface. Para fixar, veja o exemplo abaixo: f unc t i on scanCancel ( ) { Dat aSour ceEdi t Dwr . c ancel Tes t i ngUt i l i t y( sc anBut t ons) ; } f unc t i on scanBut t ons( scanni ng) { set Di s abl ed( " sc anBt n" , sc anni ng) ; set Di s abl ed( " sc anCanc el Bt n" , ! s canni ng) ; } No caso acima, a funo cancelTestingUtility est definida no servidor sem parmetros de entrada. Ao ser chamada via DWR no cdigo Javascript necessrio que se passe no mnimo um parmetro que indica a funo callback que ser chamada quando o mtodo retornar (scanButtons). A funo scanButtons chamada e recebe como parmetro (scanning) o retorno de cancelTestingUtility (), que um boolean. Arquivos de ajuda onde colocar, como configurar. (manifest.xml em dox). As janelas de ajuda dos datasources so configuradas atravs de uma varivel chamada dsHelpId. <c : s et v ar =" ds Hel pI d" v al ue=" m odbus Ser i al DS" / > Para este caso acima, a varivel tem como valor "modbusSerialDS" que deve referenciar um id definido no arquivo: WebContent/WEB-INF/dox/manifest.xml. O arquivo de ajuda dever estar nas pastas do idioma desejado e conter o mesmo nome do id comentado, 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 mesma forma citada acima, porm a referncia a ajuda se dar na tag customizada pointList que usada em todas as telas para configurao 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 implementao
Passo 1: Criar os objetos VO 2 classes devem ser criadas: - ProtocoloDataSourceVO (extends DataSourceVO): deve conter as propriedades (atributos) do protocolo, mtodo de validao, configurao dos eventos associados a este datasource e mtodos de serializao dos atributos. - ProtocoloPointLocatorVO (extends AbstractPointLocatorVO): deve conter as propriedades (atributos) dos datapoints do protocolo, mtodo de validao e mtodos de serializao dos atributos. Passo 2: Criar os objetos RT 2 classes devem ser criadas: - ProtocoloDataSource (extends PollingDataSource): deve conter os mtodos de inicializao e finalizao, realizao do polling e atualizao dos datapoints e mtodo de escrita (envio de comandos). - ProtocoloPointLocatorRT (extends PointLocatorRT): deve conter atributos do ponto em runtime, se necessrio. Passo 3: Adicionar o novo protocolo em DataSourceVO e MangoContextListener

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 5 / 16

O novo protocolo deve ser adicionado no enum Type em DataSourceVO e no mtodo 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 referncia para a nova pgina em jsp/DataSourceEdit.jsp. A nova pgina criada deve constar no arquivo dataSourceEdit.jsp para que aparea na lista de protocolos. Passo 6: Implementar os mtodos necessrios em Java em DataSourceEditDwr No mnimo os mtodos para inserir/editar datasources e datapoints devero ser implementados nesta classe. Passo 7: Implementar os mtodos necessrios em JavaScript no arquivo jsp. Implementar as funes 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 referncias em dox/manifest.xml.

Executando
Exemplo Para exemplificar, a criao de um novo protocolo seguindo os passos citados ser detalhada. O protocolo se chamar ProtocoloTemplate. Ter como configuraes (do datasource) apenas 2 propriedades: propriedadeTexto e propriedadeInteiro. Os datapoints deste protocolo tero apenas uma propriedade que ser chamada numeroPonto. Implementao

Passo 1: Criar os objetos VO


1.1 1.2 Crie duas classes: ProtocoloTemplateVO e ProtocoloTemplatePointLocatorVO. Faa a classe ProtocoloTemplateVO estender DataSourceVO e adicione os mtodos que devem

ser 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 m pl ( Li st <Local i z abl eM essage> l i st ) { . . . } pr ot ect ed voi d addPr oper t yChangesI m pl ( Li st <Local i zabl eM essage> 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 eM essage 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. m ango. vo. dat aSour ce. Dat aSour ceVO. Type get Type( ) {. . . } 1.3 O mtodo de validao, 2 mtodos de serializao (para persistir no banco de dados) e mais 2

mtodos para converso em JSON (para utilizao 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( M ap<St r i ng, Obj ect > m ap) { super . j sonSer i al i ze( m ap) ; }

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 6 / 16

1.4

Adicione os dois atributos: String propriedadeTexto e int propriedadeInteiro. Adicione tambm os

mtodos getters e setters. 1.5 Adicione tambm mais 2 atributos: int updatePeriodType e int updatePeriods, que iro indicar o

perodo de polling e sua unidade (segundos, minutos, etc...) 1.6 Supondo que a propriedadeTexto no possa ser nula e que a propriedadeInteiro sempre tenha 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 M essage( " 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 sEm pt y( pr opr i edadeText o) ) r esponse. addCont ext ual M essage( " pr opr i edadeText o" , " val i dat e. i nval i dVal ue" ) ;

que ser maior que zero, preencha o mtodo de validao conforme abaixo.

Ateno: O primeiro argumento de addContextualMessage indica o ID do campo em que dever ser apresentada a mensagem (validate.invalidValue, por exemplo) na interface grfica. Isto , ao ocorrer um erro de validao da propriedadeInteiro, por exemplo, o sistema ir procurar pelo campo na interface que possui id "propriedadeInteiro" e adicionar a mensagem "validate.greaterThanZero" prximo a ele. 1.7 Implemente os mtodos writeObject e readObject. Eles devero "serializar" todos os atributos do pr i vat e st at i c f i nal i nt ver si on = 1; pr i vat e out . out . out . Ser i out . } voi wr i wr i wr i al i wr i d wr i t eObj ect ( Obj ect Out put St r eam out ) t hr ows I OExcept i on { t eI nt ( ver si on) ; t eI nt ( updat ePer i odType) ; t eI nt ( updat ePer i ods) ; z at i onHel per . wr i t eSaf eUTF( out , pr opr i edadeText o) ; t eI nt ( pr opr i edadeI nt ei r o) ;

protocolo em questo, como abaixo:

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 z at i onHel per . r eadSaf eUTF( i n) ; pr opr i edadeI nt ei r o = i n. r eadI nt ( ) ; } } Ateno: os mtodos devem ser escritos e recuperados na mesma ordem. Atente tambm para a maneira diferente de serializar atributos String. 1.8 Os mtodos de serializao JSON j serializam os parmetros "bsicos" automaticamente nas

superclasses. Apenas o atributo updatePeriodType (que serializado de forma diferente) deve ser adicionado nestes mtodos, 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( M ap<St r i ng, Obj ect > m ap) { super . j sonSer i al i ze( m ap) ; ser i al i z eUpdat ePer i odType( m ap, updat ePer i odType) ; } 1.9 Faa a classe ProtocoloTemplatePointLocatorVO estender AbstractPointLocatorVO e adicione os

mtodos que devem ser implementados. 2.0 Adicione a propriedade int numeroPonto, tambm mais duas propriedades "comuns" a todos

datapoints: int dataTypeId e boolean settable. 2.1 Adicione tambm os mesmos 5 mtodos adicionados manualmente em ProtocoloTemplateVO e

preencha-os de forma similar. (para este caso, os mtodos de serializao JSON no precisam ter implementao) 2.2 A implementao de alguns mtodos desta classe como "createDataSourceRT()" em

ProtocoloTemplateVO, por exemplo, dependem de passos que sero abordados adiante, portanto no sero implementados agora.

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 7 / 16

Alguns outros mtodos como addPropertiesImpl no sero abordados aqui por no serem obrigatrios ou serem de implementao fcil, bastando analisar implementaes j feitas em outros protocolos.

Passo 2: Criar os objetos RT


2.1 2.2 Crie duas classes: ProtocoloTemplateDataSource e ProtocoloTemplatePointLocatorRT Faa a classe ProtocoloTemplateDataSource estender PollingDataSource e adicione os mtodos Pr ot ocol ed voi d v oi d set Set Poi nt oTem pl at eDat aSour c e( Dat aSour ceVO<?> vo) { . . . } doPol l ( l ong t i m e) { . . . } Poi nt Val ue( Dat aPoi nt RT dat aPoi nt , Poi nt Val ueTi m e Sour ce s our c e) { . . . }

que devem ser implementados. publ i c pr ot ec t publ i c val ueTi m e, 2.3

Adicione manualmente os mtodos de inicializao e finalizao do datasource publ i c voi super . i } publ i c voi super . t } d i ni t i al i ze( ) { ni t i al i z e( ) ; d t er m i nat e( ) { er m i nat e( ) ;

2.3

Adicione o ProtocoloTemplateVO como atributo da classe ProtocoloTemplateDataSource. Altere o pr i v at e f i nal Pr ot ocol oTem pl at eVO<?> vo;

construtor. publ i c Pr ot ocol oTem pl at eDat aSour c e( Pr ot oc ol oTem pl at eVO<?> v o) { super ( vo) ; t hi s . v o = v o; set Pol l i ngPer i od( vo. get Updat ePer i odTy pe( ) , vo. get Updat ePer i ods( ) , f al s e) ; } 2.4 Implemente os mtodos de ProtocoloTemplateDataSource. Segue uma descrio da funo de doPoll(long time) Este mtodo ser chamado pelo runtime do ScadaBR periodicamente (de acordo, claro, com o tempo de polling especificado para o datasource). Portanto, neste mtodo que o datasource dever enviar a requisio, por exemplo, para o dispositivo escravo, receber os valores e atualizar os datapoints. setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source) Este mtodo ser chamado quando um comando de escrita for requisitado. As informaes de qual datapoint, qual valor e outros esto nos parmetros recebidos. initialize() Este mtodo ser chamado ao iniciar (habilitar) o datasource. Dever executar todos os comandos necessrios para iniciar uma comunicao. terminate() Este mtodo ser chamado ao terminar (desabilitar) o datasource. Dever executar todos os comandos necessrios para finalizar uma comunicao. 2.5 Faa a classe ProtocoloTemplatePointLocatorRT estender PointLocatorRT e adicione os mtodos mtodos e atributos, como abaixo: publ i c c l ass Pr ot oc ol oTem pl at ePoi nt Locat or RT ex t ends Poi nt Loc at or RT { pr i v at e f i nal Pr ot ocol oTem pl at ePoi nt Loc at or VO v o; publ i c Pr ot oc ol oTem pl at ePoi nt Locat or RT ( Pr ot ocol oTem pl at ePoi nt Locat or VO vo) { t hi s . vo = v o; } @ Over r i de publ i c bool ean i s Set t abl e( ) { r et ur n vo. i sSet t abl e( ) ; } publ i c Pr ot oc ol oTem pl at ePoi nt Locat or VO get Vo( ) { r et ur n vo; }

cada um deles:

que devem ser implementados. Adicione tambm outros

} 2.6

Termine de implementar os mtodos que ficaram faltando em ProtocoloTemplateVO @ Over r i de publ i c Dat aSour ceRT c r eat eDat aSour c eRT( ) { r et ur n new Pr ot oc ol oTem pl at eDat aSour c e( t hi s ) ; }

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 8 / 16

@ Over r i de publ i c Poi nt Loc at or VO c r eat ePoi nt Locat or ( ) { r et ur n new Pr ot oc ol oTem pl at ePoi nt Locat or VO( ) ; } 2.7 Termine de implementar o mtodo em ProtocoloTemplatePointLocatorVO @ Over r i de publ i c Poi nt Loc at or RT c r eat eRunt i m e( ) { r et ur n new Pr ot oc ol oTem pl at ePoi nt Locat or RT( t hi s ) ; }

Passo 3: Adicionar o novo protocolo em DataSourceVO e MangoContextListener


3.1 Na classe com.serotonin.mango.vo.dataSource.DataSourceVO, adicione o novo protocolo:
PROTOCO LO_TEM PLATE( 99, " ds Edi t . pr ot oc ol oTem pl at e" , t r ue) { @ Over r i de publ i c Dat aSour ceVO<?> c r eat eDat aSour c eVO( ) { r et ur n new Pr ot oc ol oTem pl at eVO( ) ; } }

3.2

Na classe com.serotonin.mango.MangoContextListener, adicione o novo protocolo no mtodo

constantsInitialize():
ct x. set At t r i but e( " const ant s . Dat aSour ceVO. Ty pes . PROTOCOLO_TEM PLATE" , Dat aSour c eVO. Type. PROTOCOLO_TEM PLATE. get I d( ) ) ;

3.3

Adicione o atributo TYPE em ProtocoloTemplateVO e implemente o mtodo getType()


publ i c st at i c f i nal Type TYPE = Ty pe. PROTOCOLO_TEM PLATE; publ i c com . ser ot oni n. m ango. v o. dat aSour c e. Dat aSour c eVO. Ty pe 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=" / W EB- I NF/ j s p/ i nc l ude/ t ec h. j s p" % > <scr i pt t ype=" t ext / j avasc r i pt " > f unct i on i ni t I m pl ( ) { / / f uncao que c ham ada ao ent r ar na t el a. }

i nser i -

f unct i on saveDat aSour c eI m pl ( ) { / / f uncao cham ada quando o usur i o s al v a o dat as our c e, dev e env i ar os dados ao s er v i dor par a / / l o/ al t er - l o. / / os dados par a env i ar ao s er v i dor dev em s er r ec uper ados dos c am pos pr eenc hi dos .

f unct i on edi t Poi nt CBI m pl ( l ocat or ) { / / f uncao cham ada quando o usur i o c l i c a par a al t er ar um dat apoi nt ex i st ent e. Deve l i st ar os dados do / / dat apoi nt ( que j v em c om o par am et r o ' l oc at or ' ) nos cam pos na t el a. } f unct i // i nser i - l o/ // } on savePoi nt I m pl ( l oc at or ) { f uncao cham ada quando o usuar i o s al v a o dat apoi nt . dev e env i ar os dados ao s er v i dor par a al t er a- l o. os dados que devem s er envi ados es t ao no obj et o l oc at or r ec ebi do c om o par am et r o.

f unct i on appendPoi nt Li st Col um nFunc t i ons( poi nt Li s t Col um nHeader s , poi nt Li s t Col um nFunc t i ons ) { / / f uncao ut i l i zada c as o s ej a nec ess r i o adi ci onar nov as c ol 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 Tem pl at e </ c: set > <c: set var =" dsHel pI d" val ue=" pr ot oc ol oTem pl at eDS" / > <% @ i ncl ude f i l e=" / W EB- I NF/ j sp/ dat aSour ceEdi t / dsHead. j spf " % > <t r > <t d cl ass=" f or m Label Requi r ed" ><f m t:m es sage key =" ds Edi t . updat ePer i od" / ></ t d> <t d cl ass=" f or m Fi el d" > <i nput t ype=" t ext " i d=" updat ePer i ods " v al ue=" ${ dat aSour c e. updat ePer i ods } " c l ass =" f or m Shor t " / > <sst : sel ect i d=" updat ePer i odTy pe" v al ue=" ${ dat aSour ce. updat ePer i odType} " >

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 9 / 16

<t ag: t i m ePer i odOpt i ons ss t =" t r ue" m s =" t r ue" s=" t r ue" m i n=" t r ue" h=" t r ue" / > </ sst : sel ect > </ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" >Pr opr i edade Tex t o</ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" t ex t " i d=" pr opr i edadeText o" val ue=" ${ dat aSour ce. pr opr i edadeTex t o} " / ></ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" >Pr opr i edade I nt ei r o</ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" t ex t " 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=" / W EB- 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 oTem pl at ePP" > <t r > <t d cl ass=" f or m Label Requi r ed" ><f m t:m es sage key =" ds Edi t . s et t abl e" / ></ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" c heck box " i d=" s et t abl e" / ></ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" ><f m t:m es sage key =" ds Edi t . poi nt Dat aTy pe" / ></ t d> <t d cl ass=" f or m Fi el d" > <sel ect i d=" dat aTypeI d" > <t ag: dat aTypeO pt i ons ex cl udeI m age=" t r ue" / > </ sel ect > </ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" >Nm er o do Pont o</ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" t ex t " i d=" num er oPont o" / ></ t d> </ t r > </ t ag: poi nt Li st >

* esta implementao acima um bom modelo para implementar a interface de qualquer protocolo.

Passo 5: Adicionar a referncia para a nova pgina em jsp/DataSourceEdit.jsp.


5.1 Adicione o seguinte trecho em WEB-INF/jsp/dataSourceEdit.jsp
<c: when t est =" ${ dat aSour c e. t y pe. i d == appl i c at i onSc ope [ ' const ant s. Dat aSour ceVO. Ty pes . PROTOCOLO_TEM PLATE' ] } " > <j sp: i ncl ude page=" dat aSour c eEdi t / edi t Pr ot oc ol oTem pl at e. j s p" / > </ c: when>

Passo 6: Implementar os mtodos necessrios em Java em DataSourceEditDwr


5.2 Implemente os mtodos como abaixo:
@ M et hodFi l t er publ i c Dwr ResponseI 18n s av ePr ot ocol oTem pl at eDat aSour ce( St r i ng nam e, St r i ng xi d, i nt updat ePer i ods , i nt updat ePer i odTy pe, St r i ng pr opr i edadeTex t o, i nt pr opr i edadeI nt ei r o) { Pr ot ocol oTem pl at eVO ds = ( Pr ot oc ol oTem pl at eVO) Com m on. get Us er ( ) . get Edi t Dat aSour c e( ) ; ds. set Xi d( xi d) ; ds. set Nam e( nam e) ; ds. set Updat ePer i ods ( updat ePer i ods ) ; ds. set Updat ePer i odTy pe( updat ePer i odTy pe) ; ds. set Pr opr i edadeTex t o( pr opr i edadeTex t 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 c eSave( ds ) ;

@ M et hodFi l t er publ i c Dwr ResponseI 18n s av ePr ot ocol oTem pl at ePoi nt Loc at or ( i nt i d, St r i ng xi d, St r i ng nam e, Pr ot oc ol oTem pl at ePoi nt Loc at or VO l oc at or ) { r et ur n val i dat ePoi nt ( i d, x i d, nam e, l ocat or , nul l ) ; }

Passo 7: Implementar os mtodos necessrios em JavaScript no arquivo jsp.


7.1 Implemente as funes Javascript no JSP:
f unct i on i ni t I m pl ( ) { } f unct i on saveDat aSour ceI m pl ( ) { Dat aSour ceEdi t Dwr . s av ePr ot oc ol oTem pl at eDat aSour c e( $get ( " dat aSour ceNam e" ) , $get ( " dat aSour ceXi d" ) , $get ( " updat ePer i ods " ) , $get ( " updat ePer i odTy pe" ) , $get ( " pr opr i edadeText o" ) , $get ( " pr opr i edadeI nt ei r o" ) , saveDat aSour ceCB) ; }

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 10 / 16

f unct i on edi t Poi nt CBI m pl ( l oc at or ) { $set ( " set t abl e" , l oc at or . s et t abl e) ; $set ( " dat aTypeI d" , l oc at or . dat aTy peI d) ; $set ( " num er oPont o" , l ocat or . num er oPont o) ; } f unct i on savePoi nt I m pl ( l oc at or ) { l ocat or . set t abl e = $get ( " s et t abl e" ) ; l ocat or . dat aTypeI d = $get ( " dat aTy peI d" ) ; l ocat or . num er oPont o = $get ( " num er oPont o" ) ; Dat aSour ceEdi t Dwr . s av ePr ot oc ol oTem pl at ePoi nt Loc at or ( c ur r ent Poi nt . i d, $get ( " x i d" ) , $get ( " nam e" ) , l ocat or , savePoi nt CB) ; } f unct i on appendPoi nt Li s t Col um nFunc t i ons ( poi nt Li st Col um nHeader s , poi nt Li s t Col um nFunc t i ons ) { }

Passo 8: Criar e configurar os arquivos de ajuda.


8.1 Na pasta dox/pt (ou idioma de preferncia), 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 referncia para os dois arquivos de ajuda: <i t em i d=" pr ot ocol oTem pl at eDS" > <r el at i on i d=" pr ot ocol oTem pl at ePP" / > </ i t em > <i t em i d=" pr ot ocol oTem pl at ePP" > <r el at i on i d=" pr ot ocol oTem pl at eDS" / > </ i t em > * Ateno: o id da tag <item> deve ser igual aos id referenciado no JSP e tambm igual ao nome dos arquivo de ajuda criado. lembrar: - implementar alguma simulacao no mtodo doPoll - implementar a funcao para adicionar uma coluna na tabela de datapoints

Extenso da API
1. Introduo
1.1 Informaes gerais A API do ScadaBR um servio web (web-service) implementado utilizando a tecnologia SOAP. Sua implementao foi realizada com a utilizao de uma ferramenta chamada Axis1, da Apache, que se encontra embarcado na aplicao. O desenvolvimento da API se deu por uma abordagem top-down, no sentido de que primeiramente se escreveu o WSDL (descritor dos servios), e com isso as classes que fazem a comunicao via SOAP (skeletons, para o caso do servidor) foram geradas utilizando ferramentas do Axis1 (wsdl2java), para que finalmente os servios fossem implementados. Todas as classes referentes a API se encontram no pacote br.org.scadabr.api, sendo sua maioria gerada automaticamente pelas ferramentas utilizadas, como dito acima. As duas principais classes so: br.org.scadabr.api.ScadaBRAPIImpl e br.org.scadabr.api.AuthenticationHandler. A primeira contem a implementao de todos os mtodos que so atualmente disponibilizados como servios e a segunda uma classe que intercepta todas as requisies para verificar a autenticao no cabealho (header) das mensagens.

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 11 / 16

1.2 Requisitos - Conhecimentos bsicos em Java. - Eclipse Helios (ou Galileo) instalado. - Projeto ScadaBR (cdigo fonte) configurado no Eclipse. - Apache Tomcat configurado no Eclipse. 1.3 Este documento Seo 1: Introduo Seo 2: Breve descrio do Apache Axis1 no ScadaBR Seo 3: Viso geral dos passos necessrios para se inserir um novo mtodo na API. Seo 4: Exemplo de implementao de um mtodo (readData) seguindo os passos acima. Seo 5: Informaes para ajudar na implementao dos servios.

2. Apache Axis1
O Axis1 oferece duas maneiras de se disponibilizar servios utilizando sua arquitetura: - bsica: envolve o deploy de arquivos .java (JWS) apenas, sem maiores configuraes. - avanada: envolve um arquivo de configurao geral dos servios (arquivo WSDD), que permite que configuraes mais avanadas sejam includas. No ScadaBR optou-se por utilizar o mtodo avanado. Os arquivos envolvidos na implementao da API no ScadaBR, portanto, so: - classes dos skeletons, implementao dos servios e outras que se encontram no pacote br.org.scadabr.api, j comentadas anteriormente. - server-config.wsdd: descritor dos servios, que detm configuraes gerais do Axis1 embarcado e dos servios disponibilizados no ScadaBR. Todos os arquivos envolvem complexidades, porm, como ser visto adiante, as ferramentas utilizadas para implementao da API no ScadaBR (Axis1 e Eclipse) geram tudo o que necessrio para que o desenvolvedor se preocupe apenas com a implementao dos servios em si.

3. Como estender a API


Para a incluso de novos mtodos 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 servios e clientes facilmente. Segue abaixo uma breve descrio de cada um dos passos necessrios para se disponibilizar um novo servio: Passo 1: Realizar um backup da classe ScadaBRAPIImpl, para no perder as implementaes dos antigos mtodos. importante realizar um backup da classe que contm a implementao dos servios atuais, para que em caso de quaisquer problemas ela possa ser recuperada. (como ser visto mais adiante, esta ser a

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 12 / 16

nica classe que no dever ser substituda aps gerar as novas implementaes com o novo servio) Passo 2: Realizar um backup do arquivo server-config.wsdd, para posteriormente reconfigurar o Handler da autenticao. Como dito no passo 2, o server-config.wsdd envolve configuraes complexas, porm gerado automaticamente pelo Eclipse/Axis1. H, no entanto, uma nica configurao que foi feita manualmente que consiste na configurao do Handler de autenticao. Ao ser gerado novamente este arquivo pelas ferramentas, essa configurao manual ser perdida e dever ser recuperada. Passo 3: Alterar o WSDL da API de modo a incluir o novo mtodo e os objetos necessrios. Neste passo que se inicia a implementao de fato do novo servio. Embora configurar o WSDL envolva certa complexidade, todos os mtodos se implementam de forma parecida, de modo que se possa copiar os mtodos j definidos e apenas alterar os nomes e parmetros. Passo 4: Em um projeto WEB temporrio, utilizar o Eclipse (que j possui o Axis1 internamente) para gerar novamente o servio. (gera todas as classes do skeleton e o arquivo de configurao server-config.wsdd). Aps incluir no WSDL o novo servio, basta gerar os arquivos necessrios (skeletons e serverconfig.wsdd) utilizando as ferramentas j citadas (Eclipse/Axis1). (em um novo projeto temporrio, para evitar conflitos) Passo 5: Substituir os arquivos no ScadaBR. Aps a criao dos arquivos com o novo mtodo, deve-se substituir os arquivos do ScadaBR por estes. Copie primeiramente todo* o cdigo fonte gerado e depois substitua tambm o arquivo server-config.wsdd. * No substitua apenas o arquivo ScadaBRAPIImpl. Aps a cpia, basta incluir nele o novo mtodo manualmente. Dessa forma as antigas implementaes no sero perdidas. Passo 6: Recuperar a configurao no server-config.wsdd do Handler de Autenticao. Como dito, deve-se recuperar a nica configurao manual feita no arquivo server-config.wsdd. Passo 7: Implementar o novo servio em ScadaBRAPIImpl O novo servio j estar disponvel ao iniciar o ScadaBR. Basta agora realizar sua implementao na classe ScadaBRAPIImpl.

4. Exemplo (implementando o readData)


A seguir, ser mostrado o exemplo de implementao de um dos mtodos j existentes na API seguindo os passos acima:

Passo 1: Realizar um backup da classe ScadaBRAPIImpl, para no perder as implementaes dos antigos mtodos. Passo 2: Realizar um backup do arquivo server-config.wsdd, para posteriormente reconfigurar o Handler da autenticao.
Copie os dois arquivos para uma pasta qualquer de backup.

Passo 3: Alterar o WSDL da API de modo a incluir o novo mtodo e os objetos necessrios.
3.1 Primeiramente, crie todos os objetos que sero utilizados em seu novo mtodo, nos parmetros ou em seus retornos. Veja o exemplo de como definir o objeto ItemValue no WSDL: <c om pl ex Ty pe nam e=" I t em Val ue" > <s equenc e> <el em ent nam e=" i t em Nam e" ni l l abl e=" t r ue" t y pe=" xs d: st r i ng" / > <el em ent nam e=" dat aTy pe" ni l l abl e=" t r ue" t y pe=" cons t : Dat aTy pe" / > <el em ent nam e=" val ue" ni l l abl e=" t r ue" t ype=" x sd: any Ty pe" / > <el em ent nam e=" qual i t y" ni l l abl e=" t r ue" t ype=" c onst : Qual i t y Code" / > <el em ent nam e=" t i m est am p" ni l l abl e=" t r ue" t ype=" x sd: dat eTi m e" / > </ sequence> </ com pl exType> Como o parmetro e o retorno do mtodo readData so objetos, eles devem ser definidos tambm: <x sd: el em ent nam e=" ReadDat aPar am s" > <c om pl ex Ty pe> <s equenc e> <el em ent m axOcc ur s=" unbounded" nam e=" i t em Pat hLi st " t y pe=" xs d: st r i ng" / >

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 13 / 16

<el em ent nam e=" opt i ons" ni l l abl e=" t r ue" t y pe=" da: ReadDat aOpt i ons" / > </ sequence> </ com pl exType> </ xs d: el em ent > <x sd: el em ent nam e=" ReadDat aResponse" > <c om pl ex Ty pe> <s equenc e> <el em ent m axOcc ur s=" unbounded" m i nOcc ur s=" 0" nam e=" er r or s " t y pe=" vo: API Er r or " / > <el em ent m axOcc ur s=" unbounded" m i nOcc ur s=" 0" nam e=" i t em sLi s t " t y pe=" vo: I t em Val ue" / > <el em ent nam e=" r epl yBas e" t ype=" v o: Repl yBas e" / > </ sequence> </ com pl exType> </ xs d: el em ent > * observe que os parmetros, embora sejam objetos normais, foram definidos como "<xsd:element>" e os outros objetos como "<complexType>". Isso se deu porque as mensagens ("<wsdl:message>") so definidas referenciando "elements", como ser visto abaixo: 3.2 Aps definir os objetos que sero utilizados, deve-se definir as "mensagens" no WSDL, que indicam a requisio e o retorno do mtodo sendo implementado: <! - - Requi s i o do M t odo: i ndi c a que t em com o par m et r o o obj et o ReadDat aPar am s --> <wsdl : m ess age nam e=" ReadDat aPar am s" > <wsdl : par t el em ent =" da: ReadDat aPar am s " nam e=" par am et er s " / > </ ws dl : m es sage> <! - - Ret or no do M t odo: i ndi ca que t em c om o r et or no o obj et o ReadDat aResponse - - > <wsdl : m ess age nam e=" ReadDat aRes pons e" > <wsdl : par t el em ent =" da: ReadDat aResponse" nam e=" r esponse" / > </ ws dl : m es sage> 3.3 Defina agora o mtodo (operao) em si: associe a ele como input a mensagem criada acima que representa a requisio e como output a mensagem criada para representar o retorno: <wsdl : oper at i on nam e=" r eadDat a" > <wsdl : i nput m es sage=" sbr : ReadDat aPar am s " nam e=" r eadDat aReques t " / > <wsdl : out put m ess age=" s br : ReadDat aRes pons e" nam e=" r eadDat aRes pons e" / > </ ws dl : oper at i on> 3.4 Crie agora os "bindings", que sero configuraes mais especficas do protocolo em relao a cada operao definida anteriormente: <wsdl : oper at i on nam e=" r eadDat a" > <s oap: oper at i on/ > <wsdl : i nput nam e=" r eadDat aRequest " > <s oap: body us e=" l i t er al " / > <s oap: header m ess age=" s br : header RQ" par t =" header " use=" l i t er al " / > </ ws dl : i nput > <wsdl : out put nam e=" r eadDat aResponse" > <s oap: body us e=" l i t er al " / > </ ws dl : out put > </ ws dl : oper at i on> * Observe que neste ponto que associado o header de autenticao a cada mtodo

Passo 4: Em um projeto WEB temporrio, utilizar o Eclipse (que j possui o Axis1 internamente) para gerar novamente o servio. (gera todas as classes do Skeleton e o arquivo de configurao 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 boto direito sobre o WSDL, navegue at Web Services -> Generate Java Bean Skeleton

4.4 Confira as configuraes e clique em Finish

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 14 / 16

4.5 Os arquivos necessrios para o Servio sero criados automaticamente:

Passo 5: Substituir os arquivos no ScadaBR.


5.1 Copie todos os arquivos criados no pacote br.org.scadabr.api, com exceo da classe ScadaBRAPIImpl. 5.2 Copie tambm o arquivo server-config.wsdd para WEB-INF/

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 15 / 16

Passo 6: Recuperar a configurao no server-config.wsdd do Handler de Autenticao.


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: s er vi ce nam e=" API " pr ovi der =" j av a: RPC" s t y l e=" docum ent " us e=" l i t er al " > <r equest Fl ow> <handl er t y pe=" j ava: br . or g. sc adabr . api . Aut hent i cat i onHandl er " / > </ r eques t Fl ow> <ns1: par am et er nam e=" al l owedM et hods " val ue=" * " / > ...

Passo 7: Implementar o novo servio em ScadaBRAPIImpl


S ScadaBRAPIImpl estar informando um erro, pois o novo mtodo adicionado (que consta na interface ScadaBRAPI) no estar sendo implementado. Basta faz-lo.

5. Dicas para a implementao dos servios


5.1 DAOs do ScadaBR Os DAOs (Data Access Objects) so os objetos que oferecem mtodos para acesso ao banco de dados do ScadaBR, sendo teis na implementao do seus servios. Segue abaixo uma lista dos principais DAOs do sistema: DataPointDao: operaes CRUD (create, retrieve, update e delete) dos Data Points e PointEventDetectors do sistema. DataSourceDao: operaes CRUD dos Data Sources do sistema. EventDao: operaes CRUD dos Alarmes e Tratadores de Eventos (EventHandlers) do sistema. PointValueDao: operaes CRUD a respeito dos VALORES dos data points. Mtodos muito teis para a aquisio de valores (passados) dos pontos. UserDao: operaes CRUD dos usurios do sistema. Os DAOs se encontram no pacote com.serotonin.mango.db.dao.

5.2 Outras classes e mtodos teis Outras classes do ScadaBR oferecem funcionalidades que podem ser importantes na implementao dos servios: Classe com.serotonin.mango.rt.RuntimeManager

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

13/12/2012

scadabr-desenvolvedores-2 - CERTI - SCADABR

Page 16 / 16

Oferece importantes funcionalidades de runtime do sistema: mtodos para iniciar e parar data sources e data points, para escrever valores nos data points, etc. Classe com.serotonin.mango.rt.EventManager Funcionalidades a respeito dos eventos do sistema: mtodos para iniciar, reconhecer e "retornar ao normal" os alarmes.

Comentrios
Voc no tem permisso para adicionar comentrios.

Fazer login | Denunciar abuso | Imprimir pgina | Remover acesso | Tecnologia Google Sites

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

13/12/2012