Yandex.Stations中的漏洞如何启发我参与该项目:音乐数据传输

上周,我谈到了如何通过声音激活Yandex.Station。 事实证明,WiFi密码以明文形式传输。 我想知道为什么有必要以这种方式而不是以某种调试方式进行激活。

结果,我得出结论,演出在这个过程中很重要。 但是,如果我们制定一个完全专注于用户体验的数据传输协议,将会发生什么? 这就是Octave项目的诞生方式-用于旋律式数据传输。



在切口下,我将告诉您原型的制作方法,并提供演示的链接。 您可以听任何消息的声音:)

上一篇文章的摘要


我录制了激活Station的声音,观察了移动的Fourier变换的可视化效果,并意识到了信号的排列方式以及WiFi密码的位置。



传输一个十六进制字符串,其中每个字符0-F的频率为1 kHz-4.6 kHz,步长为240 Hz。 我想知道为什么有必要以这种方式而不是像中国的机器人吸尘器那样通过蓝牙进行激活,并得出结论,在这种情况下,效率比安全性或速度更为重要。

灵感来源


真的! 毕竟,通信协议始终是范围,速度和可靠性之间的折衷。 但是,如果所有这些特征都淡出背景,而决定性的因素是用户的印象因素,该怎么办?

我喜欢Yandex开发人员的想法,就像锤子一样-选择16个频率:每个十六进制符号一个。 我还从以前的研究中得到了一个信号接收器,所以我决定发展这个想法,而不是从头开始提出所有建议。

两项改进


消除相间中断


首先,当我分析电台的激活信号时,切换符号时所有频率的噪声使我感到困惑。 这些是频谱图中的竖线:



在这些时候,会听到喀哒声。 产生这种效果的原因是字符之间的相位差。 事实是,一个符号的长度不适合整数个周期的声音振动。 因此,在切换频率时,信号幅度急剧变化。 像这样:



收音机中有多种方法可以避免这种影响。 我决定在切换频率时平滑降低信号的幅度,然后平滑建立-听起来更柔和。 看起来像这样:



也许这些点击不是错误,而是功能,并且发出了更“未来派”的声音,但如果没有它们,我会更好:)

添加音乐


我们通过声音传输数据。 为什么不为此使用音符频率? 我尝试了不同的选项,最后从第一个八度之前选择了16个音符。



使用较高的音调会使您的耳朵不舒服。 由于扬声器和麦克风的频率响应特性,小音更难传输。 同样,低音的频率彼此更接近,这会影响接收。

原来是一种音乐频率调制。 我们称其为“组调制” :)

我们启动


听起来怎么样? 为了能够在浏览器中尝试,我将Krup调制的发送器从python重写为js,并创建了一个简单的界面。

我借此机会打招呼:


我使用utf-8,这意味着也可以传输西里尔字母,甚至表情符号。 带它们的包裹更长,因为每个这样的字符都超过1个字节。


由于每个西里尔字母都包含相同的地址字节,因此听起来比拉丁语听起来令人愉悦。 但仍然很有趣:)

您可以在这里尝试任何短语。 (在文章末尾重复)

但是接收器呢?


当然,聆听基于文本的随机声音很有趣,但是只有在接收,解调和解码信号后才能调用数据传输。

我制作了python接收器的原型作为概念证明。 运作方式如下:


您会看到,数据传输就像通过注释一样! 当然,现在没有任何生产的问题。 没有同步,纠错编码和完整性控制。 但是,如果社区表现出兴趣并抛出了一些实用选项,我可以实现上述功能并将其包装在普通库中:)

骑单车的?
我知道通过声音的数据传输已得到很好的发展。 有很多与超声波相关的库DTMF仍然很普及, 人们甚至还哨子模仿音调命令。 但是我还没有看到使用笔记进行数据传输的项目。 如果您知道这样的话,请在评论中写。

总结一下


这是一个有趣的项目,经过了两个晚上,结果非常出色。 这样的数据传输可以用作“声音QR码”,以将帐户从手机共享到网站等。

或者,您可以使用它来为品牌创建铃声。 例如,在这里听起来像habr

所有当前的开发都可以在github上找到 -您可以尝试自己开发该项目。

链接复制到浏览器中运行的演示。

感谢您的阅读! 我希望你有兴趣。

祝你好运!

Source: https://habr.com/ru/post/zh-CN470293/


All Articles