windows 蓝牙开源工具包分析及C#实例
来源:互联网 发布:c 定义json数组 编辑:程序博客网 时间:2024/04/30 02:23
windows 蓝牙开源工具包分析及C#实例
<buletooh-tool-v2.1.zip>中是使用“Windows Embedded Source Tools for Bluetooth”开发的实例程序。Bluetooth的应用十分广泛,基于Bluetooth的通信程序开发主要有以下几个步骤:服务端* 设置本设备为可发现。* 公开服务给其他Bluetooth设备访问。* 接受其他Bluetooth设备的链接。* 与链接上的Bluetooth设备进行通信。客户端* 发现周边Bluetooth设备。* 主动与被发现的设备发起连接。* 与链接上的Bluetooth设备进行通信。在.NET Compact Framework下进行Bluetooth开发有几个可选解决方案* 可以P/Invoke直接调用Bluetooth的API(btdrt.dll)* 使用MS的Windows Embedded Source Tools for Bluetooth* 使用32feet.NET库这篇文章讲述基于Windows Embedded Source Tools for Bluetooth的开发,点击 链接 下载Windows Embedded Source Tools for Bluetooth,安装后在目录 C:\Program Files\Microsoft\Windows Embedded Source Tools会找到源码以及编译后的DLL。Windows Embedded Source Tools for Bluetooth提供的API总结如下:BluetoothRadio.cs分析:public enum BluetoothRadioMode : int { Off, On, Discoverable };API:bool Dispose() 设置蓝牙设备运行被发现或读取当前蓝牙设备是否允许被发现BluetoothRadioMode BluetoothRadioMode() 设置或去读当前蓝牙状态BluetoothDeviceCollection PairedDevices() 获取配对设备集class BluetoothRadio :BluetoothRadio() 初始化蓝牙系统构造类BluetoothEndPoint.cs分析:class BluetoothEndPoint 蓝牙端点构造类。构造时包含deviceAddress ,serviceGuid,port三个值。BluetoothService.cs分析:class BluetoothService:BluetoothService(Guid serviceGuid) 蓝牙服务端构造类,执行该构造类的应该是蓝牙通信中的主设备。void Start() 启动服务void Stop() 停止服务bool Started 获取服务状态,启动或停止bool ConnectionPending 指示是否有一个客户端等待连接到本服务上。NetworkStream AcceptConnection() 接受一个连接,执行该函数后,该函数会挂起直到一个客户端连接上来。Guid ServiceGuid 返回本服务的GUIDStandardServices.cs分析:class StandardServices:StandardServices() 标准的蓝牙服务列表的GUIDGuid SerialPortServiceGuid 返回串口服务对应的GUIDRegistry.cs分析:class Registry 封装的注册表操作类。SafeNativeMethods.cs分析:class SafeNativeMethods 构造类。导入以下类库的API:const string BTHUTIL_DLL = "bthutil.dll";const string BTDRT_DLL = "btdrt.dll";const string WINSOCK_DLL = "Ws2.dll";const string CORE_DLL = "coredll.dll";BluetoothDeviceCollection.cs分析:class BluetoothDeviceCollection 蓝牙设备集类,实际为一个ArrayList();实测程序例子:服务器端:private void SetRadioMode() { BluetoothRadio br = new BluetoothRadio(); //WriteMessage("Radio Mode:" + br.BluetoothRadioMode); if (br.BluetoothRadioMode != BluetoothRadioMode.Discoverable) { br.BluetoothRadioMode = BluetoothRadioMode.Discoverable; //WriteMessage("Radio Mode:" + br.BluetoothRadioMode); } } private void StartService() { Guid guid = StandardServices.SerialPortServiceGuid; BluetoothService service = new BluetoothService(guid); service.Start(); //WriteMessage("Service started!"); System.Net.Sockets.NetworkStream ns = service.AcceptConnection(); //Warning: this is blocking code //WriteMessage("Got a request!"); string dataToSend = "Hello from service!"; // Convert dataToSend into a byte array byte[] dataBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(dataToSend); // Output data to stream ns.Write(dataBuffer, 0, dataBuffer.Length); byte[] buffer = new byte[2000]; while (service.Started )//&& !stop) { if (ns.DataAvailable) { ns.Read(buffer, 0, 50); string data = System.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, 50); // WriteMessage("Receiving data:" + data); } } // Clear and close stream ns.Flush(); ns.Close(); }//////////////////////////////////////////int main(){ SetRadioMode(); StartService();}客户端:private void PairedDevices() { BluetoothRadio br = new BluetoothRadio(); BluetoothDeviceCollection devices = br.PairedDevices; foreach (BluetoothDevice device in devices) { WriteMessage("ID:" + device.Address[5].ToString("X2") + "-" + device.Address[4].ToString("X2") + "-" + device.Address[3].ToString("X2") + "-" + device.Address[2].ToString("X2") + "-" + device.Address[1].ToString("X2") + "-" + device.Address[0].ToString("X2") + ", Name:" + device.Name); } ConnectService(devices[0] as BluetoothDevice); } private void ConnectService(BluetoothDevice device) { Guid guid = StandardServices.SerialPortServiceGuid; // Create network stream object // Connect to the device service (via the GUID) System.Net.Sockets.NetworkStream ns = device.Connect(guid); // Create storage for receiving data byte[] buffer = new byte[2000]; byte[] SendBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes("DT\r"); ns.Write(SendBuffer, 0, SendBuffer.Length); // Read Data ns.Read(buffer, 0, 50); // Convert Data to String string data = System.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, 50); WriteMessage("Receiving data: " + data); //////////////////////////////////////////////////////////// SendBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes("TD\r"); ns.Write(SendBuffer, 0, SendBuffer.Length); // Read Data ns.Read(buffer, 0, 50); // Convert Data to String data = System.Text.ASCIIEncoding.ASCII.GetString(buffer, 0, 50); WriteMessage("Receiving data: " + data); //////////////////////////////////////////////////////////// int i = 0; while (true ) { WriteMessage("Writing: " + i.ToString()); byte[] dataBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(i.ToString()); ns.Write(dataBuffer, 0, dataBuffer.Length); ++i; if (i >= int.MaxValue) { i = 0; } System.Threading.Thread.Sleep(500); } // Close network stream ns.Close(); }int main(){ PairedDevices();}特别说明:Windows Embedded Source Tools for Bluetooth不支持自发现功能,所以在客户端的设备首先要和服务端的设备进行配对,所谓配对就是把对端的信息写入注册表里面。PairedDevices()取出配对信息,其实就是从注册表里面取信息,Windows Embedded Source Tools for Bluetooth这个功能也写得不好,如果在wince下使用需要修改BluetoothRadio.cs文件的PairedDevices属性。//const string BT_DEVICE_KEY_NAME = "Software\\Microsoft\\Bluetooth\\Device";const string BT_DEVICE_KEY_NAME = "Software\\Microsoft\\Bluetooth\\Device\\pan"; //wince 5代码4在wince下,注册表的位置取决于配对设备的类型,见下图。图1不同类型的配对设备放在不同的目录下。但是在Windows Mobile下,所有配对信息存放于Software\\Microsoft\\Bluetooth\\Device下。图2ConnectService()的功能是链接服务端的设备。链接前同样选择串口服务,服务端和客户端需要使用统一的服务类型才能通信。在例子中连接后从服务端接收欢迎信息,然后不断往服务端发送数据。从上面的例子看Windows Embedded Source Tools for Bluetooth的功能不是很完整,没有自动发现功能,也就是通信双方在通信之前需要配对成功,因此这样很不方便。而且Windows Embedded Source Tools for Bluetooth只是支持 Microsoft windows stack,不支持broadcom stack,后面文章会介绍另外一个的开源库32feet.NET。这个库支持自发现功能,同时部分支持broadcom stack。以上参考来源: <Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth|中国IT实验室>
0 0
- windows 蓝牙开源工具包分析及C#实例
- dbutils工具包分析及应用
- 使用Java开源工具包问题及解决
- C#启动Windows服务及关闭实例实现
- 开源搜索引擎工具包
- 开源拓扑工具包
- Java 开源工具包
- C#程序结构分析实例
- 最大熵工具包的模型文件格式分析及比较
- 蓝牙驱动及Bluez使用流程分析
- Android5.1蓝牙电话分析及demo
- C#反射及实例
- 开源机器人技术工具包
- 开源机器人技术工具包
- 开源机器人技术工具包
- 开源机器人技术工具包
- 开源项目之工具包
- Python常用开源工具包
- ThinkPHP支持MongoDb Aggregate方法聚合管道
- jsp页码通过href标签传中文参数
- 这就是Thinkpad S1 yoga 20CD-A06SCD问题
- 动态的获取ios键盘的高度
- 上海的it环境怎样,打算去上海看看
- windows 蓝牙开源工具包分析及C#实例
- 设置UILabel的内间距
- yum 错误TypeError: rpmdb open failed
- MySQL 服务安装启动
- Omnet下安装Inet工具箱
- osg如何画网格
- js正则函数match、exec、test、search、replace、split使用介绍集合
- 用FPGA设计软件无线电和调制解调器
- rdis3.0集群安装