android和台式机的发现系统

android和台式机的发现系统,android,upnp,jini,Android,Upnp,Jini,我有一个分布式系统,由androids和台式机组成,它们需要在它们之间传递数据(一个简单的序列化对象)。我对android的类似jini的发现系统感兴趣,通过该系统,androids/桌面机器可以相互发现,然后相互传输数据。分布式系统是非常动态的,从某种意义上说,设备的进出非常突然和频繁 我试着与之合作,我可以发现我的路由器,但无法发现其他设备,如android手机。所以我想知道android设备是否真的与UPnP兼容,或者我的代码可能有问题。 我正在使用中讨论的代码 编辑:发布下面的代码- p

我有一个分布式系统,由androids和台式机组成,它们需要在它们之间传递数据(一个简单的序列化对象)。我对android的类似jini的发现系统感兴趣,通过该系统,androids/桌面机器可以相互发现,然后相互传输数据。分布式系统是非常动态的,从某种意义上说,设备的进出非常突然和频繁

我试着与之合作,我可以发现我的路由器,但无法发现其他设备,如android手机。所以我想知道android设备是否真的与UPnP兼容,或者我的代码可能有问题。

我正在使用中讨论的代码

编辑:发布下面的代码-

public class UpnpBrowserActivity extends ListActivity {

private AndroidUpnpService upnpService;
Registry registry;
private ArrayAdapter<DeviceDisplay> listAdapter;
private BrowseRegistryListener registryListener = new BrowseRegistryListener();

private ServiceConnection serviceConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
        upnpService = (AndroidUpnpService) service;
        registry = upnpService.getRegistry();

        // Refresh the list with all known devices
        listAdapter.clear();
        for (Device device : registry.getDevices()) {               
            registryListener.deviceAdded(registry,device);
        }

        // Getting ready for future device advertisements
        registry.addListener(registryListener);

        // Search asynchronously for all devices
        upnpService.getControlPoint().search();
    }

    public void onServiceDisconnected(ComponentName className) {
        upnpService = null;
    }
};

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_upnp_browser);

    listAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1);
    setListAdapter(listAdapter);

    getApplicationContext().bindService(new Intent(this, AndroidUpnpServiceImpl.class),serviceConnection, Context.BIND_AUTO_CREATE);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.upnp_browser, menu);
    menu.add(0, 0, 0, "Menu1").setIcon(android.R.drawable.ic_menu_search);   
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == 0 && upnpService != null) {
        upnpService.getRegistry().removeAllRemoteDevices();
        upnpService.getControlPoint().search();
    }
    return false;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (upnpService != null) {
        upnpService.getRegistry().removeListener(registryListener);
    }
    getApplicationContext().unbindService(serviceConnection);
}

class BrowseRegistryListener extends DefaultRegistryListener {

    @Override
    public void remoteDeviceDiscoveryStarted(Registry registry, RemoteDevice device) {
        deviceAdded(device);
    }

    @Override
    public void remoteDeviceDiscoveryFailed(Registry registry, final RemoteDevice device, final Exception ex) {
        runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(
                        UpnpBrowserActivity.this,
                        "Discovery failed of '" + device.getDisplayString() + "': " +
                        (ex != null ? ex.toString() : "Couldn't retrieve device/service descriptors"),
                        Toast.LENGTH_LONG
                ).show();
            }
        });
        deviceRemoved(device);
    }

    @Override
    public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
        deviceAdded(device);
    }

    @Override
    public void remoteDeviceRemoved(Registry registry, RemoteDevice device) {
        deviceRemoved(device);
    }

    @Override
    public void localDeviceAdded(Registry registry, LocalDevice device) {
        deviceAdded(device);
    }

    @Override
    public void localDeviceRemoved(Registry registry, LocalDevice device) {
        deviceRemoved(device);
    }

    public void deviceAdded(final Device device) {
        runOnUiThread(new Runnable() {
            public void run() {
                DeviceDisplay d = new DeviceDisplay(device);
                int position = listAdapter.getPosition(d);
                if (position >= 0) {
                    // Device already in the list, re-set new value at same position
                    listAdapter.remove(d);
                    listAdapter.insert(d, position);
                } else {
                    listAdapter.add(d);
                }
            }
        });
    }

    public void deviceRemoved(final Device device) {
        runOnUiThread(new Runnable() {
            public void run() {
                listAdapter.remove(new DeviceDisplay(device));
            }
        });
    }
}
公共类UpnpBrowserActivity扩展了ListActivity{
私有AndroidUpnpService-upnpService;
登记处;
专用阵列适配器列表适配器;
private BrowserRegistryListener registryListener=新建BrowserRegistryListener();
专用ServiceConnection ServiceConnection=新ServiceConnection(){
服务连接上的公共无效(组件名称类名称,IBinder服务){
upnpService=(AndroidUpnpService)服务;
registry=upnpService.getRegistry();
//使用所有已知设备刷新列表
listAdapter.clear();
对于(设备:registry.getDevices()){
registryListener.deviceAdded(注册表,设备);
}
//为未来的设备广告做准备
addListener(registryListener);
//异步搜索所有设备
upnpService.getControlPoint().search();
}
ServiceDisconnected上的公共void(ComponentName类名称){
upnpService=null;
}
};
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u upnp\u浏览器);
listAdapter=newarrayadapter(这是android.R.layout.simple\u list\u item\u 1);
setListAdapter(listAdapter);
getApplicationContext().bindService(新意图(this,AndroidUpnpServiceImpl.class)、serviceConnection、Context.BIND\u AUTO\u CREATE);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.upnp_浏览器,菜单);
menu.add(0,0,0,“Menu1”).setIcon(android.R.drawable.ic_菜单搜索);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
if(item.getItemId()==0&&upnpService!=null){
upnpService.getRegistry().removeAllRemoteDevices();
upnpService.getControlPoint().search();
}
返回false;
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
if(upnpService!=null){
upnpService.getRegistry().removeListener(registryListener);
}
getApplicationContext().unbindService(serviceConnection);
}
类BrowserRegistryListener扩展了DefaultRegistryListener{
@凌驾
public void remoteDeviceDiscoveryStarted(注册表、远程设备){
添加设备(设备);
}
@凌驾
public void remoteDeviceDiscoveryFailed(注册表、最终RemoteDevice设备、最终异常){
runOnUiThread(新的Runnable(){
公开募捐{
Toast.makeText(
UpnpBrowserActivity.this,
“发现“+”设备失败。getDisplayString()+”:”+
(ex!=null?ex.toString():“无法检索设备/服务描述符”),
吐司,长度
).show();
}
});
设备(装置);
}
@凌驾
public void remoteDeviceAdded(注册表、远程设备){
添加设备(设备);
}
@凌驾
public void remoteDeviceRemoved(注册表、远程设备){
设备(装置);
}
@凌驾
public void localDeviceAdded(注册表、LocalDevice){
添加设备(设备);
}
@凌驾
public void localDeviceRemoved(注册表、LocalDevice设备){
设备(装置);
}
添加的公共无效设备(最终设备){
runOnUiThread(新的Runnable(){
公开募捐{
DeviceDisplay d=新的DeviceDisplay(设备);
int position=listAdapter.getPosition(d);
如果(位置>=0){
//设备已在列表中,请在同一位置重新设置新值
listAdapter。移除(d);
listAdapter.插入(d,位置);
}否则{
添加(d);
}
}
});
}
公共无效设备已移动(最终设备){
runOnUiThread(新的Runnable(){
公开募捐{
移除(新设备显示(设备));
}
});
}
}
}

我也读过,但如果不能用Cling或其他类似的库发现android设备,我更愿意使用TCP/IP套接字编写一个小型发现系统


如果我遗漏或误解了什么,请指导我。感谢您的帮助。提前感谢。

Android设备能够运行UPnP堆栈。然而,这并不意味着所有Android设备都发布UPnP设备。您是否正在尝试使用UPnP检测任意Android工具包?或者,您想将自己的软件添加到发布UPnP设备的特定Android设备上吗?我认为前者行不通;后者应该很简单。谢谢你的评论。我想写一个软件来发布其他安卓设备和桌面机器(我假设这是注册表所做的),这样这些设备/机器就可以在每个安卓设备和桌面机器之间消费和共享数据