Error exporting new datasource
-
Perhaps posting your source would help.
-
package com.serotonin.mango.vo.dataSource.openv4j; import com.serotonin.json.JsonException; import com.serotonin.json.JsonObject; import com.serotonin.json.JsonReader; import com.serotonin.json.JsonRemoteProperty; import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.mango.rt.dataSource.openv4j.OpenVDataSourceRT; import com.serotonin.mango.rt.event.type.AuditEventType; import com.serotonin.mango.util.ExportCodes; import com.serotonin.mango.vo.dataSource.DataSourceVO; import com.serotonin.mango.vo.dataSource.PointLocatorVO; import com.serotonin.mango.vo.event.EventTypeVO; import com.serotonin.util.SerializationHelper; import com.serotonin.util.StringUtils; import com.serotonin.web.dwr.DwrResponseI18n; import com.serotonin.web.i18n.LocalizableMessage; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.List; import java.util.Map; import net.sf.openv4j.Devices; import net.sf.openv4j.Protocols; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class OpenVDataSourceVO extends DataSourceVO<OpenVDataSourceVO> { private final static Log LOG = LogFactory.getLog(OpenVDataSourceVO.class); private static final ExportCodes EVENT_CODES = new ExportCodes(); static { EVENT_CODES.addElement(OpenVDataSourceRT.DATA_SOURCE_EXCEPTION_EVENT, "DATA_SOURCE_EXCEPTION"); EVENT_CODES.addElement(OpenVDataSourceRT.POINT_READ_EXCEPTION_EVENT, "POINT_READ_EXCEPTION"); EVENT_CODES.addElement(OpenVDataSourceRT.POINT_WRITE_EXCEPTION_EVENT, "POINT_WRITE_EXCEPTION"); } @JsonRemoteProperty private String commPortId; private int updatePeriodType = Common.TimePeriods.MINUTES; @JsonRemoteProperty private int updatePeriods = 1; @JsonRemoteProperty private Devices device; @JsonRemoteProperty private Protocols protocol; @Override public Type getType() { return Type.OPEN_V_4_J; } @Override protected void addEventTypes(List<EventTypeVO> eventTypes) { eventTypes.add(createEventType(OpenVDataSourceRT.DATA_SOURCE_EXCEPTION_EVENT, new LocalizableMessage("event.ds.dataSource"))); eventTypes.add(createEventType(OpenVDataSourceRT.POINT_READ_EXCEPTION_EVENT, new LocalizableMessage("event.ds.pointRead"))); eventTypes.add(createEventType(OpenVDataSourceRT.POINT_WRITE_EXCEPTION_EVENT, new LocalizableMessage("event.ds.pointWrite"))); } @Override public LocalizableMessage getConnectionDescription() { return new LocalizableMessage("common.default", commPortId); } @Override public PointLocatorVO createPointLocator() { return new OpenVPointLocatorVO(); } @Override public DataSourceRT createDataSourceRT() { return new OpenVDataSourceRT(this); } @Override public ExportCodes getEventCodes() { return EVENT_CODES; } @Override protected void addPropertiesImpl(List<LocalizableMessage> list) { AuditEventType.addPropertyMessage(list, "dsEdit.openv4j.port", commPortId); AuditEventType.addPeriodMessage(list, "dsEdit.updatePeriod", updatePeriodType, updatePeriods); } @Override protected void addPropertyChangesImpl(List<LocalizableMessage> list, OpenVDataSourceVO from) { AuditEventType.maybeAddPropertyChangeMessage(list, "dsEdit.openv4j.port", from.commPortId, commPortId); AuditEventType.maybeAddPeriodChangeMessage(list, "dsEdit.updatePeriod", from.updatePeriodType, from.updatePeriods, updatePeriodType, updatePeriods); } public String getCommPortId() { return commPortId; } public void setCommPortId(String commPortId) { this.commPortId = commPortId; } public int getUpdatePeriodType() { return updatePeriodType; } public void setUpdatePeriodType(int updatePeriodType) { this.updatePeriodType = updatePeriodType; } public int getUpdatePeriods() { return updatePeriods; } public void setUpdatePeriods(int updatePeriods) { this.updatePeriods = updatePeriods; } @Override public void validate(DwrResponseI18n response) { super.validate(response); if (StringUtils.isEmpty(commPortId)) { response.addContextualMessage("commPortId", "validate.required"); } if (!Common.TIME_PERIOD_CODES.isValidId(updatePeriodType)) { response.addContextualMessage("updatePeriodType", "validate.invalidValue"); } if (updatePeriods <= 0) { response.addContextualMessage("updatePeriods", "validate.greaterThanZero"); } } // /// /// Serialization /// // private static final long serialVersionUID = -1; private static final int version = 2; // Serialization for saveDataSource private void writeObject(ObjectOutputStream out) throws IOException { out.writeInt(version); out.writeInt(updatePeriodType); out.writeInt(updatePeriods); SerializationHelper.writeSafeUTF(out, commPortId); SerializationHelper.writeSafeUTF(out, device.name()); SerializationHelper.writeSafeUTF(out, protocol.name()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { int ver = in.readInt(); // Switch on the version of the class so that version changes can be elegantly handled. switch (ver) { case 2: updatePeriodType = in.readInt(); updatePeriods = in.readInt(); commPortId = SerializationHelper.readSafeUTF(in); device = Devices.valueOf(SerializationHelper.readSafeUTF(in)); protocol = Protocols.valueOf(SerializationHelper.readSafeUTF(in)); break; } } @Override public void jsonDeserialize(JsonReader reader, JsonObject json) throws JsonException { LOG.info("WRITE TO JSON"); super.jsonDeserialize(reader, json); LOG.info("SUPER TO JSON"); Integer value = deserializeUpdatePeriodType(json); if (value != null) updatePeriodType = value; LOG.info("JSON OK"); } @Override public void jsonSerialize(Map<String, Object> map) { super.jsonSerialize(map); serializeUpdatePeriodType(map, updatePeriodType); } /** * @return the device */ public Devices getDevice() { return device; } /** * @param device the device to set */ public void setDevice(Devices device) { this.device = device; } /** * @return the device */ public Devices[] getDevices() { return Devices.values(); } /** * @return the protocol */ public Protocols getProtocol() { return protocol; } /** * @param protocol the protocol to set */ public void setProtocol(Protocols protocol) { this.protocol = protocol; } /** * @return the protocols */ public Protocols[] getProtocols() { return Protocols.values(); } }
-
Annotate your class with "@JsonRemoteEntity". The JSON serializer is picking up the s/getAlarmLevel from the super class.
-
Thanks,
it works. (I will have to look better doing past and copy next time:-))
Arne
-
Are your data sources completed/tested? You did mbus and openv?
-
No consider both as highly experimental...
Currently I work on openv read maybe write access.
If this is done I have to update the m-bus sources at mbus4j.sf.net to the latest specification (IEC).
Once this is done I plan to support primary adressing with no change of the data frame.
Later support for- secondary addressing.
- rewrite JSP to make it more compact
- ability of changing frames.
- atmodem support (atmodem4j.sf.net).
My problem is currently that I have no direct access to m-bus hardware so this is mostly tested against dummys or mbus data from different readouts.
If anyone has access to hardware it will speedup development.
Arne
-
If anyone has access to hardware it will speedup development.
Isn't that always the problem! I might as well make a shout out now for OPC XML-DA hardware. If anyone has any that they can make internet accessible for the purposes of data source testing, please let me know. I know there are some sample servers on the internet, but those i've found so far contain a single unchanging point. Not very useful...
-
Maybe try using WinCC from SIEMENS that has XML-OPC capabilities - I never tested it...
I think you can grap a demo version vom your local dealer.
Or could you send me the code for initial testing?
Arne
-
I haven't written any code yet. There was no point in starting without decent equipment to work against. You have some OPC XML-DA stuff? Any chance i could hit it up for a bit? Could you open just to a particular IP address?
-
What about OPC UA (xml and binary protocol) I dont know the licence restrictions for any?
And for software see www.opcfoundation.org, there seem many servers and clients for demo available???
Arne
-
And for software see www.opcfoundation.org, there seem many servers and clients for demo available???
That would be what i was referring to:
I know there are some sample servers on the internet, but those i've found so far contain a single unchanging point. Not very useful...
-
What exact is your plan OPS server, client or both.
I looked at the Java6 implementation of the Web service or axis2 or....
if mango should act as a server we need a client first - I can test it against WinCC.
after that the server should be easily implemented.Arne
-
Mango is primarily intended to act as a server.
-
So maybe implement at first the client into mango ;-) (one can use the get function to retrieve data from other (OPC-servers - which in turn could be simple devices...)
to have a testet client - and then do the server stuff.what do you plan to use JAX-WS or Axis2?
Arne
-
I use axis because i know it better, and it has ANT support (which i couldn't find in less than 5 minutes for JAX). But if someone else is doing the work it doesn't matter to me.