Windows下使用C#和32feet.NET开发蓝牙传输功能的记录
引用的第三方Nuget库
- 32feet.NET 3.5.0
- MaterialDesignColors
- MaterialDesignThemes
- Newtonsoft.Json
使用到的技术:
XAML C#
本实例中使用的蓝牙是作为服务器端等待连接.
主要流程如下:
第1步
初始化相关内容:
public static void InitSDK()
{
Guid mGUID = Guid.Parse("00001101-0000-1000-8000-00805F9B34FB");
bluetoothListener = new BluetoothListener(mGUID);
}
其中00001101-0000-1000-8000-00805F9B34FB是蓝牙串口服务的uuid,其他类型的服务uuid各有不同,可以查阅相关资料
第2步
声明蓝牙监听对象:
BluetoothListener bluetoothListener;
第3步
等待蓝夜客户端进行连接:
client = bluetoothListener.AcceptBluetoothClient();
获取客户端连接对象的信息(类似于TCP连接):
bluetoothModel.blueAddress = client.RemoteEndPoint.Address;
bluetoothModel.blueName = client.RemoteMachineName;
通知调用,通知注册的事件已经有蓝牙连接成功:
public static void Notify(object message)
{
NotifyMessage?.Invoke(message);
}
Notify(bluetoothModel);
接收数据并解析:
while (true)
{
try
{
if (peerStream.DataAvailable)
{
peerStream.ReadAsync(buffer, 0, 1024);
//peerStream.Read(buffer, 0, 200);
string data = Encoding.UTF8.GetString(buffer).ToString().Replace("\0", "");//去掉后面的\0字节
Console.WriteLine("Receiving data: " + data);
//if (peerStream.Length > 0)
//{
//}
}
}
catch (Exception ex)
{
client.Close();
Notify("链接关闭");
MessageBox.Show(ex.Message);
return;
}
}
作为服务器要一直监听客户端发送的消息,所以进行死循环接收(这种方案比较简单,可以使用异步委托重复调用进行优化)
缓冲区大小设置为1024的长度,没有做按照标准进行处理,此项目中不接受数据,所以没有展开写.
发送
发送数据
public static void Send(string str)
{
if (peerStream != null)
{
if (peerStream.CanWrite)
{
List<byte> list = new List<byte>();
byte header = 0x01;
list.Add(header);
byte[] dataBuffer = Encoding.UTF8.GetBytes(str);
foreach (var item in dataBuffer)
{
list.Add(item);
}
try
{
// Output data to stream
peerStream.Write(list.ToArray(), 0, list.Count);
peerStream.Flush();
}
catch (Exception ex)
{
client.Close();
Notify("链接关闭");
MessageBox.Show(ex.Message);
}
}
else
{
client.Close();
Notify("链接关闭");
MessageBox.Show("配对失败内侧");
}
}
else
{
MessageBox.Show("配对失败外侧");
}
}
发送数据遵从一定的协议,超过1024即1K字节长度则分包发送
其中0x01代表发送字符串,0x02代表发送文件
发送文件:
//1 文件类型
//1 文件子类型
//4 文件大小
//4 总包数
//4 第几包
//4 本包大小
public static void SendFile(int type, string filePath)
{
if (peerStream != null)
{
int packCount = 512 - 17;
byte btype = (byte)type;
byte[] img = File.ReadAllBytes(filePath);
int imgLength = img.Length;
Console.WriteLine("图像长度:" + imgLength);
byte[] blen = intToBytes(imgLength);
List<byte> original = new List<byte>(img.ToArray());
List<List<byte>> targetList = new List<List<byte>>();
int totalCount = img.Length / packCount + 1;
byte[] btotalCount = intToBytes(totalCount);
for (int i = 0; i < totalCount - 1; i++)
{
List<byte> curList = new List<byte>();
curList.Add(0x02);
curList.Add(btype);
//总文件长度
curList.AddRange(blen);
//总包数
curList.AddRange(btotalCount);
byte[] bForNoCount = intToBytes(i);
//第几包
curList.AddRange(bForNoCount);
//本包大小
byte[] curCount = intToBytes(packCount);
curList.AddRange(curCount);
//包内容
curList.AddRange(original.GetRange(i * packCount, packCount));
targetList.Add(curList);
}
List<byte> lastList = new List<byte>();
lastList.Add(0x02);
lastList.Add(btype);
lastList.AddRange(blen);
//总包数
lastList.AddRange(btotalCount);
byte[] bNoCount = intToBytes(totalCount - 1);
//第几包
lastList.AddRange(bNoCount);
//包大小
byte[] lastCount = intToBytes(imgLength - (totalCount - 1) * packCount);
lastList.AddRange(lastCount);
lastList.AddRange(original.GetRange((totalCount - 1) * packCount, imgLength - (totalCount - 1) * packCount));
//lastList.Add((Byte)('\n'));
targetList.Add(lastList);
if (peerStream.CanWrite)
{
foreach (var item in targetList)
{
try
{
Console.WriteLine("包长:" + item.Count);
peerStream.Write(item.ToArray(), 0, item.Count);
peerStream.Flush();
}
catch (Exception ex)
{
//Console.WriteLine(ex);
MessageBox.Show(ex.Message);
return;
}
}
}
}
}
文件一般大于1K,所以分包发送.基本协议见方法注释.
代码比较粗糙,毕竟只是一次性项目,没有花很多信息分层,优化,写注释等,看客们请谅解,学习到精髓就可以了
详细代码见github链接
[链接](https://github.com/KleinPan/WpfAppBluetooth)
Windows下使用C#和32feet.NET开发蓝牙传输功能的记录的更多相关文章
- windows下使用vs进行Proctocol Buffer开发(C++篇)
因工作原因接触Proctocol Buffer(protobuf),至于什么是protobuf,为何使用protobuf,我就不赘述了,百度下都是答案. 今天我介绍的是在windows下使用vs进行p ...
- Windows下visual studio code搭建golang开发环境
Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...
- 在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题
在 Windows 下用 TDM-GCC(MinGW)开发 DLL 如果要用到数据同步锁,理论上可以采用 Windows API 提供的临界区实现(需要用到的函数有 InitializeCritica ...
- Windows下nginx的启动,重启,关闭功能
@echo off rem 提供Windows下nginx的启动,重启,关闭功能 echo ==================begin======================== cls :: ...
- Windows下用Eclipse搭建C/C++开发环境
本文假定你已经熟悉Java,Eclipse的安装,并能顺利启动和运行Eclipse.此外因为各软件版本在不断更新,有些地方可能不准确,以最新的.原文资料为准. 距上一次写和调C++程序,已经5.6年了 ...
- Windows 下使用 MinGW 和 CMake 进行开发
CMake 是个非常棒的项目管理工具,这已经是毋庸置疑的. 一些小工具需要在 win 下开发,所以今天探索使用 MinGW 和 CMake 在 win 下的搭配使用.简单做记录. MinGW 使用 Q ...
- windows下sublime text的node.js开发环境搭建
首先安装sublime text3,百度一堆,自己找吧.理论上sublime text2应该也可以.我只能说一句:这个软件实在是太强悍了. 跨平台,丰富的插件体系,加上插件基本上就是一个强悍的ide了 ...
- windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)
郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...
- 不用rustup,Windows下gnu版Rust安装与开发环境配置
写在前面 本文介绍了在不使用rustup的情况下,在Windows上安装gnu版的Rust,并配置开发环境(VSCode + rust-analyzer,CLion + IntelliJ Rust)的 ...
- Windows下几款免费C/C++开发工具简介
我相信作为编程初学者,我们都希望有好用的编程软件.这里"好用"应该至少要满足两点:1.安装简单,2.使用方便.大神移驾,对工具有特殊偏好跳过,从来不用Windows的止步.本文不做 ...
随机推荐
- 本地项目上传到Git仓库
1. 进入项目主目录,打开Git Bash,执行以下命令,将项目变为一个git管理的项目: $ git init 执行成功后,会在项目根目录生成一个.git的文件夹. 可以执行以下命令查看项目状态: ...
- 聊一聊 TLS/SSL
哈喽大家好,我是咸鱼 当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 "https://" 开头 这意味着我们正在使用 TLS/SSL 协议进行安全通信.虽 ...
- 解决Dependency 'fastdfs-client-java’not found
如何能把 fastdfs的jar包安装到本地的仓库中(因为中央仓库没有FASTDFS的jar包地址) 1.首先去github上下载下来fastdfs的压缩包 下载链接 然后直接解压出来 2.使用cmd ...
- 浅析依赖属性(DependencyProperty)
在WPF中,引入了依赖属性这个概念,提到依赖属性时通常都会说依赖属性能节省实例对内存的开销.此外依赖属性还有两大优势. 支持多属性值,依赖属性系统可以储存多个值,配合Expression.Style. ...
- 手写商用Java虚拟机HotSpot,疯狂磨砺技术中
在当前Java行业激烈竞争的形式下,唯有掌握技术,心中才不能慌.在多年前,我就开始苦练底层技术,但是眼看百遍也不如手过一遍,所以我打算把虚拟机的精华实现部分用手敲出来,这个过程注定不会轻松,但是心态不 ...
- 一款简单漂亮的WPF UI - AduSkin
前言 经常会有同学会问,有没有好看简单的WPF UI库推荐的.今天就给大家推荐一款简单漂亮的WPF UI,融合多个开源框架组件:AduSkin. WPF是什么? WPF 是一个强大的桌面应用程序框架, ...
- 网络层IP数据包
网络层 功能 选择数据通过网络(IP地址)的最佳路径 协议字段 版本号(4bit):指IP协议版本.并且通信双方使用的版本必须一致,目前我们使用的是IPv4,表示为0100 十进制 是4 首部长度(4 ...
- JVM 学习
目录 1. 类加载器及类加载过程 1.1 基本流程 1.2 类加载器子系统作用 1.3 类加载器角色 1.4 加载过程 (1) 加载 loading (2) 链接 linking 验证 verify ...
- Java文件与IO流
首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中 ,流大概就是类 接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢? 输入输出明显需要一个参照,而这 ...
- Unity3D 选择焦点切换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...