我最近在亚马逊附近购买了一个分贝仪(http://www.amazon.com/Sound-Measure-Tester-Pressure-Decibel/dp/B00CPKSE38/ref=sr_1_1?ie=UTF8&qid=1436376590&sr=8-1&keywords=wensn)将分贝测量结果输出到microSD卡。我在计算机上打开了sd卡的内容,并遇到了四个单独的* .wsn文件,其中两个是我创建的,另外两个显然是制造商在测试中制造的。无论如何,谷歌搜索了.wsn文件扩展名,却找不到“ whoopsie皮肤文件”之类的东西,这似乎不是我要找的东西。谁能帮我找到解析此文件的方法?我想它只包含一个包含两列(db级和时间)的信息表。这是文件示例的链接。它是从分贝表开始仅几秒钟的时间序列数据。 :
db测量设备的制造商是“ wensn”,它清楚地说明了文件扩展名。到目前为止,我已经找到了两条线索:


设备的制造网站(不是很有帮助,实际上已经被黑客攻击了)东西)
wensn usb流github在python中的解析项目

,但两者都是用于解析设备中* .tmp文件的usb流,而不是静态的wsn文件。我猜我可以利用此代码来解析wsn文件,但我还不知道该怎么做。老实说,这时我已经不知所措。预期的输出数据为柱状,时间和分贝级别,如此处所示。实用程序,用于读取科学传感器的各种串行输出。

评论

出于好奇,您怎么知道它已被黑客入侵?

我目前不从事业余噪声研究项目,因为该死的设备被切断并且数据仅保留了几秒钟,然后突然由于其他业务原因而无济于事。我仍然有设备,可以尝试再次学习。我将正确答案标记为导致我破解难题的答案。在此之前,这个问题似乎在帮助很多人,这很好。

#1 楼

这是示例文件的十六进制转储:

00000000  1F DA 51 A0 19 5A 52 A0  19 DA 52 A0 28 5A 53 A0  ..Q..ZR...R.(ZS.
00000010  28 DA 53 A0 24 5A 54 A0  1A DA 54 A0 2A 5A 55 A0  (.S.$ZT...T.*ZU.
00000020  26 DA 55 A0 26 5A 56 A0  08 DA 56 A0 47 5A 57 A0  &.U.&ZV...V.GZW.
00000030  35 DA 57 A0 32 5A 58 A0  3B DA 58 A0              5.W.2ZX.;.X.


您可以看到,该文件显然具有一种模式,其中似乎重复了4个字节:
-字节一上升和下降,可能与声音电平有关缓慢上升,也许是时间指示符
-字节4是A0,并且可能是时间的高位字节。

但是,没有关于已记录的声音电平的任何信息,或者来自原始字节的一些期望值,每个猜测都很难验证。如果您可以使用设备随附的软件,打开该文件,然后告诉我们该数据由什么软件组成,这将非常有帮助。是有信誉的,我曾几次从他们那里购买过),该产品具有德语/英语的PDF手册,最新版本请访问www.omnitronic.com。该网站将转至出售该产品的商店,不再有库存,但仍然具有手册和软件的下载页面。该产品看上去略有不同,但是具有相同的总体布局和关键位置,因此有理由假设它是相同的电子产品,但塑料外壳略有不同,因此该软件可能对您有用,甚至比设备随附的产品更好-亚马逊评论说该软件是中文,没有驱动程序; “我的”下载页面上的zip文件包含一个“ Vista驱动程序”文件夹和一个似乎支持英语的安装程序。

#2 楼

这是十六进制格式的文件(用vi和:%!xxd完成;我自己添加了列号):

          0 1  2 3  4 5  6 7  8 9  a b  c d  e f
0000000: 1fda 51a0 195a 52a0 19da 52a0 285a 53a0  ..Q..ZR...R.(ZS.
0000010: 28da 53a0 245a 54a0 1ada 54a0 2a5a 55a0  (.S.$ZT...T.*ZU.
0000020: 26da 55a0 265a 56a0 08da 56a0 475a 57a0  &.U.&ZV...V.GZW.
0000030: 35da 57a0 325a 58a0 3bda 58a0 0a         5.W.2ZX.;.X..


您可以看到带有奇数索引的字节全部daa05aa0,其周期为8个字节(半行)。这看起来不像usb流中的数据,因此链接或Python项目可能对您没有太大帮助:



此外,似乎成为2a列中的计数器:515253,... 6a列中的字节相同。 e2列中的字节也相同,但有2个不同,这表明我们该部分的对齐方式不是很好。一个更好的对齐方式来进行进一步的反向工程是将e列移到最左边的位置。

您可以获取更大的样本来查看daa05a是常量还是它们是计数器的一部分,或者可能是其他东西。例如,也有可能它们实际上是测量的一部分,但在这里似乎是恒定的,因为测量时刻的声级是恒定的。指出只有048c列携带数据。一旦确认了假设(通过查看更多数据),就可以开始生成声音,并查看所看到的数据与所生成的声音之间的关系。作为扩展名,此文件不太可能具有某些常用的表格式,因此,我不能给您更多提示。如前所述,我将vi与xxd一起使用(即在vi中打开文件,然后在:%!xxd中打开文件)。但是,有很多十六进制编辑器,也适用于Windows。我不知道允许您移动起始列的任何内容,这对于检查对齐方式很有用。

#3 楼

您的文件似乎像这样:为什么每个模式(51A0,52A0)都显示2次,因为dos时间不接受奇数作为秒。

理论1:

我认为诸如声音之类的自然事物不会进入DA,5A,DA,5A,DA,5A,DA,5A,DA,5A。

所以我假设DA表示较低的部分,而5A是较高的部分。 (DA = + 0和5A = + 1)但这可能是错误的,因为您没有提供有关所捕获声音的任何信息。

文件的第一个字节最大为0x47(71)最小为0x8(8)。

在亚马逊页面上说(30〜130 Db)

8不能满足这些范围,所以我认为第一个字节是偏移量。

130-30 = 100- > 0> x>100。

每4个字节都有以下信息:

51A0
52A0
52A0
53A0
53A0


我为您的数据编写了一个示例代码。

52A0 = 20:02:36
53A0 = 20:02:38 in dos time


哪个输出:

5A 52 A0 = 20:02:36
DA 52 A0 = 20:02:37
5A 53 A0 = 20:02:38
DA 53 A0 = 20:02:39


理论2:

给了我们(http://opensource.ebswift.com/RaspiMonitor/wensn/),就是这个函数(dB =(byte1 +((byte2&3)* 256))* 0.1 + 30)使我觉得也许实际上,第二个字节不是时间偏移,而是dB的第二个字节。同样,我从第二种理论获得的输出也要好得多,因此我认为这是正确的答案。

struct Frame{
  char SoundOffset;
  char TimeOffset;
  char DosTime[2];
}


输出:

#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <string>
#include <iostream>  
#include <fstream>
#include <iostream>

using namespace std;


struct DosTime{
    int hour, minute, second;
    DosTime(char a1, char a2){
        char y[2] = { a1, a2 };
        INT16 * b = (INT16*)y;
        second = 2 * (*b & 31);
        minute = (*b & 2016) >> 5;
        hour = (*b & 63488) >> 11;
    }
    DosTime(){
        hour = 0;
        minute = 0;
        second = 0;
    }
};
struct Frame{
    char SoundOffset;
    char TimeOffset;
    char DosTime[2];
};
struct ConvertedFrame{
    int soundDB;
    DosTime time;
    void print(){
        cout << "Sound Level: " << soundDB << " dB @ ";
        cout.fill('0'); cout.width(2); cout << time.hour;
        cout << ":";
        cout.fill('0'); cout.width(2); cout << time.minute;
        cout << ":";
        cout.fill('0'); cout.width(2); cout << time.second;
        cout << endl;
    }
};
int main(int argc, char* argv[])
{

    int bytecount = 0;

    ifstream inFile;
    inFile.open("FG8U0235.wsn", ios::in | ios::binary | ios::ate);
    inFile.seekg(0, ios::end);
    bytecount = inFile.tellg();
    inFile.seekg(0, ios::beg);

    char * buffer = new char[bytecount];
    inFile.read(buffer, bytecount);

    ConvertedFrame * frames = new ConvertedFrame[bytecount / 4];
    for (int i = 0; i < bytecount; i += 4){
        ConvertedFrame _con;
        Frame f;
        memcpy(&f, &buffer[i], 4);
        DosTime _t = DosTime(f.DosTime[0], f.DosTime[1]);
        if (f.TimeOffset == '\xDA')
            _t.second++;
        _con.time = _t;
        _con.soundDB = ((int)f.SoundOffset) + 30;
        frames[i / 4] = _con;
        _con.print();
    }
    system("pause");
    return 0;

}


注意:
要找到哪一个是正确的,您需要将dB写到纸上或其他东西上,然后与从这两个代码获得的输出进行比较。

如果您使用此代码,并且还想防止内存泄漏,则还需要清除ConvertedFrame *帧和char *缓冲区。我在凌晨4点写了这段代码,只是为了测试理论。

#4 楼

我从亚马逊购买了分贝仪Koolertron SL1361,它会产生* .wsn文件,但是软件无法正常工作,因此我使用此注释来理解。
最后一个理论2是正确的,每个样本数据都是4字节长。

假设32位(四个字节)被命名为bit31-0,这是我的解码:

Bit 31-24和17-16 Db中的值(10位) ),必须除以10,然后再加上30以得到正确的值
位22过滤模式0 =快速1 =慢
位21过滤模式0 = A 1 = C
位12 -8&23 =秒
位7-3 =小时
位2-0&15-13 =分钟

它们以正二进制编码。

一切正常。

#5 楼

如果您根本无法获得任何文档,那么显而易见的简单解决方案:
您是否具有读取这些文件的软件?

如果这样的话,可能会以一些有用的图形格式显示它们?在它们可能加载的位置。.