Xbee通信使用Digi xbee-javaapi
Xbee communication using Digi xbee-java api
我已经将一个 xbee pro 配置为协调器(API 模式),另一个配置为路由器(API 模式)。我尝试使用 xbee java api 将数据从协调器发送到路由器,但在路由器代码中我一直为空,我做错了什么。
下面是发送数据(协调器)的代码:
public class MainApp {
private static final String PORT = "/dev/ttyUSB0";
private static final int BAUDRATE = 9600;
public static void main(String[] args)
{
String data = "Helloww";
XBeeDevice mycord = new XBeeDevice(PORT, BAUDRATE);
try {
mycord.open();
System.out.println("Port is opened\n");
System.out.println("remote device connection\n");
//mac of my router
RemoteXBeeDevice router = new RemoteXBeeDevice(mycord,
new XBee64BitAddress("0013A20040DD9BDD"));
System.out.println("Sending data\n");
mycord.sendData(router, data.getBytes());
} catch (XBeeException e) {
e.printStackTrace();
mycord.close();
System.exit(1);
}
}
}
路由器端的代码
public class RecvApp {
private static final String PORT = "/dev/ttyUSB1";
private static final int BAUDRATE = 9600;
public static void main(String[] args)
{
XBeeDevice myrouter = new XBeeDevice(PORT, BAUDRATE);
try {
myrouter.open();
System.out.println("router port opened\n");
//mac of coordinator
RemoteXBeeDevice remotecord = new RemoteXBeeDevice(myrouter, new XBee64BitAddress("0013A20040D96FE5"));
XBeeMessage msg = myrouter.readDataFrom(remotecord);
System.out.print(msg);
} catch (XBeeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
myrouter.close();
System.exit(1);
}
}
}
在路由器上,您需要有一个循环来检查消息并将它们打印出来。 API 应该有一个方法,您可以在调用 readDataFrom()
之前调用它来检查消息(或者您可能只是忽略空响应)。每次检查之间休眠几毫秒。目前,您的消息在程序退出之前没有多少机会通过。
在调试类似的东西时,首先要确定您的问题。哪一方发生故障,协调器还是路由器?你确定 XBee 模块已经相互连接并且在同一个网络上吗?
一个测试是 运行 在连接到路由器的串行端口上的一个简单的终端仿真器,你看到任何帧通过了吗?如果您查看字节的十六进制转储,您是否看到 "Helloww" 消息?如果没有,您需要先让协调器工作,然后再调试您的路由器。
发现问题,我没有以正确的格式转换收到的消息。添加了以下行
String content = HexUtils.prettyHexString(HexUtils.byteArrayToHexString(xbeeMessage.getData()));
System.out.println("Hex data" + "" + content + "\n");
String value = new String(xbeeMessage.getData());
System.out.print("Actual msg" + " " + value + "\n");
现在有效:)
我已经将一个 xbee pro 配置为协调器(API 模式),另一个配置为路由器(API 模式)。我尝试使用 xbee java api 将数据从协调器发送到路由器,但在路由器代码中我一直为空,我做错了什么。 下面是发送数据(协调器)的代码:
public class MainApp {
private static final String PORT = "/dev/ttyUSB0";
private static final int BAUDRATE = 9600;
public static void main(String[] args)
{
String data = "Helloww";
XBeeDevice mycord = new XBeeDevice(PORT, BAUDRATE);
try {
mycord.open();
System.out.println("Port is opened\n");
System.out.println("remote device connection\n");
//mac of my router
RemoteXBeeDevice router = new RemoteXBeeDevice(mycord,
new XBee64BitAddress("0013A20040DD9BDD"));
System.out.println("Sending data\n");
mycord.sendData(router, data.getBytes());
} catch (XBeeException e) {
e.printStackTrace();
mycord.close();
System.exit(1);
}
}
}
路由器端的代码
public class RecvApp {
private static final String PORT = "/dev/ttyUSB1";
private static final int BAUDRATE = 9600;
public static void main(String[] args)
{
XBeeDevice myrouter = new XBeeDevice(PORT, BAUDRATE);
try {
myrouter.open();
System.out.println("router port opened\n");
//mac of coordinator
RemoteXBeeDevice remotecord = new RemoteXBeeDevice(myrouter, new XBee64BitAddress("0013A20040D96FE5"));
XBeeMessage msg = myrouter.readDataFrom(remotecord);
System.out.print(msg);
} catch (XBeeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
myrouter.close();
System.exit(1);
}
}
}
在路由器上,您需要有一个循环来检查消息并将它们打印出来。 API 应该有一个方法,您可以在调用 readDataFrom()
之前调用它来检查消息(或者您可能只是忽略空响应)。每次检查之间休眠几毫秒。目前,您的消息在程序退出之前没有多少机会通过。
在调试类似的东西时,首先要确定您的问题。哪一方发生故障,协调器还是路由器?你确定 XBee 模块已经相互连接并且在同一个网络上吗?
一个测试是 运行 在连接到路由器的串行端口上的一个简单的终端仿真器,你看到任何帧通过了吗?如果您查看字节的十六进制转储,您是否看到 "Helloww" 消息?如果没有,您需要先让协调器工作,然后再调试您的路由器。
发现问题,我没有以正确的格式转换收到的消息。添加了以下行
String content = HexUtils.prettyHexString(HexUtils.byteArrayToHexString(xbeeMessage.getData()));
System.out.println("Hex data" + "" + content + "\n");
String value = new String(xbeeMessage.getData());
System.out.print("Actual msg" + " " + value + "\n");
现在有效:)