现在很多电脑提供了蓝牙支持,很多笔记本网卡也集成了蓝牙功能,也可以采用usb蓝牙方便的连接手机等蓝牙设备进行通信。
操作蓝牙要使用类库inthehand.net.personal
首先在项目中引用该类库;
static void main( string [] args)
{
bluetoothradio bluetoothradio = bluetoothradio.primaryradio;
if (bluetoothradio == null )
{
console.writeline( "没有找到本机蓝牙设备!" );
}
else
{
console.writeline( "classofdevice: " + bluetoothradio.classofdevice);
console.writeline( "hardwarestatus: " + bluetoothradio.hardwarestatus);
console.writeline( "hcirevision: " + bluetoothradio.hcirevision);
console.writeline( "hciversion: " + bluetoothradio.hciversion);
console.writeline( "lmpsubversion: " + bluetoothradio.lmpsubversion);
console.writeline( "lmpversion: " + bluetoothradio.lmpversion);
console.writeline( "localaddress: " + bluetoothradio.localaddress);
console.writeline( "manufacturer: " + bluetoothradio.manufacturer);
console.writeline( "mode: " + bluetoothradio.mode);
console.writeline( "name: " + bluetoothradio.name);
console.writeline( "remote:" + bluetoothradio.remote);
console.writeline( "softwaremanufacturer: " + bluetoothradio.softwaremanufacturer);
console.writeline( "stackfactory: " + bluetoothradio.stackfactory);
}
console.readkey();
}
如果pc插入了蓝牙适配器,便会显示蓝牙相关信息:
然后我们就要利用蓝牙收发文件了:
前提是蓝牙设备(如手机)已经和pc配对了
public partial class form1 : form
{
bluetoothradio radio = null ; //蓝牙适配器
string sendfilename = null ; //发送文件名
bluetoothaddress sendaddress = null ; //发送目的地址
obexlistener listener = null ; //监听器
string recdir = null ; //接受文件存放目录
thread listenthread, sendthread; //发送/接收线程
public form1()
{
initializecomponent();
radio = bluetoothradio.primaryradio; //获取当前pc的蓝牙适配器
checkforillegalcrossthreadcalls = false ; //不检查跨线程调用
if (radio == null ) //检查该电脑蓝牙是否可用
{
messagebox.show( "这个电脑蓝牙不可用!" , "提示" , messageboxbuttons.ok, messageboxicon.information);
}
recdir = environment.getfolderpath(environment.specialfolder.desktop);
labelrecdir.text = recdir;
}
private void buttonselectbluetooth_click( object sender, eventargs e) //选择远程蓝牙设备
{
selectbluetoothdevicedialog dialog = new selectbluetoothdevicedialog();
dialog.showremembered = true ; //显示已经记住的蓝牙设备
dialog.showauthenticated = true ; //显示认证过的蓝牙设备
dialog.showunknown = true ; //显示位置蓝牙设备
if (dialog.showdialog() == dialogresult.ok)
{
sendaddress = dialog.selecteddevice.deviceaddress; //获取选择的远程蓝牙地址
labeladdress.text = "地址:" + sendaddress.tostring() + " 设备名:" + dialog.selecteddevice.devicename;
}
}
private void buttonselectfile_click( object sender, eventargs e) //选择要发送的本地文件
{
openfiledialog dialog = new openfiledialog();
if (dialog.showdialog() == dialogresult.ok)
{
sendfilename = dialog.filename; //设置文件名
labelpath.text = path.getfilename(sendfilename);
}
}
private void buttonsend_click( object sender, eventargs e) //发送按钮
{
sendthread = new thread(sendfile); //开启发送文件线程
sendthread.start();
}
private void sendfile() //发送文件方法
{
obexwebrequest request = new obexwebrequest(sendaddress, path.getfilename(sendfilename)); //创建网络请求
webresponse response = null ;
try
{
buttonsend.enabled = false ;
request.readfile(sendfilename); //发送文件
labelinfo.text = "开始发送!" ;
response = request.getresponse(); //获取回应
labelinfo.text = "发送完成!" ;
}
catch (system.exception ex)
{
messagebox.show( "发送失败!" , "提示" , messageboxbuttons.ok, messageboxicon.warning);
labelinfo.text = "发送失败!" ;
}
finally
{
if (response != null )
{
response.close();
buttonsend.enabled = true ;
}
}
}
private void buttonselectrecdir_click( object sender, eventargs e) //选择接受目录
{
folderbrowserdialog dialog = new folderbrowserdialog();
dialog.description = "请选择蓝牙接收文件的存放路径" ;
if (dialog.showdialog() == dialogresult.ok)
{
recdir = dialog.selectedpath;
labelrecdir.text = recdir;
}
}
private void buttonlisten_click( object sender, eventargs e) //开始/停止监听
{
if (listener == null || !listener.islistening)
{
radio.mode = radiomode.discoverable; //设置本地蓝牙可被检测
listener = new obexlistener(obextransport.bluetooth); //创建监听
listener.start();
if (listener.islistening)
{
buttonlisten.text = "停止" ;
labelrecinfo.text = "开始监听" ;
listenthread = new thread(receivefile); //开启监听线程
listenthread.start();
}
}
else
{
listener.stop();
buttonlisten.text = "监听" ;
labelrecinfo.text = "停止监听" ;
}
}
private void receivefile() //收文件方法
{
obexlistenercontext context = null ;
obexlistenerrequest request = null ;
while (listener.islistening)
{
context = listener.getcontext(); //获取监听上下文
if (context == null )
{
break ;
}
request = context.request; //获取请求
string uristring = uri.unescapedatastring(request.rawurl); //将uri转换成字符串
string recfilename = recdir + uristring;
request.writefile(recfilename); //接收文件
labelrecinfo.text = "收到文件" + uristring.trimstart( new char [] { '/' });
}
}
private void form1_formclosed( object sender, formclosedeventargs e)
{
if (sendthread != null )
{
sendthread.abort();
}
if (listenthread != null )
{
listenthread.abort();
}
if (listener != null && listener.islistening)
{
listener.stop();
}
}
}
程序界面:
selectbluetoothdevicedialog是一个inthehand.net.personal提供的窗体,用于选择蓝牙设备:
从手机往电脑发送文件需要在电脑上开启监听obexlistener,才能收到文件。
核心代码:
bluetoothradio radio = null ; //蓝牙适配器
string sendfilename = null ; //发送文件名
bluetoothaddress sendaddress = null ; //发送目的地址
obexlistener listener = null ; //监听器
string recdir = null ; //接受文件存放目录
thread listenthread, sendthread; //发送/接收线程
radio = bluetoothradio.primaryradio; //获取当前pc的蓝牙适配器
//关于蓝牙设备选择对话框
selectbluetoothdevicedialog dialog = new selectbluetoothdevicedialog();
dialog.showremembered = true ; //显示已经记住的蓝牙设备
dialog.showauthenticated = true ; //显示认证过的蓝牙设备
dialog.showunknown = true ; //显示位置蓝牙设备
sendaddress = dialog.selecteddevice.deviceaddress; //获取选择的远程蓝牙地址
//发送文件操作
obexwebrequest request = new obexwebrequest(sendaddress, path.getfilename(sendfilename)); //创建网络请求
webresponse response = null ;
request.readfile(sendfilename); //发送文件
response = request.getresponse(); //获取回应
response.close();
//接收文件
radio.mode = radiomode.discoverable; //设置本地蓝牙可被检测
listener = new obexlistener(obextransport.bluetooth); //创建监听
listener.start();
listener.stop();
obexlistenercontext context = null ;
obexlistenerrequest request = null ;
context = listener.getcontext(); //获取监听上下文
request = context.request; //获取请求
string uristring = uri.unescapedatastring(request.rawurl); //将uri转换成字符串
string recfilename = recdir + uristring;
request.writefile(recfilename); //接收文件
labelrecinfo.text = "收到文件" + uristring.trimstart( new char [] { '/' }
ps:关于inthehand.net.personal
inthehand.net.personal.dll来源于32feet.net。
32feet.net是shared-source的项目,支持cf.net 2.0以及桌面版本.net framework,提供短距离领域(personal area networking technologie)的通信功能,支持bluetooth,infrared(irda)红外等. 想了解更多的信息可以参考其 官方主页,其项目的安装包和源码是放在微软的开源工程网站codeplex上面的,作为.net开发人员我们必须要上的网站就是codeplex~
dy("nrwz");
查看更多关于Windows系统中使用C#编写蓝牙通信程序的简单实例的详细内容...