前言

小米pro的Hackintosh方案挺香的,用了也有8个月了,还是挺稳定的。

但是其中有两个很操蛋的问题:

  • 内置蓝牙无法使用
  • 无法驱动内置Wi-Fi

由于不想硬改,作出一些不可逆操作,所以以上问题均采用USB方案解决。

  • Wi-Fi解决方案也比较完美了,使用Comfast的CF-811AC可支持5G网络,搭配GitHub上的驱动使用,效果极佳。
  • 蓝牙,当时随便在淘宝买了个比较mini的USB蓝牙(加搜黑苹果关键字),倒是能用,但睡眠唤醒(设备断电)之后(手动关闭亦是如此),会导致无法使用,但如果重新插拔就又能正常使用了。(可能是驱动问题)

所以为了让蓝牙正常的工作,而又不希望每次都进行物理插拔(一点都不geek),就诞生了现在的想法:

  • 使用虚拟机模拟插拔!

正文

首先是会导致蓝牙翻车的情况有:

  • 长时间的睡眠唤醒
  • 手动关闭蓝牙(无法再打开)

睡眠唤醒的话,直接模拟插拔就OK。

而手动关闭蓝牙,会在重新插上的时候,系统会根据之前关闭的状态再一次把蓝牙设备关闭(关闭就翻车了),形成了死循环。

所以这时需要在系统里,将蓝牙开关打开;

可以使用blueutil(终端下的蓝牙工具)进行打开操作。(拒绝手动操作)

模拟插拔使用PD虚拟机,其SDK极其完善。(在.app/Contents/MacOS内的命令行工具)

代码

shell脚本的语法十分诡异,查了好久才能写出个判断、循环语句。(???)

  • 将以上所有内容结合,最后得出以下结果:
#!/bin/bash# 设置变量program="/Applications/Parallels Desktop.app/Contents/MacOS/prlctl"vm="Windows 10"device="CSR8510 A10"vm_app="$HOME/Parallels/$vm.pvm/$vm.app"# 重置蓝牙开关(后台运行以缩短时间){    /usr/local/bin/blueutil -p 0 2> /dev/null
    /usr/local/bin/blueutil -p 1 2> /dev/null
} &# 等待PD启动start=false
while true; do    status_content=$("$program" status "$vm" 2>&1)    if [[ "$status_content" =~ "Unable to connect to Parallels Service" ]]; then        if [ !$start ]; then            start=true
            open "$vm_app"        fi        echo "Waiting PD Service Start..."        sleep 0.5
    elif [[ "$status_content" =~ "$vm" ]]; then        break    fidone# 获取VM状态echo $status_contentstatus=$(echo "$status_content"|awk '{print $NF}')[ "$status" == "suspended" -o "$status" == "stopped" -o "$status" == "paused" ]need_resume=$?# 开启VMif [ $need_resume -eq 0 ]; then    "$program" resume "$vm" 2> /dev/null
fiwhile true; do    status_content=$("$program" status "$vm" 2>&1)    if [[ "$status_content" =~ "resuming" ]]; then        echo "Waiting VM Resuming..."        sleep 0.5
    elif [[ "$status_content" =~ "running" ]]; then        break    fidone# 模拟USB插拔"$program" set "$vm" --device-connect "$device""$program" set "$vm" --device-disconnect "$device"# 根据操作前状态决定是否暂停VMif [ $need_resume -eq 0 ]; then    "$program" pause "$vm"fi