如何读出通过蓝牙发送的传入值?
How to read out de incoming values send with Bluetooth?
我想使用从我的 Arduino 发送到我的 android 的数据。我能够将两者连接在一起并在我的屏幕上显示传入的数据。但是,当我想使用传入数据来设置评论时,这似乎不起作用。那么如何从传入数据中获取值?
String address1 = ("98:D3:81:FD:4B:87");
String name1 = ("Sensor_Shoe");
@SuppressLint("HandlerLeak")
protected void bluetoothconnect() {
btEnablingIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
requestCodeForEnable=1;
if (myBluetoothAdapter==null){
Toast.makeText(getApplicationContext(),"Bluetooth not supported", Toast.LENGTH_LONG).show();
} else {
if (!myBluetoothAdapter.isEnabled()) {
startActivityForResult(btEnablingIntent, requestCodeForEnable);
}
if (myBluetoothAdapter.isEnabled()) {
myBluetoothAdapter.disable();
Toast.makeText(getApplicationContext(),"Bluetooth disabled",Toast.LENGTH_SHORT).show();
TextView input1 = findViewById(R.id.input1); input1.setVisibility(View.INVISIBLE);
ImageButton btn_bluetooth = findViewById(R.id.btn_bluetooth); btn_bluetooth.setBackgroundColor(getResources().getColor(R.color.transparent));
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode==requestCodeForEnable){
ImageButton btn_bluetooth = findViewById(R.id.btn_bluetooth);
if(resultCode==RESULT_OK){
Toast.makeText(getApplicationContext(),"Bluetooth enabled",Toast.LENGTH_SHORT).show();
TextView input1 = findViewById(R.id.input1); input1.setVisibility(View.VISIBLE);
btn_bluetooth.setBackgroundColor(getResources().getColor(R.color.colorAccent));
createsocket();
}
else if(resultCode==RESULT_CANCELED){
Toast.makeText(getApplicationContext(),"Bluetooth enabling cancelled",Toast.LENGTH_SHORT).show();
TextView input1 = findViewById(R.id.input1); input1.setVisibility(View.INVISIBLE);
btn_bluetooth.setBackgroundColor(getResources().getColor(R.color.transparent));
}
}
}
protected void createsocket() {
new Thread() {
public void run() {
boolean fail = false;
BluetoothDevice device = myBluetoothAdapter.getRemoteDevice(address1);
try {
BTSocket = createBluetoothSocket(device);
} catch (IOException e) {
fail = true;
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show();
}
// Establish the Bluetooth socket connection.
try {
BTSocket.connect();
} catch (IOException e) {
try {
fail = true;
BTSocket.close();
BTHandler.obtainMessage(CONNECTING_STATUS, -1, -1)
.sendToTarget();
} catch (IOException e2) {
//insert code to deal with this
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show();
}
}
if (!fail) {
mConnectedThread = new ConnectedThread(BTSocket);
mConnectedThread.start();
BTHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name1)
.sendToTarget();
}
}
}.start();
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
try {
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", UUID.class);
return (BluetoothSocket) m.invoke(device, PORT_UUID);
} catch (Exception e) {
Log.e(TAG, "Could not create Insecure RFComm Connection",e);
}
return device.createRfcommSocketToServiceRecord(PORT_UUID);
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
}
public void run() {
byte[] buffer = new byte[1024]; // 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.available();
if(bytes != 0) {
buffer = new byte[1024];
SystemClock.sleep(100); //pause and wait for rest of data. Adjust this depending on your sending speed.
bytes = mmInStream.available(); // how many bytes are ready to be read?
bytes = mmInStream.read(buffer, 0, bytes); // record how many bytes we actually read
BTHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget(); // Send the obtained bytes to the UI activity
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
}
这就是我建立连接的方式,这似乎工作正常。比我使用下面的代码读出传入的数据。
BTHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == MESSAGE_READ) {
String readMessage = " ";
try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
inputdata1 = readMessage;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
TextView input1 = findViewById(R.id.input1);
input1.setText(readMessage);
if (readMessage.equals("X")){
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(100);
}
}
}
};
在文本视图中显示输入数据有效。但它无法识别传入数据中的 X。但是我可以看到这个数据在 textView 中输入,我确实用 de arduino 代码发送这个。
if (fsrReadingHeel >= (fsrReadingHeelOld + 800)){
Serial.println("X");
}
我知道代码已处理,因为当我说 if (!(readMessage.equals("X"))){ 时它会振动。
Arduinos Serial.print 发送 ASCII。构建字符串时,可以像这样使用 ASCII:Charset.setName("ASCII") 而不仅仅是 "UTF-8"。这对我来说很好(使用 Arduino Uno 和 HC-06 蓝牙模块):
readMessage = new String((byte[]) msg.obj, Charset.setName("ASCII"));
您从 byteBuffer 创建的字符串应限制为实际数据的大小 - 您可以为此使用 substring(0, sizeOfData)。
当我让我的应用程序与我的 Arduino Uno 连接时,我遇到了问题,根据配置,它忽略了 Android 中第一个发送的字节,所以尝试发送一个更长的字符串,看看是否你得到了一些东西,而且你实际上可以正确地阅读它。
我建议您使用 Serial.print 而不是 println,因为您不需要在发送时换行。它还可能会更改您在 Android.
上收到的消息
if (fsrReadingHeel >= (fsrReadingHeelOld + 800)){
Serial.print("X");
}
您也可以改用 Serial.write,但您不需要 - 请查看此处的差异:https://arduino.stackexchange.com/questions/10088/what-is-the-difference-between-serial-write-and-serial-print-and-when-are-they
我想使用从我的 Arduino 发送到我的 android 的数据。我能够将两者连接在一起并在我的屏幕上显示传入的数据。但是,当我想使用传入数据来设置评论时,这似乎不起作用。那么如何从传入数据中获取值?
String address1 = ("98:D3:81:FD:4B:87");
String name1 = ("Sensor_Shoe");
@SuppressLint("HandlerLeak")
protected void bluetoothconnect() {
btEnablingIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
requestCodeForEnable=1;
if (myBluetoothAdapter==null){
Toast.makeText(getApplicationContext(),"Bluetooth not supported", Toast.LENGTH_LONG).show();
} else {
if (!myBluetoothAdapter.isEnabled()) {
startActivityForResult(btEnablingIntent, requestCodeForEnable);
}
if (myBluetoothAdapter.isEnabled()) {
myBluetoothAdapter.disable();
Toast.makeText(getApplicationContext(),"Bluetooth disabled",Toast.LENGTH_SHORT).show();
TextView input1 = findViewById(R.id.input1); input1.setVisibility(View.INVISIBLE);
ImageButton btn_bluetooth = findViewById(R.id.btn_bluetooth); btn_bluetooth.setBackgroundColor(getResources().getColor(R.color.transparent));
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode==requestCodeForEnable){
ImageButton btn_bluetooth = findViewById(R.id.btn_bluetooth);
if(resultCode==RESULT_OK){
Toast.makeText(getApplicationContext(),"Bluetooth enabled",Toast.LENGTH_SHORT).show();
TextView input1 = findViewById(R.id.input1); input1.setVisibility(View.VISIBLE);
btn_bluetooth.setBackgroundColor(getResources().getColor(R.color.colorAccent));
createsocket();
}
else if(resultCode==RESULT_CANCELED){
Toast.makeText(getApplicationContext(),"Bluetooth enabling cancelled",Toast.LENGTH_SHORT).show();
TextView input1 = findViewById(R.id.input1); input1.setVisibility(View.INVISIBLE);
btn_bluetooth.setBackgroundColor(getResources().getColor(R.color.transparent));
}
}
}
protected void createsocket() {
new Thread() {
public void run() {
boolean fail = false;
BluetoothDevice device = myBluetoothAdapter.getRemoteDevice(address1);
try {
BTSocket = createBluetoothSocket(device);
} catch (IOException e) {
fail = true;
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show();
}
// Establish the Bluetooth socket connection.
try {
BTSocket.connect();
} catch (IOException e) {
try {
fail = true;
BTSocket.close();
BTHandler.obtainMessage(CONNECTING_STATUS, -1, -1)
.sendToTarget();
} catch (IOException e2) {
//insert code to deal with this
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show();
}
}
if (!fail) {
mConnectedThread = new ConnectedThread(BTSocket);
mConnectedThread.start();
BTHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name1)
.sendToTarget();
}
}
}.start();
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
try {
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", UUID.class);
return (BluetoothSocket) m.invoke(device, PORT_UUID);
} catch (Exception e) {
Log.e(TAG, "Could not create Insecure RFComm Connection",e);
}
return device.createRfcommSocketToServiceRecord(PORT_UUID);
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
}
public void run() {
byte[] buffer = new byte[1024]; // 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.available();
if(bytes != 0) {
buffer = new byte[1024];
SystemClock.sleep(100); //pause and wait for rest of data. Adjust this depending on your sending speed.
bytes = mmInStream.available(); // how many bytes are ready to be read?
bytes = mmInStream.read(buffer, 0, bytes); // record how many bytes we actually read
BTHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget(); // Send the obtained bytes to the UI activity
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
}
这就是我建立连接的方式,这似乎工作正常。比我使用下面的代码读出传入的数据。
BTHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == MESSAGE_READ) {
String readMessage = " ";
try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
inputdata1 = readMessage;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
TextView input1 = findViewById(R.id.input1);
input1.setText(readMessage);
if (readMessage.equals("X")){
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(100);
}
}
}
};
在文本视图中显示输入数据有效。但它无法识别传入数据中的 X。但是我可以看到这个数据在 textView 中输入,我确实用 de arduino 代码发送这个。
if (fsrReadingHeel >= (fsrReadingHeelOld + 800)){
Serial.println("X");
}
我知道代码已处理,因为当我说 if (!(readMessage.equals("X"))){ 时它会振动。
Arduinos Serial.print 发送 ASCII。构建字符串时,可以像这样使用 ASCII:Charset.setName("ASCII") 而不仅仅是 "UTF-8"。这对我来说很好(使用 Arduino Uno 和 HC-06 蓝牙模块):
readMessage = new String((byte[]) msg.obj, Charset.setName("ASCII"));
您从 byteBuffer 创建的字符串应限制为实际数据的大小 - 您可以为此使用 substring(0, sizeOfData)。
当我让我的应用程序与我的 Arduino Uno 连接时,我遇到了问题,根据配置,它忽略了 Android 中第一个发送的字节,所以尝试发送一个更长的字符串,看看是否你得到了一些东西,而且你实际上可以正确地阅读它。 我建议您使用 Serial.print 而不是 println,因为您不需要在发送时换行。它还可能会更改您在 Android.
上收到的消息if (fsrReadingHeel >= (fsrReadingHeelOld + 800)){
Serial.print("X");
}
您也可以改用 Serial.write,但您不需要 - 请查看此处的差异:https://arduino.stackexchange.com/questions/10088/what-is-the-difference-between-serial-write-and-serial-print-and-when-are-they