0

我正在尝试开发一个 Android 应用程序,它与用 C++ 编写的函数执行相同的功能,以在手机和远程以太网接口之间进行通信(我不知道它到底是什么......)。

我知道我必须将 15 个字节从十六进制值中检索到接口传递给连接到接口的一些负载。

我已经尝试了一些事情,最接近正确解决方案的似乎是这个:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://192.168.2.100:1001");

        try {
            //String message "AA10A0F0F0FFFF0102FF00010091A5";              
            byte[] messaggioInBytes={(byte)10101010, //AA
                    (byte)00010000,  //10
                    (byte)10100000,  //A0
                    (byte)11110000,  //F0
                    (byte)11110000,  //F0
                    (byte)11111111,  //FF
                    (byte)11111111,  //FF
                    (byte)00000001,  //01
                    (byte)00000010,  //02
                    (byte)11111111,  //FF
                    (byte)00000000,  //00
                    (byte)00000001,  //01
                    (byte)00000000,  //00
                    (byte)10010001,  //91
                    (byte)10100101}; //A5

            httppost.setEntity(new ByteArrayEntity(messaggioInBytes));

            // Execute HTTP Post Request

            httpclient.execute(httppost);


            } catch(Exception e){
                Log.i("ConnectionHandler", "Error", e);

            }

使用此代码,以太网接口停止闪烁并开始监听,但它似乎没有接收到正确的命令字节串。

我的疑惑与:1.发送命令的格式 2.使用的连接类型

关于这个系统,我唯一知道的是它与这个 C++ 函数配合得很好,所以我想知道是否有办法将它翻译成 Android 的 Java 代码,而不是使用 Android NDK 来导入它。

C++ 函数如下:

void __fastcall TForm1::SendClick(TObject *Sender)
{
unsigned char Buffer[15];
AnsiString Line;
Buffer[0] = 0xAA;
...
Buffer[13] = 0x91;
Buffer[14] = 0xA5;
ClientSocket1->Socket->SendBuf(Buffer,15);
}

有没有人可以指出我正确的方向?

4

1 回答 1

0

不确定您是否还有其他问题,但是当您尝试用字节填充数组时,您正在尝试获取错误数字的字节值。

(byte) 00010000

正在尝试将 10000(一万)填充到一个字节中。尝试输入十六进制值,

(byte)0xAA, (byte)0x10, etc.

编写了一个小测试类,只是为了验证尝试转换字节的位表示是问题所在:

public class TestByteArray {

static byte[] myTestArray = {(byte) 0xAA,
                      (byte) 0x10,
                      (byte) 0xA0,
                      (byte) 0xF0,
                      (byte) 0xF0,
                      (byte) 0xFF,
                      (byte) 0xFF,
                      (byte) 0x01,
                      (byte) 0x02,
                      (byte) 0xFF,
                      (byte) 0x00,
                      (byte) 0x01,
                      (byte) 0x00,
                      (byte) 0x91,
                      (byte) 0xA5};

static byte[] myBitTestArray = {(byte)10101010, //AA
                         (byte)00010000,  //10
                         (byte)10100000,  //A0
                         (byte)11110000,  //F0
                         (byte)11110000,  //F0
                         (byte)11111111,  //FF
                         (byte)11111111,  //FF
                         (byte)00000001,  //01
                         (byte)00000010,  //02
                         (byte)11111111,  //FF
                         (byte)00000000,  //00
                         (byte)00000001,  //01
                         (byte)00000000,  //00
                         (byte)10010001,  //91
                         (byte)10100101}; //A5

public static void main(String[] args) {
    for(int i = 0;i < myTestArray.length; i++)
    {
        if(myTestArray[i] != myBitTestArray[i])
        {
            System.out.println("The value in myTestArray at index " + i + " is " + Integer.toHexString(myTestArray[i] & 0xFF).toUpperCase());
            System.out.println("The value in myBitTestArray at index " + i + " is " + Integer.toHexString(myBitTestArray[i] & 0xFF).toUpperCase());
        }
        else
            System.out.println("Arrays are equal at index " + i);
    }

}

}

于 2013-11-03T14:52:01.473 回答