使用GSMComm库获取USSD结果

Sha*_*lam 6 c# gsm gsmcomm

我正在尝试通过gsm调制解调器运行usdd代码以获取sim卡余额。我正在使用GsmComm库,ASP.NET Web窗体,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;
    }
Run Code Online (Sandbox Code Playgroud)

我调试并发现调制解调器已连接。在“ ExecAndReceiveMultiple”上,我收到错误消息-等待29999/30030毫秒后,没有从电话接收数据。代码正确吗?可能是什么问题呢 ?任何其他建议(例如其他库或代码)都将有助于您获得SIM卡的平衡。谢谢。

hlo*_*dal 0

string getString = protocol.ExecAndReceiveMultiple("AT+CUSD=1," + asPDUencoded + ",15");

这一行有一个或两个问题。要首先获取可能部分,AT 命令行应以回车符结束,例如\r,又名 ASCII 值 13 1。如果ExecAndReceiveMultiple隐式执行此操作,则没有问题,但如果不执行此操作,则存在问题,因为命令行未正确终止。


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

该命令在27.005规范第7.15章非结构化补充服务数据+CUSDAT+CUSD定义,语法如下:

+CUSD=[<n>[,<str>[,<dcs>]]]
...
<str>: string type USSD-string 
Run Code Online (Sandbox Code Playgroud)

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

5.4.2.2 字符串常量

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

asPDUencoded变量被赋予一个带有输入的十六进制表示形式的字符串值,让我们假设"1A2B3C4D5F"如下。该代码行将导致以下函数调用:

+CUSD=[<n>[,<str>[,<dcs>]]]
...
<str>: string type USSD-string 
Run Code Online (Sandbox Code Playgroud)

你看到问题了吗?第二个参数<str>是一个字符串,必须用双引号2括起来,例如

protocol.ExecAndReceiveMultiple("AT+CUSD=1,1A2B3C4D5F,15");
Run Code Online (Sandbox Code Playgroud)

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

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


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

2另请记住,字符串需要AT+CSCS格式化