2017-10-03 16 views
-1

Windows 10 Systemで正常に動作し、ネットワーク上のリモートデバイスを検出できる以下のコードを見つけてください。 Linuxでは、私たちはコードの外にjarファイルを作成し、我々はWindowsのOSが、あるアプリケーションで実行されているデバイスを検出することができない-jar test.jar LinuxのRaspberry OSのBacNet/IPブロードキャストが動作しない

package main; 

import java.util.ArrayList; 
import java.util.List; 

import com.serotonin.bacnet4j.LocalDevice; 
import com.serotonin.bacnet4j.RemoteDevice; 
import com.serotonin.bacnet4j.RemoteObject; 
import com.serotonin.bacnet4j.ServiceFuture; 
import com.serotonin.bacnet4j.event.DeviceEventAdapter; 
import com.serotonin.bacnet4j.exception.BACnetException; 
import com.serotonin.bacnet4j.exception.ErrorAPDUException; 
import com.serotonin.bacnet4j.npdu.ip.IpNetwork; 
import com.serotonin.bacnet4j.npdu.ip.IpNetworkBuilder; 
import com.serotonin.bacnet4j.service.acknowledgement.ReadPropertyAck; 
import com.serotonin.bacnet4j.service.acknowledgement.ReadPropertyMultipleAck; 
import com.serotonin.bacnet4j.service.confirmed.*; 
import com.serotonin.bacnet4j.service.unconfirmed.WhoIsRequest; 
import com.serotonin.bacnet4j.transport.DefaultTransport; 
import com.serotonin.bacnet4j.transport.Transport; 
import com.serotonin.bacnet4j.type.constructed.ReadAccessResult; 
import com.serotonin.bacnet4j.type.constructed.ReadAccessSpecification; 
import com.serotonin.bacnet4j.type.constructed.SequenceOf; 
import com.serotonin.bacnet4j.type.enumerated.ObjectType; 
import com.serotonin.bacnet4j.type.enumerated.PropertyIdentifier; 
import com.serotonin.bacnet4j.type.enumerated.Segmentation; 
import com.serotonin.bacnet4j.type.primitive.ObjectIdentifier; 
import com.serotonin.bacnet4j.type.primitive.Real; 
import com.serotonin.bacnet4j.util.DiscoveryUtils; 

public class test { 

    public static void main(String[] args) throws Exception { 

     IpNetwork network = new IpNetworkBuilder().broadcastIp("192.168.1.255").localBindAddress("192.168.1.164").port(47808).build(); 
     Transport transport = new DefaultTransport(network); 
     transport.setTimeout(500000); 
     transport.setSegTimeout(15000); 
     LocalDevice localDevice = new LocalDevice(21312, transport);    

     localDevice.getEventHandler().addListener(new DeviceEventAdapter() { 
      @Override 
      public void iAmReceived(RemoteDevice device) { 
       System.out.println("Discovered device " + device); 
       System.out.println("device Address" + device.getAddress().getMacAddress().getDescription()); 
       localDevice.addRemoteDevice(device); 


       final RemoteDevice remoteDevice = localDevice.getRemoteDevice(device.getAddress()); 

       remoteDevice.setSegmentationSupported(Segmentation.segmentedBoth); 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          try { 
           DiscoveryUtils.getExtendedDeviceInformation(localDevice, remoteDevice); 
          } catch (BACnetException e) { 
           e.printStackTrace(); 
          } 
          System.out.println(remoteDevice.getName() + " " + remoteDevice.getVendorName() + " " + remoteDevice.getModelName() + " " + remoteDevice.getAddress() + " " + remoteDevice.getProtocolRevision() + " " + remoteDevice.getProtocolVersion()); 

          ReadPropertyAck ack = localDevice.send(remoteDevice, new ReadPropertyRequest(remoteDevice.getObjectIdentifier(), PropertyIdentifier.objectList)).get(); 
          SequenceOf<ObjectIdentifier> value = ack.getValue(); 

          for (ObjectIdentifier id : value) { 

           List<ReadAccessSpecification> specs = new ArrayList<ReadAccessSpecification>(); 
           specs.add(new ReadAccessSpecification(id, PropertyIdentifier.presentValue)); 
           specs.add(new ReadAccessSpecification(id, PropertyIdentifier.units)); 
           specs.add(new ReadAccessSpecification(id, PropertyIdentifier.objectName)); 
           specs.add(new ReadAccessSpecification(id, PropertyIdentifier.description)); 
           specs.add(new ReadAccessSpecification(id, PropertyIdentifier.objectType)); 
           ReadPropertyMultipleRequest multipleRequest = new ReadPropertyMultipleRequest(new SequenceOf<ReadAccessSpecification>(specs)); 

           ReadPropertyMultipleAck send = localDevice.send(remoteDevice, multipleRequest).get(); 
           SequenceOf<ReadAccessResult> readAccessResults = send.getListOfReadAccessResults(); 

           System.out.print(id.getInstanceNumber() + " " + id.getObjectType() + ", "); 
           for (ReadAccessResult result : readAccessResults) { 
            for (ReadAccessResult.Result r : result.getListOfResults()) { 
             System.out.print(r.getReadResult() + ", "); 
            } 
           } 
           System.out.println(); 
          } 

          ObjectIdentifier mode = new ObjectIdentifier(ObjectType.analogValue, 11); 

          ServiceFuture send = localDevice.send(remoteDevice, new WritePropertyRequest(mode, PropertyIdentifier.presentValue, null, new Real(2), null)); 
          System.out.println(send.getClass()); 

         } catch (ErrorAPDUException e) { 
          System.out.println("Could not read value " + e.getApdu().getError() + " " + e); 
         } catch (BACnetException e) { 
          e.printStackTrace(); 
         } 

        } 
       }).start(); 
      } 

      @Override 
      public void iHaveReceived(RemoteDevice device, RemoteObject object) { 
       System.out.println("Value reported " + device + " " + object); 
      } 
     }); 


     localDevice.initialize();   
     localDevice.sendGlobalBroadcast(new WhoIsRequest());    

     System.in.read(); 
     localDevice.terminate(); 
    } 
} 

Javaを使用して、それを実行していますWindows上で動作している場合、Linux BacNet localDeviceを検出できます。コードは同じですが、Linux上でBacNetデバイスを検出できません。

解決策を見つけるお手伝いをしてください。

答えて

0

ブロードキャストとLocalBindAddressを削除して問題を解決しました。

0

このような問題(部分的な可視性)は、しばしば私のIPパラメータの「不一致」を引き起こします。私はあなたが "192.168.1.255"をハードコードしていることに気付きました。これは本当にPIの観点からのブロードキャストIPアドレスですか?

+0

私たちはネットワーク192.168.1。*を持っていますが、ブロードキャストIPとして255.255.255.255も試しました。 – Rahul

+0

明確にする:Windows上で実行中のBACnetクライアントがあり、他のBACnetサーバーを検出できますが、Piで実行されているBACnetサーバーは見えません。正しい?したがって、1)WindowsプラットフォームでWiresharkを実行し、キャプチャフィルタを「udp port 47808」に設定し、トラフィックを観察します。 2)WindowsプラットフォームとPiの両方にある複数のアダプタに注目して_close_注意を払う。どちらの側のBACnetも、 '間違った' 'Network Interface'(eth0、wlan0)などにバインドしてトラフィックの一部を見ることはできません。トラフィックは異なるサブネット上にある可能性があるからです。 – Edward

関連する問題