基于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) ...
随机推荐
- 发现DELL笔记本一个很弱智的问题
以前用联想的笔记本,最近联想笔记本坏了,用的是公司的DELL笔记本,发现DELL笔记本一个很弱智的问题. 关于禁用触摸板的问题. 起因: 由于要经常写程序,我配置的有有线鼠标,但是打字时经常碰到触摸板 ...
- Webpack vs Browersify vs SystemJs for SPAs
https://engineering.velocityapp.com/webpack-vs-browersify-vs-systemjs-for-spas-95b349a41fa0 Right no ...
- asp.net core ABP模板本地化设置
ABP的语言本地化设置非常方便,甚至地区图标ABP框架都已经有了. 先看看结果吧. 英文的界面 中文的界面 配置流程如下: 首先在Localization目录下新建一个对应的json文件,里面存放对应 ...
- NewLife.Net——管道处理器解决粘包
Tcp网络编程,必须要解决的一个问题就是粘包,尽管解决办法有很多,这里讲一个比较简单的方法. 老规矩,先上代码:https://github.com/nnhy/NewLife.Net.Tests 一. ...
- 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!
今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...
- 第五章 MySQL函数
一.数学函数 (1) 绝对值函数:ABS(x) ABS(x) 用于返回 x 的绝对值 mysql> SELECT ABS(2), ABS(-2.3), ABS(-33); +--------+- ...
- ELK 架构之 Elasticsearch 和 Kibana 安装配置
阅读目录: 1. ELK Stack 简介 2. 环境准备 3. 安装 Elasticsearch 4. 安装 Kibana 5. Kibana 使用 6. Elasticsearch 命令 最近在开 ...
- python_集合
>>> import random>>> import time>>> x=list(range(10000))>>> y=se ...
- JS的进阶技巧
前言 你真的了解JS吗,看完全篇,你可能对人生产生疑问. typeof typeof运算符,把类型信息当做字符串返回. //正则表达式 是个什么 ? typeof /s/ // object //nu ...
- python selenium鼠标键盘操作(ActionChains)
用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击.双击.点击鼠标右键.拖拽等等.而selenium给我们提供了一个类来处理这类事件--ActionChains sele ...