передача двойников между java и simulink с помощью udp

мне нужно передать десятичные значения между Java-программой и моделью Simulink, для этого я использую UDP-сокеты, они не являются проблемой на стороне java. В Simulink я могу отправить значения, используя блок "Stream Output", но проблема возникает при получении от java! блок "Stream input" ничего не получает. Я использую стандартный протокол UDP устройств с правильным локальным портом UDP, а адрес - " localhost. Пожалуйста, скажите мне, как правильно получить double в simulink с udp, или даже с другими методами, какое значение имеет передача данных. Спасибо заранее. вот некоторые коды:

localSocket = new DatagramSocket(9010);

...

 public static void localSend(String msg,int PORT) throws Exception{  
    DatagramPacket sendPacket = null,encPacket=null;
    try {
        sendPacket = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), PORT);
    } catch (Exception e) {
        System.out.printf("Error!");
    }
    localSocket.send(sendPacket);
}

и в основном методе:

localSend(myMessage, 9005);

"настройка платы" блока "входной поток" является Simulink, как показано ниже: enter image description here

вот как я получаю данные от Simulink ins Java (метод):

    public static String localReceive() throws Exception{                     
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
     int count=0;
       try {
           localSocket.receive(receivePacket);
            return new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
            } catch (SocketTimeoutException socketTimeoutException) {
                return defaultValue;
            }
 }

и настройка блока "выходной поток" в Симулинк: enter image description here

2 ответов


другое решение, с входным потоком в Simulink. Просто добавьте Терминатор "\n " к каждому сообщению с java.


Я сделал трюк. Блок Simulink "пакетного ввода" и "ASCII декодирование", blocks connection

настроить параметры этих 2 блоков следующим образом:

the 'Packet Input' block

the 'ASCII Decoder

и на стороне java я "переформатирую" двойной, с помощью этого метода:

public static String reformat(String str){
    double d = 0;
    DecimalFormat df=null;
    try {
        d = Double.parseDouble(str);
    } catch (NumberFormatException numberFormatException) {
        return "0.00000";
    }
    if(d>=0){
    String[] sp=str.split("\.");
    if(sp[0].length()==0)
    df= new DecimalFormat("0.00000");
    if(sp[0].length()==1)
    df= new DecimalFormat("0.00000");
    if(sp[0].length()==2)
        df= new DecimalFormat("00.0000");
    if(sp[0].length()==3)
        df= new DecimalFormat("000.000");
    if(sp[0].length()==4)
        df= new DecimalFormat("0000.00");
    if(sp[0].length()==5)
        df= new DecimalFormat("00000.0");
    }
    else{
    String[] sp=str.split("\.");
    if(sp[0].length()==1)
    df= new DecimalFormat("0.0000");
    if(sp[0].length()==2)
    df= new DecimalFormat("0.0000");
    if(sp[0].length()==3)
        df= new DecimalFormat("00.000");
    if(sp[0].length()==4)
        df= new DecimalFormat("000.00");
    if(sp[0].length()==5)
        df= new DecimalFormat("0000.0");
    if(sp[0].length()==6)
        df= new DecimalFormat("000000");
    }

    try {
        return df.format(d);
    } catch (Exception e) {
        return "0.00000";
    }
}

кратко: блок ввода пакета получает 7 ASCIIs каждый раз, и в java я переформатирую двойной, который будет объединен из 7 символов (включая точку и минус).

надеюсь, что это поможет кому-то.

обновление:

some self explanatory extra code:

//somewhere before:
//Global variables
    String defaultValue="0",ip="xxx.xx.xx.xx";
    DatagramSocket remoteSocket,localSocket;
    byte[] receiveArray,receiveKey,receiveSig,sendSig;
    int remoteSendPort=xxx,localSendport=xxx,
        remoteReceivePort=xxx,localReceivePort=xxx;    
    String feedback,control_val,ReceivedTimeStamp;
    InetAddress IPAddress;     
...
//receive message from the other java program in pc2 
    public  void remoteMsgSend(byte[] msg,InetAddress IPAddress, int PORT)  {     
        try {     
            DatagramPacket sendPacket = null;
            try {
                sendPacket = new DatagramPacket(msg, msg.length, IPAddress, PORT);
            } catch (Exception e) {
                System.out.printf("Error! check ports");
            }
            remoteSocket.send(sendPacket);
        } catch (IOException ex) {
            System.out.println("IOException! remote send");
        }
    }
    //receive message from the other java program in pc2
    public  String remoteMsgReceive() {                     
         DatagramPacket receivePacket = new DatagramPacket(receiveArray, receiveArray.length);
         byte[] r1;
         int count=0,len,offset;
           try {
               remoteSocket.receive(receivePacket);
               r1=receivePacket.getData();
               len=receivePacket.getLength();
               offset=receivePacket.getOffset();
               r1=Arrays.copyOfRange(r1, offset, len);
               remoteOk=true;
                return new String(r1);
                } catch (Exception ex) {
//                    System.out.println("remote receive time out: " +ex.getMessage());
                    remoteOk=false;
                    return defaultValue;
                }
     }

    //send data to matlab on this pc
    public  void localSend(String msg,int PORT)  {  
        DatagramPacket sendPacket = null;
        try {
            sendPacket = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), PORT);
        } catch (Exception e) {
            System.out.printf("Error! check ports");
        }
        try {
            localSocket.send(sendPacket);
        } catch (IOException ex) {
            System.out.println("localsend error");
        }
    }
    //receive data from Matlab on this pc
    public  String localReceive() {                     
         DatagramPacket receivePacket = new DatagramPacket(receiveArray, receiveArray.length);

         String rec;
           try {
               localSocket.receive(receivePacket);
               rec=new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
               localOk=true;
                return rec;
                } catch (Exception ex) {
//                          System.out.println("local receive time out " +ex.getMessage());
                          localOk=false;
                          return defaultValue;
                }
     }