技术开发 频道

.NET Compact Framework下的Bluetooth广播程序的开发

 【IT168技术文档】

 简述

 本文讲述如何使用32feet.NET实现Bluetooth的广播程序,同时演示了Broadcom stack在Windows Mobilie下的实现。

 背景

 在.NET Compact Framework下的Bluetooth开发 之 32feet.NET 的反馈中 camper9999 同学希望实现蓝牙广播的功能,本文就是一个基于32feet.NET蓝牙广播的实现。

 sammylp 的提出代码挂死问题,其实是使用过程的不恰当造成的,本文演示如何使用线程防止UI线程的挂起,程序的假死。

 另外一个同学(不好意思忘记哪位了)问32feet.NET是否支持Broadcom stack,所以本文的实现运行于安装Broadcom stack的windows mobile中。

 感谢各位的反馈,现在尽量在一篇文章中回答。

 关于Bluetooth开发的也可以参考以下其他文章:

 .NET Compact Framework下的Bluetooth开发 之 Windows Embedded Source Tools for Bluetooth

 .NET Compact Framework下的Bluetooth开发 之 32feet.NET

 .NET Compact Framework下的Bluetooth开发 之 Bluetooth Virtual Serial Port

 .NET Compact Framework下的Bluetooth设备的配对

 30 Days of .NET [Windows Mobile Applications] - Day 02: Bluetooth Manager(蓝牙管理器)

 什么是广播

 所谓广播就是消息发送方向公众(public)发送信息的过程,广播有一个主要的特点是消息发送方不需要知道消息接收方的存在。现实生活中广播的例子如收音机广播,GPS卫星广播,以太网同网段数据包的广播等等。可是所谓蓝牙广播其实不算严格下的广播,因为蓝牙通信过程中有发现,配对,甚至验证过程,所以通信双方是需要握手的,没办法实现严格意义上的广播。本文例子实现了一个通过注册订阅方式的组播过程(MultiCast)。

 实现

 服务端

 服务端负责监听和注册服务,同时把消息发送到已经注册的设备去。在例子中服务端使用PC实现,其实可以使用Windows Mobilie作为服务端,32feet.net库基本兼容PC和CE。

 成员定义

  private BluetoothListener listener;

 private bool listening = true;

 private List<BluetoothClient> clientList = new List<BluetoothClient>();

 private System.Threading.Thread listenThread;

 private System.Threading.Thread broadcastThread;

 listener负责监听服务,clientList 存放已经注册的设备,listenThread负责监听的线程,broadcastThread负责广播的线程。

 启动服务

 BluetoothRadio radio = BluetoothRadio.PrimaryRadio;

 if (radio == null)

 {

 WriteMessage("No radio hardware or unsupported software stack");

 return;

 }

 // Enable discoverable mode

 radio.Mode = RadioMode.Discoverable;

 WriteMessage("Radio Name:" + radio.Name);

 WriteMessage("Radio Address:" + radio.LocalAddress);

 WriteMessage("Radio Mode now: " + radio.Mode.ToString());

 listener = new BluetoothListener(BluetoothService.SerialPort);

 listener.Start();

 listening = true;

 listenThread = new System.Threading.Thread(ListenLoop);

 broadcastThread = new System.Threading.Thread(BroadcastLoop);

 listenThread.Start();

 broadcastThread.Start();

 WriteMessage("Service started!");

 启动服务的流程是:

 1.检查蓝牙设备是否准备好。

 2.设置蓝牙设备为可发现。

 3.启动蓝牙监听,这里配置的服务类型为串口服务,在客户端也需要配置串口服务类型才能进行通信。

 4.启动监听线程,这样不会挂死主线程(Main Thread)。

 5.启动广播线程。

0
相关文章