首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在android上通过蓝牙接收数据包

在android上通过蓝牙接收数据包
EN

Stack Overflow用户
提问于 2013-12-18 08:01:36
回答 2查看 1.6K关注 0票数 0

我对arduino和android领域都很陌生。我使用arduino通过蓝牙模块向android发送数据(linvor JY-MCU v.1.05)。它与我的应用程序通信非常完美,但我无法接收到这个特定应用程序的任何数据。我正在从arduino =>转一个包裹($ 43,56!)我想要提取它,并在android应用程序上单独显示数字。在这里$-header, 43-hr value, 56-temp value, !-footer

我的arduino代码如下所示:

代码语言:javascript
复制
  #include <SoftwareSerial.h>


  SoftwareSerial mySerial(10, 11); // RX, TX
  String command = "";             // Stores response of bluetooth device
                           // which simply allows \n between each
                           // response.


  void setup() {
  mySerial.begin(9600); // initialization

  delay(25);
  }

  void loop() 

  {
  mySerial.println("$-43:56^!");  // print   message


  delay(5000);
  }

字符串就像一个包。我希望43显示在编辑框中,56显示在文本框中。

我的android代码也是一个检查蓝牙连接性的庞大代码。所以我把它限制在一个部分。有谁能帮我把这两组数字分别用两个txtView1和txtView2显示出来吗?

代码语言:javascript
复制
    package com.example.projtrial;

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.lang.reflect.Method;
    import java.util.UUID;

    import com.example.projtrial.R;


    import android.R.string;
    import android.os.Bundle;
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Intent;
    import android.os.Build;
    import android.view.Menu;
    import android.os.Handler;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.EditText;
    import java.util.regex.Pattern;
    import java.util.Arrays;
    import java.util.StringTokenizer;

    public class MainActivity extends Activity {
  private static final String TAG = "projtrial";

  public EditView editView1;
  public TextView textView1;
  Handler h;

final int RECEIVE_MESSAGE = 1;       //Handler status
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder sb = new StringBuilder();

private ConnectedThread mConnectedThread;

//SPP UUID service
  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-    00805F9B34FB");       
// MAC-address of Bluetooth module 
  private static String address = "20:13:05:13:01:98";

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


editText1 = (EditText) findViewById(R.id.editText1);       
textView1 = (TextView) findViewById(R.id.textView1);

h = new Handler() {
    private String strIncom;
private String header;
    private String hr;
    private String tempr;
    private String footer;


public void handleMessage(android.os.Message msg) {

switch (msg.what) {
        case RECEIVE_MESSAGE:   // If one receives a message                                

            byte[] readBuf = (byte[]) msg.obj;
            String header = new String(readBuf, 0, msg.arg1);

            String[] separated = message.split("\\:");
            editText1.setText("hr: " + separated[0]);  //works
            textView1.setText("temp:" + separated[1]); //doesnt work
               }
            break;    
    }

};

};


btAdapter = BluetoothAdapter.getDefaultAdapter();       // get Bluetooth adapter
checkBTState();

}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws        IOException {
    if(Build.VERSION.SDK_INT >= 10){
        try {
            final Method  m =   device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
            return (BluetoothSocket) m.invoke(device, MY_UUID);
        } catch (Exception e) {
            Log.e(TAG, "Could not create Insecure RFComm Connection",e);
        }
    }
    return  device.createRfcommSocketToServiceRecord(MY_UUID);
}


@Override
public void onResume() {
  super.onResume();

  Log.d(TAG, "...onResume - try connect...");

  // Set up a pointer to the remote node using it's address.
  BluetoothDevice device = btAdapter.getRemoteDevice(address);

  // Two things are needed to make a connection:
  //   A MAC address, which we got above.
  //   A Service ID or UUID.  In this case we are using the
  //     UUID for SPP.

try {
    btSocket = createBluetoothSocket(device);
} catch (IOException e) {
    errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
}

  /*try {
    btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
  } catch (IOException e) {
    errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
  }*/

  // Discovery is resource intensive.  Make sure it isn't going on
  // when you attempt to connect and pass your message.
  btAdapter.cancelDiscovery();

  // Establish the connection.  This will block until it connects.
  Log.d(TAG, "...Connecting...");
  try {
    btSocket.connect();
    Log.d(TAG, "....Connection ok...");
  } catch (IOException e) {
    try {
      btSocket.close();
    } catch (IOException e2) {
      errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
    }
  }

  // Create a data stream so we can talk to server.
  Log.d(TAG, "...Create Socket...");

  mConnectedThread = new ConnectedThread(btSocket);
  mConnectedThread.start();
}

@Override
public void onPause() {
  super.onPause();

  Log.d(TAG, "...In onPause()...");

  try     {
    btSocket.close();
  } catch (IOException e2) {
    errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
  }
}

private void checkBTState() {
  // Check for Bluetooth support and then check to make sure it is turned on
  // Emulator doesn't support Bluetooth and will return null
  if(btAdapter==null) { 
    errorExit("Fatal Error", "Bluetooth not support");
  } else {
    if (btAdapter.isEnabled()) {
      Log.d(TAG, "...Bluetooth ON...");
    } else {
      //Prompt user to turn on Bluetooth
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
      startActivityForResult(enableBtIntent, 1);
    }
  }
}

private void errorExit(String title, String message){
  Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
  finish();
}

private class ConnectedThread extends Thread {
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }


  public void run() {
        byte[] buffer = new byte[256];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
              h.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();       // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
/*
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
  */
            }
      }
        }
   }

快来人帮帮我。我已经忍受了一个多星期的痛苦。提前感谢你。桑杰

"Case接收“和"Run”是必须进行更改的循环。查找字符"indexOf()“的索引将提供一个错误(字符串索引超出绑定范围)。我也试过在进入箱子后关掉蓝牙,但是没有成功。希望能找到解决办法。

EN

回答 2

Stack Overflow用户

发布于 2013-12-18 15:44:51

信息包含了什么?使用

代码语言:javascript
复制
byte[] readBuf = (byte[]) msg.obj;
String header = new String(readBuf, 0, msg.arg1);

所有连续

代码语言:javascript
复制
 byte[] readBuf2 = (byte[]) msg.obj; 
 String hr = new String(readBuf2, 0, msg.arg1);

你总是提取相同的数据。考虑到在obj中包含了$!之间的字符,那么您可以读取所有消息。

代码语言:javascript
复制
byte[] readBuf = (byte[]) msg.obj;
String message = new String(readBuf, 0, msg.arg1);

然后提取所有的线

代码语言:javascript
复制
String[] cell = message.split("\n");
txtView1.setText("HR:" +cell[1]);
[...]

如果在obj中有一些byte[],那么必须将它们添加到缓冲区中,然后删除所有字节直到$,添加byte[]直到找到!,从缓冲区中提取和删除两个数据之间的数据,包括在内,并按我前面说的做。(好吧,这只是一个解决方案)

票数 0
EN

Stack Overflow用户

发布于 2013-12-19 22:23:45

现在我一开始就没有用过蓝牙,但我想说的是,问题就在这几条线上:

代码语言:javascript
复制
mySerial.println("$");  // print   message

mySerial.println(23);

mySerial.println(546);

mySerial.println("!");

因为您使用println(),所以在每一行都将消息作为单独的数据包发送,因此接收端不能将其拆分并使用信息。

我也遇到了类似的问题,只需将所需的所有数据放在一个字符串中,然后将整个字符串发送一次,就可以解决这个问题。

由于某种原因,arduino编码语言也无法将整数和字符串连接到另一个字符串,就像这样,我花了一段时间才弄清楚,但您只需使用类似于以下代码的行:

代码语言:javascript
复制
String output = "$";
output += 23; //or "23", not sure if it matters which one you use.
output += 546;
output += "!";
mySerial.println(output);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20652622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档