2016-04-21 15 views
14

Kể từ Android 5.0.0, bạn có thể nhấn vào kết nối WiFi và ghi kết nối đó vào thẻ ("Ghi vào thẻ NFC"). Bạn có thể tìm nguồn cho hoạt động đó tại đây: WriteWifiConfigToNfcDialog.java. Dòng tương ứng mà phải mất một kết nối WiFi và tạo ra một tải trọng NDEF dường như là ở đây:Tạo bản ghi WiFi NDEF bằng ứng dụng/vnd.wfa.wsc trong Android

String wpsNfcConfigurationToken = mWifiManager.getWpsNfcConfigurationToken(mAccessPoint.networkId);

mWifiManager là một thể hiện của WifiManager, tuy nhiên getWpsNfcConfigurationToken không phải là một phần của API. Bằng cách theo dõi phương thức này, chúng tôi có thể tìm thấy cam kết của nó tại đây: Add calls for NFC WSC token creation thật không may là không có trợ giúp. Đây là nơi điều tra của tôi đã hết. Edit: Tôi đã phát hiện ra các cuộc gọi stack sau:

WifiServiceImpl.java cuộc gọi mWifiStateMachine.syncGetWpsNfcConfigurationToken(netId);

WifiStateMachine.java cuộc gọi mWifiNative.getNfcWpsConfigurationToken(netId);

WifiNative.java cuối cùng đã có phương pháp

public String getNfcWpsConfigurationToken(int netId) { return doStringCommand("WPS_NFC_CONFIG_TOKEN WPS " + netId); }

mà sau đó gọi

String result = doStringCommandNative(mInterfacePrefix + command);

trong đó doStringCommandNative thực hiện cuộc gọi hệ thống (không thể tìm mã cho nơi này).

Hiện tại, nơi điều tra kết thúc.

Hy vọng ai đó có thể tham gia và chỉ cho tôi phương pháp tạo NdefRecord thuộc loại application/vnd.wfa.wsc được cấp SSID, Mật khẩu, Mã hóa/Loại xác thực.

Tôi đã kiểm tra các byte của bản ghi application/vnd.wfa.wsc thực tế được tạo bởi Android nhưng tự tái tạo quy trình này với các byte dường như có khả năng rất không đáng tin cậy và cực kỳ tẻ nhạt.

Trả lời

10

Câu trả lời nằm trong Wi-Fi Alliance "Thông số kỹ thuật cấu hình đơn giản Wi-Fi v2.0.5" (có sẵn để tải xuống here).Android sử dụng định dạng chuẩn này để định cấu hình mạng Wi-Fi, tôi giả định rằng nó là độc quyền.

Thứ nhất, tôi đã tạo một lớp trợ giúp NFC (có tên là NFCHelper.java) có tất cả các hằng số byte cần thiết để tạo bản ghi. Sau đó, tôi đã tạo một phương pháp hacky để tạo một trong hai bản ghi được yêu cầu. Thông số kỹ thuật thực sự khá vô dụng ở đây, những gì tôi đã làm được kiểm tra một số tải trọng của các thẻ đã được cấu hình thành công thông qua hệ điều hành Android. Cuối cùng, bạn cần phải có một cơ chế để thêm vào một "Bản ghi Lựa chọn Bàn giao (NFC WKT Hs)" (xem trang 90 của thông số WiFi). Tôi tin rằng bản ghi này "yêu cầu" Android đăng ký mạng trong mã thông báo sau.

Làm thế nào để tạo bản ghi bàn giao:

ndefRecords = new NdefRecord[2]; 
byte[] version = new byte[] { (0x1 << 4) | (0x2)}; 
ndefRecords[0] = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_HANDOVER_REQUEST, new byte[0], version); 
// and then obviously add the record you create with the method below. 

Phương pháp để tạo token cấu hình:

private NdefRecord createWifiRecord(String[] data) { 
    String ssid = data[0]; 
    String password = data[1]; 
    String auth = data[2]; 
    String crypt = data[3]; 
    byte[] authByte = getAuthBytes(auth); 
    byte[] cryptByte = getCryptBytes(crypt); 
    byte[] ssidByte = ssid.getBytes(); 
    byte[] passwordByte = password.getBytes(); 
    byte[] ssidLength = {(byte)((int)Math.floor(ssid.length()/256)), (byte)(ssid.length()%256)}; 
    byte[] passwordLength = {(byte)((int)Math.floor(password.length()/256)), (byte)(password.length()%256)}; 
    byte[] cred = {0x00, 0x36}; 
    byte[] idx = {0x00, 0x01, 0x01}; 
    byte[] mac = {0x00, 0x06}; 
    byte[] keypad = {0x00, 0x0B}; 

    byte[] payload = concat(NFCHelper.CREDENTIAL, cred, 
      NFCHelper.NETWORK_IDX, idx, 
      NFCHelper.NETWORK_NAME, ssidLength, ssidByte, 
      NFCHelper.AUTH_TYPE, NFCHelper.AUTH_WPA_PERSONAL, authByte, 
      NFCHelper.CRYPT_TYPE, NFCHelper.CRYPT_WEP, NFCHelper.CRYPT_AES_TKIP, 
      NFCHelper.NETWORK_KEY, passwordLength, passwordByte); 
      // NFCHelper.MAC_ADDRESS, mac); 
    return NdefRecord.createMime(NFC_TOKEN_MIME_TYPE, payload); 
} 

Giấy phép và ý chính here. Bạn có thể tìm cách triển khai phương thức concat ở bất kỳ nơi nào trên mạng hoặc chỉ viết thư của riêng bạn.

Lưu ý: đây là một triển khai khá hacky (như bạn có thể thấy). Tôi bao gồm AES và AES/TKIP byte như tôi thấy trong thử nghiệm nó làm việc cho một loạt các mạng bằng cách sử dụng các phương pháp mã hóa/auth khác nhau dưới Android 5. * Xin vui lòng thay đổi nguyên mẫu chức năng, mảng String chỉ làm việc độc đáo với Những gì tôi đang làm.

Sử dụng hai bản ghi được tạo trong đoạn mã đầu tiên ở trên, sau đó bạn sẽ chuyển nó vào một NdefMessage và ghi nó vào thẻ của bạn.

Một ngày nào đó sắp tới tôi sẽ viết một bài viết và một giải pháp tốt hơn/mạnh mẽ hơn với đồ họa và nội dung, vì vậy tôi sẽ cập nhật câu trả lời này sau đó.

+1

Cảm ơn câu trả lời và mã của bạn. Nó không gần như là hacky như tôi đã mong đợi. : D – noone

7

Cuộc gọi doStringCommand("WPS_NFC_CONFIG_TOKEN WPS " + netId) cuối cùng được xử lý bởi mô-đun wpa_supplicant. Tính năng này được mô tả here. Tôi nghĩ rằng việc thực hiện thực tế này có thể được tìm thấy trong wps_supplicant.c.

Những gì bạn đang thực sự cố gắng làm không phải là một cái gì đó cụ thể của Android. Nó được định nghĩa trong "Đặc tả kỹ thuật cấu hình đơn giản WiFi", mà bạn có thể tải xuống bằng cách điền this form. Phần có liên quan phải là 10.1.2 Mã thông báo cấu hình.

NfcUtils.java có triển khai hoạt động cho việc này! Có một vài FIXME và TODO, nhưng trong tổng số nó hoạt động và nên cung cấp cho bạn một ý tưởng khá tốt về những gì bạn cần làm.

Trong trường hợp bạn muốn phân tích cú pháp NdefRecords đó và làm điều gì đó với SSID và khóa, NfcWifiProtectedSetup.java cho biết cách thực hiện điều đó.

+0

Trước hết, cảm ơn bạn đã theo dõi 'wps_supplicant.c'. Thứ hai, trong khi tôi đã không cập nhật các câu hỏi ban đầu trong một thời gian, tôi đã có thể tạo ra các hồ sơ Wifi! Tôi chỉ không hài lòng với giải pháp (và không quá tự hào vì nó khá là hacky). Tôi thực sự có được một bản sao của "WiFi Simple Configuration Technical Specification" (phiên bản 2.0.0) và đã có thể làm theo các đặc điểm kỹ thuật - phần quan trọng nhất là Handover Record mà tôi thậm chí không nghĩ đến. Tôi sẽ đăng mã của tôi như là một câu trả lời. – henrycjc

+0

@Tôi đã gặp khá nhiều sự cố khi đọc và hiểu thông số kỹ thuật cho đến thời điểm này. Vì tôi hiện đang cố gắng làm điều này, tôi rất mong được xem bạn đã làm thế nào! – noone

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