代理程序(Broker)
代理程序既是一个可执行档,也是一个服务器,可以在IP和端口监听远程命令。默认情况下,在机器人上,“NAO start”命令让可执行档“/bin/naoqi”监听以太网的IP;没有以太网时,监听无线网络的IP。
#shell exemple ./bin/naoqi -b 127.0.0.1 -p 9559 #listen on ip 127.0.0.1 and port 9559
模块生成器($AL_DIR/tools)会为您生成项目:生成一个可执行档并连接至机器人,或生成一个库并连接至主要可执行档(添加至“autoload.ini”)。模块会管理链接和路径。这样,您就可以将精力集中于所需的函数(更多有关模块生成器的信息,请参见SDK )。
以下图表中显示了一个简单的范例,使用一个名为“myModule”的用户创建模块。“myModule”在远程代理程序“myBroker”里运行,该代理程序可以在“127.0.0.1:9559”上与主代理程序进行信息交流。
图表说明:
代理程序用粉色长方形表示。代理程序是使用IP和端口参数运行的可执行档。“0.0.0.0”可用来监听所有可以使用的IP。
#shell command # IP 127.0.0.1 and port 9559 by default ./bin/naoqi -b 0.0.0.0
所有代理程序在网页浏览器上显示其API。http://127.0.0.1:9559(或参数中的其它IP和端口)。上图中,“Myroker”连接至“mainBroker”。如要连接至另一个代理程序,可以使用“-pip”命令:
#shell command ./modules/bin/myBroker -pip 127.0.0.1 # connect to mainBroker 127.0.0.1
模块用绿色圆圈表示。可以使用“Launcher”模块将其加载在运行时间,或是加载至设定文件“autoload.ini”($AL_DIR/modules/lib)。
#autoload.ini sample [core] # required files albase [extra] # removable modules launcher # module that can launch other modules devicecommunicationmanager # interface with hardware motion # module that manage motion pythonbridge # embedded python interpreter [remote] # run executable from ($AL_DIR/modules/bin audioout
一个代理程序既是一个可执行档,也是一个服务器。服务器会监听远程命令。通过ALProxy,可以连接至代理程序,来发送命令:
// C++ sample ALProxy p = ALProxy("module name", parentIP, parentPort); p.info("display it on remote broker parentIP and parentPort);
模块可通过“getParentBroker()”来访问其本地代理程序。
// C++ sample getParentBroker()->getIP(); // get my IP address
ALModuleInfo:模块或代理程序说明的结构
ALModuleInfo字段 | 说明 |
---|---|
std::string name; | 模块或代理程序的名称 |
int architecture; | Linux/Win32/MacOSX |
std::string ip; | 代理程序的IP地址(如果是代理程序的话) |
int port; | 代理程序的端口(如果是代理程序的话) |
int processId; | 已弃用 |
int modulePointer; | 模块地址 |
bool isABroker; | 是代理程序(true),还是模块(false)? |
bool keepAlive; | 父类代理程序被删除时,自动删除相应的子代理程序。 |
ALBroker
方法 | 说明 |
---|---|
int getModuleByName( const std::string& pModuleName, al__ALModuleInfo& pModInfo ); | 在模块网络里寻找一个模块 |
int getLocalModuleByName(const std::string& pModuleName, ALModuleInfo& pModInfo); | 在本地进程里寻找一个模块 |
int registerModule(ALPtr<ALModule> pModule); | 在本地进程里添加一个模块(加载一个库时,会被自动调用) |
int unregisterModule(const std::string& pModuleName); | 在本地进程里删除一个模块(如果模块中有函数在运行时,不会删除模块) |
int removeProxy(const std::string& pModuleName); | 移除一个模块参考(取消一个模块注册时,会被自动调用) |
int getModuleList( TALModuleInfoVector &pModuleList ); | 获取本地模块列表 |
int getBrokerList( TALModuleInfoVector &pBrokerList ); | 获取连接的本地代理程序(可执行档) |
int getGlobalModuleList( TALModuleInfoVector &pModuleList ); | 获取所有模块列表(包括远程模块) |
int init(const std::string& pBrokerName, const std::string& pIP, int pPort, const std::string& pParentBrokerIP, int pParentBrokerPort, bool pKeepAlive = false); | 重新设置代理程序,监听IP和端口。使用模块生成器或“createBroker”来轻松地创建代理程序。 |
int registerBroker( ALModuleInfo pBrokerToRegister); | 添加一个可执行档至当前代理程序 |
int getBrokerInfo( ALModuleInfo &pModuleInfo); | 获取当前代理程序信息 |
int exploreToGetModuleByName(const std::string& pModuleName, bool pSearchUp, bool pSearchDown, const std::string& pDontLookIntoBrokerName, ALModuleInfo &pModInfo); | 在进程树里寻找一个模块的类属函数 |
int getMethodList(const std::string& pModuleName, std::vector<std::string> &pMethodListName) const; | 获取pModuleName模块的API |
int getMethodHelp( const std::string& pModuleName, const std::string& pMethodName, AL::ALValue &pMethodHelp ) const; | 获取pModuleName、pMethodName的程序说明书 |
int getInfo( const std::string& pModuleName, ALModuleInfo &pModuleInfo) const; | 获取pModuleName的信息 |
int shutdown(); | 停止监听IP和端口。删除所有本地模块。取消当前代理程序在其它进程或代理程序的注册。 |
bool HasParent() | 如果是主代理程序(NAOqi)时,为“False” |
std::string getName() | 获取可执行档或代理程序的名称 |
std::string getIP() | 获取代理程序的IP |
int getPort() | 获取代理程序的端口 |
ALPtr<ALProxy> getProxy(const std::string& pProxyName); | 获得pProxyName上的一个指针(本地模块),或获得pProxyName的访问(远程模块) |