本次设计结合日常生活中的需要,应用单片机技术、蓝牙通信技术和Android手机APP开发技术,设计了一种以Android智能手机作为指令传送和数据接收终端,获取实时温湿度信息的系统。系统整体框架如图所示。
整体设计包含硬件与软件两大部分,硬件提供数据支持,软件用于数据显示,数据传送的桥梁HC-05蓝牙模块,它支持Socket蓝牙通信协议,这种协议与4.0低功耗蓝牙通信协议有很大的区别,具体可以自己去上网查资料,这里仅介绍传统的蓝牙通信协议。程序流程如下图所示。
下面我将从硬件和软件两个方面对本系统进行详细的介绍。
1.软件部分
软件开发用的是eclipse工具,在文章结束时将一并给出手机端与硬件端完整源代码。
1.1添加蓝牙权限
在设计主程序之前,首先需要在AndroidManifest.xml文件中添加操作蓝牙的权限。
<uses-permissionandroid:name="android.permission.BLUETOOTH"/> //允许程序连接到已配对的蓝牙设备。
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/> // 允许程序发现和配对蓝牙设备。1.2打开蓝牙并连接设备
打开蓝牙使用的是eclipse系统自带的蓝牙适配器BluetoothAdapter,通过实例化该对象,运用条件语句判断是否打开蓝牙,具体代码如下:
if (!mBluetoothAdapter.isEnabled())
{ //蓝牙未代开时会执行此语句,提示是否打开蓝牙
IntentenableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent,REQUEST_ENABLE_BT);
}
当用户选择打开蓝牙时,程序会执行条件里的语句,跳转至蓝牙设备选择界面
用户点击页面底下的扫描设备时,程序会首先注册一个广播接收机制,监听蓝牙设备的变化,每搜索一个设备就会发送一个广播,当全部搜索完之后会发送该广播,注册广播接收机制的代码如下:
privatefinal BroadcastReceiver mReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
String action =intent.getAction(); // When discoveryfinds a device
if (BluetoothDevice.ACTION_FOUND.equals(action))
{
BluetoothDevicedevice = intent.getParcelableExtra(BluetoothDevice.EXTRA _DEVICE);
if (device.getBondState() !=BluetoothDevice.BOND_BONDED)
{ //设备绑定状态
mNewDevicesArrayAdapter.add(device.getName()+ "\n" + device.getAddress());
}
}
else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))
{
setProgressBarIndeterminateVisibility(false);
setTitle(R.string.select_device);
if(mNewDevicesArrayAdapter.getCount() == 0)
{
String noDevices =getResources().getText(R.string.none_found.toString();
mNewDevicesArrayAdapter.add(noDevices);
}
}
}
};
系统扫描完所有的可用蓝牙设备后,用户点击其中一个设备,程序会根据点击的设备通过getAdress方法获取该设备地址,该地址将会通过putExtra方法传递给下一个界面。同时运用getName方法获取设备名告知用户。
1.3线程建立连接