基于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) ...
随机推荐
- 在Windows上安装Git
实话实说,Windows是最烂的开发平台,如果不是开发Windows游戏或者在IE里调试页面,一般不推荐用Windows.不过,既然已经上了微软的贼船,也是有办法安装Git的. Windows下要使用 ...
- unity零基础开始学习做游戏(一)为了实现你的游戏,你需要提前做的准备工作
-------小基原创,转载请给我一个面子 正所谓,工欲善其事,必现准备好电脑.接下来跟着小基一步一步来搭建你的开发环境吧 1.下载安装unity 上面的那个是破解软件,下面是unity5.5.6的安 ...
- git如何移除某文件夹的版本控制
目录结构如下 project bin lib src ...... 执行如下的操作 git add . git commit -m "add bin/ lib/ src/" git ...
- Ubuntu 16.04开启SSH服务
安装: sudo apt-get install openssh-server 启动: sudo service ssh start 查询服务启动状态: sudo ps -e | grep ssh 或 ...
- java集合及其方法
1.集合框架 我们已经学习过使用数组来批量存储某一类数据: 但是,数组还是存在一些不足,比如长度不可变(建立对象的时候就已经定义好长度): 查找某一个数据时,要依靠索引值来遍历数组进行条件查找,数据量 ...
- Quartz学习-- quartz基本介绍和 Cron表达式
Quartz学习 一. Quartz 大致简介 Quartz 是完全由 java 开发的一个开源的任务日程管理系统 任务日程管理系统 换句话说就是: 一个预先确定的日程时间到达时,负责执行任务的 ...
- threesum
算法题 问题描述:在一些给定的数中,找到三个数,他们相加的和是0,并且这三个数的组合是不能重复的 例子: input [-1, 0, -1, 2, 1] Output [[-1, 1 ,0], [-1 ...
- SOFA 源码分析 — 泛化调用
前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例 ...
- git常用笔记整理
Git 什么是Git 初始化 guthub创建sshKey 下载 上传 更新 创建切换分支 删除分支 合并分支 查看命令历史|提交历史 撤回 设置用户名和密码 查看配置信息 强制pull 强制push ...
- POI导出excel并下载(以流的形式在客户端下载,不保存文件在服务器上)
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; i ...