Android BLE自动测试系统与框架

实际开发中,因为需要对不同的BLE设备进行测试。包括语音遥控器,OTA,模组,ble mesh等设备的不同功能进行兼容与稳定性测试,而使用人工测试非常的缓慢且消耗人力。因此开发了一个测试系统用来做自动测试。 同时这个自动测试,可以和CI结合起来,完成DevOps的构建。而且本套系统可以非常好的扩展到嵌入式中的其他测试,也包括其他的IoT RF测试。同时还可以与IC测试结合起来。 演示效果 youku视频: https://v.youku.com/v_show/id_XMzcxNTA2OTQ4NA==.html?spm=a2h3j.8428770.3416059.1 <embed src=’http://player.youku.com/player.php/sid/XMzcxNTA2OTQ4NA==/v.swf’ allowFullScreen=’true’ quality=’high’ width=’480′ height=’400′ align=’middle’ allowScriptAccess=’always’ type=’application/x-shockwave-flash’></embed> 另外一个比较完整的,但是有些程序有些老的测试Demo视频: https://v.youku.com/v_show/id_XMzcxNTIwNTMxNg==.html?spm=a2h3j.8428770.3416059.1 GIF演示,比较大,需要在新标签中打开才能自动播放(对着下面的图片右键–>在新Tab中打开): 系统构成

Continue reading »

imx6ul蓝牙语音识别项目之6:语音格式说明以及整合与实际效果演示

前面我们准备好了所有的软件硬件,现在是时候开始正在的业务逻辑功能的实现了。 语音数据的格式 语音遥控器走的是BLE, 对于Voice Over BLE有多种方案,不同的厂家和方案商都不同的实现。下面我们使用TI的来说明,其他的也是类似的。 这里面主要是说明了各种格式,以及传递协议。 我们需要接受和decoder语音,那么就需要搞明白这些东西。 具体而言,语音的Profile如下: 交互过程如下: 注意第一包语音数据有头部: 语音数据从Gatt Notification中获取过来,我们先说一下这个压缩后的语音格式ADPCM。 具体可以参考: 简单而言,使用的是差分压缩: 下面是ADPCM的压缩与解压图: 解压后我们得到的是PCM audio data, 格式为PCM

Continue reading »

imx6ul蓝牙语音识别项目之5:BLE基础与imx6ul上的BLE外设的使用

前面我们准备好了下面这些软件: BlueZ 5.49及其运行需要的组建 百度语音识别及其运行需要的依赖库 Controller的驱动 并编译好了测试代码。 那么接下来,我们就需要和语音遥控器连接了,但是在此之前需要对BLE有所了解。 BLE VS Wifi VS ZigBee BLE属于Personal network, 工作距离近, 一般在10m内。 BLE协议架构 Core Specification 与

Continue reading »

imx6ul蓝牙语音识别项目之4:构建ARM Linux语音识别环境

语音识别的选择 前面我们准备好了BlueZ stack, 接下来就需要准备语音识别库了。对于语音识别,国内主要的提供商有: 科大讯飞 图灵机器人 思必驰信息科技有限公司 北京捷通华声科技股份有限公司 百度语音 北京云知声信息技术有限公司 哦啦语音 但是,我们是在ARM Cortex-A7单核上面跑,平台为ARM Linux,而且我们不准备跑python,而是使用C/C++, python脚本写代码会很快,但是效率较低,在这里可能不那么合适。 同时,考虑到我们需要从BlueZ那边获取音频,且音频数据量不小,为了有更好的体验,所以用C/C++会较好。 国内提到语音识别,那么大家会很可能马上想打的是科大讯飞,但是科大讯飞最新的Linux SDK库,里面有各prebuilt shared library,这个shared

Continue reading »

imx6ul蓝牙语音识别项目之3:用户态蓝牙配置

stack的划分 在前面的文章中,我们已经配置好了内核态对蓝牙的支持, 包括驱动以及内核态的stack。 Linux蓝牙的stack为BlueZ, 参考前面的文章的图片,可以知道,内核态和用户态使用的是MGMT接口来通讯。 底层主要负责和Controller数据的传输,而数据的传输接口一般为USB,SDIO以及串口。 具体而言,功能如下: 其中个人认为比较复杂的是SMP,内核态中对: 控制 数据 这两类信息通过socket接口传递到了用户态。MGMT作为控制接口,定义了大量的控制命令。同时将Controller的数据使用HCI方式传递给用户态的BlueZ daemon, 即下面图中说到的bluetoothd bluetoothd使用D-Bus保留控制和数据接口,用于应用程序与stack的交互。 还有一些工具可以用来完成对stack中信息的获取。 更新stack 现在stack的版本已经到了5.49, 这个版本开始支持mesh了。其中最为重要的是5.47版本,这个版本修正和正式使用D-Bus接口来完成绝大部分操作的接口的暴露。  同时Gatt的支持也变得比较完善,而Yocto中的版本一般都在5.43左右,属于比较老的版本。 因此我们需要做的事情是升级Yocto中的BlueZ版本。

Continue reading »

imx6ul蓝牙语音识别项目之2: 添加蓝牙Controller支持

蓝牙架构 在Linux中蓝牙的stack分层如下: 从总体上看分为两层, 一个在内核态,一个在用户态,内核态。 在内核态中的部分暴露了一个特殊的Socket给用户态,然后用户态使用命令+参数的格式传递给内核态。而如果硬件有反馈信息,一般是事件,那么会有callback消息上来。 硬件说明 对于蓝牙,一般都是模组,例如有些是BT Wifi模组,即BT-Wifi为一体的模组。 这种模组一般是通过UART,SDIO,或者USB接口与SoC的某类总线连接。 而模组本身其实也带有固件,甚至里面自己跑着操作系统,这个时候可能就需要下载固件。这个固件是由内核发现设备的时候从用户态获取,然后通过总线现在到模组中。 内核态的配置 对于现在的比较新的内核一般都有蓝牙的stack支持,以及驱动。 如同前面所说,蓝牙自己在内核态创建了一种新的socket来和上面的用户态通信。我们可以看到内核态中的muenuconfig中,蓝牙位于Networking support中: 选中了Bluetooth subsystem support后就有驱动等支持。 对于通用,常用的蓝牙dongle都有对应的驱动: 可以看到支持的范围很广: USB

Continue reading »

imx6ul语音识别项目之硬件准备

硬件 在一些时间的延误后,终于收到了顺丰过来的板子,本以为需要到年后了。听说板子的延误是因为发现了一个小问题。 收到板子后打开看到的是盒子包装,看起来“高大上”的感觉: 打开,里面有一张V3 软件的BSP, 网线, OTG USB 线,以及电源线: 核心的板子看起来不错,至少做工和基本可见的布线很漂亮: 但是板子的尺寸比我想象的小。 软件 在将关盘拷贝到电脑后,发现结构和以前IoT和Industry里面是类似的: . ├── 01-Document ├── 02-Images ├── 03-Tools

Continue reading »

USB与BT HID reports描述符实践与抓包分析

文章内容提示 这篇文章主要说明如何获取与查看USB和BLE HoGP HID设备报告描述符,如何根据获取的描述符读懂report。然后说明了可以使用hidrd-convert工具,来如何根据hex报告描述符转化得到C语言格式的描述符,这对于我们编码是有意义的。 其中,还截取了USB 逻辑分析仪,Wireshark等工具来查看input report。 如何看懂HID report descriptor 对于如何看懂HID报告描述符,几乎离不开下面的这两个pdf: USB HID Usage Table USB HID Spec 先看文档(USB HID设备)弄明白一些基本概念:

Continue reading »

跨系统的录音格式兼容性问题: iOS Android

iOS/ OS X支持的可播放的Audio Format与Android支持的有些不一样。因此可能出现在Android设备上面使用MediaRecorder录制出来的音频文件在iOS上面不可用。当然也可能iOS上面录制的audio file在Android上面无法playback。 如果在iOS和Android上面开发类似微信这样的待遇语音交流的软件,那么就需要考虑iOS和Android上面录制出来的音频的跨系统的兼容性。 音频文件的基础知识 这方面涉及到下面几个方面: 采样率 比特率 声音通道 编码格式:指压缩方法 存储容器:即压缩后使用什么方式存储 对于这些可以看文章:How to convert between (most) audio formats

Continue reading »