基于香橙派和SU-03T 使用Linux实现语音控制刷抖音

硬件介绍

SU-03T之前在小车的时候使用过,详见:语音小车---6 + 最终整合_mjmmm的博客-CSDN博客

按照下图进行接线:

项目需求 

通过语音指令来控制安卓手机刷抖音,可以实现视频切换和点赞等功能:

1. 开机播报“你好,我是你的刷抖音助手

1. 当说出“你好抖音助手"可以唤醒模块,模块回复“抖音助手在

2. 当超过10s没有指令或说出“退下”时,模块会进入休眠模式,并回复“有需要再叫我

3. 当说出“下一个视频”或“这个不好看”时,模块回复“切换至下一个视频”,并划到下一个视频

4. 当说出“上一个视频”或“刚刚那个挺好看”时,模块回复“切换至上一个视频”,并划回上一个视频

5. 当说出“点个赞”或“这个视频不错”时,模块回复“以为您点赞”,并点赞当前视频

6. 当说出“不想看了”时,模块回复“以为您关闭屏幕”,并关闭手机屏幕

SU-03T的设置和烧写

设置和烧写的详细步骤也参考之前写的博文,此处只展示关键信息:

1. 创建产品:

2. 设置PIN脚为串口模式:

对于SU-03T,串口的RX和TX分别对应B6和B7

并设置相应的波特率:

3.  设置唤醒词:

4.  设置指令语句:

5. 设置控制详情:

参数的设置就是行为的名字 -> 大写字母 -> 16进制ASCII码,已空格分开

 

next -> 4E 45 58 54

pre -> 50 52 45

zan -> 5A 41 4E

guan -> 47 55 41 4E

 6. 其他配置,如声音,开机播报,主动退出等,都是按喜好设置,这里不再详细展示:

 7. 下载SDK并烧写进入SU-03T

详细步骤仍参考之前的博文:

8. 测试:

此时,可以打开串口助手来测试一下,分别说出对应的指令,看看SU-03T是否会向串口发送对应的字符:

我分别说出了四条指令,可见串口输出正确!

编写香橙派代码的框架

SU-03T设置完成后,就可以将SU-03T接到香橙派并进行Linux部分的代码编写:

由于在这个项目中,SU-03T只负责发送,香橙派只负责接收,所以除了电源外,只需要将SU-03T的TX(B7)接到香橙派的RX就可以,算上电源共三根线:

新创建一个“douyin”文件夹,将语音刷抖音项目的代码放在这里面:

然后将一些代码拷贝进来方便修改:

 重新编译一下,并说出4条控制语句:

可见,SU-03T成功识别了指令,香橙派成功的接收了SU-03T通过串口打印的字符!

现在,就需要修改serial_douyin.c中接收的代码,添加数据处理的部分

先简单写一个数据处理的框架:

serial_douyin.c -> void *write_serial(void *arg):

void *write_serial(void *arg)
{char readbuf[32] = {'\0'};while(1){while(serialDataAvail (*((int *)arg))){serialGetstring (*((int *)arg),readbuf) ;if(strcmp(readbuf,"NEXT") == 0 ){printf("收到下一条视频指令\n");}else if(strcmp(readbuf,"PRE") == 0){printf("收到上一条视频指令\n");}else if(strcmp(readbuf,"ZAN") == 0){printf("收到点赞指令\n");}else if(strcmp(readbuf,"GUAN") == 0){printf("收到关闭指令\n");}else{printf("未知指令\n");}memset(readbuf,'\0',32);}}pthread_exit(NULL);
}

然后再次编译运行,说出四句指令:

可见,函数框架正确,接下来只需要将printf替换成真正的操作手机的代码就可以了 

将手机接入香橙派

将我破旧的小米5C再次拿出哈哈哈,然后通过 TYPE-C -- USB 连接到香橙派:

然后进行如下操作:

1.  香橙派输入dmesg指令查看手机接入情况:

可见已经成功识别

2.  安装adb:

由于安卓手机的底层也是用Linux系统来操作的,所以可以通过香橙派来直接进入控制手机shell的界面,但需要先安装adb工具,adb是做安卓开发中常用的工具:

sudo apt-get install adb

安装完之后,执行”adb devices“指令:

发现好像权限不太对,因此需要在安卓手机上设置权限

3. 设置手机权限

报错的本质原因是香橙派系统还不支持USB设备的热拔插UDEV的机制

解决办法:在 /etc/udev/rules.d 文件夹下创建规则文件:

cd /etc/udev/rules.d/
sudo vim 51-android.rules

然后在文件中添加内容:

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666" 

 

然后重新拔插手机!!

现在再次执行”adb devices“指令:

没有像刚刚那样报错了,但是仍然显示执行”adb devices“指令:限

解决办法:打开手机,允许调试:

此时,再再次执行”adb devices“指令:

没有任何报错了,此时”adb shell“指令:

连接成功!! 

此时如果“ls”一下:

可以看到很多文件没有权限,因为没有root 

小插曲:什么是udev?

  • udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件。udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。

4. 使用shell指令来模拟手滑屏幕

现在可以成功的连入手机内部的系统,关键就在于对于滑动或点击屏幕的指令模拟了:

  • adb shell input swipe <起始x坐标> <起始y坐标> <结束x坐标> <结束y坐标> <滑动持续时间ms>
  • adb shell input keyevent <按键事件的常量>
adb shell input swipe 540 1300 540 500 500 //下滑
adb shell input swipe 540 500 540 1300 500 //上滑
adb shell "seq 3 | while read i;do input tap 350 1050 & input tap 350 1050 &sleep 0.01;done;" //点赞
adb shell input keyevent 26 //锁屏

最终代码的编写

现在有了基本的代码模型,和控制手机的具体指令,接下来的工作就是在数据处理的部分,执行adb指令了,显然,使用system函数就可以:

serial_douyin.c:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include "mjm_uart_tool.h"void *read_serial(void *arg)
{char *sendbuf;sendbuf = (char *)malloc(32*sizeof(char));while(1){memset(sendbuf,'\0',32*sizeof(char));fgets(sendbuf,sizeof(sendbuf),stdin);serialSendstring (*((int *)arg), sendbuf) ;}pthread_exit(NULL);}void *write_serial(void *arg)
{char readbuf[32] = {'\0'};while(1){while(serialDataAvail (*((int *)arg))){serialGetstring (*((int *)arg),readbuf) ;//printf("-> %s\n",readbuf);if(strcmp(readbuf,"NEXT") == 0 ){printf("收到下一条视频指令\n");system("adb shell input swipe 540 1300 540 500 500");}else if(strcmp(readbuf,"PRE") == 0){printf("收到上一条视频指令\n");system("adb shell input swipe 540 500 540 1300 500");}else if(strcmp(readbuf,"ZAN") == 0){printf("收到点赞指令\n");system("adb shell \"seq 3 | while read i;do input tap 350 1050 & input tap 350 1050 &sleep 0.01;done;\"");}else if(strcmp(readbuf,"GUAN") == 0){printf("收到关闭指令\n");system("adb shell input keyevent 26");}else{printf("未知指令\n");}memset(readbuf,'\0',32);}}pthread_exit(NULL);
}int main ()
{int fd ;int ret;pthread_t read_thread;pthread_t write_thread;if ((fd = myserialOpen ("/dev/ttyS5", 115200)) < 0) //打开驱动文件,配置波特率{fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;return 1 ;}/*	if (wiringPiSetup () == -1){fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;return 1 ;}*/ret = pthread_create(&read_thread,NULL,read_serial,(void *)&fd);if(ret != 0){printf("read_serial create error\n");return 1;}ret = pthread_create(&write_thread,NULL,write_serial,(void *)&fd);if(ret != 0){printf("write_serial create error\n");return 1;}pthread_join(read_thread,NULL);pthread_join(write_thread,NULL);return 0 ;
}

实现效果: 

和项目需求一致,可见,我的手并没有碰到手机屏幕,只是说出了对应的指令,手机就会有所反应:

并且在香橙派终端也可以看到指令历史:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 并发可视化解释 - sync.Mute

在学习 Go 编程语言时&#xff0c;您可能会遇到这句著名的格言&#xff1a;“不要通过共享内存来进行通信&#xff1b;相反&#xff0c;通过通信来共享内存。” 这句话构成了 Go 强大并发模型的基础&#xff0c;其中通道&#xff08;channels&#xff09;作为协程之间的主要通信…

6条优势,anzo capital昂首资本相信MT5替代MT4的原因

投资者都知道MT5是在MT4基础上升级换代的多资产平台&#xff0c;MT5于2010年6月首次发布。anzo capital昂首资本认为MT5将完全取代MT4&#xff0c;就像MT4取代之前版本一样&#xff0c;因为有以下6条优势&#xff1a; 一.市场深度(DOM)数据。在MT4中&#xff0c;DOM几乎没有用…

什么是生成对抗网络 (GAN)?

什么是生成对抗网络 &#xff08;GAN&#xff09;&#xff1f; 钦吉兹赛义德贝利 一、说明 GAN&#xff08;Generative Adversarial Network&#xff09;网络是一种深度学习模型&#xff0c;由两个神经网络——生成器和判别器组成。生成器负责生成虚假的数据&#xff0c;而判别…

yarn安装依赖时报错 error An unexpected error occurred:

一切起因是因为前一天安装了volta管理node&#xff0c;第二天启动项目&#xff0c; 显示error An unexpected error occurred: “https://registry.npmmirror.com/webpack-aliyun-oss/-/webpack-aliyun-oss-0.2.6.tgz: Request failed “404 Not Found””. 项目启动时发现报错…

【WSN】基于蚁群算法的WSN路由协议(最短路径)消耗节点能量研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【虚拟化】虚拟机vcpu绑核物理机

文章目录 一、NUMA二、虚拟机xml配置解析 参考文章 第一篇&#xff1a;KVM虚拟化CPU技术总结 第二篇&#xff1a;虚机cpu和mem的配置&#xff08;cputune和numatune&#xff09; 第三篇&#xff1a;libvirt 中cpu, numa 的配置 第四篇&#xff1a;如何提高虚拟机性能&#xff1…

安全学习_开发相关_JavaEE过滤器监听器简单了解

文章目录 Web应用运行流程图 JavaEE-过滤器-Filter过滤器概述&作用过滤器相关安全测试场景 JavaEE-监听器-Listener监听器作用&#xff1a;监听器相关安全测试场景 过滤器和监听器&#xff0c;主要对安全测试有影响的是过滤器&#xff0c;监听器只是在对代码进行逻辑分析时…

2020-2023中国高等级自动驾驶产业发展趋势研究-中国高等级自动驾驶发展近况

1.2 中国高等级自动驾驶发展近况 通过对中国高等级自动驾驶行业的观察和分析&#xff0c;亿欧汽车认为&#xff0c;除技术解决方案提供商外&#xff0c;如今的车企、政府、资本同样在产业链中扮演重要角色。此外&#xff0c;车路协同技术的发展也为高等级自动驾驶的发展提供了更…

Web自动化框架中验证码识别处理全攻略,让测试更得心应手!

前言&#xff1a; 随着Web应用程序的不断发展&#xff0c;自动化测试已成为项目开发中必不可少的一环。然而&#xff0c;验证码的出现却经常会使自动化测试变得更具挑战性。为了解决这个问题&#xff0c;我们需要一种方法来自动识别和处理验证码&#xff0c;从而提高自动化测试…

leetcode面试题0808有重复字符串的排列组合

描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n<10 要求&#xff1a;空间复…

引领初创企业的数字化转型:选择适合的低代码平台

初创企业在初期各项架构都还不完善&#xff0c;对于应用程序的需求多样&#xff0c;但是又要考量成本。所以&#xff0c;低代码平台就是在综合考量成本和需求的情况下的一个突出的选择。下面我们就六个方面为您介绍&#xff1a;初创企业选择的Zoho Creator低代码平台。 1、功能…

机器学习笔记 - k-NN算法的数学表达

一、概述 所有的机器学习算法都是有假设前提的。k-NN算法的假设前提是相似的输入有相似的输出。其分类规则是对于测试输入x,在其k个最相似的训练输入中分配最常见的标签。 k-NN 的正式定义: 对于一个待测试数据。 将的个最近邻的集合表示为 。的正式定义为 ,并且。(意思就是…

Linux第一次作业

一&#xff0c;作业问题&#xff1a; 二&#xff0c;问题解答&#xff1a; 1. 2.文件管理命令练习 3.vi/vim练习 3.1 3.2 3.3 3.4

消除达人游戏小程序开发流程:专业性与创新的结合

在移动互联网时代&#xff0c;达人游戏小程序逐渐成为了用户追逐娱乐的一种方式。为了满足用户对于达人游戏的需求&#xff0c;开发一款专业且具有创新性的达人游戏小程序显得尤为重要。本文将从需求分析、技术选型、系统设计和用户体验等多个方面&#xff0c;深入探讨达人游戏…

2023.9.23-最强实战:Typora+mkdocs构建自己的知识库博客

最强实战&#xff1a;Typoramkdocs构建自己的知识库&博客-2023.9.23 winodws-ecs-rsync-mkdocs-typora-百度网盘同步空间数据维护方案 目录 实验环境 win10 typora v1.7.4 mkdocs, version 1.5.2 vscode v1.82.2 阿里云轻量服务器实验软件 链接&#xff1a;https://pan.…

005:vue2使用vue-type-writer实现打字机效果

Vue Type Writer是一个Vue.js 2打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。 文章目录 1. 效果2. 安装使用 1. 效果 2. 安装使用 npm 安装 npm install vue-type-writer --save完整代码 <template><div class"app-container home"><…

2023.9.11 关于传输层协议 UDP和TCP 详解

目录 UDP协议 TCP协议 TCP十大核心机制 确认应答 超时重传 连接管理&#xff08;三次握手 四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP 中的异常处理 经典面试题 对比 TCP 和 UDP 如何使用 UDP 实现可靠传…

Spring面试题15:Spring支持几种bean的作用域?singleton、prototype、request的区别是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持几种bean的作用域? Spring支持以下几种Bean的作用域: Singleton(单例):这是Spring默认的作用域。使用@Scope(“singleton”)注解或…

【观察】数字化转型的“下半场”,华为加速行业智能化升级

过去几年数字化转型席卷全球&#xff0c;随着新技术的广泛应用&#xff0c;新的机会和价值正在不断被发现和创造。从某种程度上说&#xff0c;数字化转型不再是“可选项”&#xff0c;而变成了“必选项”。 目前&#xff0c;已经有超过170多个国家和地区制定了各自的数字化相关…