2012-02-21 7 views
5

XBee-API 인터페이스를 사용하는 MATLAB GUI를 작성하여 Arduino 보드의 XBee 무선 라디오와 통신하려고합니다. GUI는 주로 데이터 수집을 수행하고 들어오는 패킷을 구문 분석합니다.MATLAB에서 Java 인터페이스 구현

the Developer's Guide (see section "Receiving Packets")에 정의 된대로 addPacketListener을 처리하여 패킷 처리를 기다리고 싶습니다. 자바에서는,이 그것을 할 것이 방법입니다

xbee.addPacketListener(new PacketListener() { 
    public void processResponse(XBeeResponse response) { 
     // handle the response 
    } 
}); 

는 MATLAB에서, 내가 addlistener()을 내 처리 할 콜백을 설정합니다.

나는 많은 모든 자바에 대해 모르는, 그래서 라 MATLAB가 processResponse 코드를 설정할 수 있는지 궁금

: 난

function processResponse 
    #% do response here 
end 

>> xbee.addPacketListener(@processResponse) 

: 나는 다음과 같은 작업을 수행 할 수 있습니다 이것이 완전한 의미로 만들어 졌는지 확실하지 않습니다. 기본적으로 내가 달성하고자하는 일은 새로운 패킷이 내 XBee (Java에서 addPacketListener으로 처리됨)에 사용 가능 해지면 콜백을 실행하는 것입니다.

+0

나는 당신이 무엇을 요구하고 있는지 완전히 이해하지 못하고 있습니다. 위에서 설명한 것처럼 addPacketListener 메서드를 호출하면 패킷이 도착하면 processResponse 메서드가 호출되는 새 개체 (익명 내부 클래스)가 전달됩니다. 이것은 콜백입니다. "응답 처리"부분을 직접 작성하십시오. – cutchin

+0

@cutchin 그래서'processResponse' 메소드를 내보내는 별도의 MATLAB 클래스를 작성하고 그 클래스의 인스턴스를'addPacketListener'에 전달할 수 있습니까? 'processResponse' 메서드를 사용하여 MATLAB 객체를 전달하려고 시도하고 다음 오류가 발생했습니다 :'XB.addPacketListener (testclass) 'com.rapplogic.xbee.api.XBee'클래스에 일치하는 서명이있는 'addPacketListener'메소드가 없습니다. –

+0

저는 MATLAB 통합 분야의 전문가는 아니지만, 당신이이 문제에 대해 반대하고 있다고 생각합니다. 자바 코드를 작성하여 XBee 인터페이스를 시작하고 패킷을 먼저 수신하십시오. 명령 줄에서 제대로 작동하는지 확인하고 패킷이 도착하는지 확인할 수 있습니다. 거기에서 matlib에 가져올 라이브러리 (.jar 파일)를 작성하고 [here] (http://www.mathworks.com/help/techdoc/matlab_external/f6671)에 설명 된대로 클래스에서 데이터를 검색하도록합니다. .html). – cutchin

답변

3

제가 틀렸다면 알려주세요. 그러나 기본적으로 PacketListener.processResponse(XBeeResponse x)에 XBee의 호출을 가로 채고 들어오는 XBeeResponse 개체의 내용을 MATLAB에서 처리해야하는 것처럼 보입니다. 필자는 MATLAB 전문가가 아니지만 MATLAB 코드를 사용하여 Java 클래스를 구현 한 다음 해당 클래스를 Java로 다시 전달할 수 있습니까? 내 추측은 그렇지 않을 수도 있지만 잘못 될 수 있습니다.

여기서 다루는 문제는 자바 객체에서 MATLAB을 호출하는 것이 쉽지만 그 반대는 아닙니다. Java 코드를 사용하여 PacketListener을 실제로 구현 한 다음 matlabcontrol과 같은 써드 파티 라이브러리를 사용하여 Java PacketListener 구현에서 다시 MATLAB으로 함수 호출을 수행 할 수 있습니다.

MATLAB에서 작성된 백엔드 코드를 호출하기 위해 Java로 작성된 GUI가 필요한 대형 소프트웨어 프로젝트에서이 문제를 처리해야 했으므로 matlabcontrol의 기능을 보증 할 수 있습니다. Java 내에서 MATLAB을 제어 할 때 또 다른 중요한 리소스 인 undocumentedmatlab.com입니다.

편집

또 한가지는 자바 측에서 스레딩되어주의해야합니다. MatLab을 동시에 호출하는 Java 스레드는 얼마든지 가질 수 있지만 MatLab은 Java에서 모든 호출을 "순차 화"합니다. Java가 MatLab 함수 "f1"및 "f2"를 호출해야한다고 가정 해 봅시다. 두 개의 자바 스레드를 설정하고 각각은 f1 또는 f2를 동시에 호출합니다. MatLab은 두 번째 함수 호출을 시작하기 전에 다른 함수가 끝날 때까지 기다릴 것을 강요합니다. 실제로 어느 것이 먼저 호출되는지는 완전히 불확정합니다.

내가 말하는 이유는 Java Thread가 processResponse(XBeeResponse x) 함수라고 부르는 것은 MatLab을 호출하고 MatLab이 이미 다른 작업을 수행 중일 때 차단됩니다. PacketListener가 들어오는 XBeeResponse 인스턴스를 캐시하여 XBee가 MatLab이 데이터를 처리 할 때까지 기다리지 않아도되도록하는 것이 가장 좋습니다. 명심할 것.

+0

확실히 데이터를 matlab에서 Java로 확실히 전달할 수있다. – macduff

+0

matlabcontrol은 훌륭한 도구입니다. 감사! –

-1

MATLAB을 Java와 인터페이스하려면 인터페이스 요구 사항을 Bringing Java Classes and Methods into MATLAB Workspace에 따르십시오.

최악의 경우 Java Jars 클래스 경로를 javaclass 경로에 추가 한 다음 생성자, 메소드 등을 호출하는 것이 가장 좋습니다.