您的位置:首页 > 运维架构 > Linux

实战 linux蓝牙编程之(八) hci 协议 应用编程实现

2013-01-23 11:22 489 查看
对于hci层的编程 是相当复杂的 功能也是强大的,建议学习者 去读bluez-lib中的hci和sdp

这里简要介绍 我在开发公司的项目中的 一个小的基础动作. 该编程的过程基本理清了hci和sdp的衔接和应用.希望对学习者有帮助

说明有不到之处,望大家多多研究,不要局限,每个人有自己的方式,也许你的在逻辑算法上比我的好!!

//scan是一个利用hci层协议 获得远程蓝牙设备的蓝牙地址和蓝牙昵称的函数;

int scan()

{



inquiry_info *ii = NULL;

int max_rsp, num_rsp;

int dev_id, sock, len, flags;

int i;

char addr[19] = { 0 };

char name[248] = { 0 };

dev_id = hci_get_route(NULL);

printf("/nhci%d is scanning....../n",dev_id);

//dev_id = lc[scannum].name;

sock = hci_open_dev( dev_id );

if (dev_id < 0 || sock < 0) {

system("reboot");

perror("opening socket");

return 0;

}

bdaddr_t src;

bacpy(&src, BDADDR_ANY);

len = 8;

max_rsp = 255;

flags = IREQ_CACHE_FLUSH;

ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));



num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);

if( num_rsp < 0 ) perror("hci_inquiry");

for (i = 0; i < num_rsp; i++) {

ba2str(&(ii+i)->bdaddr, addr);

memset(name, 0, sizeof(name));

int c=0;

if (sdp_get_channel_opush(&src, &(ii+i)->bdaddr, &c))

//printf("/n%d/n",c);

if(c>0)addadr(addr,c); //此处是我在做项目中做的一个与应用程序连接的接口函数,功能是完成远程蓝牙设备的地址和文件传输通道号添加到 我自己建的地址列表中.

//printf("chinal=%d/n",c);



// if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), name, 0) < 0)

// strcpy(name, "[unknown]");

// printf("%s %s/n", addr, name);

}

free( ii );

close( sock );



return 0;

}

//sdp_get_channel_opush,这是一个我自己编写的通过 hci获得的远程蓝牙地址和初始化为零的 channel来获取远程蓝牙设备有无文件传输功能,并获得文件传输通道的过程.

int sdp_get_channel_opush(bdaddr_t *src, bdaddr_t *dst, int *channel)

{

uuid_t service;

sdp_session_t *session;

sdp_list_t *search, *attrs, *rsp;

uint16_t attr;

int err;

/* build search request */

sdp_uuid16_create(&service, OBEX_OBJPUSH_SVCLASS_ID);

search = sdp_list_append(0, &service);

attr = SDP_ATTR_PROTO_DESC_LIST;

attrs = sdp_list_append(NULL, &attr);

/* connect */

session = sdp_connect(src, dst, SDP_RETRY_IF_BUSY);

if (!session) return(-1);

/* send request */

err = sdp_service_search_attr_req(session, search, SDP_ATTR_REQ_INDIVIDUAL, attrs, &rsp);

/* close connection */

sdp_close(session);

printf("sdp_service_search_attr_req-return=%d/n",err);

if (err) return(0);

/* get rfcomm channel */

for(; rsp; rsp = rsp->next) {

sdp_record_t *rec = (sdp_record_t *) rsp->data;

sdp_list_t *protos;

if (!sdp_get_access_protos(rec, &protos)) {

int ch = sdp_get_proto_port(protos, RFCOMM_UUID);

printf("channel=%d/n",ch);

if (ch > 0) {

*channel = ch;

return(1);

}

}

}

return(0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐