基于蓝牙socket开发Android蓝牙通信

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:手机设备的蓝牙硬件权限要打开,否则就没法运行。

相关推荐

faguoduifangui / 0评论 2019-10-27
chinaycheng / 0评论 2019-10-22