shell脚本 处理 ec20卡状态的问题

2024-03-14 02:49:07   工作备份

 

ec20好不容易开始工作了,但是发现在并发比较高的情况下,出现了卡状态的问题,具体表现为 呼叫已经结束,但是asterisk中设备状态认为停留在dialing状态,无法释放,这时候也无法呼出,因为软件认为这个设备正忙

查询ec20 AT指令 发现了AT+CPAS指令 可以查询获取 设备状态,在此基础上结合重启命令,可以很大程度上自动恢复。

  1. AT+CPAS
  2. +CPAS: 0
  3. 0 准备(ME 允许来自 TA/TE 的命令)
  4. 2 未知(ME 未授权响应指令)
  5. 3 振铃(ME 准备好接收来自 TA/TE 的命令,但正在振铃)
  6. 4 呼叫进行中(ME 准备好来自 TA/TE 的命令,但当前有一个呼叫正在进行)

在写脚本的过程中,发现了比较麻烦的点是:

  • 需要多次反复查询,降低高并发情况下干扰,尽量不影响正常的设备
  • asterisk 发送cmd命令时 后台是队列执行的,而不是实时返回内容,所以没办法通过asterisk -rx “”执行获取返回结果,查询相关资料,可以expect 命令 模拟输入,并获得返回内容
  1. #!/bin/bash
  2. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  3. # 检查 Asterisk 服务是否运行
  4. if ! pidof asterisk >/dev/null; then
  5. echo "Asterisk service is not running. Exiting..."
  6. exit 1
  7. fi
  8. check_device_state() {
  9. local device_name=$1
  10. local device_state=$(asterisk -rx "quectel show device state $device_name" | grep -E "State\s+:" | awk '{print $3}')
  11. echo "$device_state"
  12. }
  13. device_info=$(asterisk -rx "quectel show devices" | grep "Dialing" | awk '{print $1}')
  14. echo "$device_info"
  15. for line in $device_info; do
  16. # 循环10次
  17. need_deal=0
  18. need_try=10
  19. for ((i=1; i<=need_try; i++)); do
  20. # 定义设备名称
  21. device_name=${line%% *}
  22. # 获取设备状态
  23. device_state=$(check_device_state "$device_name")
  24. echo "$device_name state: $device_state"
  25. # 判断设备状态是否为 Dialing
  26. if [[ $device_state == "Dialing" ]]; then
  27. # 进入 Asterisk 命令
  28. cpas_result=$(expect -c "
  29. spawn asterisk -r
  30. expect \"CLI>\"
  31. send \"quectel cmd $device_name \\\"AT+CPAS\\\"\\r\"
  32. expect \"OK\"
  33. expect \"CLI>\"
  34. exit
  35. ")
  36. # 提取值并判断
  37. cpas_value=$(echo $cpas_result | grep -oE "+CPAS: [0-9]+" | awk '{print $2}')
  38. if [[ $cpas_value == "0" ]]; then
  39. # 执行重启命令
  40. ((need_deal++))
  41. echo "$device_name may be something wrong,checks:$need_deal"
  42. sleep 3
  43. #asterisk -rx "quectel restart now $device_name"
  44. else
  45. echo "$device_name looks normal..."
  46. break
  47. fi
  48. fi
  49. done
  50. if [[ $need_deal == $need_try ]]; then
  51. echo "$device_name looks wrong"
  52. /etc/asterisk/sh/tell_qy.sh "$device_name 发现问题,重启中..."
  53. asterisk -rx "quectel restart now $device_name"
  54. fi
  55. done