pc机上VC++6.0写的蓝牙服务,手机搜索不到

ryanho2008 2009-09-22 02:55:37
最近参照教程在我的电脑上用VC++写了一个关于蓝牙的程序程序。当我在电脑上插上蓝牙适配器后运行程序时,我的手机没法搜索到电脑蓝牙,不知道为什么,请高手指点。谢谢!代码如下:

#include "stdafx.h"
#include <initguid.h>
#include <winsock2.h>
#include <ws2bth.h>
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"msvcrt.lib")

DEFINE_GUID(SAMPLE_UUID,0x31b44148,0x041f,0x42f5,0x8e,0x73,0x18,0x6d,0x5a,0x47,0x9f,0xc9);

int _tmain(int argc, _TCHAR* argv[ ])
{
SOCKET server;
SOCKADDR_BTH sa;
int sa_len = sizeof(sa );

//initialize windows sockets
printf("initialize windows sockets...\n");
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2,0 );
if( WSAStartup( wVersionRequested, &wsaData) !=NO_ERROR ) {
ExitProcess ( 2 ) ;
}

// create the server socket
printf("create the server socket...\n");
server = socket (AF_BTH , SOCK_STREAM , BTHPROTO_RFCOMM ) ;
if( SOCKET_ERROR ==server) {
ExitProcess ( 2 );
}

// bind the server socket to an arbitrary RFCOMM port
printf("bind the server socket to an arbitrary RFCOMM port...\n");
sa.addressFamily=AF_BTH;
sa.btAddr =0;
sa.port =BT_PORT_ANY ;
if(SOCKET_ERROR == bind (server ,(const sockaddr*)&sa , sizeof(SOCKADDR_BTH )))
{
ExitProcess ( 2 ) ;
}
listen( server, 1 );

// check which port we’re listening on
printf("check which port we’re listening on...\n");
if(SOCKET_ERROR==getsockname (server, (SOCKADDR*)&sa, &sa_len )) {
ExitProcess ( 2 ) ;
}
printf("listening on RFCOMM port: %d\n",sa.port);

// advertise the service
printf("advertise the service...\n");

CSADDR_INFO sockInfo ;
sockInfo.iProtocol=BTHPROTO_RFCOMM;
sockInfo.iSocketType=SOCK_STREAM;
sockInfo.LocalAddr.lpSockaddr=(LPSOCKADDR) &sa;
sockInfo.LocalAddr.iSockaddrLength=sizeof(sa );
sockInfo.RemoteAddr.lpSockaddr=(LPSOCKADDR) &sa;
sockInfo.RemoteAddr.iSockaddrLength=sizeof(sa );
WSAQUERYSET svcInfo={0};
svcInfo.dwSize=sizeof(svcInfo);
svcInfo.dwNameSpace=NS_BTH;
svcInfo.lpszServiceInstanceName="Win32 Sample Bluetooth Service";
svcInfo.lpszComment="Description of service..." ;
svcInfo.lpServiceClassId=(LPGUID)&SAMPLE_UUID;
svcInfo.dwNumberOfCsAddrs =1;
svcInfo.lpcsaBuffer=&sockInfo;
if( SOCKET_ERROR ==WSASetService(&svcInfo,RNRSERVICE_REGISTER,0))
{
printf("setService goes wrong...\n");
ExitProcess(2);
}
printf("setService goes ok...\n");//程序能够运行到这里来!

SOCKADDR_BTH ca;
int ca_len = sizeof(ca);
SOCKET client;
char buf[1024] = {0};
DWORD buf_len = sizeof(buf);
client=accept(server,(LPSOCKADDR) &ca, &ca_len );
if( SOCKET_ERROR == client ) {
printf("accept goes wrong...\n");
ExitProcess ( 2 ) ;
}
printf("accept goes ok...\n");

WSAAddressToString ( (LPSOCKADDR)&ca, (DWORD) ca_len,NULL,buf,&buf_len ) ;
printf( "Accepted connection from %s\n" , buf ) ;
int received =0;
received = recv (client,buf,sizeof(buf),0);
if(received>0) {
printf("received: %s\n",buf) ;
}
closesocket (client);
closesocket (server);
return 0;
}
...全文
1319 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryanho2008 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 junux 的回复:]

引用 13 楼 ryanho2008 的回复:
其实上面的程序没有错,是当初没有设置好蓝牙适配器,要将蓝牙适配器设置为可发现


我是菜鸟.... 正在做同样的尝试
我用的是HP笔记本来同手机通信,在启动这个程序之前我有利用笔记本本身的蓝牙assistant同我的手机连接并传送文件。现在我用手机蓝牙搜索,总是搜到笔记本设置的蓝牙名字,而不是程序设置的。
请问楼主要怎么样解决呢?
[/Quote]

我记得在手机端搜索的时候有个设备名和服务名。你搜索到的是设备名,程序设置的是服务名,我们以前也碰到过这个问题。
junux 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ryanho2008 的回复:]
其实上面的程序没有错,是当初没有设置好蓝牙适配器,要将蓝牙适配器设置为可发现
[/Quote]

我是菜鸟.... 正在做同样的尝试
我用的是HP笔记本来同手机通信,在启动这个程序之前我有利用笔记本本身的蓝牙assistant同我的手机连接并传送文件。现在我用手机蓝牙搜索,总是搜到笔记本设置的蓝牙名字,而不是程序设置的。
请问楼主要怎么样解决呢?
ryanho2008 2010-04-12
  • 打赏
  • 举报
回复
其实上面的程序没有错,是当初没有设置好蓝牙适配器,要将蓝牙适配器设置为可发现
colour2006 2010-04-07
  • 打赏
  • 举报
回复
最简单的设备搜索与服务发现结合起来的结果
connString = agent.selectService(uuid,ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);
if(connString!=null)
{
//已经发现了服务
}
else
{
//没有发现错误
}
colour2006 2010-04-04
  • 打赏
  • 举报
回复
现在正在用pc端VC,客户端j2me来实现大家的想法,估计快有结果了,倒是后给大家分享。
malteser 2009-10-22
  • 打赏
  • 举报
回复
问题解决啦,你联系一下我吧。
ryanho2008 2009-10-22
  • 打赏
  • 举报
回复
终于解决了电脑端

现在
我想写一个用手机蓝牙连接电脑的程序。安装的诺基亚的sdk是:nS60_jme_sdk_2nd_e_fp3,因为我用的实体机是n72。开发环境是Netbeans 6.7.1,jdk是:jdk-6u16。我参考了很多例子的代码,发现都是一样的,但是我的程序就是打不开蓝牙设备...郁闷中...现在请求大家的帮忙。
以下是在模拟器中运行程序时总出现的错误:
javax.bluetooth.BluetoothStateException: SymbianOS error = -5 : System:\nFeature is not supported
at javax.bluetooth.LocalDevice. <init>(LocalDevice.java:100)
at javax.bluetooth.LocalDevice.getLocalDevice(LocalDevice.java:120)
at j2meproject.bluetooth.MobileToPCController.BTServer.run(BTServer.java:100)
at java.lang.Thread.run(), bci=11

以下是我的部分代码:
public void run(){
try {
localDevice = LocalDevice.getLocalDevice();
//设置本地蓝牙设备为能够被发现
localDevice.setDiscoverable(DiscoveryAgent.GIAC);

StringBuffer url=new StringBuffer("btspp://");
url.append("localhost").append(':');
url.append(uuid.toString());
url.append(";name=SSS");
url.append(";authorize=false");
notifier = (StreamConnectionNotifier) Connector.open(url.toString());
record = localDevice.getRecord(notifier);
conn = notifier.acceptAndOpen();
//in = conn.openDataInputStream();
//out = conn.openDataOutputStream();
sendText=30;
//System.out.println("准备就绪");
ready = true;
}catch(Exception e){
sendText = 31;
e.printStackTrace();
return;
}
sendText = 333;
}

请问这是为什么?有解决的办法吗?谢谢!
ryanho2008 2009-10-12
  • 打赏
  • 举报
回复
还是不行....继续期待...
mldxs 2009-10-05
  • 打赏
  • 举报
回复
装个蓝牙驱动吧 !
VIT很好使的
我前几天刚刚装过一个
ryanho2008 2009-10-02
  • 打赏
  • 举报
回复
还是不行....继续期待...
jmulxg 2009-09-24
  • 打赏
  • 举报
回复
使用widcomm驱动的蓝牙适配器,二者的协议不一样
不过最新版的ivr好像也可以被symbian 识别
  • 打赏
  • 举报
回复
会不会是蓝牙适配器的驱动有问题呢
ryanho2008 2009-09-24
  • 打赏
  • 举报
回复
是即插即用免驱动的蓝牙,我写了一个小程序可以用我的蓝牙发现手机蓝牙,返回手机蓝牙的地址、名字。但是手机收索不到电脑蓝牙...
ryanho2008 2009-09-23
  • 打赏
  • 举报
回复
期待高手指点....
ryanho2008 2009-09-22
  • 打赏
  • 举报
回复
程序运行结果:
initialize windows sockets...
create the server socket...
bind the server socket to an arbitrary RFCOMM port...
check which port we’re listening on...
listening on RFCOMM port:1
setService goes ok...
用手机蓝牙去搜索搜索不到!

3,119

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧