Shell脚本AT命令:无法通过串行端口

时间:2016-03-03 10:28:33

标签: shell expect at-command

我有以下shell脚本(期待)我正在尝试发送短信。我已经引用了许多堆栈溢出引用,并发现ctrl-z映射到\ x1a。但是,即使将其附加到消息并发送到端口或分别向端口发送ctrl z也没有帮助我。它稍后会超时。

编写脚本是为了以pdu格式发送短信。不管怎样,我相信,这是将ctrl-z发送到端口的一般问题。如果您觉得脚本有其他一些错误,请分享相同的解决方案。

下面提到的长度(34)也是根据规范的(PDU_LENGTH -2)/ 2的长度。该长度不包括ctrl-z字符。

at_command =" AT + CMGS = 34 \ r" message_content =" 0011000C810056890 ......"

脚本:

set PROMPT "0"
set timeout "$COMMAND_TIMEOUT"
send "$at_command"
expect {
    "OK" { puts "Command Accepted\n"; }
    "ERROR" { puts "Command Failed\n"; }
    timeout { puts "Unable to connect to $HOSTIP at $HOSTPORT"; exit 1 }
    "*>*" { set PROMPT "1"; }
}

if { "$PROMPT" == "1" } {
    send "$message_content"
    send "\x1a"
    expect {
        "OK" { puts "\nCommand accepted"; }
        "ERROR" { puts "\nCommand failed"; }
        "*>*" { puts "CTRL-Z dint reach UT. Error..."; }
        "*" { puts "Unexpected return value received"; }
    }
}

我非常肯定脚本会发送$ message_content"发送" $ message_content"。

后立即退出

输出:

AT+CMGS=34

>

1 个答案:

答案 0 :(得分:0)

我在c#中使用SMS-Gateway-Modul进行了类似的操作。

我必须switch to PDU-Mode first!
之后,我必须发送预期的PDU长度,最后发送PDU本身。

每个命令都必须使用can carriage return ASC[13]提交,并且最终必须使用ASC[26]提交PDU。

在这里,您可以看到示意图(!)流程,我是如何在c#中完成的:

1)创建PDU并获取长度

int len;
var pdu = PDUGenerator.GetPdu(destination, message, "", out len);

2)切换到PDUMode

 SendToCom("AT+CMGF=0" + System.Convert.ToChar(13));

3)宣布消息长度

SendToCom("AT+CMGS=" + len + System.Convert.ToChar(13));

4)发送PDU并提交

SendToCom(pdu + System.Convert.ToChar(26));