Чтение NFC-тега Sony QX10

Я создал свое собственное клиентское приложение QX10, которое только что было опубликовано для хранения. (доступно в Магазине Windows Phone: http://www.windowsphone.com/en-us/store/app/nc-qx10/1c8d71da-0e4b-43cd-a5c2-020a072419d3 и открыто здесь: https://github.com/nantcom/SonyCameraSDK {еще не синхронизирован, все еще очищает код...}), и мой следующий шаг - получить пароль камеры от NFC.

После нескольких испытаний у меня небольшой успех в чтении тега NFC, встроенного в мой QX10, с использованием NdefLibrary. И вот что я могу получить от моего QX10:

MIME тип:

application/x-sony-pmm

Полезная нагрузка:

\0\0\0\0DIRECT-qdQ0:DSC-QX10\0\*********\0\n\0��\0\0\n\0\0����ɇ\v\0\0\0�@/\0\n\0\0�A\nDmsRmtDesc\0\0

Я вижу SSID моего QX10, а местоположение, которое было замаскировано ****, - это мой пароль QX10, так что это возможный способ получить пароль от QX10.

Тем не менее, полезная нагрузка имеет определенный формат, который я пытался найти около 2 часов. Я могу просто использовать подстроку для получения пароля, но он не очень надежен, так как он может отличаться на других камерах.

Существует ли какая-либо опубликованная спецификация об этом типе записи Ndef, поэтому я могу надежно прочитать SSID/ пароль с него?

1 ответ

Хорошее приложение! Хотя я не могу помочь вам напрямую, я использовал некоторый код от Тибо Мишеля ( https://github.com/ThibaudM/timelapse-sony), чтобы мое приложение работало с подключением NFC для Android:

Вот метод java, который обрабатывает получение пароля из полезной нагрузки:

private static Pair<String, String> decodeSonyPPMMessage(NdefRecord ndefRecord) {

        if(!SONY_MIME_TYPE.equals(new String(ndefRecord.getType()))) {
            return null;
        }

        try { 
            byte[] payload = ndefRecord.getPayload(); 
            Log.v("pay",String.valueOf(payload));
            int ssidBytesStart = 8;
            int ssidLength = payload[ssidBytesStart];

            byte[] ssidBytes = new byte[ssidLength];
            int ssidPointer = 0;
            for (int i=ssidBytesStart+1; i<=ssidBytesStart+ssidLength; i++) {
                ssidBytes[ssidPointer++] = payload[i];
            }
            String ssid = new String(ssidBytes);

            int passwordBytesStart = ssidBytesStart+ssidLength+4;
            int passwordLength = payload[passwordBytesStart];

            byte[] passwordBytes = new byte[passwordLength];

            int passwordPointer = 0;
            for (int i=passwordBytesStart+1; i<=passwordBytesStart+passwordLength; i++) {
                passwordBytes[passwordPointer++] = payload[i];
            }
            String password = new String(passwordBytes);

            return new Pair<String, String>(ssid, password);

        } catch(Exception e) {
            return null;
        }
    }

Вы можете видеть, что мы получаем строку с именем password, которая является желаемым паролем:). У меня нет под рукой Windows Phone / Visual Studio для тестирования любого кода C#/C++. Надеюсь, это довольно просто переписать его для Windows Phone.

Другие вопросы по тегам