基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(一)
作品已经完成,先上源码:
https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip
全文包含三篇,这是第一篇,作为前言和概述。
第二篇:基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(二)
第三篇:基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)
以下是正文:
一、前言
先说为什么要做这个作品。作者手头上有一闲置的蓝牙音箱,可恨的是笔记本电脑没有蓝牙功能,而USB口只有两个,即使买个蓝牙适配器也不够用USB口用,也不考虑用USB Hub,看着这么多线就让人觉得糟心。刚好还有一块OrangPi Zero,突发奇想,打算利用它和家里的WIFI无线网络实现无线音箱的功能。其实类似功能音箱某宝上也有,不过大部分都是打着云音箱、智能音箱的旗号,个人觉得这类音箱都有一个很大问题:只能播放网络音乐或者使用DLNA、Airplay等协议从手机或电脑推送音频,可是实际上很多浏览器、播放器并不支持DLNA或Airplay推送,这就很大的限制了这种音箱的使用范围。例如作者习惯使用Potplayer(不支持DLNA和Airplay)作为PC端的音乐播放器和视频播放器,这种情况下,这些智能音箱就完全没用了。另外,在安卓上也有一些类似的app,类似Soundwire、wifiaudio等,能实现电脑声卡输出的音频实时录音并传输到安卓手机上,把手机充当wifi音箱,但在Linux环境上目前没发现类似软件。
二、硬件连接
说干就干,先说硬件:OrangPi Zero硬件引出了音频接口,如下图所示。本作品直接使用耳机接口的LINEOUTR、LINEOUTL和GND引脚,分别代表左右声道,这样硬件环境就搭建好了。

三、软件运行环境
发送端:Windows7,开发工具Visual Studio 2012,C++语言。根据微软MSDN,Core Audio APIs只支持Windows Vista以上操作系统,所以发送端软件也只能在Vista以上系统运行。
接收端:Orangpi Zero,运行Armbian 5.38,python3.5
四、系统原理图
发送端和接收端通过底层socket进行数据的发送和接受。socket意为套接字,是实现TCP/IP协议的一种最常用的方式,在各种编程环境下都有成熟的应用。了解网络通讯的人都知道,网络通讯最主要的两种通讯协议是TCP协议和UDP协议,以下是我对这两种协议的理解:
1、TCP协议是建立连接的通讯,是可靠的通讯,能保证发出去的数据包不丢失、不重复。
2、UDP协议是无连接的通讯,是不可靠的通讯,UDP尽最大努力保证数据可靠传输,但不保证一定能不出差错、不丢包。
这两种通讯方式的优缺点也很明显,TCP要建立连接、麻烦、效率低,一般使用在对数据准确率要求高而实时性不高的情况。相反,UDP协议不建立连接,操作简单,不管对方能否收到,发送端都不停地发送,UDP协议在实时性要求比较高的场合非常合适,例如传输视频、音频数据时,一两帧数据丢失、错误并不会影响用户的体验。所以,在本作品中,使用UDP协议的socket接口进行网络通讯。系统框图如下所示:

发送端原理看似较简单,但实际上作者花的最多的时间就在调试发送端上,在下一节将详细讲述发送端的原理和过程。以下是发送端和接收端运行界面:

基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(一)的更多相关文章
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(二)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第二篇,主要讲述发送端程序的原理和过程. 第一 ...
- 基于Orangpi Zero和Linux ALSA实现WIFI无线音箱(三)
作品已经完成,先上源码: https://files.cnblogs.com/files/qzrzq1/WIFISpeaker.zip 全文包含三篇,这是第三篇,主要讲述接收端程序的原理和过程. 第一 ...
- 基于Linux ALSA音频驱动的wav文件解析及播放程序 2012
本设计思路:先打开一个普通wav音频文件,从定义的文件头前面的44个字节中,取出文件头的定义消息,置于一个文件头的结构体中.然后打开alsa音频驱动,从文件头结构体取出采样精度,声道数,采样频率三个重 ...
- 菜鸟学习物联网---辨析基于Andriod 5.1,Linux,Windows10开发Dragon Board 410c板
点击打开链接 诸位亲最近怎么样?刚过完年上班是不是很不情愿?自古做事者,不唯有坚韧不拔之志,亦或有超世之才.所以,诸位好好加油.今天小编想给大家系统性总结一下Dragon Board 410c板基于A ...
- Kali Linux下破解WIFI密码挂载usb无线网卡的方法
Kali Linux下破解WIFI密码挂载usb无线网卡的方法 时间:2014-10-12 来源:服务器之家 投稿:root 首先我要说的是,wifi密码的破解不是想象中的那么容易,目前还 ...
- 基于VMware的虚拟Linux集群搭建-lvs+keepalived
基于VMware的虚拟Linux集群搭建-lvs+keepalived 本文通过keepalived实现lvsserver的的双机热备和真实server之间的负载均衡.这方面的blog挺多,可是每一个 ...
- [原创]基于Zynq AXI-Bram Standalone & Linux 例程
基于Zynq AXI-Bram Standalone & Linux 例程 待添加完善中
- [原创]基于Zynq AXI-GPIO Standalone & Linux 例程
基于Zynq AXI-GPIO Standalone & Linux 例程 待添加完善中
- Linux学习笔记——基于鸟哥的Linux私房菜
Linux学习笔记--基于鸟哥的Linux私房菜 ***** ARM与嵌入式linux的入门建议 (1) 学习基本的裸机编程:ARM7或ARM9,理解硬件架构和控制原理 (这一步是绝对的根基) (2) ...
随机推荐
- Jmeter(二十六)_数据驱动测试
花了一点时间做了一个通用的执行引擎,好处就是我不用再关注测试脚本的内容,而是用测试用例的数据去驱动我们执行的方向.(这个只适合单个接口的测试,具体运用到接口自动化时,还是要靠手动去编写脚本!) 首先我 ...
- 寻找DevExpress破解经历之旅
众所周知DevExpress是收费的,但是破解版的也不少,近期公司需要做发票套打的功能让我找个打印工具,我寻思着DevExpress这个软件好像挺不错的,功能强大,看了下价格方面,好吧!2W多呢,市面 ...
- Java的精确整数计算-Bigdecimal学习总结和工具类
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...
- VueJs(12)---vue-router(导航守卫,路由元信息)
vue-router(导航守卫,路由元信息) 之前泄露两篇有关vue-router博客: VueJs(10)---vue-router(进阶1) VueJs(11)---vue-router(进阶2) ...
- JavaScript之对象继承
原型链继承 function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ ...
- Java Web Without SSM(前言)
是的,Spring,Mybaties确实给我们带来了方便的轻量级JavaWeb开发,但是,对于大部分中小系统来说,分层,框架,规范,已经成为一种累赘.实际的程序开发过程中,大部分时间都花在了" ...
- NopCommerce是什么(转自CNSD)
NopCommerce是什么 nopCommerce--最好的免费购物车!nopCommerce是一个开源的解决方案.它是一个具有综合功能.对于新在线业务来说亦易于使用的解决方案,同时它也是一个功能强 ...
- java解析xml字符串方法
一,用DOM4J 针对无重复标签的xml字符串格式,如下: 针对此种情况可用DOM4J解析法,引入 dom4j的相关jar包代码如下: Document document=DocumentHelpe ...
- Intellij-Idea Maven SSH项目的搭建
添加阿里云镜像 在.m2/settings.xml中, <mirror> <id>nexus-aliyun</id> <name>Nexus aliyu ...
- 利用分支限界法求解单源最短路(Dijkstra)问题
分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分 ...