如何解决为什么我的蓝牙模块无法与应用程序连接?
我必须将连续数据从 Max30102 传感器传输到移动应用程序。为此,我使用蓝牙模块 Hc05/Hc-06。我已经通过将模块连接到其他一些基本级别的应用程序来检查该模块是否工作正常。现在在我的项目中,我可以看到可用设备的列表,但是当我单击任何设备时,屏幕上会出现“无法连接到设备。它是串行设备?还要检查设置中的 UUID 是否正确”的消息。请建议我应该怎么做。指出下面给出的编码错误。这是我第一次尝试做这种类型的项目。谢谢。
package com.example.pulseoxisensor;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class pulseOximeter extends AppCompatActivity {
private Button search;
private Button connect;
private ListView listView1;
private BluetoothAdapter mBTAdapter;
private static final int BT_ENABLE_REQUEST = 10; // This is the code we use for BT Enable
private static final int SETTINGS = 20;
private UUID mDeviceUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private int mBufferSize = 50000; //Default
public static final String DEVICE_EXTRA = "com.example.protry1.soCKET";
public static final String DEVICE_UUID = "com.example.protry1.uuid";
private static final String DEVICE_LIST = "com.example.protry1.devicelist";
private static final String DEVICE_LIST_SELECTED = "com.example.protry1.devicelistselected";
public static final String BUFFER_SIZE = "com.example.protry1.buffersize";
private static final String TAG = "BlueT5-pulseOxiActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pulse_oximeter);
search = (Button) findViewById(R.id.search);
connect = (Button) findViewById(R.id.connect);
listView1 = (ListView) findViewById(R.id.listviewl1);
if (savedInstanceState != null) {
ArrayList<BluetoothDevice> list = savedInstanceState.getParcelableArrayList(DEVICE_LIST);
if (list != null) {
initList(list);
MyAdapter adapter = (MyAdapter) listView1.getAdapter();
int selectedindex = savedInstanceState.getInt(DEVICE_LIST_SELECTED);
if (selectedindex != -1) {
adapter.setSelectedindex(selectedindex);
connect.setEnabled(true);
}
} else {
initList(new ArrayList<BluetoothDevice>());
}
} else {
initList(new ArrayList<BluetoothDevice>());
}
search.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mBTAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBTAdapter == null) {
Toast.makeText(getApplicationContext(),"Bluetooth not found",Toast.LENGTH_SHORT).show();
} else if (!mBTAdapter.isEnabled()) {
Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBT,BT_ENABLE_REQUEST);
} else {
new SearchDevices().execute();
}
}
});
connect.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
BluetoothDevice device = ((MyAdapter) (listView1.getAdapter())).getSelectedItem();
Intent intent = new Intent(getApplicationContext(),MonitoringScreen.class);
intent.putExtra(DEVICE_EXTRA,device);
intent.putExtra(DEVICE_UUID,mDeviceUUID.toString());
intent.putExtra(BUFFER_SIZE,mBufferSize);
startActivity(intent);
}
});
}
protected void onPause() {
// Todo Auto-generated method stub
super.onPause();
}
@Override
protected void onStop() {
// Todo Auto-generated method stub
super.onStop();
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
switch (requestCode) {
case BT_ENABLE_REQUEST:
if (resultCode == RESULT_OK) {
msg("Bluetooth Enabled successfully");
new SearchDevices().execute();
} else {
msg("Bluetooth Couldn't be enabled");
}
break;
case SETTINGS: //If the settings have been updated
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String uuid = prefs.getString("prefUuid","Null");
mDeviceUUID = UUID.fromString(uuid);
Log.d(TAG,"UUID: " + uuid);
String bufSize = prefs.getString("prefTextBuffer","Null");
mBufferSize = Integer.parseInt(bufSize);
String orientation = prefs.getString("prefOrientation","Null");
Log.d(TAG,"Orientation: " + orientation);
if (orientation.equals("Landscape")) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if (orientation.equals("Portrait")) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (orientation.equals("Auto")) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
break;
default:
break;
}
super.onActivityResult(requestCode,resultCode,data);
}
/**
* Quick way to call the Toast
* @param str
*/
private void msg(String str) {
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_SHORT).show();
}
/**
* Initialize the List adapter
* @param objects
*/
private void initList(List<BluetoothDevice> objects) {
final MyAdapter adapter = new MyAdapter(getApplicationContext(),R.layout.list_item,R.id.lstContent,objects);
listView1.setAdapter(adapter);
listView1.setonItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
adapter.setSelectedindex(position);
connect.setEnabled(true);
}
});
}
/**
* Searches for paired devices. Doesn't do a scan! Only devices which are paired through Settings->Bluetooth
* will show up with this. I didn't see any need to re-build the wheel over here
* @author ryder
*
*/
private class SearchDevices extends AsyncTask<Void,Void,List<BluetoothDevice>> {
@Override
protected List<BluetoothDevice> doInBackground(Void... params) {
Set<BluetoothDevice> pairedDevices = mBTAdapter.getBondedDevices();
List<BluetoothDevice> listDevices = new ArrayList<BluetoothDevice>();
for (BluetoothDevice device : pairedDevices) {
listDevices.add(device);
}
return listDevices;
}
@Override
protected void onPostExecute(List<BluetoothDevice> listDevices) {
super.onPostExecute(listDevices);
if (listDevices.size() > 0) {
MyAdapter adapter = (MyAdapter) listView1.getAdapter();
adapter.replaceItems(listDevices);
} else {
msg("No paired devices found,please pair your serial BT device and try again");
}
}
}
/**
* Custom adapter to show the current devices in the list. This is a bit of an overkill for this
* project,but I figured it would be good learning
* Most of the code is lifted from somewhere but I can't find the link anymore
* @author ryder
*
*/
private class MyAdapter extends ArrayAdapter<BluetoothDevice> {
private int selectedindex;
private Context context;
private int selectedColor = Color.parseColor("#FF6200EE");
private List<BluetoothDevice> myList;
public MyAdapter(Context ctx,int resource,int textViewResourceId,List<BluetoothDevice> objects) {
super(ctx,resource,textViewResourceId,objects);
context = ctx;
myList = objects;
selectedindex = -1;
}
public void setSelectedindex(int position) {
selectedindex = position;
notifyDataSetChanged();
}
public BluetoothDevice getSelectedItem() {
return myList.get(selectedindex);
}
@Override
public int getCount() {
return myList.size();
}
@Override
public BluetoothDevice getItem(int position) {
return myList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private class ViewHolder {
TextView tv;
}
public void replaceItems(List<BluetoothDevice> list) {
myList = list;
notifyDataSetChanged();
}
public List<BluetoothDevice> getEntireList() {
return myList;
}
@Override
public View getView(int position,View convertView,ViewGroup parent) {
View vi = convertView;
ViewHolder holder;
if (convertView == null) {
vi = LayoutInflater.from(context).inflate(R.layout.list_item,null);
holder = new ViewHolder();
holder.tv = (TextView) vi.findViewById(R.id.lstContent);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
if (selectedindex != -1 && position == selectedindex) {
holder.tv.setBackgroundColor(selectedColor);
} else {
holder.tv.setBackgroundColor(Color.WHITE);
}
BluetoothDevice device = myList.get(position);
holder.tv.setText(device.getName() + "\n " + device.getAddress());
return vi;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.homescreen,menu);
return true;
}
@Override
public boolean onoptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_settings) {
Intent intent = new Intent(pulseOximeter.this,PreferencesActivity.class);
startActivityForResult(intent,SETTINGS);
}
return super.onoptionsItemSelected(item);
}
}
//
package com.example.pulseoxisensor;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import java.util.Map;
public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferencechangelistener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityHelper.initialize(this);
// Using this for compatibility with Android 2.2 devices
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
Preference pref = findPreference(key);
if (pref instanceof ListPreference) {
ListPreference listPref = (ListPreference) pref;
pref.setSummary(listPref.getEntry());
ActivityHelper.initialize(this);
}
if (pref instanceof EditTextPreference) {
EditTextPreference editPref = (EditTextPreference) pref;
pref.setSummary(editPref.getText());
}
}
@Override
protected void onPause() {
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferencechangelistener(this);
super.onPause();
}
@Override
protected void onResume() {
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferencechangelistener(this);
Map<String,?> keys = PreferenceManager.getDefaultSharedPreferences(this).getAll();
for (Map.Entry<String,?> entry : keys.entrySet()) {
// Log.d("map values",entry.getKey() + ": " + entry.getValue().toString());
Preference pref = findPreference(entry.getKey());
if (pref != null) {
pref.setSummary(entry.getValue().toString());
}
}
super.onResume();
}
}
//
package com.example.pulseoxisensor;
import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
public class MonitoringScreen extends Activity {
private static final String TAG = "BlueT5-pulseOxiActivity";
private int mMaxChars = 50000;//Default
private UUID mDeviceUUID;
private BluetoothSocket mBTSocket;
private ReadInput mReadThread = null;
private boolean mIsUserInitiateddisconnect = false;
// All controls here
private TextView mTxtReceive;
private Button mBtnClearInput;
private ScrollView scrollView;
private CheckBox chkScroll;
private CheckBox chkReceiveText;
private boolean mIsBluetoothConnected = false;
private BluetoothDevice mDevice;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_monitoring_screen);
ActivityHelper.initialize(this);
Intent intent = getIntent();
Bundle b = intent.getExtras();
mDevice = b.getParcelable(pulseOximeter.DEVICE_EXTRA);
mDeviceUUID = UUID.fromString(b.getString(pulseOximeter.DEVICE_UUID));
mMaxChars = b.getInt(pulseOximeter.BUFFER_SIZE);
Log.d(TAG,"Ready");
mTxtReceive = (TextView) findViewById(R.id.txtReceive);
chkScroll = (CheckBox) findViewById(R.id.chkScroll);
chkReceiveText = (CheckBox) findViewById(R.id.chkReceiveText);
scrollView = (ScrollView) findViewById(R.id.viewScroll);
mBtnClearInput = (Button) findViewById(R.id.btnClearInput);
mTxtReceive.setMovementMethod(new ScrollingMovementMethod());
mBtnClearInput.setonClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
mTxtReceive.setText("");
}
});
}
private class ReadInput implements Runnable {
private boolean bStop = false;
private Thread t;
public Readinput() {
t = new Thread(this,"Input Thread");
t.start();
}
public boolean isRunning() {
return t.isAlive();
}
@Override
public void run() {
InputStream inputStream;
try {
inputStream = mBTSocket.getInputStream();
while (!bStop) {
byte[] buffer = new byte[256];
if (inputStream.available() > 0) {
inputStream.read(buffer);
int i = 0;
/*
* This is needed because new String(buffer) is taking the entire buffer i.e. 256 chars on Android 2.3.4 http://stackoverflow.com/a/8843462/1287554
*/
for (i = 0; i < buffer.length && buffer[i] != 0; i++) {
}
final String strInput = new String(buffer,i);
/*
* If checked then receive text,better design would probably be to stop thread if unchecked and free resources,but this is a quick fix
*/
if (chkReceiveText.isChecked()) {
mTxtReceive.post(new Runnable() {
@Override
public void run() {
mTxtReceive.append(strInput);
int txtLength = mTxtReceive.getEditableText().length();
if(txtLength > mMaxChars){
mTxtReceive.getEditableText().delete(0,txtLength - mMaxChars);
}
if (chkScroll.isChecked()) { // Scroll only if this is checked
scrollView.post(new Runnable() { // Snippet from http://stackoverflow.com/a/4612082/1287554
@Override
public void run() {
scrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
}
});
}
}
Thread.sleep(500);
}
} catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
} catch (InterruptedException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
public void stop() {
bStop = true;
}
}
private class disConnectBT extends AsyncTask<Void,Void> {
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
if (mReadThread != null) {
mReadThread.stop();
while (mReadThread.isRunning())
; // Wait until it stops
mReadThread = null;
}
try {
mBTSocket.close();
} catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
mIsBluetoothConnected = false;
if (mIsUserInitiateddisconnect) {
finish();
}
}
}
private void msg(String s) {
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
if (mBTSocket != null && mIsBluetoothConnected) {
new disConnectBT().execute();
}
Log.d(TAG,"Paused");
super.onPause();
}
@Override
protected void onResume() {
if (mBTSocket == null || !mIsBluetoothConnected) {
new ConnectBT().execute();
}
Log.d(TAG,"Resumed");
super.onResume();
}
@Override
protected void onStop() {
Log.d(TAG,"Stopped");
super.onStop();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// Todo Auto-generated method stub
super.onSaveInstanceState(outState);
}
private class ConnectBT extends AsyncTask<Void,Void> {
private boolean mConnectSuccessful = true;
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(MonitoringScreen.this,"Hold on","Connecting");// http://stackoverflow.com/a/11130220/1287554
}
@Override
protected Void doInBackground(Void... devices) {
try {
if (mBTSocket == null || !mIsBluetoothConnected) {
mBTSocket = mDevice.createInsecureRfcommSocketToServiceRecord(mDeviceUUID);
BluetoothAdapter.getDefaultAdapter().canceldiscovery();
mBTSocket.connect();
}
} catch (IOException e) {
// Unable to connect to device
e.printstacktrace();
mConnectSuccessful = false;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (!mConnectSuccessful) {
Toast.makeText(getApplicationContext(),"Could not connect to device. Is it a Serial device? Also check if the UUID is correct in the settings",Toast.LENGTH_LONG).show();
finish();
} else {
msg("Connected to device");
mIsBluetoothConnected = true;
mReadThread = new Readinput(); // Kick off input reader
}
progressDialog.dismiss();
}
}
}
//
package com.example.pulseoxisensor;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.preference.PreferenceManager;
public class ActivityHelper {
public static void initialize(Activity activity) {
//intialize
SharedPreferences prefs;
String orientation;
//call a method getSharedPreferences() that returns a SharedPreference instance pointing to the file that contains the values of preferences.
prefs = PreferenceManager.getDefaultSharedPreferences(activity);
orientation = prefs.getString("prefOrientation","Null");
//for landscape orientation,set screen landscape scrren
if ("Landscape".equals(orientation)) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if ("Portrait".equals(orientation)) {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/y9"
android:orientation="vertical"
tools:context=".MonitoringScreen">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btnClearInput"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="5"
android:text="Clear Input"
app:backgroundTint="@android:color/holo_orange_light" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<CheckBox
android:id="@+id/chkScroll"
android:layout_width="fill_parent"
android:layout_height="59dp"
android:layout_margin="0dp"
android:alpha="5"
android:checked="true"
android:text="Scroll"
android:textColor="@color/black" />
<CheckBox
android:id="@+id/chkReceiveText"
android:layout_width="fill_parent"
android:layout_height="58dp"
android:alpha="5"
android:checked="true"
android:text="Read"
android:textColorHighlight="@color/black"
android:textColorLink="@android:color/background_dark" />
<ScrollView
android:id="@+id/viewScroll"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/txtReceive"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="20dp"
android:background="#eeeeee"
android:hint="Message shows up here ..."
android:scrollbars="vertical"
android:typeface="monospace" />
</ScrollView>
</LinearLayout>
</LinearLayout>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。