代理程序(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”上与主代理程序进行信息交流。

broker/module/proxy

图表说明:

代理程序用粉色长方形表示。代理程序是使用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的访问(远程模块)





Copyright © 2010 Aldebaran-Robotics - 版权所有