2008-12-30 30 views
31

Tôi muốn có danh sách các mạng không dây khả dụng. Lý tưởng nhất điều này sẽ được thông qua một số cuộc gọi C, nhưng tôi không nhớ nếu tôi phải kludge nó với một cuộc gọi hệ thống. Thậm chí tốt hơn nếu yêu cầu C gọi hoặc chương trình không yêu cầu một số gói bên thứ 3 kỳ lạ.Làm cách nào để có danh sách các mạng không dây khả dụng trên Linux?

Internet dường như đề nghị tôi sử dụng sudo iwlist <interface> scan dường như thực hiện thủ thuật từ dòng lệnh, nhưng tôi không muốn yêu cầu quyền root. Tôi chỉ muốn nhìn thấy những điều cơ bản, không thay đổi bất cứ điều gì.

+2

Bạn không cần phải root để chạy iwlist, nhưng nó sẽ chỉ báo cáo các giá trị được lưu trong bộ nhớ cache từ lần quét định kỳ cuối cùng. Để bắt buộc quét mới, bạn cần phải root. – Hudson

+0

Hmm, khi chạy không phải root nó sẽ trả về không có gì, ít nhất là trên Ubuntu 8.04: -/ – richq

Trả lời

26

Gói Wireless Tools - trong đó iwlist là một phần - cũng chứa Thư viện trình trợ giúp công cụ không dây. Bạn cần bao gồm iwlib.h và liên kết với libiw.a (ví dụ: add -liw). Sau đó tìm tài liệu cho hàm iw_set_ext. Thông số SIOCSIWSCAN sẽ được sử dụng nhiều nhất. Để biết ví dụ về cách sử dụng giao diện này, hãy xem nguồn KWifiManager trong thư viện KDE (xem: Interface_wireless_wirelessextensions::get_available_networks). Ngoài ra, bạn cũng có thể tải xuống Wireless Tools source code và xem cách chức năng iwlib iw_set_ext cũng được sử dụng để quét trong iwlist.c.

Đối với đặc quyền, tôi hình dung quy trình sẽ cần chạy dưới dạng gốc để thực hiện quét. Tôi rất muốn biết nếu điều này có thể được thực hiện bằng cách khác là tốt.

Vì bạn đang sử dụng Ubuntu 8.04, gói libiw-dev nên được sử dụng.

+0

Tôi có thể sử dụng gói ** Công cụ Wirelsess ** (** libiw-dev **) trong ứng dụng thương mại không? Có lẽ tôi không thể, nhưng tôi muốn chắc chắn. – rraszewski

35

Thật dễ dàng để thực hiện quét trong dòng lệnh. Trang người đàn ông là bạn của bạn ở đây (hãy xem iwconfigiwlist). Nhưng việc sử dụng giao diện C thì khó hơn một chút nên tôi sẽ tập trung vào đó.

Trước hết, như những người khác đã đề cập, hãy tải xuống số wireless tools source code. Tất cả tài liệu cho giao diện lập trình nằm trong các tệp .c. Theo như tôi có thể nói, không có tài liệu web cho api. Tuy nhiên, mã nguồn khá dễ đọc. Bạn khá nhiều chỉ cần iwlib.hiwlib.c cho câu hỏi này.

Trong khi bạn có thể sử dụng iw_set_extiw_get_ext, các libiw thực hiện một chức năng quét cơ bản iw_scan, từ đó bạn có thể trích xuất hầu hết các thông tin mà bạn cần.

Đây là một chương trình đơn giản để có được ESSID cho tất cả các mạng không dây có sẵn. Biên dịch với -liw và chạy với sudo.

#include <stdio.h> 
#include <time.h> 
#include <iwlib.h> 

int main(void) { 
    wireless_scan_head head; 
    wireless_scan *result; 
    iwrange range; 
    int sock; 

    /* Open socket to kernel */ 
    sock = iw_sockets_open(); 

    /* Get some metadata to use for scanning */ 
    if (iw_get_range_info(sock, "wlan0", &range) < 0) { 
    printf("Error during iw_get_range_info. Aborting.\n"); 
    exit(2); 
    } 

    /* Perform the scan */ 
    if (iw_scan(sock, "wlan0", range.we_version_compiled, &head) < 0) { 
    printf("Error during iw_scan. Aborting.\n"); 
    exit(2); 
    } 

    /* Traverse the results */ 
    result = head.result; 
    while (NULL != result) { 
    printf("%s\n", result->b.essid); 
    result = result->next; 
    } 

    exit(0); 
} 

KHUYẾN CÁO: Đây chỉ là một chương trình trình diễn. Có thể cho một số kết quả không có một bài luận. Ngoài ra, điều này giả định giao diện không dây của bạn là "wlan0". Bạn có được ý tưởng.

Đọc mã số iwlib!

+0

Bạn cũng có thể nhận địa chỉ AP (địa chỉ mac) bằng phương pháp này không? Làm cách nào? Cảm ơn :) – bubbly

+0

Tôi nhận được địa chỉ MAC với: result-> ap_addr nhưng nó không ở dạng in được. Nó in ra một cái gì đó giống như 71732. – bubbly

+0

** iwconfig ** in ra các điểm truy cập ở định dạng thông thường. Kiểm tra mã nguồn cho lệnh trong 'iwconfig.c' (tìm kiếm cho" Access Point "). –

Các vấn đề liên quan