實戰 linux藍牙編程之(八) hci 協議 應用編程實現

 

  對於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);
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章