继上次更新的Bluetooth控制Arduino单片机项目的arduino部分之后,本期将更新Android手机跟Bluetooth通信部分,主要是Eclipse平台的Java编程,以及Arduino平台的C编程。
开始之前,我们来看一下Android手机和Bluetooth实现通信的答题思路。
第一步,我们需要打开Android手机的本地蓝牙设备。
creatButton.setOnClickListener(creatOnClickListener);
View.OnClickListener creatOnClickListener=new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//得到BluetoothAdapter对象
//判断手机是否有蓝牙设备
if(adapter!=null){
if (adapter.isEnabled()) {
TextView.setText(R.string.bluetoothon_TextView);
}
else if(!adapter.isEnabled()) {
//修改蓝牙设备的可见性
Intent discoverIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
//指定蓝牙可见状态可见时间为300s
discoverIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
//弹出对话框询问是否执行此操作
startActivity(discoverIntent);
TextView.setText(R.string.bluetoothon_TextView);
}
}
}
};
第二步,我们需要搜索所需要的蓝牙设备,我用的是HC-05的蓝牙模块。
scanButton.setOnClickListener(scanOnClickListener);
//开始扫描周边的蓝牙设备,并发送广播
View.OnClickListener scanOnClickListener =new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//开始扫描周边的蓝牙设备,并发送广播
adapter.startDiscovery();
}
};
注册一个广播来看是否搜索到HC-05此蓝牙设备。若搜索到HC-05,则在listview中显示HC-05的信息,并且停止搜索。(注意:我们事先将安卓手机和HC-05蓝牙模块进行配对,使用的是android系统自带的蓝牙配对方式)
private String nameBluetoothString="HC-05";//蓝牙设备名称
//创建Intent过滤器
IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
bluetoothReceiver = new BluetoothReceiver();
//注册广播接收器
registerReceiver(bluetoothReceiver, intentFilter);
//接收广播
private class BluetoothReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent) {
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)) {
//得到远程蓝牙设备的对象
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//显示搜索到的蓝牙设备信息,只显示一行蓝牙设备
ArrayList<HashMap<String, Object> > myList=new ArrayList<HashMap<String,Object>>();
for(int i=0;i<1;i++) {
HashMap<String, Object> map =new HashMap<String, Object>();
map.put("num","\nBlueTooth:");
map.put("info", "NAME:"+device.getName()+"\n"+"MAC:"+device.getAddress()+"\r");
myList.add(map);
}
//若搜索到所需的蓝牙设备,则停止继续搜索
if (device.getName().equalsIgnoreCase(nameBluetoothString)) {
adapter.cancelDiscovery();
//Toast信息显示
Toast.makeText(getApplicationContext(), R.string.toast_String1,Toast.LENGTH_SHORT).show();
}
//ListView适配器(重点注意第一个参数的写法)
SimpleAdapter mySimpleAdapter=new SimpleAdapter(context,
myList,
R.layout.listview_bluetooth,
new String[] {"num","info"},
new int[] {R.id.num_bluetoothdevice,R.id.info_bluetoothdevice});
listView.setAdapter(mySimpleAdapter);
}
}
}
第三步,我们则需要连接HC-05。
//全球唯一标示符,用于普通蓝牙适配器和android手机蓝牙模块连接的
private static final UUID MY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
public void connectDevice(){
try {
socket=device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();
connected=true;
linearLayout1.setVisibility(View.VISIBLE);
} catch (Exception e) {
// TODO: handle exception
connected=false;
try {
socket.close();
socket=null;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
最后一步,连接蓝牙成功之后,我们需要来发送msg给Arduino单片机。
//发送数据函数
public void sent(String string){
if (socket==null) {
Toast.makeText(getApplicationContext(), "未连接", Toast.LENGTH_SHORT).show();
return;
}
try {
OutputStream osOutputStream =socket.getOutputStream();
osOutputStream.write(string.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
举例:
modeButton.setOnClickListener(modeOnClickListener);
//模式按钮
View.OnClickListener modeOnClickListener=new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
sent("m");
}
};
上面涉及到安卓手机蓝牙的四个操作步骤,只有关键性的函数代码,希望可以对自己或对他人有所帮助。
接下来,就是在Arduino层面上的蓝牙msg接收工作,我们还是以模式按钮为例。
#include <SoftwareSerial.h>
#include <IRremote.h>
SoftwareSerial BT(10,9);
const byte ledPin = 13;
char val;
String str;
IRsend irsend;
unsigned int test1[]={2086,27038,556,1372,532,3384,516};
unsigned int ddelay[]={0,67260};
unsigned int danfan1[]={600,1300,600,3300,600};
unsigned int danfan2[]={600,1300,600,3300,600,26850};
void setup(){
pinMode(ledPin,OUTPUT);
BT.begin(9600);
Serial.begin(9600);
//BT.print("bluetooth is ready!!!");
}
void loop(){
if(BT.available()){
val=BT.read();
switch(val){
//mode
case 'm':
irsend.sendRaw2(test1,7,38);
delay(67);
irsend.sendRaw2(test1,7,38);
//Serial.println(val);
break;
default:
break;
}
}
}
这样就可以通过蓝牙实现Android手机好Arduino单片机的通信啦!