使用Digi';s XBee Java库,其中XBee处于API 2中(转义模式)

使用Digi';s XBee Java库,其中XBee处于API 2中(转义模式),java,api,xbee,zigbee,Java,Api,Xbee,Zigbee,产品系列:XBP24-ZB 函数集:ZigBee协调器API 固件版本:21A7 您好,我目前正在使用Digi的XBee Java库和API(AP=1),它工作正常。 但是,我网络的另一个节点与Arduino关联,我想使用“Arduino库在API模式下与XBee通信”()。 该Arduino库需要API转义操作模式(API 2)。这本不应该是个问题,因为XBee Java库支持API 2。然而,我在尝试打开与XBee的串行连接时出错 package com.digi.xbee.example;

产品系列:XBP24-ZB 函数集:ZigBee协调器API 固件版本:21A7

您好,我目前正在使用Digi的XBee Java库和API(AP=1),它工作正常。 但是,我网络的另一个节点与Arduino关联,我想使用“Arduino库在API模式下与XBee通信”()。 该Arduino库需要API转义操作模式(API 2)。这本不应该是个问题,因为XBee Java库支持API 2。然而,我在尝试打开与XBee的串行连接时出错

package com.digi.xbee.example;

import com.digi.xbee.api.XBeeDevice;
import com.digi.xbee.api.exceptions.XBeeException;

public class MainApp {
    /* Constants */
    // TODO Replace with the port where your sender module is connected to.
    private static final String PORT = "COM4";
    // TODO Replace with the baud rate of your sender module.
    private static final int BAUD_RATE = 9600;

    private static final String DATA_TO_SEND = "Hello XBee World!";

    public static void main(String[] args) {
        XBeeDevice myDevice = new XBeeDevice(PORT, BAUD_RATE);
        byte[] dataToSend = DATA_TO_SEND.getBytes();

        try {
            myDevice.open();

            System.out.format("Sending broadcast data: '%s'", new String(dataToSend));

            myDevice.sendBroadcastData(dataToSend);

            System.out.println(" >> Success");

        } catch (XBeeException e) {
            System.out.println(" >> Error");
            e.printStackTrace();
            System.exit(1);
        } finally {
            myDevice.close();
        }
    }
}
错误 com.digi.xbee.api.exceptions.TimeoutException:执行请求的操作时超时。 在com.digi.xbee.api.AbstractXBeeDevice.sendXBeePacket上(AbstractXBeeDevice.java:989) 在com.digi.xbee.api.AbstractXBeeDevice.sendATCommand(AbstractXBeeDevice.java:806) 位于com.digi.xbee.api.AbstractXbeedDevice.sendParameter(AbstractXbeedDevice.java:1983) 在com.digi.xbee.api.AbstractXBeeDevice.getParameter(AbstractXBeeDevice.java:1925)上 在com.digi.xbee.api.AbstractXBeeDevice.readDeviceInfo(AbstractXBeeDevice.java:365) 在com.digi.xbee.api.XBeeDevice.open上(XBeeDevice.java:219) 位于com.digi.xbee.example.MainApp.main(MainApp.java:20)


使用此Java库编程时,API和API 2之间有什么区别吗?

我不确定是否使用Arduino库,但我看到您正在打开设备,并且从未告诉它连接到其他xbee

您需要告诉xbee您要连接到哪个设备

public void connect(String REMOTE_NODE_IDENTIFIER)
{
 //REMOTE_NODE_IDENTIFIER is the name of the xbee device you want to connect to.
    try 
    {
        myDevice.open();
        // Obtain the remote XBee device from the XBee network.
        XBeeNetwork xbeeNetwork = myDevice.getNetwork();
        RemoteXBeeDevice remoteDevice = xbeeNetwork.discoverDevice(REMOTE_NODE_IDENTIFIER);
        if (remoteDevice == null)
        {
            //Unable to connect to device
            System.out.println("Couldn't find the remote XBee device with '" + REMOTE_NODE_IDENTIFIER + "' Node Identifier.");
        }

        else
        {
            //Successfully connected
        }

     } catch (XBeeException e) 
        {
            e.printStackTrace();
        }
}

我不确定是否使用Arduino库,但我看到您正在打开设备,并且从未告诉它连接到其他xbee

您需要告诉xbee您要连接到哪个设备

public void connect(String REMOTE_NODE_IDENTIFIER)
{
 //REMOTE_NODE_IDENTIFIER is the name of the xbee device you want to connect to.
    try 
    {
        myDevice.open();
        // Obtain the remote XBee device from the XBee network.
        XBeeNetwork xbeeNetwork = myDevice.getNetwork();
        RemoteXBeeDevice remoteDevice = xbeeNetwork.discoverDevice(REMOTE_NODE_IDENTIFIER);
        if (remoteDevice == null)
        {
            //Unable to connect to device
            System.out.println("Couldn't find the remote XBee device with '" + REMOTE_NODE_IDENTIFIER + "' Node Identifier.");
        }

        else
        {
            //Successfully connected
        }

     } catch (XBeeException e) 
        {
            e.printStackTrace();
        }
}

网络中每个模块上的波特率和API模式不需要匹配,它们只是用于与本地主机的串行通信。请注意,XBee模块的
ATAP
设置需要与您试图在主机软件中使用的任何API模式相匹配

继续在Java库中使用工作的
ATAP=1
,在Arduino中使用
ATAP=2
。API模式2只是一种“转义”模式,其中有效负载中的某些字节被转义,以区别于0x7E帧开始字符


您甚至可以以115200或57600 bps的速度运行Java端,并将Arduino端保持在9600 bps。您可以使用“AT模式”固件运行模块,并使用“API模式”从模块与模块通信。无线模块缓冲数据,并以250kbps的速率通过空中发送,而不管您的主机设置如何。

网络中每个模块上的波特率和API模式不需要匹配,它们仅用于与本地主机的串行通信。请注意,XBee模块的
ATAP
设置需要与您试图在主机软件中使用的任何API模式相匹配

继续在Java库中使用工作的
ATAP=1
,在Arduino中使用
ATAP=2
。API模式2只是一种“转义”模式,其中有效负载中的某些字节被转义,以区别于0x7E帧开始字符


您甚至可以以115200或57600 bps的速度运行Java端,并将Arduino端保持在9600 bps。您可以使用“AT模式”固件运行模块,并使用“API模式”从模块与模块通信。无论您的主机设置如何,无线模块都会缓冲数据,并以250kbps的速率通过无线发送。

谢谢您的回复,但这将是我的下一步。现在我只想打开和关闭与本地XBee的串行通信。正如我所说,它可以与API 1正常工作。当我把它改成API2时,我得到了错误。我很好奇,所以我尝试了你的代码,它对我有效。然而,我不得不改变波特率以匹配我的机器人。也许你也需要换一下你的?打开时超时异常通常发生在波特率不正确时。代码和XBee中的波特率为9600。我重置了XBee,并将API 1更改为API 2。仍然没有工作。谢谢你的回复,但这将是我的下一步。现在我只想打开和关闭与本地XBee的串行通信。正如我所说,它可以与API 1正常工作。当我把它改成API2时,我得到了错误。我很好奇,所以我尝试了你的代码,它对我有效。然而,我不得不改变波特率以匹配我的机器人。也许你也需要换一下你的?打开时超时异常通常发生在波特率不正确时。代码和XBee中的波特率为9600。我重置了XBee,并将API 1更改为API 2。仍然不起作用。