阅读Sony QX10的NFC标签

时间:2014-12-30 09:55:43

标签: camera sony

我创建了自己的QX10客户端应用程序,它刚刚发布到商店。 (可在Windows Phone商店中找到:http://www.windowsphone.com/en-us/store/app/nc-qx10/1c8d71da-0e4b-43cd-a5c2-020a072419d3并且它在这里开源:https://github.com/nantcom/SonyCameraSDK {尚未同步,仍在清理代码......})我的下一步是获取相机来自NFC的密码。

经过几次试验后,我在使用NdefLibrary阅读嵌入QX10的NFC标签方面取得了一些成功。以下是我可以从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

我可以看到我的QX10的SSID以及用****屏蔽的位置是我的QX10密码,所以这是从QX10获取密码的可能方法。

然而,有效载荷似乎有一些特定的格式,我一直试图找到大约2个小时。我可以简单地使用substring来获取密码,但它似乎不太可靠,因为它可能与其他相机不同。

是否有关于此Ndef记录类型的已发布规范,所以我可以可靠地从中读取SSID /密码?

1 个答案:

答案 0 :(得分:0)

好的应用程序!虽然我无法直接帮助您,但我使用了Thibaud Michel(https://github.com/ThibaudM/timelapse-sony)的一些代码来让我的应用程序使用Android的NFC连接:

这是处理从有效负载获取密码的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手机重写它非常简单。