我正在使用终端仿真器库来创建终端,然后我用它将通过串口输入的数据发送到串行设备。当数据被发回时,我想解析它并在editText中向用户显示最重要的信息。目前我收到字节数组/块,我将它们转换为字符串。当我得到\ r或\ n时,我会创建一个新字符串并重复该过程。这适用于大多数命令,但是有些命令会在多行上返回结果,例如“show vlan”:
当我遍历这个时,我得到每一行的字符串。第一个包含VLAN名称状态和端口,作为示例。所以现在我有一个问题,我怎么能将VLAN 1的x端口激活。它们有不同的字符串。这是一个当前更容易命令的代码和屏幕截图,我对这一行感兴趣:
Handler viewHandler = new Handler();
Runnable updateView = new Runnable() {
@Override
public void run() {
mEmulatorView.invalidate();
if (statusBool == true) {
for (int i = 0; i < dataReceived.length(); i++) {
parseCommand = parseCommand + dataReceived.charAt(i);
if (dataReceived.charAt(i) == '\n' || dataReceived.charAt(i) == '\r'){
if(parseCommand.contains("KlasOS"))
{
String[] tokens = parseCommand.split("\\s{1,}");
final String ReceivedText = mReceiveBox.getText().toString() + " "
+ new String("Software Version: " + tokens[1] + "\n" );
runOnUiThread(new Runnable() {
public void run() {
mReceiveBox.setText(ReceivedText);
mReceiveBox.setSelection(ReceivedText.length());
}
});
}
parseCommand = "";
}
}
statusBool = false;
viewHandler.postDelayed(updateView, 1000);
}
}
};
现在我想改变它,这样我可以处理多行。如果ebst包含某些信息,它们是否会存储字符串?
我需要在右侧editText输出:
“以下端口在vlan 1上:Fa1 / 0,fa1 / 1,fa1 / 2,fa1 / 3,fa1 / 4,fa1 / 5,fa1 / 6,fa1 / 7,fa1 / 8,fa1 / 9,fa1 / 10,fa1 / 11,Gi0“
答案 0 :(得分:2)
基本上,您需要一种方法来可靠地检测命令结果的结束。然后归结为发送命令,从设备读取数据,直到遇到结果结束,最后解析结果。
我会像你自己的回答一样扫描提示符(switch#
)。也许您甚至可以强制设备使用更奇特的字符序列,这在命令的常规输出中不太可能发生,并且更容易检测结果的结束。例如,您可以尝试将提示配置为包含控制字符,如^ G或^ L.或者,如果您的用户不介意,您可以始终发送第二个发出此类序列的命令,例如“show vlan; echo ^ G”。
您还应该为命令错误做好准备,这会导致不同的输出,例如,预期的行数越来越少或输出格式完全不同。结果甚至可能包含常规输出和警告或错误。
答案 1 :(得分:0)
我用一个布尔和一些字符串以杂乱的方式解决了这个问题。我做了一个附加字符串的方法。
if((parseCommand.contains("VLAN Name") && parseCommand.contains("Status")&& parseCommand.contains("Ports"))
|| ((ShowVlanAppend.contains("VLAN Name")&& ShowVlanAppend.contains("Status")&& ShowVlanAppend.contains("Ports"))))
{
commandParse();
if(finalCommandBool == true){
runOnUiThread(new Runnable() {
public void run() {
mReceiveBox.setText(finalCommand);
mReceiveBox.setSelection(finalCommand.length());
ShowVlanAppend = "";
finalCommand = "";
finalCommandBool = false;
}
});
}
}
public void commandParse()
{
if (!parseCommand.contains("switch#")){
ShowVlanAppend = ShowVlanAppend + parseCommand;
}
else{
finalCommand = ShowVlanAppend;
finalCommandBool = true;
}
}