http://www.cyqdata.com/android/article-detail-53225#

如何实现Android蓝牙通信?一般通过使用蓝牙虚拟串口,可以通过配置非常简单地实现,很多外置蓝牙GPS都用这种做法。
然而Android却不支持,因此不得不得使用第二种方式:蓝牙socket。
本示例不使用C++开发,借助于第三方.NET组件inthehand来实现。
手机端的初始化代码。其中的具体含义可参照http://android.tgbus.com/Android/tutorial/201103/346657.shtml。
private PrintStream mPrintStream = null;
private BufferedReader mBufferedReader = null;

BluetoothAdapter myBluetoothAdapter = null;
BluetoothServerSocket mBThServer = null;
BluetoothSocket mBTHSocket = null;



myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

myBluetoothAdapter.enable();//open bth

Intent discoverableIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//使得蓝牙处于可发现模式,持续时间150s
discoverableIntent.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 150);
 下面是PC上的初始化核心代码:PC是作为客户端出现的。它需要通过搜索获取手机的蓝牙MAC地址,实现通信。GUID又名UUID,是标记硬件地址的一种方法。
/// <summary>
/// 打开端口
/// </summary>
/// <param name="Name">端口名称</param>
/// <returns>成功否</returns>
public bool OpenPort(string Name)
{
InTheHand.Net.Bluetooth.BluetoothRadio.PrimaryRadio.Mode = InTheHand.Net.Bluetooth.RadioMode.Connectable;
InTheHand.Net.Sockets.BluetoothClient cli = new InTheHand.Net.Sockets.BluetoothClient();
InTheHand.Net.Sockets.BluetoothDeviceInfo[] devices = cli.DiscoverDevices();
foreach (InTheHand.Net.Sockets.BluetoothDeviceInfo device in devices)//设备搜寻
{
device.Update();
device.Refresh();
MessageBox.Show("设备已找到");
break;
}


BluetoothDeviceInfo bd = new BluetoothDeviceInfo(devices[0].DeviceAddress);
bluetoothClient = new BluetoothClient();

Guid mGUID = Guid.Parse("fa87c0d0-afac-11de-8a39-0800200c9a66");
bluetoothClient.Connect(devices[0].DeviceAddress, mGUID);//客户端对地址实现连接,这是一个阻塞线程,需要服务器端的回应
ReceiveThread = new Thread(ReceiveMethod);
ReceiveThread.Start();

return true;
}
下面是手机接受PC端连接请求的方法:
1 if (connected)
2 {
3 return;
4 }
5 try
6 {
7 mBThServer = myBluetoothAdapter
8 .listenUsingRfcommWithServiceRecord(NAME_SECURE,
9 MY_UUID_SECURE);
10 } catch (IOException e)
11 {
12 // TODO Auto-generated catch block
13 e.printStackTrace();
14 }
15
16 try
17 {
18 mBTHSocket = mBThServer.accept();
19 } catch (IOException e)
20 {
21 // TODO Auto-generated catch block
22 e.printStackTrace();
23 }
24 try
25 {
26 mBufferedReader = new BufferedReader(new InputStreamReader(
27 mBTHSocket.getInputStream()));
28 } catch (IOException e1)
29 {
30 // TODO Auto-generated catch block
31 e1.printStackTrace();
32 }// 取得输入、输出流
33 try
34 {
35 mPrintStream = new PrintStream(
36 mBTHSocket.getOutputStream(), true);
37 connected = true;
38 } catch (IOException e)
39 {
40 // TODO Auto-generated catch block
41 e.printStackTrace();
42 }
要通过手机发送数据,执行以下代码即可:
mPrintStream.write(buff);
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}// 发送给服务器
mPrintStream.flush();
PC端的接受代码:
while (isConnecting)
{

try
{
Stream peerStream = bluetoothClient.GetStream();
peerStream.Read(buffer, 0, PACKETLENGTH);
//dataprocess();
}


catch (Exception ex)
{
isConnecting = false;
MessageBox.Show(ex.ToString());

}
以下有几个需要注意事项:
1:inthehand.net.personal是PC端上一定要用得到的库,但注意这个库函数的版本,版本弄错了是很浪费时间的。
2:手机设备的蓝牙硬件权限要打开,否则就没法运行。

更多相关文章

  1. Binder驱动的实现
  2. Android实例收藏
  3. Android(安卓)MVC模式
  4. Android系统启动,用过安卓手机的都知道,你还不知道吗?
  5. Android使用Presentation进行双屏开发
  6. Android的源代码结构
  7. Android(安卓)ListView 去除底色、选中色、阴影
  8. 在eclipse中查看android SDK的源代码
  9. Android(安卓)绘制中国地图及热点省份分布

随机推荐

  1. Android下生成core dump的方法
  2. 如何在Android真机上检测是否有Google Ma
  3. Android画图之抗锯齿
  4. Android(安卓)adb的使用略解
  5. 硬件访问服务4之Android硬件访问服务框架
  6. Android(安卓)Adapter的那些事
  7. Android应用程序签名(官方文档中文版)(上)
  8. android的binder机制研究(C++部分)
  9. Android主流屏幕分辨率介绍
  10. android studio 新建项目 界面一直停在