全志H616语言控制刷抖音小项目(守护进程、udev机制)

目录

前期准备:

语音模块配置  

手机接入Linux热拔插相关

用shell指令来操作手机屏幕,模拟手动滑屏幕

项目代码:

Linux的热拔插UDEV机制

守护进程 

基本特点

守护进程开发方式

守护进程应用

守护进程不让控制程序退出

守护进程和后台进程的区别

UDEV的配置文件

udev 规则的匹配键  ​​​​​​​

一、手动挂载U盘

 自动挂载U盘


前期准备:

语音模块配置  

进入语音模块官网 http://www.smartpi.cn/#/ ,配置词条和识别后的串口输出指令,具体
根据视频教程

记录下相关指令以及上图的识别词条,方便固件烧写后的调试

 固件烧写

固件先和电脑调试助手配合,验证数据
将语音模块插入开发板并编程实现基础逻辑代码 , 添加串口读取一个字符的接口
myserialGetchar();

手机接入Linux热拔插相关

a. 把手机接入开发板
b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb
c. dmesg能查看到手机接入的信息,但是输入adb devices会出现提醒
dinsufficient permissions for device: user in plugdev group; are your udev
rules wrong?
d. 配置文件,以支持USB设备的热拔插,支持UDEV的机制
在/etc/udev/rules.d 文件夹下创建规则文件
cd /etc/udev/rules.d/
sudo vim 51-android.rules
在文件中添加内容 SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
e. 在手机开发者选项中,打开USB调试,重新拔插手机
f. 手机弹出调试提醒,点确认手机调试模式

shell指令来操作手机屏幕,模拟手动滑屏幕

adb shell input swipe 540 1300 540 500 100 向下滑动540是水平的,1300是竖直方向,下 是
500
adb shell input swipe 540 500 540 1300 100 向上滑动
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 锁屏

项目代码:

uartTool.h

int myserialGetchar (const int fd);


int myserialOpen (const char *device, const int baud);



void serialSendstring (const int fd, const char *s);


int serialGetstring (const int fd,char *buffer);
uartTool.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 "wiringSerial.h"

int myserialGetchar (const int fd)//新增加的 获取字符
{
	char x ;

	if (read (fd, &x, 1) != 1)
		return -1 ;

	return x ;
}


int myserialOpen (const char *device, const int baud)
{
	struct termios options ;
	speed_t myBaud ;
	int     status, fd ;

	switch (baud){
		case    9600:	myBaud =    B9600 ; break ;
		case  115200:	myBaud =  B115200 ; break ;
		default:
						return -2 ;

	}
	if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
		return -1 ;

	fcntl (fd, F_SETFL, O_RDWR) ;

	// Get and modify current options:

	tcgetattr (fd, &options) ;

	cfmakeraw   (&options) ;
	cfsetispeed (&options, myBaud) ;
	cfsetospeed (&options, myBaud) ;

	options.c_cflag |= (CLOCAL | CREAD) ;
	options.c_cflag &= ~PARENB ;
	options.c_cflag &= ~CSTOPB ;
	options.c_cflag &= ~CSIZE ;
	options.c_cflag |= CS8 ;
	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
	options.c_oflag &= ~OPOST ;

	options.c_cc [VMIN]  =   0 ;
	options.c_cc [VTIME] = 100 ;	// Ten seconds (100 deciseconds)

	tcsetattr (fd, TCSANOW, &options) ;

	ioctl (fd, TIOCMGET, &status);

	status |= TIOCM_DTR ;
	status |= TIOCM_RTS ;

	ioctl (fd, TIOCMSET, &status);

	usleep (10000) ;	// 10mS

	return fd ;
}



void serialSendstring (const int fd, const char *s)
{
	int ret;
	ret = write (fd, s, strlen (s));
	if (ret < 0)
		printf("Serial Puts Error\n");
}

int serialGetstring (const int fd,char *buffer)
{
	int n_read;
	n_read=read(fd,buffer,32);
	return n_read;
}

uartTest.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 <pthread.h>

#include "uartTool.h"

int fd;


void *readSerial()
{
	char cmd;
	while(1){

		cmd=myserialGetchar(fd);
		switch(cmd){
			case 'N':
				printf("next\n");
				system("adb shell input swipe 540 1300 540 500 100");
				break;
			case 'P':
				printf("pre\n");
				system("adb shell input swipe 540 500 540 1300 100");
				break;
			case 'Z':
				printf("zan\n");
				system("adb shell \"seq 3 | while read i;do input tap 350 1050 &input tap 350 1050 & sleep 0.01;done;\"");
				break;
			case 'Q':
				printf("quit\n");
				system("adb shell input keyevent 26");
				break;
		}

	}
}


int main(int agrc,char **argv)
{
	pthread_t readt;
	char deviceName[32]={'\0'};
	if(agrc < 2){
		printf("uage:%s /dev/ttyS?\n",argv[0]);
		return -1;
	}
	strcpy(deviceName,argv[1]);
	if((fd=myserialOpen(deviceName,115200))== 1){
		printf("open %s error!",deviceName);
		return -1;
	}
	pthread_create(&readt,NULL,readSerial,NULL);

	while(1){sleep(10);}

}

Linux的热拔插UDEV机制

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

守护进程 

Linux Daemon (守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux 系统的大多数服务器就是通过守护进程实现的。
常见的守护进程包括系统日志进程syslogd web 服务器 httpd 、邮件服务器 sendmail 和数据库服务器mysqld等。守护进程的名称通常以 d 结尾
UDEV 守护进程,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。

基本特点

  • 生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。
  • 守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退
  • 守护进程是在后台运行,不会占着终端,终端可以执行其他命令
  • 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程
### Linux UDEV机制与USB设备自动挂载 在Linux操作系统中,`udev` 是用户空间中的设备管理器,负责管理和命名系统上的硬件设备节点。当检测到新设备连接时(如U盘),会触发相应的事件处理程序来加载驱动并创建对应的设备文件。 #### udev的工作原理 `systemd-udevd`服务作为守护进程运行,在内核通过netlink socket通知有新的硬件变动时立即响应。对于每一个被识别出来的设备,该服务都会读取位于 `/usr/lib/udev/rules.d/`, `/run/udev/rules.d/` 和 `/etc/udev/rules.d/` 目录下的规则文件[^1]。这些规则定义了如何针对特定类型的设备执行操作,比如设置权限、重命名设备节点或是调用外部脚本等。 为了支持热插拔功能,每当有一个USB存储设备插入计算机时: - 内核探测到新设备并向 `systemd-udevd` 发送消息; - `systemd-udevd` 查找匹配的规则并将属性应用给这个新发现的设备; - 如果存在配置好的自动化行为,则按照设定启动相应流程;例如可以是挂载分区或将媒体图标显示于桌面环境上。 #### 自动挂载U盘的方法 要实现U盘插入后的自动挂载,通常有两种方式:一是利用图形界面自带的功能,二是编写自定义的 `udev` 规则配合其他工具完成此目的。下面介绍基于命令行环境下的一种方法——借助 `udisks2` 工具包及其配套的服务来进行自动化的磁盘管理。 首先安装必要的软件包: ```bash sudo apt-get install udisks2 gvfs-backends ``` 接着编辑或新建一条适用于所有可移动介质的通用规则,保存至 `/etc/udev/rules.d/99-usb-auto-mount.rules` 文件中: ```plaintext ACTION=="add", SUBSYSTEMS=="usb", ENV{ID_TYPE}=="disk", RUN+="/bin/systemctl start udiskie@%k.service" ``` 上述规则表示只要检测到了新增加的USB磁盘就激活名为 `udiskie@[device_name].service` 的实例化单元。这里假设已经预先准备好了模板形式的服务定义文件用于实际挂载动作。 最后重启 `systemd-udevd` 来使更改生效: ```bash sudo systemctl restart systemd-udevd ``` 现在每次插入兼容的USB闪存盘或其他外置硬盘之后都应该能够看到它们被正确识别并且自动挂在指定位置上了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈学弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值