1

Androidアプリケーションで現在の時刻と日付を取得し、Bluetooth経由で送信しようとしています。時間とカレンダーの両方を使用して、時、分、秒、月、日、および年から2000を引いた値を取得しようとしました。次に、各値を1バイトにキャストし、それらをバイト配列に配置しようとしました。ただし、Bluetooth経由で値を送信しようとすると、反対側で値が間違って表示されます。私が撮影している形式は、ヘッダー(0xFF)の後に時間、分、秒、月、日、年が続く形式です。

public class Bluetooth extends Activity{
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private String bt_address;//00:18:E4:OC:67:FF
    private BluetoothAdapter mBluetoothAdapter = null;
    private BluetoothSocket btSocket = null;
    private OutputStream outStream = null;
    private InputStream inStream = null;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bluetooth);

    Button connect = (Button)findViewById(R.id.Btn_Connect);

    try{
        /*code removed, reads bt_address from a file or creates a file if no file exists yet*/

    } catch(IOException ioe){
        ioe.getStackTrace();
    }

    connect.setOnClickListener(new OnClickListener(){
        public void onClick(View v){
            try{
                /*code removed, saves bt_address to a file*/
            }

            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

            /*code removed, prompts user to turn on Bluetooth if not already on*/

            BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(bt_address);
            try {
                    btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e) {}
            mBluetoothAdapter.cancelDiscovery();
            try {
                    btSocket.connect();
                } catch (IOException e) {
                    try {
                        btSocket.close();
                    } catch (IOException e2) {}
                }
            try {
                    outStream = btSocket.getOutputStream();
             } catch (IOException e) {}

            try {
                    inStream = btSocket.getInputStream();
            } catch (IOException e) {}

                    Time time = new Time();
                    byte[] msgbuf = new byte[7];

                    msgbuf[0] = (byte)0xFF;
                    msgbuf[1] = (byte)time.hour;
                    msgbuf[2] = (byte)time.minute;
                    msgbuf[3] = (byte)time.second;
                    msgbuf[4] = (byte)(time.month + 1);
                    msgbuf[5] = (byte)time.monthDay;
                    msgbuf[6] = (byte)(time.year - 2000);

                    outStream.write(msgbuf);
           }
)};

このコードは、Bluetoothアドレスを使用してデバイスに接続し、ボタンがクリックされたときにタイムスタンプを送信するように設定されています。デバイスに接続し、その過程で長い数字の文字列を送信しますが、タイムスタンプを送信する前に切断されると思い始めています。

4

2 に答える 2

0

1 バイトだけ送信します。メソッド outStream.write(int) にはパラメーターとして int が必要です (重要なのは 8 バイトだけです)。だからあなたは正しく送信します。メッセージをフラッシュしましたか?

このメッセージをどのように受け取るかが重要です。InputStream.read()メソッドを読み取り、整数をバイトにキャストする必要があります。

おそらくより良い解決策は、バイトをoutStream.write(msgbuf)として送信し、 inputStream.read(receiveBuffer);として読み取ることです。

于 2012-04-24T06:33:41.220 に答える
0

Android のTimeクラスには、Time オブジェクトを 2 つの異なる標準化された文字列形式( format2445()format3339() ) に変換する組み込み関数があります。彼らはすでにあなたのためにそこにいて、オープン スタンダードを実装しており、他の誰かが QA を行っています。

文字列は、使用している形式よりも少し長くなりますが、このサイズでは問題になるとは思えません。同様に、受信側でデコードするのが少し難しくなります。人間が読める文字列であるため、デバッグが容易になります。

これら 2 つの文字列形式のいずれかを使用することをお勧めします。

于 2012-04-24T06:52:13.790 に答える