views:

540

answers:

4

We have a need to take dozens of different protocols from systems such as security systems, fire alarms, camera systems etc.. and integrate them into a single common protocol.

I would like this to be a messaging server that many systems could subscribe to and or communicate through.

  • polling and non-polling "drivers" (protocol converters)
  • handle RS232 / RS485 / tcp
  • programmable "drivers" in a managed language like Java or C#
  • rules engine capability

Does biztalk fit this?

Are there open source alternatives?

Is there a Java / JEE way to do this?

At one end the system would be a SCADA system at the other is is kind of a middleware / messaging server.

Any thoughts on the best way to proceed would be appreciated. I know that there will be a considerable amount of programming involved on the driver side, however as tempted as I am, building the whole system from scratch would not be appropriate.

+2  A: 

If you don't mind working on the Java platform there's a lightweight protocol switcher and implementation of the Enterprise Integration Patterns in an open source project called Apache Camel.

Camel can already speak most of the common protocols and technologies like files, email, JMS, XMPP and so forth so there'd be no actual coding required for those things.

To add new custom protocols the simplest route is to build on top of the MINA component which takes care of all the networking, socket handling, threading and so forth (e.g. NIO versus BIO et al).

Then you just extend it to add your own protocol codec (how to marshal/unmarshal messages on the socket with possibly using framing etc).

The HL7 component is an example of doing this. More detail on writing MINA codecs here.

Then once you've got your camel component (lets call it foo) you could then bridge from any protocol to any other protocol using simple URIs to implement any of the Enterprise Integration Patterns such as Content Based Router, Recipient List, Routing Slip etc

e.g. in Java code

// route all messages from foo
// to a single queue on JMS
from("foo://somehost:1234").
  to("jms:MyQueue");

// route all messages from foo component
// to a queue using a header
from("foo://somehost:1234").
  recipientList().
    simple("activemq:MyPrefix.${headers.cheese}");
James Strachan
+5  A: 

I would avoid BizTalk for SCADA and RS232/RS485 because these typically require realtime (or at least low latency) solutions. BizTalk is optimized for high throughtput, but has the drawback of having high latency by default.

You can tweak BizTalk for low latency, but at this point you'll find you bypass almost everything BizTalk has built-in and it would probably get in the way instead of helping you.

ckarras
+1  A: 

I suggest OpenSCADA. The website is at the moment a bit of a mess, but the software is actively in use and in active development. A explicit goal is to create a common, technology independent, interface for SCADA use cases (although at the moment the direction is more or less oriented towards java [but we experiment also with ikvm to create a .NET version]).

So you could use OpenSCADA to communicate with all the "hardware" devices and then create a bridge to the rest of your middleware, or create a OpenSCADA bridge as a plugin within your middleware. We already have for instance drivers which connect to card readers linked via a serial server to the LAN.

Mauli
Thanks, I'll check into this.
JeffV
if you need any infos/help just drop me a email: juergen DOT rose AT inavare DOT netDiffering from the website, the downloads are on http://download.openscada.org/ and http://repo.openscada.org
Mauli
+1  A: 

www.livedata.com

It's a bit pricey but it's a python based engine that can take one protocol and spit out another, it's already setup for multiple scada protocols such as ICCP, modbus, OPC, and DNP out of the box. Then you can talk whatever you want downstream.

  • John
silvrhand