Чтение 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.