我正在尝试通过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卡的平衡。谢谢。
string getString = protocol.ExecAndReceiveMultiple("AT+CUSD=1," + asPDUencoded + ",15");
这一行有一个或两个问题。要首先获取可能部分,AT 命令行应以回车符结束,例如\r,又名 ASCII 值 13 1。如果ExecAndReceiveMultiple隐式执行此操作,则没有问题,但如果不执行此操作,则存在问题,因为命令行未正确终止。
但肯定存在的问题是"AT+CUSD=1," + asPDUencoded + ",15"。
该命令在27.005规范第7.15章非结构化补充服务数据+CUSD中AT+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格式化。