• 树莓派USB存储设备自动挂载并通过脚本实现自动拷贝,自动播放视频,脚本自动升级等功能


    需求:
    首先需要树莓派自动挂载USB设备,然后扫描USB指定目录下文件,将相关文件拷贝至树莓派指定目录,然后通过omxplayer循环播放新拷贝文件视频

    1. 树莓派实现USB存储设备自动挂载

    树莓派USB存储设备自动挂载
    udev 实现 USB 设备自动挂载

    需要注意的是:
    必须使用pi用户登陆至图形界面(图形界面默认是开启移动设备自动挂载的),否则会挂载不成功,如果使用其他用户登录,系统界面会看到挂载失败的错误信息;通过上面的方法设置也不成功,最后都必须通过pi用户登录到图形界面。
    上面的方法根本不可在命令行下实现USB设备的自动挂载。

    2. 树莓派安装omxplayer

    Raspberry pi音乐播放器omxplayer
    轻松搞定omxplayer操作界面安装

    3. Shell脚本实现文件自动拷贝并调用omxplayer循环播放拷贝的视频

      1 #! /bin/bash
      2 # -------------------------------------------------------------------
      3 # 该脚本结合树莓派pi用户自动挂载U盘功能,
      4 # 实现自动拷贝U盘指定目录下文件至树莓派指定目录下,进行文件解压缩等操作
      5 # 然后进行视频文件播放;
      6 # 增加脚本自动更新功能
      7 # 注:如果树莓派指定目录下存在待拷贝文件,则不进行cp操作
      8 # -------------------------------------------------------------------
      9 # mntpath为树莓派默认将U盘挂载路径
     10 mntpath="/media/udisk"
     11 # mnt为插入U盘存放待拷贝视频的默认文件夹名称,默认为U盘根目录
     12 mnt="/"
     13 # destination为将U盘中的视频文件需要拷贝到树莓派的哪个文件夹
     14 destination="/home/pi/media"
     15 # 文件拷贝过程中播放"视频拷贝中"视频的全路径名.
     16 audioAsync="${destination}/audiocopying.mp4"
     17 # 文件拷贝或者zip包解压缩异常,需要播放的错误提示信息视频
     18 errormedia="${destination}/error.mp4"
     19 # 线程休眠时间(秒)
     20 sleepsec=5
     21 # U盘待拷贝视频文件zip命名规则
     22 pattern=".*[lL]uck[tT]est_.*.zip$"
     23 # 校验文件是否是mp4扩展名
     24 mp4pattern=".+.mp4$"
     25 # 校验文件是否是shell脚本扩展名
     26 shpattern=".+.sh$"
     27 # 待升级脚本所在目录
     28 scriptpath="/home/pi/"
     29 # 脚本名称
     30 scriptname="test_ad_autodisplay.sh"
     31 # 升级成功标识文件
     32 updatedfile="updated"
     33 # 默认播放得视频名称
     34 defaultDisplayAudioName="default.mp4"
     35 # zip包解压缩密码
     36 # zip -P test@123 *_lucktest_*.zip 1.mp4
     37 # sudo unzip -P "$password" -o -q "${destination}/${timedate}/${medianame}" -d "${destination}/${timedate}"
     38 password="test@123
     39 # -------------------------------------------------------------------
     40 # 入参 $1:需要播放文件的全路径名称
     41 # 传入待播放文件全路径名,检测并播放该文件
     42 # -------------------------------------------------------------------
     43 function checkAndDisplay(){
     44     echo "INFO:display file name is:$1"
     45     # 播放之前,先判断omxplayer是否安装
     46     if command -v omxplayer > /dev/null;then
     47         # omxplayer已安装,检测是否有omxplayer进程,如果有,需要kill该进程,播放新拷贝的文件
     48         echo "INFO:omxplayer command found.Begin to check if have omxplayer process."
     49         # 检测是否已启动omxplayer,如果已启动,需要kill掉omxplayer相关pid
     50         count=`ps -ef|grep omxplayer|grep -v "grep"|wc -l`;
     51         if [ 0 == $count ];then
     52             echo "INFO:omxplayer not started.Begin to display ${1} by omxplayer."
     53         else
     54             echo "INFO:omxplayer have stared.Begin to get its pid."
     55             # 获取omxplayer相关pids进行kill
     56             pids=`ps -ef|grep omxplayer|grep -v "grep"|awk '{print $2}'`
     57             echo "INFO:omxplayer pids are:$pids"
     58             if [ -n "$pids" ];then
     59                 pidarr=($pids)
     60                 for pid in ${pidarr[@]}
     61                 do        
     62                     echo "INFO:kill omxplayer process id:$pid!"
     63                     sudo kill -9 $pid
     64                 done        
     65             fi
     66         fi
     67     else
     68         echo "ERROR:omxplayer command has not found!Need to install omxplayer first!!!"
     69         return 1
     70     fi
     71     echo "INFO:excute cmd:sudo nohup sudo omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 &"
     72     # nohup运行omxplayer,--no-osd config do no display status info on the screen
     73     sudo nohup omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 &
     74     if [ $? -eq 0 ];then
     75         echo "INFO:excute cmd:sudo nohup sudo omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 & success!";
     76         return 0
     77     else
     78         echo "ERROR:excute cmd:sudo nohup sudo omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 & failure!";
     79         return 1
     80     fi
     81 }
     82 
     83 # -------------------------------------------------------------------
     84 # 入参 $1:需要删除哪个目录下的所有视频目录
     85 # 入参 $2:排除$1下的该目录,不删除
     86 # 删除指定目录下的所有目录,如果有$2,则排除该目录不删除
     87 # -------------------------------------------------------------------
     88 function deleteDir(){
     89     if [ -n $1 ];then
     90         echo "INFO:Need to delete the folders under the $1"
     91         echo "INFO:Need to exclusion folder name is : $2"
     92         if [ -d "${1}" ];then
     93             for delfile in ${1}/*
     94             do
     95                 echo "INFO:check file:${delfile} if need to delete!"
     96                 if [ -f "${delfile}" ];then
     97                     echo "INFO:${delfile} is a file, not delete!"
     98                 else
     99                     echo "INFO:${delfile} is a folder,begin to check it!"
    100                     # 如果$2不为空,则进行排除删除,否则都删除
    101                     if [ -n $2 ];then
    102                         # 获取待校验文件名
    103                         delfoldername=${delfile##*/}
    104                         echo "INFO:current folder name is : ${delfoldername},exclusion folder name is : $2"
    105                         if [ $delfoldername != $2 ];then
    106                             sudo rm -fr "${delfile}"
    107                             # 删除成功,打印成功信息
    108                             if [ $? -eq 0 ];then
    109                                 echo "INFO:delete folder:${delfile} success!"
    110                             else
    111                                 echo "ERROR:delete folder:${delfile} failure!"
    112                             fi
    113                         else
    114                             echo "INFO:current folder name is equals to exclusion folder name,not delete"
    115                         fi
    116                     else
    117                         echo "INFO:begin to delete folder:${delfile}"
    118                         sudo rm -fr "${delfile}"
    119                         # 删除成功,打印成功信息
    120                         if [ $? -eq 0 ];then
    121                             echo "INFO:delete folder:${delfile} success!"
    122                         else
    123                             echo "ERROR:delete folder:${delfile} failure!"
    124                         fi
    125                     fi
    126                 fi
    127             done
    128         else
    129             echo "ERROR:${1} is not a directory!"
    130         fi
    131     else
    132         echo "ERROR:parameter 1($1) is null,do nothing!";
    133     fi
    134 }
    135 
    136 # -------------------------------------------------------------------
    137 # 入参 $1:待播放视频根目录,该目录下存放的是yyyy-mm-dd的文件夹,文件夹内为播放的视频文件
    138 # 自动播放视频功能,包括开机自动播放和拷贝异常恢复播放等,都由该方法实现
    139 # 实现逻辑:对$destination目录进行ls -t排序,取最新时间文件夹里的mp4文件进行播放
    140 # -------------------------------------------------------------------
    141 function autoDisplaying(){
    142     if [ -n $1 ];then
    143         echo "INFO:auto displaying folder:$1"
    144         if [ -d "${1}" ];then
    145             # 如果当前目录为dirctory,则进行ll -t,获取最新时间戳folder,然后获取folder里面的视频进行播放
    146             # 按时间排序list folder
    147             # sudo ls -lt $1|grep -e '^d'|awk '{print $9}'
    148             folders=`sudo ls -lt ${1}|grep -e '^d'|awk '{print $9}'`
    149             echo "INFO:auto displaying folders are : $folders"
    150             # 是否已播放成功
    151             isdisplayed=
    152             if [ -n "$folders" ];then
    153                 foldersArray=($folders)
    154                 for((i=0;i<${#foldersArray[@]};i++))
    155                 do
    156                     foldername=${foldersArray[i]}
    157                     # 判断该foldername文件夹下是否有mp4文件,有则播放,break;否则继续循环
    158                     for file4play in "${1}"/"${foldername}"/*
    159                     do
    160                         file4playname=${file4play##*/}
    161                         # file4playname
    162                         echo "$file4playname"|grep -E "$mp4pattern" > /dev/null
    163                         # 如果符合mp4扩展名,说明是需要播放的视频,进行播放
    164                         if [ $? -eq 0 ];then
    165                             echo "INFO:autoDisplaying file:${file4playname}"
    166                             checkAndDisplay "$file4play"
    167                             if [ $? -eq 0 ];then
    168                                 isdisplayed=0
    169                                 # 跳出两层循环
    170                                 break 2
    171                             fi
    172                         fi
    173                     done
    174                 done
    175             else
    176                 echo "ERROR:auto displaying folder:$1 has no child folder!"
    177             fi
    178             # 如果未播放成功,则需要播放默认视频
    179             if [ ! -n "$isdisplayed" ];then
    180                 echo "WARN:$1 have no audio to display,begin to display default audio!"
    181                 # 如果待播放目录下没有视频目录,则判断该目录($1)下是否有默认播放视频($defaultDisplayAudioName),如果有则播放
    182                 # 目前 $1 == $destination
    183                 if [ -f "${1}/${defaultDisplayAudioName}" ];then
    184                     checkAndDisplay "${1}/${defaultDisplayAudioName}"
    185                 elif [ -f "${destination}/${defaultDisplayAudioName}" ];then
    186                     # 如果$1目录下没有,则判断${destination}目录下是否有默认播放视频
    187                     checkAndDisplay "${destination}/${defaultDisplayAudioName}"
    188                 else
    189                     echo "ERROR:default display file:${1}/${defaultDisplayAudioName} not exist,auto display do nothing!"
    190                 fi
    191             fi
    192         else
    193             echo "ERROR:auto displaying file path:${1} is not a directory!"
    194         fi
    195     else
    196         echo "ERROR:parameter 1($1) is null,auto display do nothing!"
    197     fi
    198 }
    199 
    200 # -------------------------------------------------------------------
    201 # 
    202 # 入参 $1:升级的脚本文件全路径
    203 # 入参 $2:$1脚本名称
    204 #
    205 # 处理逻辑如下:
    206 # 重命名(加上当前时间戳)$scriptpath/$scriptname进行备份,
    207 # 将$1脚本拷贝到$scriptpath目录下,
    208 # 将$1文件重命名为$scriptname,reboot系统
    209 #
    210 # -------------------------------------------------------------------
    211 function updateShellScript(){
    212     # 如果脚本存在,则执行备份和拷贝操作
    213     if [ -f "$scriptpath/$scriptname" ];then
    214         timestp=`date "+%Y%m%d%H%M%S"`
    215         # 备份当前被替换的脚本
    216         sudo mv "${scriptpath}/${scriptname}" "${scriptpath}/${scriptname}.${timestp}"
    217         if [ $? -eq 0 ];then
    218             echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname} $scriptpath/${scriptname}.${timestp} success!"
    219             # 拷贝$1至$scriptpath目录下
    220             sudo cp -f "$1" "$scriptpath"
    221             if [ $? -eq 0 ];then
    222                 # 如果$2 == $scriptname,则不需要执行mv操作
    223                 if [ "$2"!="$scriptname" ];then
    224                     # 如果拷贝成功,则执行mv操作
    225                     sudo mv "${scriptpath}/$2" "${scriptpath}/${scriptname}"
    226                     # 如果mv操作成功,则执行reboot命令
    227                     if [ $? -eq 0 ];then
    228                         echo "INFO:excute cmd:sudo mv ${scriptpath}/$2 ${scriptpath}/${scriptname} success!"
    229                         # 重命名成功,给该脚本添加执行权限
    230                         sudo chmod +x "${scriptpath}/${scriptname}"
    231                         # 启动之前创建升级成功标识文件,防止循环启动!
    232                         if [ ! -f "${scriptpath}/${updatedfile}" ];then
    233                             sudo touch "${scriptpath}/${updatedfile}"
    234                         fi
    235                         echo "INFO:shell script update finished.Reboot!!!"
    236                         # 增加suid权限
    237                         sudo chmod u+s /sbin/reboot
    238                         reboot
    239                     else
    240                         echo "INFO:excute cmd:sudo mv ${scriptpath}/$2 ${scriptpath}/${scriptname} failure!Rollback!"
    241                         echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname}!"
    242                         #如果mv操作不成功,则执行回滚操作
    243                         sudo mv "${scriptpath}/${scriptname}'.'${timestp}" "${scriptpath}/${scriptname}"
    244                         if [ $? -eq 0 ];then
    245                             echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} success!"
    246                         else
    247                             echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} failure!"
    248                         fi
    249                     fi
    250                 else
    251                     # 复制成功,给该脚本添加执行权限
    252                     sudo chmod +x "${scriptpath}/${scriptname}"
    253                     # 启动之前创建标识升级标识文件,防止循环启动!
    254                     if [ ! -f "${scriptpath}/${updatedfile}" ];then
    255                         sudo touch "${scriptpath}/${updatedfile}"
    256                     fi
    257                     echo "INFO:shell script update finished.Reboot!!!"
    258                     # 增加suid权限
    259                     sudo chmod u+s /sbin/reboot
    260                     reboot
    261                 fi
    262             else
    263                 # 如果拷贝不成功,则将原备份脚本进行回滚
    264                 sudo mv "${scriptpath}/${scriptname}'.'${timestp}" "${scriptpath}/${scriptname}"
    265                 if [ $? -eq 0 ];then
    266                     echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} success!"
    267                 else
    268                     echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} failure!"
    269                 fi
    270             fi
    271         else
    272             echo "ERROR:excute cmd:sudo mv $scriptpath/$scriptname $scriptpath/${scriptname}.${timestp} failure!Stop update shell script!!!"
    273         fi
    274     else
    275         # 如果脚本不存在,则执行拷贝和重命名操作
    276         echo "ERROR:shell script file:$scriptpath/$scriptname not exist.Copy $1 to path:$scriptpath"
    277         sudo cp "$1" "$scriptpath"
    278         if [ $? -eq 0 ];then
    279             echo "INFO:Copy $1 to path:$scriptpath success!"
    280             echo "INFO:rename file:$2 to $scriptname"
    281             sudo mv "$scriptpath/$2" "$scriptpath/$scriptname"
    282             if [ $? -eq 0 ];then
    283                 echo "INFO:excute cmd:sudo mv $scriptpath/$2 $scriptpath/$scriptname success!"
    284                 # 重命名成功,给该脚本添加执行权限
    285                 sudo chmod +x "${scriptpath}/${scriptname}"
    286                 # 启动之前创建标识升级标识文件,防止循环启动!
    287                 if [ ! -f "${scriptpath}/${updatedfile}" ];then
    288                     sudo touch "${scriptpath}/${updatedfile}"
    289                 fi
    290                 # 增加suid权限
    291                 sudo chmod u+s /sbin/reboot
    292                 reboot
    293             else
    294                 echo "ERROR:excute cmd:sudo mv $scriptpath/$2 $scriptpath/$scriptname failure!"
    295             fi
    296         else
    297             echo "ERROR:Copy $1 to path:$scriptpath failure!"
    298         fi
    299     fi
    300 }
    301 
    302 # -------------------------------------------------------------------
    303 #
    304 # 入参 $1:U盘挂载目录
    305 #
    306 # 检测待拷贝U盘指定目录下是否存在指定格式zip包,
    307 # 如果存在,则拷贝至PI的指定目录下并解压,解压和拷贝过程中,播放"视频同步中"的视频
    308 # 拷贝结束后,播放新拷贝的视频,删除早前的视频目录
    309 #
    310 # 1、检测到U盘插入信息,搜索“*测试_*.zip”文件,将该文件拷贝到树莓派文件系统并解压;停止原有视频播放,改为显示“视频同步中”图片;
    311 # 2、计算每个mp4文件的Hash并和“目录名_hash”文件中的Hash值进行比较,全部相同则成功,有任一文件Hash值校验失败则显示失败;(TODO)
    312 # 3、成功则将播放目录连接到当前copy进来的目录,并删除早期的视频目录,重新开始播放
    313 # 4、失败则播放特定的图片(5s),提示错误,之后删除刚拷贝的文件和目录,重新播放之前的目录
    314 # 5、树莓派记录视频更新日志,播放日志(具体格式待定,作为二期扩展功能)。(TODO)
    315 #
    316 # -------------------------------------------------------------------
    317 function checkAndCopyZipFileToPi(){
    318     if [ -d "${1}/${mnt}" ];then
    319         echo "INFO:${1}/${mnt} is existed."
    320         # 循环该目录文件,判断是否需要进行文件拷贝
    321         for media in ${1}/$mnt/*
    322         do
    323             # 如果待拷贝文件为file,则判断文件名称是否符合zip命名规则,如果符合,则执行拷贝
    324             if [ -f "$media" ];then
    325                 echo "INFO:begin to check if file $media matchs to $pattern!"
    326                 # 获取待校验文件名
    327                 medianame=${media##*/}
    328                 echo "INFO:file name is $medianame"
    329                 # 校验medianame是否符合$pattern
    330                 echo "$medianame"|grep -E "$pattern" > /dev/null
    331                 if [ $? -eq 0 ];then
    332                     timedate=`date "+%Y-%m-%d"`
    333                     echo "INFO:$medianame matchs $pattern,copy it to ${destination}/${timedate}!"
    334                     # 如果找到符合命名规范的文件,则播放“视频同步中”的视频
    335                     checkAndDisplay "$audioAsync"
    336                     if [ ! -d "${destination}/${timedate}" ];then
    337                         sudo mkdir -p "${destination}/${timedate}"
    338                         if [ $? -eq 0 ];then
    339                             echo "INFO:excute cmd:mkdir -p ${destination}/${timedate} success!"
    340                         else
    341                             echo "INFO:excute cmd:mkdir -p ${destination}/${timedate} failure!"
    342                             #如果目录创建失败,需要播放之前最新目录下的视频
    343                             autoDisplaying "${destination}"
    344                         fi
    345                     fi
    346                     # 安全起见,拷贝之前,再校验一遍目标目录是否存在
    347                     if [ -d "${destination}/${timedate}" ];then
    348                         # -f:if an existing destination file cannot be opened, remove it and try again
    349                         sudo cp -f "$media" "${destination}/${timedate}"
    350                         # 如果zip文件拷贝到PI指定目录成功,则执行解压缩和播放等逻辑
    351                         # 3、成功则将播放目录连接到当前copy进来的目录,并删除早期的视频目录,重新开始播放
    352                         if [ $? -eq 0 ];then
    353                             echo "INFO:excute cmd:cp -n $media ${destination}/${timedate} success!"
    354                             # unzip copy进来的zip包,-o:overwrite files WITHOUT prompting,-q:quiet mode
    355                             sudo unzip -P "$password" -o -q "${destination}/${timedate}/${medianame}" -d "${destination}/${timedate}"
    356                             # 如果unzip成功,则播放拷贝的文件,删除早前的视频目录
    357                             if [ $? -eq 0 ];then
    358                                 echo "INFO:excute cmd:sudo unzip -P $password -o -q ${destination}/${timedate}/${medianame} ${destination}/${timedate} success!"
    359                                 ifhasmp4=
    360                                 for unzipfile in "${destination}"/"${timedate}"/*
    361                                 do
    362                                     filename=${unzipfile##*/}
    363                                     # 校验filename是否是shell脚本扩展名,如果是,则说明是需要升级的脚本
    364                                     echo "$filename"|grep -E "$shpattern" > /dev/null
    365                                     if [ $? -eq 0 ];then
    366                                         # 如果脚本升级成功标识文件存在,则说明已升级成功,不再进行升级;将该标识文件进行删除,以便执行下次升级
    367                                         if [ -f "${scriptpath}/${updatedfile}" ];then
    368                                             echo "INFO:${scriptpath}/${updatedfile} file existed!Stop update!"
    369                                             sudo rm -f "${scriptpath}/${updatedfile}"
    370                                             if [ $? -eq 0 ];then
    371                                                 echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} success!"
    372                                             else
    373                                                 echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} failure!"
    374                                             fi
    375                                         else
    376                                             updateShellScript "$unzipfile" "$filename"
    377                                         fi
    378                                     fi
    379                                     # 校验filename是否是mp4扩展名
    380                                     echo "$filename"|grep -E "$mp4pattern" > /dev/null
    381                                     # 如果符合mp4扩展名,说明是需要播放的视频,进行播放
    382                                     if [ $? -eq 0 ];then
    383                                         ifhasmp4=0
    384                                         #线程休眠几秒,再执行播放
    385                                         sleep $sleepsec
    386                                         checkAndDisplay "$unzipfile"
    387                                         # 如果checkAndDisplay播放成功,则删除早期的视频目录
    388                                         if [ $? -eq 0 ];then
    389                                             deleteDir "${destination}" "${timedate}"
    390                                         else
    391                                             # 先播放error视频提示播放失败信息
    392                                             checkAndDisplay "${errormedia}"
    393                                             sleep $sleepsec
    394                                             # 如果checkAndDisplay播放不成功,则播放早期的视频
    395                                             autoDisplaying "${destination}"
    396                                         fi
    397                                     fi
    398                                 done
    399                                 # 如果zip包解压后未发现mp4文件,则播放早期视频
    400                                 if [  ! -n "$ifhasmp4" ];then
    401                                     echo "ERROR:${destination}/${timedate}/${medianame} not have mp4 file,display before audio!"
    402                                     autoDisplaying "${destination}"
    403                                 fi
    404                             else
    405                                 echo "INFO:excute cmd:sudo unzip -P $password -o -q ${destination}/${timedate}/${medianame} ${destination}/${timedate} failure!"
    406                                 # 先播放error视频提示播放失败信息
    407                                 checkAndDisplay "${errormedia}"
    408                                 sleep $sleepsec
    409                                 # 解压缩失败,播放之前最新目录下的视频
    410                                 autoDisplaying "${destination}"
    411                             fi
    412                         else
    413                             # 4、拷贝失败则播放特定的图片(5s),提示错误,之后删除刚拷贝的文件和目录,重新播放之前的目录
    414                             # (不能删除刚拷贝的文件和目录)否则存在以下问题:
    415                             # 存在第一次拷贝成功,然后删除了早期的视频目录,第二次进行覆盖拷贝时异常,如果删除刚拷贝的文件和目录,则会导致无视频播放的问题
    416                             echo "ERROR:excute cmd:cp -n $media ${destination}/${timedate} failure!"
    417                             # 播放拷贝失败视频
    418                             checkAndDisplay "${errormedia}"
    419                             sleep $sleepsec
    420                             # 播放之前最新目录下的视频
    421                             autoDisplaying "${destination}"
    422                         fi
    423                     else
    424                         echo "INFO:${destination}/${timedate} file path is not exist!"
    425                         #如果目录不存在,需要播放之前最新目录下的视频
    426                         autoDisplaying "${destination}"
    427                     fi
    428                 else
    429                     echo "WARN:$medianame not matchs $pattern,not copy it!"
    430                 fi
    431             fi
    432         done
    433     fi
    434 }
    435 
    436 # -------------------------------------------------------------------
    437 # 循环检测是否有USB设备插入树莓派,手动挂载该USB设备至/media/udisk/${i}目录下
    438 # 手动挂载USB设备时,需要判断该设备是否已挂载,如果已挂载,则不再进行挂载
    439 # 当检测到无USB设备插入时,需要将挂载的信息手动umount,删除挂载的目录等
    440 # -------------------------------------------------------------------
    441 function autoScanUsbDeviceAndMount(){
    442     while true
    443     do
    444         timeb=`date "+%Y-%m-%d %H:%M:%S"`
    445         echo "${timeb}:=======================Scan USB devices start=============================="
    446         if [ ! -d $mntpath ];then
    447             echo "WARN:$mntpath file path not exist,excute mkdir cmd create it!"
    448             sudo mkdir -p $mntpath
    449         fi
    450         #获取挂载的usb devices,挂载之前需要判断该USB设备是否已挂载,如果已挂载,则不再执行挂载操作
    451         fdisks=`sudo fdisk -l|grep -E "^/dev/sd[a-z]1"|grep -v "Disk"|awk '{print $1}'`
    452         echo "INFO:usb devices are : $fdisks"
    453         if [ -n "$fdisks" ];then
    454             fdiskArray=($fdisks)
    455             for((i=0;i<${#fdiskArray[@]};i++))
    456             do
    457                 filesystem=${fdiskArray[i]}
    458                 #检测该USB设备是否已挂载
    459                 count=`df -h|grep -E "^${filesystem}"|grep -v "Filesystem"|wc -l`;
    460                 echo "INFO:excute cmd:df -h|grep -E '^${filesystem}'|grep -v 'Filesystem'|wc -l,count:${count}"
    461                 if [ $count -gt 0 ];then
    462                     echo "WARN:${filesystem} have already mounted!"
    463                 else
    464                     if [ ! -d "${mntpath}/${i}" ];then
    465                         echo "WARN:${mntpath}/${i} file path not exist,excute mkdir cmd create it!"
    466                         sudo mkdir -p "${mntpath}/${i}"
    467                     fi
    468                     echo "INFO:excute mount cmd to mount ${filesystem} on ${mntpath}/${i}"
    469                     sudo mount -o uid=${USER},gid=${USER} ${filesystem} ${mntpath}/${i}
    470                     # 挂载成功,判断路径是否存在,存在则执行拷贝
    471                     if [ $? -eq 0 ];then
    472                         echo "INFO:excute cmd:sudo mount -o uid=${USER},gid=${USER} ${filesystem} ${mntpath}/${i} success!"
    473                         checkAndCopyZipFileToPi "${mntpath}/${i}"
    474                     else
    475                         echo "ERROR:excute cmd:sudo mount -o uid=${USER},gid=${USER} ${filesystem} ${mntpath}/${i} failure!"
    476                     fi
    477                 fi    
    478             done
    479         else
    480             # 没有USB设备,如果脚本升级成功标识文件存在,将其删除,
    481             # 以便USB设备插入后,如果升级包中包含脚本升级文件做升级处理
    482             if [ -f "${scriptpath}/${updatedfile}" ];then
    483                 echo "INFO:${scriptpath}/${updatedfile} file existed!Remove it!"
    484                 sudo rm -f "${scriptpath}/${updatedfile}"
    485                 if [ $? -eq 0 ];then
    486                     echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} success!"
    487                 else
    488                     echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} failure!"
    489                 fi
    490             fi
    491             # 如果没有USB设备,则需要将mount的设备进行umount,删除该USB设备mount目录下对应的文件夹
    492             usbmounts=`df -h |grep -E "^/dev/sd[a-z]1"|grep -v "Filesystem"|awk '{print $1" "$6}'`
    493             if [ -n "$usbmounts" ];then
    494                 usbmountArray=($usbmounts)
    495                 for((j=0;j<${#usbmountArray[@]};j=j+2))
    496                 do
    497                     umdevice=${usbmountArray[j]}
    498                     umountpath=${usbmountArray[j+1]}
    499                     echo "INFO:prepare to umount device:${umdevice} from file path:${umountpath}"
    500                     sudo umount "${umountpath}"
    501                     echo "INFO:${umdevice} umount from ${umountpath} success!"
    502                     echo "INFO:prepare to remove path:${umountpath}"
    503                     # 判断挂载的目录是否存在,存在则删除
    504                     if [ -d "${umountpath}" ];then
    505                         sudo rm -fr "${umountpath}"
    506                         echo "INFO:rm -fr ${umountpath} success!"
    507                     else
    508                         echo "INFO:path ${umountpath} not exist!"
    509                     fi
    510                 done
    511             fi
    512         fi
    513         timee=`date "+%Y-%m-%d %H:%M:%S"`
    514         echo "${timee}:=======================Scan USB devices end================================"
    515         echo "INFO:Thread sleep ${sleepsec}s!"
    516         sleep $sleepsec
    517         echo "INFO:Thread wakeup!"
    518     done
    519 }
    520 
    521 # -------------------------------------------------------------------
    522 # @Deprecated
    523 # INFO:该函数暂时废弃
    524 # 循环检查是否有U盘挂载至树莓派
    525 # -------------------------------------------------------------------
    526 function autoScanUsbDeviceMounted(){
    527     while true
    528     do
    529         timeb=`date "+%Y-%m-%d %H:%M:%S"`
    530         echo "${timeb}:=======================Scan start=============================="
    531         if [ ! -d $mntpath ];then
    532             echo "WARN:$mntpath file path not exist,excute mkdir cmd create it!"
    533             sudo mkdir -p $mntpath
    534         else
    535             echo "INFO:$mntpath file path is existed."
    536         # 循环U盘挂载目录,判断是否有U盘挂载至当前树莓派
    537             for file in $mntpath/*
    538             do
    539             # 如果当前file为文件目录
    540                 if [ -d $file ];then
    541                 echo "INFO:$file is directory"
    542             # 如果当前目录下存在$mnt文件夹,说明是U盘挂载待拷贝文件目录
    543                 if [ -d "$file/$mnt" ];then
    544                     echo "INFO:$file/$mnt is existed."
    545                 # 循环该目录文件,判断是否需要进行文件拷贝
    546                 for media in $file/$mnt/*
    547                     do
    548                 # 如果待拷贝文件为file,则判断目的文件目录是否存在同名文件,存在同名文件不进行拷贝
    549                     if [ -f "$media" ];then
    550                         echo "INFO:begin to copy $media to $destination"
    551                     # 获取待拷贝文件名
    552                     medianame=${media##*/}
    553                     echo "INFO:media name is $medianame"
    554                     # 如果目的文件夹下不存在同名文件,则执行拷贝
    555                     if [ ! -f "$destination/$medianame" ];then
    556                             cp -n "$media" $destination
    557                         echo "INFO:copy file:$medianame to $destination success!Begin to display by omxplayer!"
    558                     # omxplayer需要循环播放的文件
    559                     displayfilename="$destination/$medianame"
    560                     # 播放之前,先判断omxplayer是否安装
    561                     if command -v omxplayer > /dev/null;then
    562                         # omxplayer已安装,检测是否有omxplayer进程,如果有,需要kill该进程,播放新拷贝的文件
    563                         echo "INFO:omxplayer command found.Begin to check if have omxplayer process."
    564                         checkAndDisplay "$displayfilename" 
    565                     else
    566                         echo "ERROR:omxplayer command has not found!!!"
    567                     fi
    568                     else
    569                         echo "WARN:$destination existed media file:$medianame,not excute copy cmd!"
    570                     fi
    571                     fi
    572                 done
    573                 fi
    574             else
    575                 echo "WARN:$file is file"
    576             fi
    577            done
    578         fi
    579         timee=`date "+%Y-%m-%d %H:%M:%S"`
    580         echo "${timee}:=======================Scan end================================"
    581         echo "INFO:Thread sleep ${sleepsec}s!"
    582         sleep $sleepsec
    583         echo "INFO:Thread wakeup!"
    584     done
    585 }
    586 
    587 # -------------------------------------------------------------------
    588 # 树莓派启动后,执行该方法初始化开机自动播放视频扫描USB是否插入然后自动挂载复制相关视频文件等操作
    589 # -------------------------------------------------------------------
    590 function bootStrapInit(){
    591     # 初始化默认播放最新目录下文件夹中的最新视频
    592     echo "INFO:bootstrap init excute method:autoDisplaying(${destination})!"
    593     autoDisplaying "${destination}"
    594     echo "INFO: bootstrap init excute method:autoScanUsbDeviceAndMount()"
    595     autoScanUsbDeviceAndMount
    596     
    597 }
    598 
    599 bootStrapInit
    View Code

    4.后台启动脚本

     nohup ./test_ad_autodisplay.sh >>scan.log 2>&1 & 

    5.开机自动启动脚本

    linux添加开机自启动脚本示例详解

    /etc/rc.local添加如下脚本:

    sudo /home/pi/test_ad_autodisplay.sh >> /home/pi/`date "+%Y-%m-%d"`.log 

  • 相关阅读:
    获取股票行情API 接口
    使用百度地图来展示自定义的GPS点,用pyechart 框架实例
    C 语言基础笔记
    GPS 测试汇总和python GPS 导航地图实现
    用python 来炒股二 BeautifulSoup爬虫信息新闻文章
    Python tkinter 笔记 [pack,place,grid 布局管理]
    RSS 订阅精选 2020
    用python来炒股<三> 炒股交易系统(法则)
    使用python 来实现炒股
    鼠须管输入法的配置介绍
  • 原文地址:https://www.cnblogs.com/Java-Script/p/11095686.html
Copyright © 2020-2023  润新知