Android 蓝牙串口通讯

        最近在弄蓝牙串口,参考了不少网上的大佬,加上自己早期对C#的学习,写一个给自己的备忘录,如果有大佬看到还请多多指教。

1.简介

Android设备中提供了一整套蓝牙的API,我这边只取了其中需要的部分。

初期权限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

1.BluetoothAdapter

BluetoothAdapter是本地蓝牙适配器的对象,是所有蓝牙交互操作的入口。

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;


private BluetoothAdapter mBluetoothAdapter = null;
public ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();


// 初始化蓝牙
private void BlueInit()
{
	// 获取蓝牙适配器
	mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
	// 请求开启蓝牙
	if (!mBluetoothAdapter.isEnabled()) 
	{
		Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
		((Activity)_context).startActivityForResult(enableBtIntent, 1);
	}
}

这里我只获取了已经匹配好的蓝牙模块,Android本身自带搜索匹配蓝牙设备功能,说人话就是懒得弄。太麻烦了,还有匹配,还要输PIN码。

直接搜索已经匹配的蓝牙模块。

2.BluetoothDevice

表示远程的蓝牙设备可进行远程蓝牙设备的连接请求,以及查询该蓝牙设备的信息,例如名称,地址等。

protected void onResume() 
{
	// 将已配对的设备添加到列表中
	Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
	deviceList.clear();
	if (pairedDevices.size() > 0) 
	{
		String[] nameList = new String[pairedDevices.size()];
		int i=0;
		for (BluetoothDevice device : pairedDevices)
		{
               deviceList.add(device);
			nameList[i] = device.getName() + "\n" + device.getAddress();
			i++;
 	}
		//创建一个ArrayAdapter
		ArrayAdapter<?> adapter=new ArrayAdapter<Object>((Activity)_context,android.R.layout.simple_expandable_list_item_1,nameList);
		DeviceView.setAdapter(adapter);
		//注册一个元素单击事件监听方法
		DeviceView.setOnItemClickListener(new DeviceClick());
	}
}

然后直接返回给主窗体

//事件按钮触发
public class DeviceClick implements AdapterView.OnItemClickListener 
{
	@Override
	public void onItemClick(AdapterView<?> arg0, View view, int position, long id) 
	{
		onConfirmListener.confirm(deviceList.get(position));
	}
 		
}
public interface OnConfirmListener 
{
    public void confirm(BluetoothDevice device);
}

这里其实用了一个Activity的作为一个Dialog。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="bluetoothtoserial.DeviceActivity" >

    <ListView
        android:id="@+id/DeviceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

</RelativeLayout>

也是方便后面调用

package bluetoothtoserial;

import java.util.ArrayList;
import java.util.Set;
import android.app.Activity;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class DeviceActivity extends Dialog 
{
	Context _context;
    public OnConfirmListener onConfirmListener;
	private ListView DeviceView;
	private BluetoothAdapter mBluetoothAdapter = null;
	public ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();

	public DeviceActivity(Context context) 
	{
		super(context);
		this._context = context;
		// TODO Auto-generated constructor stub
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_device);
		DeviceView = (ListView)findViewById(R.id.DeviceView);
		BlueInit();
		onResume();
	}
	// 初始化蓝牙
	private void BlueInit()
	{
		// 获取蓝牙适配器
		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		// 请求开启蓝牙
		if (!mBluetoothAdapter.isEnabled()) 
		{
			Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
			((Activity)_context).startActivityForResult(enableBtIntent, 1);
		}
	}
	protected void onResume() 
	{
		// 将已配对的设备添加到列表中
		Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
		deviceList.clear();
		if (pairedDevices.size() > 0) 
		{
			String[] nameList = new String[pairedDevices.size()];
			int i=0;
			for (BluetoothDevice device : pairedDevices)
			{
                deviceList.add(device);
				nameList[i] = device.getName() + "\n" + device.getAddress();
				i++;
			}
			//创建一个ArrayAdapter
			ArrayAdapter<?> adapter=new ArrayAdapter<Object>((Activity)_context,android.R.layout.simple_expandable_list_item_1,nameList);
			DeviceView.setAdapter(adapter);
			//注册一个元素单击事件监听方法
			DeviceView.setOnItemClickListener(new DeviceClick());
		}
	}
	//事件按钮触发
  	public class DeviceClick implements AdapterView.OnItemClickListener 
  	{
		@Override
		public void onItemClick(AdapterView<?> arg0, View view, int position, long id) 
		{
			onConfirmListener.confirm(deviceList.get(position));
		}
  		
  	}
  	public interface OnConfirmListener 
    {
        public void confirm(BluetoothDevice device);
    }
}

3.BluetoothSocket

BluetoothSocket 蓝牙的socket接口,与TCP Socket类似,设备添加完成可以开始连接设备。

这里我直接写了一个Session通讯类

package Channel;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.UUID;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;

public class Session extends Thread 
{
	private BluetoothDevice _device = null;
	private BluetoothSocket _socket = null;
	private OutputStream _outStream;
	private InputStream _inStream = null; 
	public boolean IsConnect = false;
	public String Name="";
	public String Address="";
	Handler _handler;
	public Session(BluetoothDevice _device,Handler _handler)
	{
		this._handler = _handler;
		this._device = _device;
		this.Name = this._device.getName();
		this.Address = this._device.getAddress();
		IsConnect = false;
		try 
  		{
  		    // 蓝牙串口服务对应的UUID。如使用的是其它蓝牙服务,需更改下面的字符串
            // UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
  		    _socket = _device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
  		} catch (Exception e) 
  		{
  		    return;
  		}
	}
	public void connect()
	{
		try 
		{
			_socket.connect();
			_outStream = _socket.getOutputStream();
			_inStream = _socket.getInputStream();
			IsConnect = true;
		}
		catch (IOException e) 
		{
			IsConnect = false;
			try {
				_socket.close();
			} catch (IOException e1) 
			{
			}
  		    return;
		}
	}
	@Override
	public void run() 
	{  
		byte [] buffer = new byte [1024];
		int len = 0;
		while(true) 
		{
			 //从InputStream读取
			try 
			{
				len = _inStream.read(buffer);
			} catch (IOException e) 
			{
				continue;
			}
            if(len> 0)
            { 
            	Message msg = _handler.obtainMessage();
            	msg.what = 0; 
            	try 
            	{
					msg.obj=new String(buffer,"UTF-8");
				} catch (UnsupportedEncodingException e) 
            	{
				}
            	_handler.sendMessage(msg);
            }
		}
	}
	public void Send(String _value) throws IOException
	{
		_outStream.write(_value.getBytes());
	}
	public void Close() throws IOException
	{
		IsConnect = false;
		_socket.close();
	}
}

接下来就是使用,弹窗选择设备。

public void btnDevice_Click(View v)//选择设备
{
	final DeviceActivity _deviceDialog = new DeviceActivity(this);
	_deviceDialog.onConfirmListener = new  OnConfirmListener() 
	{
        @Override
    	public void confirm(BluetoothDevice device)
		{
			_device = device;
			txtDevice.setText(device.getName()+"\n"+device.getAddress());
			_deviceDialog.dismiss();
			btnConnect.setText("连接设备");
			btnConnect.setVisibility(View.VISIBLE);
			btnSend.setVisibility(View.INVISIBLE);
		}
	};
	_deviceDialog.show();
}

选择完设备,建立Session连接设备。

public void btnConnect_Click(View v)//连接设备
{
  	_session = new Session(_device,_handler);
  	setTitle(_session.Name);
  	_session.connect();
  	if (_session.IsConnect)
  	{
  		_session.start();
  		btnConnect.setVisibility(View.INVISIBLE);
  		btnSend.setVisibility(View.VISIBLE);
  		btnSend.setText("发送消息");
	}
  	else
  	{
  		Toast.makeText(MainActivity.this,
  				"连接失败",
  				Toast.LENGTH_LONG).show();
  		btnSend.setVisibility(View.INVISIBLE);
	}
}

建立回调函数。

Handler _handler=new Handler(Looper.getMainLooper())
{
    @Override
	public void handleMessage(Message msg)
	{
		super.handleMessage(msg);
		edxMessage.setText(edxMessage.getText()+"\n"+msg.obj);
	}
};

发送消息。

public void btnSend_Click(View v)//发送消息
{
  	try
  	{
		_session.Send(edxContent.getText().toString());
	} catch (IOException e) 
  	{
	    Toast.makeText(MainActivity.this,
  				"发送失败",
  				Toast.LENGTH_LONG).show();
	}
}

基本上操作就这些。

第一次写东西,第一次开发Android,希望各位大佬多多指教,代码有很多C#的习惯,多多包涵。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值