0

NXT のメールボックスに書き込むことはできますが、(まだ) 読み取ることができません。

セットアップは、GitHub の MindDroid をスターターとして使用することです。

sendBTCmessage(0, BTCommunicator.START_PROGRAM, "bt1.rxe");
            sendBTCmessage(1000, BTCommunicator.SENDMAILBOX, "Kilroy was here");
            sendBTCmessage(3000, BTCommunicator.READMAILBOX,"",1);

SendBTCmessage (int,int,String,int) は新しい...

void sendBTCmessage(int delay, int message, String name, int mBox) { Bundle myBundle = new Bundle(); myBundle.putInt("メッセージ", メッセージ); myBundle.putString("名前", 名前); myBundle.putInt ("メールボックス",mBox); メッセージ myMessage = myHandler.obtainMessage(); myMessage.setData(myBundle); Log.d(TAG,String.format("sendBTCmessageStringMbox %d %d %s mBox=%d",delay, message,name,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で。

助けていただければ幸いです...ジョンに感謝します

4

1 に答える 1

2

このMESSAGE_READコマンドNXTは、メールボックス内の最初に使用可能なメッセージを応答として返信するようにリモートに要求します。そのためDIRECT_COMMAND_REPLY、コマンドタイプとして。の代わりに使用する必要がありDIRECT_COMMAND_NOREPLYます。

Bluetoothストリームから返信データを読み取る方法は表示されませんが、返信をリクエストする場合は、メソッドSendMessageAndState()がリモートから返信データを読み取り、適切なデータ型として返す必要があるようです。またはのいずれかを使用してNXTから。NXTDIRECT_COMMAND_REPLYSYSTEM_COMMAND_REPLY

以下のコードスニペットは、この問題をどのように解決したかを示しています(世界で最も洗練されたJavaコードでない場合は、すみません!)

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;
}

mInおよびmOutは、それぞれBluetoothソケットのInputStreamおよびOutputStreamであり、呼び出しによってgetInputStream()返さgetOutputStream()れ、BluetoothSocket上で。によって返されcreateRfcommSocketToServiceRecord(SPP_UUID)ます。MASK_NOREPLY私のパッケージの他の場所で次のように定義されています:

  public static byte MASK_NOREPLY = (byte) 0x80;

したがって、メッセージ送信方法(または近くのどこか)は、リモートNXTからの応答を要求した場合は、それを読み取る準備をしておく必要があります。次に、リモートNXTから要求したメールボックスメッセージを表示できるようになります。

ところで、NXT-Gプログラムは問題ないようです。-マイク

于 2012-11-07T08:08:26.440 に答える