使用GSMComm库获取USSD结果

7

我正在尝试通过 GSM 模块运行 USSD 代码来获取 SIM 卡余额。我正在使用 GsmComm 库,ASP.NET Web Form 和 C#。以下是我的代码:

    public string SendUssdRequest2(string request)
    {
        comm = ConnectAndGetComm();
        string data = TextDataConverter.StringTo7Bit(request);

        string msg = "";
        var asPDUencoded = Calc.IntToHex(TextDataConverter.SeptetsToOctetsInt(data));
        try
        {
            IProtocol protocol = comm.GetProtocol();
            string gottenString = protocol.ExecAndReceiveMultiple("AT+CUSD=1," + asPDUencoded + ",15");
            var re = new Regex("\".*?\"");
            int i = 0;
            if (!re.IsMatch(gottenString))
            {
                do
                {
                    protocol.Receive(out gottenString);
                    ++i;
                } while (!(i >= 5
                           || re.IsMatch(gottenString)
                           || gottenString.Contains("\r\nOK")
                           || gottenString.Contains("\r\nERROR")
                           || gottenString.Contains("\r\nDONE"))); 
            }

            string m = re.Match(gottenString).Value.Trim('"');
            return PduParts.Decode7BitText(Calc.HexToInt(m));
        }
        catch(Exception e)
        {
            msg = e.Message;
        }
        finally
        {
            comm.ReleaseProtocol();
        }
        return msg;
    }

我进行了调试,并发现调制解调器已连接。在“ExecAndReceiveMultiple”中,等待29999/30030毫秒后未从电话接收到数据而出现错误。 代码是否正确?可能的问题是什么?有任何其他建议,如使用其他库或代码来获取SIM余额将会给予很大帮助。谢谢。


您正在连接调制解调器,连接良好。调制解调器通过电话网络广播短信消息,但未从手机接收到任何文本。因此,手机可能已关闭或该人在30秒内未回复文本。 - jdweng
这是似乎每个人都在使用的相同代码片段。它可以正常工作,也许是你的手机网络运营商出了问题?多试几次,我也是这样做的。你也可以尝试使用SmsLib。 - Javier Silva Ortíz
顺便说一下,这里的整体代码结构还不错,但是DONE不是一个有效的最终结果代码,不应该进行检查。除了OK和ERROR之外,还存在更多的最终结果代码,因此您必须检查所有代码。此外,您应该更改串行输入处理以进行适当的框架处理 - hlovdal
1个回答

0

这行代码存在一个或者两个问题。首先,可能出现的问题是AT命令行应该以回车符结尾,例如\r,亦称ASCII值131。如果ExecAndReceiveMultiple隐式地执行了这个操作,则没有问题。但如果没有的话,那么就会出现问题,因为命令行没有被正确地终止。

此外,这行代码中还存在一个问题,即可能会导致字符串截断。如果asPDUencoded的长度超过了15个字符,则返回的字符串将截断。

因此,建议将代码修改为protocol.ExecAndReceiveMultiple("AT+CUSD=1," + asPDUencoded + "\r", 15),以避免上述两个问题。


但绝对存在的问题是"AT+CUSD=1," + asPDUencoded + ",15"

AT+CUSD命令在27.005规范的第7.15章节中定义,其语法如下:

+CUSD=[<n>[,<str>[,<dcs>]]]
...
<str>: string type USSD-string 

这里的关键字是string。 V.250规范对字符串的定义如下:

5.4.2.2字符串常量

字符串常量应由一系列可显示字符组成... 除了字符"\。 字符串常量应以双引号字符(")为开头和结尾。

asPDUencoded变量被赋予一个十六进制表示的输入值的字符串值,假设以下内容为"1A2B3C4D5F"。 代码行将导致以下函数调用:
protocol.ExecAndReceiveMultiple("AT+CUSD=1,1A2B3C4D5F,15");

你看到问题了吗?第二个参数<str>是一个字符串,它必须用双引号2括起来,例如:
protocol.ExecAndReceiveMultiple("AT+CUSD=1,\"1A2B3C4D5F\",15");

因此,原始字符串连接需要更正为以下内容:

"AT+CUSD=1,\"" + asPDUencoded + "\",15"


1 严格来说,这是 S3 寄存器,但永远不要更改它的默认值 13。

2 还要记住,字符串 受到 AT+CSCS 格式化的影响


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接