【大鱼叔叔|开发日记】小度小度,重启!小度小度,关机!
大鱼叔叔 发布于2017-11-03 23:53 浏览:1991 回复:9
1
收藏
共9条回复 最后由大鱼叔叔回复于2017-11-04 13:42
#2大鱼叔叔回复于2017-11-04

昨天,我叫小度关机!她说:好的,为您关机!然而并没有......

今天,我叫小度关机!她二话不说就关了,不带走一片云彩......

1
#3大鱼叔叔回复于2017-11-04

步入正题:

首先,我们先获取到我们语音识别出来的内容,才确定我们是关机还是重启!

所以需要用到@小李飞刀刀 大神的抓取/duer/duer_linux.log的程序。

#include <stdio.h>    
#include <stdlib.h> 
#include <string.h> 
#include <errno.h>    
#include <sys/wait.h>   
 
 /*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/
 int lastIndexOf(char *str1,char *str2) { 
	char *p=str1; 
	int i=0,len=strlen(str2); 
	p=strstr(str1,str2); 
	if(p==NULL) return -1; 
	while(p!=NULL) { 
		for(;str1!=p;str1++)i++; 
		p=p+len; 
		p=strstr(p,str2); 
	} 
	return i; 
 }

 
int main()    
{    
 FILE *fstream=NULL;
 char buff[1024];//定义1K数组来保存获得的日志内容
 char result[1000];//定义1000字节组数来保存语音识别结果
 int strpoint;
 int j=0;
 memset(buff,0,sizeof(buff)); //清空数组
 memset(result,0,sizeof(result));
 //打开一个通向tail的管道
 if(NULL==(fstream=popen("tail -f /duer/duer_linux.log","r"))) 
 { 
     fprintf(stderr,"execute command failed: %s",strerror(errno)); 
     return 1; 
 }
 while (NULL!=fgets(buff, sizeof(buff), fstream))//这里fgets()是阻塞的
 {
    strpoint=lastIndexOf(&buff[0],"-命中唤醒词");
	if(strpoint!=-1)		
	{
		printf("DuerOS唤醒!
");
	}
	else
	{
		strpoint=lastIndexOf(&buff[0],"-识别结果:");
		if(strpoint!=-1)		
		{
			j=0;
			//下面这段代码用于实现字符串截取功能,提取语音识别结果
			for(j=strpoint+14;buff[j]!=;j++)result[j-strpoint-14]=buff[j];
			result[j-strpoint-15]=;
			printf("%s
",result);
			if(NULL != strstr(result,"重启")){ //判断是否存在该字符串
				system("bash /home/pi/myAutoStartTest/test_reboot.sh");//使用系统流执行命令 重启
			}else if(NULL != strstr(result,"关机")){
				system("bash /home/pi/myAutoStartTest/test_shutdown.sh");//使用系统流执行命令 关机
			}
		}
	}
 }
 pclose(fstream);
 return 0;
}

虽说C语言是第一门程序语言,但是我却很陌生,也不知道我的大一是怎么度过的.......

0
#4大鱼叔叔回复于2017-11-04

然后,就是怎么执行这个程序?应该什么时候执行最合适?

我的办法是一开机就执行,通过shell脚本来编译,执行C语言程序。

那么,我们先解决开机启动的问题:

原理:startx启系统窗口后,LXDE窗口管理器会找到/home/pi/.config/autostart/*.desktop 并全部执行

mkdir /home/pi/.config/autostart 创建自启动文件文件夹
cd /home/pi/.config/autostart
touch auto.desktop
sudo gedit auto.desktop

auto.desktop内容:

[Desktop Entry]
Name=auto
Comment=Auto Python #程序的类型
Exec=python /home/pi/myAutoStartTest/auto.py #需要执行的程序
Icon=/home/pi/myAutoStartTest/auto.png #程序的icon
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true

至此,自动执行的程序就写完了,剩下的就是auto.py和关机重启需要调用的shell脚本了!

0
#5奉天逍遥回复于2017-11-04

0
#6大鱼叔叔回复于2017-11-04

再是,auto.py中执行Linux命令,编译和执行抓取log的C语言程序。

mkdir /home/pi/myAutoStartTest
cd /home/pi/myAutoStartTest
touch auto.py
sudo gedit auto.py

auto.py的内容:

import os
os.system(sudo gcc /home/pi/myAutoStartTest/test_3.c -o /home/pi/myAutoStartTest/test_3); #编译C语言
os.system(sudo /home/pi/myAutoStartTest/./test_3);#运行编译后的文件


0
#7大鱼叔叔回复于2017-11-04
#5 奉天逍遥回复
[图片]

老铁,还没睡啊?一起战斗吧!

0
#8大鱼叔叔回复于2017-11-04

最后就是执行关机和重启命令的shell脚本了!

test_reboot.sh :

#!bin/bash
sudo reboot;

test_shutdown.sh :

#!bin/bash
sudo init 0;

大功告成!程序还能优化的,但是太晚了。晚安了,各位老铁。小度小度,关机。

0
#9Athos回复于2017-11-04

如果是唤醒加语音识别的话,用snowboy+百度语音sdk(http://yuyin.baidu.com/sdk)不是更好吗?duerOS存在的意义是什么?

0
#10大鱼叔叔回复于2017-11-04
#9 Athos回复
如果是唤醒加语音识别的话,用snowboy+百度语音sdk(http://yuyin.baidu.com/sdk)不是更好吗?duerOS存在的意义是什么?
展开

http://dueros.baidu.com/html/dueros/index.html

0
TOP