2012-09-19 3 views
0

NXT의 편지함에 글을 쓸 수는 있지만 읽을 수는 없습니다.MindStorms를 사용하는 MailBox를 통한 Android NXT 통신

설치 프로그램은 GitHub의 MindDroid를 시동기로 사용합니다.

SendBTCmessage (INT, INT 문자열 INT)가 새로운
sendBTCmessage(0, BTCommunicator.START_PROGRAM, "bt1.rxe"); 
      sendBTCmessage(1000, BTCommunicator.SENDMAILBOX, "Kilroy was here"); 
      sendBTCmessage(3000, BTCommunicator.READMAILBOX,"",1); 

...

공극 sendBTCmessage (INT 지연 INT 메시지 문자열 이름, INT MBOX) { 번들 myBundle = 새로운 번들 (); myBundle.putInt ("message", message); myBundle.putString ("name", name); myBundle.putInt ("MailBox", mBox); 메시지 myMessage = myHandler.obtainMessage(); myMessage.setData (myBundle); Log.d (TAG, String.format ("sendBTCmessageStringMbox % d % s mBox = % d", 지연, 메시지, 이름, mBox)); 이것은 어디 핸들러에 요청을 전송

if (delay == 0) 
     btcHandler.sendMessage(myMessage); 
    else 
     btcHandler.sendMessageDelayed(myMessage, delay); 
} 

...

case SENDMAILBOX: 
       Log.d(TAG,String.format("case SENDMAILBOX %d %s",myMessage.getData().getInt("value1"), myMessage.getData().getString("name"))); 
       sendMailbox(myMessage.getData().getInt("MailBox"),myMessage.getData().getString("name")); 
       break; 
      case READMAILBOX: 
       Log.d(TAG,String.format("case ReadMAILBOX %d %s",myMessage.getData().getInt("MailBox"), myMessage.getData().getString("name"))); 
       readMailbox(myMessage.getData().getInt("MailBox")); 
       break; 
      case START_PROGRAM: 
       startProgram(myMessage.getData().getString("name")); 
       break; 

메시지는 "startProgram는"표준 더 준비하고, 잘 작동되는 ...

private void startProgram(String programName) { 
    byte[] message = LCPMessage.getStartProgramMessage(programName); 
    Log.d(TAG,String.format("startProgram %s %s",programName,LCPMessage.getStartProgramMessage(programName))); 
    sendMessageAndState(message); 
} 
private void readMailbox(int mBox){ 
    byte[] message = LCPMessage.getReadMailboxMessage(mBox); 
    Log.d(TAG,String.format("readMailbox %d",mBox)); 
    logByteArray(TAG,"sendMailBox",message); 
    sendMessageAndState(message); 
} 
private void sendMailbox(int mBox,String text){ 
    byte[] message = LCPMessage.getMailBoxMessage(mBox,text); 
    Log.d(TAG,String.format("mail box message %s %d",text,message.length)); 
    logByteArray(TAG,"sendMailBox",message); 
    sendMessageAndState(message); 
} 

최종 준비는 ...

public static byte[] getMailBoxMessage(int mBox, String text){ 
    byte[] message = new byte[text.length()+5]; 
    message[0] = DIRECT_COMMAND_NOREPLY; 
    message[1] = MESSAGE_WRITE; 
    message[2] = (byte)mBox; 
    message[3] = (byte)(text.length()+1); 
    for (int pos=0; pos<text.length(); pos++) 
     message[4+pos] = (byte) text.charAt(pos); 
    message[text.length()+4] = 0; 
    return message; 
} 
public static byte[] getReadMailboxMessage(int mBox){ 
    byte[] message = new byte[5]; 
    message[0] = DIRECT_COMMAND_REPLY; 
    message[1] = MESSAGE_READ; 
    message[2] = (byte)(mBox+10); 
    message[3] = (byte)mBox; 
    message[4] = (byte)0x01; //true 
    return message; 
} 
public static byte[] getStartProgramMessage(String programName) { 
    byte[] message = new byte[22]; 

    message[0] = DIRECT_COMMAND_NOREPLY; 
    message[1] = START_PROGRAM; 

    // copy programName and end with 0 delimiter 
    for (int pos=0; pos<programName.length(); pos++) 
     message[2+pos] = (byte) programName.charAt(pos); 

    message[programName.length()+2] = 0; 

    return message; 
} 

내가 가진 문제는 메시지를받는 NXT 프로그램이 제대로 작동하지만 사서함에있는 내용을 읽는 방법을 알 수 없다는 것입니다. http://www.android-tele-health.com/bt1.rbt은 NXT에서 실행되는 프로그램입니다.

감사 어떤 도움을 ... 감사합니다 존

답변

2

MESSAGE_READ 명령 요청 원격 NXT을 응답로 다시 에 사서함에서 사용 가능한 첫 번째 메시지를 보낼 수 있습니다. 따라서 DIRECT_COMMAND_NOREPLY 대신 DIRECT_COMMAND_REPLY을 명령 유형으로 사용해야합니다.

블루투스 스트림에서 답장 데이터를 읽는 방법을 보여주지는 않지만, SendMessageAndState()은 리모컨 NXT에서 답장 데이터를 읽고 적절한 데이터 형식으로 사용자에게 반환 할 수 있어야합니다. , DIRECT_COMMAND_REPLY 또는 SYSTEM_COMMAND_REPLY을 사용하여 NXT에서 회신을 요청하는 경우 나는 각각이 문제 (이것은 세계에서 가장 우아한 자바 코드가 아닌 경우 실례!)

public synchronized byte[] sendBTMessage(byte[] request) { 
    int lsb = request.length; 
    int msb = request.length >>> 8; 
    try { 
     mOut.write((byte) lsb); 
     mOut.write((byte) msb); 
     mOut.write(request); 
    } catch (IOException e) { 
     Log.e(TAG, "sendBTMessage: Write failed."); 
    } 
    if ((request[0] & MASK_NOREPLY) == 0) { // Reply requested 
     byte[] reply = readBTMessage(); 
     if (reply == null) { 
      return null; 
     } 
     if (reply[0] != 0x02) { 
      // Not a reply? 
      Log.e(TAG, "sendBTMessage read a message that was not a reply."); 
      Log.e(TAG, "Hex: " + HexValues(reply)); 
      return new byte[] {(byte) 0xFF}; 
     } 
     if (reply[1] != request[1]) { 
      // Reply for incorrect request? 
      Log.e(TAG, "sendBTMessage received a reply for the wrong request."); 
      Log.e(TAG, "Hex: " + HexValues(reply)); 
      return new byte[] {(byte) 0xFF}; 
     } 
     byte[] replymessage = new byte[reply.length - 2]; 
     System.arraycopy(reply, 2, replymessage, 0, replymessage.length);    
     return replymessage; 
    } 
    return new byte[] {0}; 
} 

public byte[] readBTMessage() { 
    byte[] buffer = new byte[66]; // All BT messages are a maximum of 66 bytes long 
    int numBytes; 
    try { 
     numBytes = mIn.read(buffer); 
    } catch (IOException e) { 
     Log.e(TAG, "readBTMessage: Read failed."); 
     return null; 
    } 
    if (numBytes <= 0) return null; 
    int msgLength = buffer[0] + (buffer[1] << 8); 
    if (numBytes != msgLength + 2) { 
     Log.e(TAG, "readBTMessage: BT Message wrong length."); 
     Log.e(TAG, "BT Message: " + HexValues(buffer)); 
     return null; 
    } 
    byte[] result = new byte[msgLength]; 
    System.arraycopy(buffer, 2, result, 0, msgLength); 
    return result; 
} 

mInmOut은 블루투스 소켓의의 InputStream과 OutputStream에 해결하는 방법

코드 조각 아래 보여 주었다 및 getOutputStream()createRfcommSocketToServiceRecord(SPP_UUID)에 의해 반환 된 BluetoothSocket에서 호출하여 반환됩니다. MASK_NOREPLY는 나의 패키지에 다른 곳에서 정의된다

그래서, (어딘가에 근처 나) 방법을 보내는 메시지는 당신이 하나를 요청한 경우 원격 NXT에서 응답을 읽을 준비를해야
public static byte MASK_NOREPLY = (byte) 0x80; 

.그런 다음 원격 NXT에서 요청한 사서함 메시지를 볼 수 있습니다.

귀하의 NXT-G 프로그램은 잘 보입니다. - 마이크