javacro'14 - java in m2m technologies – mango m2m software – ivan raguž
Upload: hujak-hrvatska-udruga-java-korisnika-croatian-java-user-association
Post on 28-Nov-2014
1.075 views
DESCRIPTION
Mango M2M is open source alternatives for Machine to Machine software that allows users to access and control electronic sensors, devices and machines over multiple protocols. The aim of the lecture is to introduce opportunities Mango M2M platform, code review and architecture, implementation protocols via a Java library.TRANSCRIPT
Sadržaj :
• Uvod
• Mango M2M
• Mango sučelje
• Arhitektura Mango M2M sustava• Arhitektura Mango M2M sustava
Uvod
M2M koncept
- Machine to machine (M2M) odnosi se na tehnologije koje omogućavaju uređajima komunikaciju preko protokola sa drugim uređajima iste sposobnosti.
- M2M koristi mjerne uređaje za hvatanje događaja koji se odvija preko mreže i prevodi ih u smislene informacije
- Podaci sa uređaja mogu se prikupljati i uređajima je moguće upravljati bez ljudskih utjecaja
Mango M2M
-Mango je softver otvorenog standarda za Machine-to-Machine (M2T) tehnologiju (software za industrijsku kontroli, SCADA, HMI ili domotics software)
- Omogućava korisniku istovremeni pristup i kontrolu elektroničkim senzorima, uređajima i strojevima preko raznih protokola.senzorima, uređajima i strojevima preko raznih protokola.
- Osigurava korisnička sučelja za konfiguriranje različitih "data sources" koji omogućavaju upravljanje "downstream" procesima, korisničkim pristupom, porukama upozorenja, zapisivanjem podataka i automatizaciju.
Mango M2M
Značajke Mango M2M-a
- Brzina
- Višestruki protokoli
- Višestruke baze podataka - Višestruke baze podataka
- Meta point
Mango M2M
Značajke Mango M2M-a
- Korisničko definirani događaji
- Inport/Export
- Hvatanje događaja - Hvatanje događaja
- Sigurnost
- Izvještaji
Mango M2M
Značajke Mango M2M-a
- Dinamički dijagrami postavljenih točaka
- Liste pregleda
- Hijerarhija točaka podataka- Hijerarhija točaka podataka
- Grafički prikazi
- Detalji podatkovnih točaka
Mango M2M
Značajke Mango M2M-a
- Lista aktivnih alarma
- Vremesko definiranje događaja
- Udaljeni grafički pregledi- Udaljeni grafički pregledi
- Zvuk alarmnih događaja
Mango sučelje
Izvještaji- Definiranja podatkovne točke koju želimo pratiti preko izvještaja- Postavljanje vremenskog okidača- Postavljanje mail notifikacije (adrese primatelja ili grupe primatelja)
Mango sučelje
Skupovi podataka – “Data source”
- Skupovi podataka su mjesta odakle podaci stižu u aplikaciju na obradu
- Skupovi podataka mogu biti svi skupovi koji su podržani protokolima unutar mango m2m aplikacije
- Skupovi podataka mogu se dodavati prilagodbom koda aplikacije i umetanjem protokola
Mango sučelje
Podatkovne točke – “Data points”
- Skup atributa koji se povijesno može pratiti ili detektori događaja koje mjere stanja interesa pojedinih vrijednosti točaka.
Mango sučelje
Podatkovne točke – “Data points”
- Hijerarhijska struktura podatkovnih točaka i pregledi
Arhitektura Mango M2M sustava
Java, web bazirana aplikacija
Otvoreni standard
Spring MVC Framework
Direct Web Remoting (DWR)
Dojo Framework
Apache Tomcat
Apache Ant
Arhitektura Mango M2M sustava
- Definiranjem skupova podatka zavisno o protokolu koji nam je potreban
- Referentni kod- com.serotonin.mango.rt.dataSource.DataSourceRT- com.serotonin.mango.vo.dataSource.DataSourceVO- com.serotonin.mango.vo.dataSource.DataSourceVO
- Izvršavaju zadatke prikupljanja i slanje informacija iz vanjskih sustava u sistem i obrnuto
Arhitektura Mango M2M sustava
DataSourceRT.java
abstract public class DataSourceRT implements
ILifecycle {
public static final String ATTR_UNRELIABLE_KEY =
"UNRELIABLE";"UNRELIABLE";
private final DataSourceVO<?> vo;
Arhitektura Mango M2M sustava
Tipovi objekta u DataSourceVO
BACNET(10, "dsEdit.bacnetIp", true) {
@Override
public DataSourceVO<?> createDataSourceVO() {
return new BACnetIPDataSourceVO();
}}
},
HTTP_RECEIVER(7, "dsEdit.httpReceiver", true) {
@Override
public DataSourceVO<?> createDataSourceVO() {
return new HttpReceiverDataSourceVO();
}
},
Arhitektura Mango M2M sustava
Tipovi objekta u DataSourceVO
SNMP(5, "dsEdit.snmp", true) {
@Override
public DataSourceVO<?> createDataSourceVO() {
return new SnmpDataSourceVO();
}}
},
EBI25(16, "dsEdit.ebi25", false) {
@Override
public DataSourceVO<?> createDataSourceVO() {
return new EBI25DataSourceVO();
}
},
Arhitektura Mango M2M sustava
Tipovi objekta u DataSourceVO
MODBUS_IP(3, "dsEdit.modbusIp", true) {
@Override
public DataSourceVO<?> createDataSourceVO() {
return new ModbusIpDataSourceVO();
}}
},
POP3(12, "dsEdit.pop3", true) {
@Override
public DataSourceVO<?> createDataSourceVO() {
return new Pop3DataSourceVO();
}
},
Arhitektura Mango M2M sustava
Spring MVC DispatcherServlet parmetri mapiranja
<bean id="publicUrlMappings"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- All user URLs -->
<prop key="/compound_events.shtm">compoundEventsController</prop><prop key="/compound_events.shtm">compoundEventsController</prop>
<prop
key="/data_point_details.shtm">dataPointDetailsController</prop>
<prop key="/data_point_edit.shtm">dataPointEditController</prop>
<prop key="/data_source_edit.shtm">dataSourceEditController</prop>
<prop key="/data_sources.shtm">dataSourceListController</prop>
Arhitektura Mango M2M sustava
dataSourceEditController
public class DataSourceEditController extends ParameterizableViewController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
DataSourceVO<?> dataSourceVO = null;
User user = Common.getUser(request);
// Get the id.
int id = Common.NEW_ID;int id = Common.NEW_ID;
String idStr = request.getParameter("dsid");
if (idStr == null) {
// Check for a data point id
String pidStr = request.getParameter("pid");
if (pidStr == null) {
// Adding a new data source? Get the type id.
int typeId = Integer.parseInt(request.getParameter("typeId"));
Permissions.ensureAdmin(user);
// A new data source
dataSourceVO = DataSourceVO.createDataSourceVO(typeId);
dataSourceVO.setId(Common.NEW_ID);
dataSourceVO.setXid(new DataSourceDao().generateUniqueXid());
Arhitektura Mango M2M sustava
Kreiranje skupova podataka
<td align="right" id="dataSourceTypesContent"><select id="dataSourceTypes">
<option value="10">BACnet I/P</option><option value="21">DNP3 IP</option><option value="14">Galil DMC-21x2</option><option value="7">HTTP Receiver</option><option value="11">HTTP Retriever</option><option value="15">HTTP Image</option><option value="27">Internal Data Source</option><option value="26">JMX</option><option value="26">JMX</option><option value="9">Meta Data Source</option><option value="3">Modbus IP</option><option value="2">Modbus Serial</option><option value="13">NMEA listener</option><option value="8">1-wire</option><option value="23">Pachube</option><option value="24">Serotonin Persistent TCP</option><option value="12">POP3 Email</option><option value="5">SNMP</option><option value="4">Spinwave Receiver</option><option value="6">SQL</option><option value="1">Virtual Data Source</option><option value="17">VMStat Data Source</option>
</select><img title="Add" class="ptr" onclick="addDataSource()" alt="Add" src="images/icon_ds_add.png" border="0">
</td>
Arhitektura Mango M2M sustava
Konektori i protokoli
BACnet I/P
public class BACnetIPDataSourceRT extends
PollingDataSource implements DeviceEventListener,
ExceptionListener {ExceptionListener {
public class BACnetIPDataSourceVO extends
DataSourceVO<BACnetIPDataSourceVO> {
public static final Type TYPE = Type.BACNET;
Arhitektura Mango M2M sustava
Konektori i protokoli
BACnet I/P
import com.serotonin.bacnet4j.LocalDevice;
import com.serotonin.bacnet4j.Network;import com.serotonin.bacnet4j.Network;
import com.serotonin.bacnet4j.RemoteDevice;
import com.serotonin.bacnet4j.RemoteObject;
import
com.serotonin.bacnet4j.event.DeviceEventListener;
import
com.serotonin.bacnet4j.event.ExceptionListener;
Arhitektura Mango M2M sustava
Konektori i protokoli
ModBus IP
abstract public class ModbusDataSource extends
PollingDataSource implementsPollingDataSource implements
MessagingExceptionHandler {
abstract public class ModbusDataSourceVO<T extends
ModbusDataSourceVO<?>> extends DataSourceVO<T> {
Arhitektura Mango M2M sustava
Konektori i protokoli
ModBus IP
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ExceptionResult;
import com.serotonin.modbus4j.ModbusMaster;
Arhitektura Mango M2M sustava
Konektori i protokoli
SNMP
public class SnmpDataSourceRT extends
PollingDataSource {PollingDataSource {
public class SnmpDataSourceVO extends
DataSourceVO<SnmpDataSourceVO> {
Arhitektura Mango M2M sustava
Konektori i protokoli
SNMP
import org.snmp4j.PDU;
import org.snmp4j.Snmp;import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.Variable;
import org.snmp4j.smi.VariableBinding;
Arhitektura Mango M2M sustava
Definirati podatkovne točke “data point”
Referentni kod
- com.serotonin.mango.rt.dataImage.DataPointRT- com.serotonin.mango.vo.DataPointVO,- com.serotonin.mango.vo.DataPointVO,
Arhitektura Mango M2M sustava
DataPointRT
public class DataPointRT implements IDataPoint,
ILifecycle, TimeoutClient {
private static final Log LOG =
LogFactory.getLog(DataPointRT.class);LogFactory.getLog(DataPointRT.class);
private static final PvtTimeComparator
pvtTimeComparator = new PvtTimeComparator();
Arhitektura Mango M2M sustava
DataPointRT
Konfiguracijski podaci
private final DataPointVO vo;
private final PointLocatorRT pointLocatorprivate final PointLocatorRT pointLocator
Arhitektura Mango M2M sustava
DataPointRT
Runtime podaci
private volatile PointValueTime pointValue;
private final PointValueCache valueCache;private final PointValueCache valueCache;
private RuntimeManager rm;
private List<PointEventDetectorRT> detectors;
private final Map<String, Object> attributes = new
HashMap<String, Object>();
Arhitektura Mango M2M sustava
DataPointRT
Podaci zapisa intervala
private PointValueTime intervalValue;
private long intervalStartTime = -1;private long intervalStartTime = -1;
private List<IValueTime> averagingValues;
private final Object intervalLoggingLock = new
Object();
private TimerTask intervalLoggingTask;