SeetyST 2012-07-09
http://www.cyqdata.com/android/article-detail-53225#
如何实现Android蓝牙通信?一般通过使用蓝牙虚拟串口,可以通过配置非常简单地实现,很多外置蓝牙GPS都用这种做法。
然而Android却不支持,因此不得不得使用第二种方式:蓝牙socket。
本示例不使用C++开发,借助于第三方.NET组件inthehand来实现。
手机端的初始化代码。其中的具体含义可参照http://android.tgbus.com/Android/tutorial/201103/346657.shtml。
privatePrintStreammPrintStream=null;
privateBufferedReadermBufferedReader=null;
BluetoothAdaptermyBluetoothAdapter=null;
BluetoothServerSocketmBThServer=null;
BluetoothSocketmBTHSocket=null;
myBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
myBluetoothAdapter.enable();//openbth
IntentdiscoverableIntent=newIntent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//使得蓝牙处于可发现模式,持续时间150s
discoverableIntent.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,150);
下面是PC上的初始化核心代码:PC是作为客户端出现的。它需要通过搜索获取手机的蓝牙MAC地址,实现通信。GUID又名UUID,是标记硬件地址的一种方法。
///<summary>
///打开端口
///</summary>
///<paramname="Name">端口名称</param>
///<returns>成功否</returns>
publicboolOpenPort(stringName)
{
InTheHand.Net.Bluetooth.BluetoothRadio.PrimaryRadio.Mode=InTheHand.Net.Bluetooth.RadioMode.Connectable;
InTheHand.Net.Sockets.BluetoothClientcli=newInTheHand.Net.Sockets.BluetoothClient();
InTheHand.Net.Sockets.BluetoothDeviceInfo[]devices=cli.DiscoverDevices();
foreach(InTheHand.Net.Sockets.BluetoothDeviceInfodeviceindevices)//设备搜寻
{
device.Update();
device.Refresh();
MessageBox.Show("设备已找到");
break;
}
BluetoothDeviceInfobd=newBluetoothDeviceInfo(devices[0].DeviceAddress);
bluetoothClient=newBluetoothClient();
GuidmGUID=Guid.Parse("fa87c0d0-afac-11de-8a39-0800200c9a66");
bluetoothClient.Connect(devices[0].DeviceAddress,mGUID);//客户端对地址实现连接,这是一个阻塞线程,需要服务器端的回应
ReceiveThread=newThread(ReceiveMethod);
ReceiveThread.Start();
returntrue;
}
下面是手机接受PC端连接请求的方法:
1if(connected)
2{
3return;
4}
5try
6{
7mBThServer=myBluetoothAdapter
8.listenUsingRfcommWithServiceRecord(NAME_SECURE,
9MY_UUID_SECURE);
10}catch(IOExceptione)
11{
12//TODOAuto-generatedcatchblock
13e.printStackTrace();
14}
15
16try
17{
18mBTHSocket=mBThServer.accept();
19}catch(IOExceptione)
20{
21//TODOAuto-generatedcatchblock
22e.printStackTrace();
23}
24try
25{
26mBufferedReader=newBufferedReader(newInputStreamReader(
27mBTHSocket.getInputStream()));
28}catch(IOExceptione1)
29{
30//TODOAuto-generatedcatchblock
31e1.printStackTrace();
32}//取得输入、输出流
33try
34{
35mPrintStream=newPrintStream(
36mBTHSocket.getOutputStream(),true);
37connected=true;
38}catch(IOExceptione)
39{
40//TODOAuto-generatedcatchblock
41e.printStackTrace();
42}
要通过手机发送数据,执行以下代码即可:
mPrintStream.write(buff);
}catch(IOExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//发送给服务器
mPrintStream.flush();
PC端的接受代码:
while(isConnecting)
{
try
{
StreampeerStream=bluetoothClient.GetStream();
peerStream.Read(buffer,0,PACKETLENGTH);
//dataprocess();
}
catch(Exceptionex)
{
isConnecting=false;
MessageBox.Show(ex.ToString());
}
以下有几个需要注意事项:
1:inthehand.net.personal是PC端上一定要用得到的库,但注意这个库函数的版本,版本弄错了是很浪费时间的。
2:手机设备的蓝牙硬件权限要打开,否则就没法运行。