2018-06-13 00:30:36 +02:00
|
|
|
package com.example.user.myapp;
|
|
|
|
|
|
|
|
import android.app.IntentService;
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.support.v4.content.LocalBroadcastManager;
|
|
|
|
|
|
|
|
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
|
2018-06-13 22:22:59 +02:00
|
|
|
import com.ghgande.j2mod.modbus.procimg.InputRegister;
|
2018-06-13 00:30:36 +02:00
|
|
|
import com.ghgande.j2mod.modbus.util.BitVector;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An {@link IntentService} subclass for handling asynchronous task requests in
|
|
|
|
* a service on a separate handler thread.
|
|
|
|
* <p>
|
|
|
|
* TODO: Customize class - update intent actions, extra parameters and static
|
|
|
|
* helper methods.
|
|
|
|
*/
|
|
|
|
public class MyIntentService extends IntentService {
|
2018-06-13 22:22:59 +02:00
|
|
|
|
2018-06-13 00:30:36 +02:00
|
|
|
private static final String ACTION_READ_COIL = "read.coil";
|
2018-06-13 22:22:59 +02:00
|
|
|
private static final String ACTION_READ_INPUT_REGISTER = "read.input.register";
|
|
|
|
private static final String ACTION_READ_DISCRETE_INPUT = "read.discrete.input";
|
2018-06-13 00:30:36 +02:00
|
|
|
|
|
|
|
private ModbusTCPMaster master;
|
|
|
|
|
|
|
|
// TODO: Rename parameters
|
|
|
|
private static final String EXTRA_IP_ADDRESS = "extra.ip.address";
|
|
|
|
private static final String EXTRA_PORT = "extra.ip.port";
|
|
|
|
private static final String EXTRA_REF = "extra.ref";
|
|
|
|
private static final String EXTRA_COUNT = "extra.count";
|
|
|
|
private static final String EXTRA_INTENT_NAME = "extra.intent.name";
|
|
|
|
|
|
|
|
// private static final String EXTRA_PARAM2 = "com.example.user.myapp.extra.PARAM2";
|
|
|
|
|
|
|
|
public MyIntentService() {
|
|
|
|
super("MyIntentService");
|
|
|
|
}
|
|
|
|
|
|
|
|
private void sendBooleanListToActivity(List<Boolean> booleanList, String intentName) {
|
|
|
|
Intent intent = new Intent(intentName);
|
|
|
|
Bundle bundle = new Bundle();
|
|
|
|
|
2018-06-13 22:22:59 +02:00
|
|
|
bundle.putBooleanArray("coilValues", toPrimitiveArray(booleanList));
|
|
|
|
intent.putExtras(bundle);
|
|
|
|
sendLocationBroadcast(intent);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void sendIntegerListToActivity (ArrayList<Integer> integerList, String intentName) {
|
|
|
|
Intent intent = new Intent(intentName);
|
|
|
|
Bundle bundle = new Bundle();
|
|
|
|
|
|
|
|
bundle.putIntegerArrayList("irValues", integerList);
|
2018-06-13 00:30:36 +02:00
|
|
|
intent.putExtras(bundle);
|
|
|
|
sendLocationBroadcast(intent);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void sendLocationBroadcast(Intent intent) {
|
|
|
|
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
|
|
|
|
}
|
|
|
|
|
2018-06-13 22:22:59 +02:00
|
|
|
public void readDiscreteInputAction (String ipAddress, int port, int ref, int count, String intentReceiveName) {
|
|
|
|
try {
|
|
|
|
master = new ModbusTCPMaster(ipAddress, port);
|
|
|
|
master.connect();
|
|
|
|
|
|
|
|
BitVector bv = master.readInputDiscretes(ref, count);
|
|
|
|
List<Boolean> listBooleanBit = new ArrayList<>();
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
listBooleanBit.add(bv.getBit(i));
|
2018-06-14 00:09:26 +02:00
|
|
|
System.out.println("input discrete values : "+i+" - "+bv.getBit(i));
|
2018-06-13 22:22:59 +02:00
|
|
|
}
|
|
|
|
sendBooleanListToActivity(listBooleanBit, intentReceiveName);
|
|
|
|
master.disconnect();
|
|
|
|
} catch (Exception e) {
|
|
|
|
System.out.println("Exception in reading discrete input " + e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void readCoilAction (String ipAddress, int port, int ref, int count, String intentReceiveName) {
|
2018-06-13 00:30:36 +02:00
|
|
|
try {
|
|
|
|
master = new ModbusTCPMaster(ipAddress, port);
|
|
|
|
master.connect();
|
|
|
|
|
|
|
|
BitVector bv = master.readCoils(ref,count);
|
|
|
|
List<Boolean> listBooleanBit = new ArrayList<>();
|
|
|
|
for (int i = 0; i < count; i++) {
|
2018-06-14 00:09:26 +02:00
|
|
|
System.out.println("coil values : "+i+" - "+bv.getBit(i));
|
2018-06-13 00:30:36 +02:00
|
|
|
listBooleanBit.add(bv.getBit(i));
|
|
|
|
}
|
|
|
|
sendBooleanListToActivity(listBooleanBit, intentReceiveName);
|
|
|
|
master.disconnect();
|
|
|
|
} catch (Exception e) {
|
|
|
|
System.out.println("Exception in reading coil " + e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-13 22:22:59 +02:00
|
|
|
public void readInputRegisterAction (String ipAddress, int port, int ref, int count, String intentReceiveName) {
|
|
|
|
try {
|
|
|
|
master = new ModbusTCPMaster(ipAddress, port);
|
|
|
|
master.connect();
|
|
|
|
|
|
|
|
InputRegister [] inputRegisters = master.readInputRegisters(ref, count);
|
|
|
|
ArrayList<Integer> listIntegerInputRegister = new ArrayList<>();
|
|
|
|
for (InputRegister ir : inputRegisters) {
|
2018-06-14 00:09:26 +02:00
|
|
|
System.out.println("ir values : "+Math.random()+" - "+ir.getValue());
|
2018-06-13 22:22:59 +02:00
|
|
|
listIntegerInputRegister.add(ir.getValue());
|
|
|
|
}
|
|
|
|
sendIntegerListToActivity (listIntegerInputRegister, intentReceiveName);
|
2018-06-14 00:09:26 +02:00
|
|
|
master.disconnect();
|
2018-06-13 22:22:59 +02:00
|
|
|
} catch (Exception e) {
|
|
|
|
System.out.println("Exception in reading input register " + e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-13 00:30:36 +02:00
|
|
|
@Override
|
|
|
|
protected void onHandleIntent(Intent intent) {
|
|
|
|
if (intent != null) {
|
|
|
|
final String action = intent.getAction();
|
|
|
|
final String ipAddress = intent.getStringExtra(EXTRA_IP_ADDRESS);
|
|
|
|
final int port = intent.getIntExtra(EXTRA_PORT, 502);
|
|
|
|
final int ref = intent.getIntExtra(EXTRA_REF, 8192);
|
|
|
|
final int count = intent.getIntExtra(EXTRA_COUNT, 8);
|
|
|
|
final String intentName = intent.getStringExtra(EXTRA_INTENT_NAME);
|
|
|
|
|
|
|
|
switch(action) {
|
2018-06-13 22:22:59 +02:00
|
|
|
case ACTION_READ_DISCRETE_INPUT:
|
|
|
|
readDiscreteInputAction (ipAddress, port, ref, count, intentName);
|
2018-06-13 00:30:36 +02:00
|
|
|
case ACTION_READ_COIL :
|
2018-06-13 22:22:59 +02:00
|
|
|
readCoilAction(ipAddress, port, ref, count, intentName);
|
|
|
|
case ACTION_READ_INPUT_REGISTER :
|
|
|
|
readInputRegisterAction (ipAddress, port,ref, count, intentName);
|
2018-06-13 00:30:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean[] toPrimitiveArray(final List<Boolean> booleanList) {
|
|
|
|
final boolean[] primitives = new boolean[booleanList.size()];
|
|
|
|
int index = 0;
|
|
|
|
for (Boolean object : booleanList) {
|
|
|
|
primitives[index++] = object;
|
|
|
|
}
|
|
|
|
return primitives;
|
|
|
|
}
|
|
|
|
}
|