Bluetooth 蓝牙文件交换完成时进行Applescript检查

Bluetooth 蓝牙文件交换完成时进行Applescript检查,bluetooth,applescript,automator,Bluetooth,Applescript,Automator,在上一个问题中,我问了关于为蓝牙文件交换创建Applescript的问题。我现在想(如果可能的话)检查当前是否有正在进行的交换,如果有,请等待它完成,然后再放入另一个文件,创建某种类型的队列 在我当前的代码中,如果您试图在一个文件已经处于传输过程中的情况下输入另一个文件进行传输,就会产生错误,从而破坏整个自动化过程 我目前的自动化设置如下。我有另一个自动化系统,它可以检测何时将文件添加到我相机的sd卡,然后将其重命名为“HP.jpg”,并将其传输到ImagesPrint文件夹(如下),激活此功能

在上一个问题中,我问了关于为蓝牙文件交换创建Applescript的问题。我现在想(如果可能的话)检查当前是否有正在进行的交换,如果有,请等待它完成,然后再放入另一个文件,创建某种类型的队列

在我当前的代码中,如果您试图在一个文件已经处于传输过程中的情况下输入另一个文件进行传输,就会产生错误,从而破坏整个自动化过程

我目前的自动化设置如下。我有另一个自动化系统,它可以检测何时将文件添加到我相机的sd卡,然后将其重命名为“HP.jpg”,并将其传输到ImagesPrint文件夹(如下),激活此功能:

移动后,将使用时间对其重命名,以避免重复


我计划同时将多个图像(15-20)放入camera sd文件夹,并通过此“队列”以某种方式“减慢速度”,这样一次只能有一个图像完成整个过程,因此文件传输不会被阻塞。

我相信我有办法让您确定是否正在进行蓝牙文件传输,或在蓝牙文件传输完成或终止时更有用

侧栏:GUI脚本 我回答的第一部分离题了,主要是因为我无法在系统上使用蓝牙文件交换应用程序的
send
命令启动文件传输。我不知道为什么,我没有耐心去诊断。因此,我使用AppleScript GUI脚本直接与Bluetooth文件交换应用程序GUI交互,并实际控制文件发送过程

(当然,这意味着我必须从弹出的对话框中手动选择文件,这很适合我的需要。)

我将把我的脚本放在这里,作为其他可能感兴趣的人的参考,即使它与你的问题无关。我不能特别推荐这种方法,因为它不是很健壮,在一次运行中AppleScript偶尔会抛出错误,但在接下来的5到6次运行中,它会完全正常工作,所以有点不稳定。我在MacOS 10.13上运行这个:

    activate application "Bluetooth File Exchange"

    tell application "System Events" to tell application process "Bluetooth File Exchange"

        tell menu item "Send File…" of menu "File" of menu bar item "File" of menu bar 1 to ¬
            perform action "AXPress"

        repeat while (exists window "Select File to Send")
        end repeat

        set W to a reference to (first window whose name begins with "Send")

        tell W
            set SendButton to button "Send"
    
            set R to a reference to rows of table 1 of scroll area 1
            set T to a reference to (static texts of UI element 1 of R whose value is Device)
            set U to a reference to value of attribute "AXParent" of T
            set [D] to a reference to value of attribute "AXParent" of U
    
            select D
    
            set start_time to do shell script "date +%Y-%m-%d\\ %H:%M:%S"
    
            click SendButton
        end tell
(*
        repeat while (exists W)
        end repeat

        (*** File transfer started ***)

        set W to a reference to window "Bluetooth File Exchange"

        repeat until (exists W)
        end repeat

        repeat while (exists W)
            delay 2
        end repeat

        (*** File transfer finished ***)
*)
    end tell
当用户以这种方式与应用程序进行物理交互时,在文件传输过程中会出现一个进度窗口。纯粹作为一种练习,我对这个窗口的外观进行监控,以标记文件传输开始的时间;然后再次标记文件传输完成时它的消失。它工作得很好,但显然不是针对特定情况的解决方案,因此在上面的代码中,这些行被块注释掉了

回到主要问题 在对计算机上的各种日志文件进行了大量梳理之后,我成功地分离出了两个在蓝牙文件传输过程中写入的有用日志条目。由于系统将记录此类文件传输,因此它提供了确定蓝牙文件传输何时开始(或已开始)以及何时完成(或完成)的可靠方法

可以使用shell命令
log
访问日志数据,并使用指定参数进行过滤。请注意,我选择的参数不是唯一可用的参数,也不是唯一可用于确定蓝牙文件传输的开始/停止的参数。在日志的不同部分,我确实注意到有平行事件消息被报告,这些消息与我最终确定的消息一样可靠。我选择了我特别的
子系统
类别
,因为这些数据中包含的信息是人类可读的英语,并且对于发生的事件明确无误

我创建了相关的shell命令并将其存储在AppleScript变量中:

    set command to "log show --predicate " & ¬
        "'(subsystem == \"com.apple.bluetooth\") && (category == \"bluetoothd\")'" & ¬
        " --start \"" & start_time & "\" --style json " & ¬
        "| grep 'EVENT: Disconnection Complete'"
然后,就在文件传输被激活之前(即,就在我的脚本单击
Send
按钮之前),我获得了传输的开始日期和时间(如上面的脚本所示:
set start\u time to do shell script…
),然后持续监视日志,以查找在此时间戳之后出现的相应消息,该时间戳报告蓝牙传输已完成:

    repeat
        try
            set disconnected to do shell script command
            if disconnected contains "EVENT: Disconnection Complete" then ¬
                exit repeat
        end try
        delay 2
    end repeat
写入日志的消息是一个非常清楚的
事件:断开连接完成
,当在其日志条目的完整上下文中读取该消息时,会报告蓝牙设备断开连接,以响应文件传输的终止(通过成功或失败)。我在我的
do shell脚本中使用
grep
命令来过滤日志条目并仅隔离该部分文本

因此,在上面的
repeat
循环过程中,
do shell脚本
花费大部分时间抛出错误(非常正确),因为缺少此文本意味着
grep
无法返回值。当日志条目最终出现时,
grep
找到它并返回它,这允许
repeat
循环结束

类似地,当蓝牙文件传输开始时,会有一条事件消息写入日志,报告一个
OBEX对象推送
,另一条消息同时报告一个
OBEX文件传输
。这些都是蓝牙传输开始的明确标志,但是我没有理由专门监视这些日志条目的出现,因为脚本控制着确定文件传输何时开始

将此方法集成到您的工作流中 将AppleScript的后两个片段添加到运行AppleScript操作将允许您摆脱暂停操作,因为AppleScript将继续在其
重复
循环中运行,直到文件传输完成

首先,贴上这张照片
    set start_time to do shell script "date +%Y-%m-%d\\ %H:%M:%S"
    set MF to (POSIX path of "Macintosh HD:Users:max:Desktop:ImagesPrint:HP.jpg") as string
    set Adr_Device to "     "

    set start_time to do shell script "date +%Y-%m-%d\\ %H:%M:%S"

    tell application "Bluetooth File Exchange" to send file MF to device Adr_Device

    set command to "log show --predicate " & ¬
        "'(subsystem == \"com.apple.bluetooth\") && (category == \"bluetoothd\")'" & ¬
        " --start \"" & start_time & "\" --style json " & ¬
        "| grep 'EVENT: Disconnection Complete'"

    repeat
        try
            set disconnected to do shell script command
            if disconnected contains "EVENT: Disconnection Complete" then ¬
                exit repeat
        end try
        delay 2
    end repeat