UpnpDemo_发布设备和服务

来源:互联网 发布:淘宝网上海故事 编辑:程序博客网 时间:2024/04/27 20:47

//主控类,将注册设备和服务,并实现业务逻辑

public class LightActivity extends Activity implements PropertyChangeListener{

private AndroidUpnpService upnpService;
private UDN udn = new UDN(UUID.randomUUID());

private ServiceConnection serviceConnection = new ServiceConnection(){

@Override
public void onServiceConnected(ComponentName className, IBinder service){
upnpService=(AndroidUpnpService)service;

//非首次,直接拿取服务
LocalService<SwitchPower> switchPowerService=getSwitchPowerService();

//如果是首次,那么要创建设备—注册设备—拿取服务
if(switchPowerService==null){
try{
LocalDevice binaryLightDevice=createDevice();
upnpService.getRegistry().addDevice(binaryLightDevice);
switchPowerService=getSwitchPowerService();
}catch(Exception e){
e.printStackTrace();
}
}

//初始化业务(灯泡状态)
setLightBulb(switchPowerService.getManager().getImplementation().getStatus());

//绑定业务事件监听:监听状态值的改变(以改变灯泡状态)
switchPowerService.getManager().getImplementation().getPropertyChangeSupport().addPropertyChangeListener(this);

}

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

@Override
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.light);

//绑定服务:无论服务端还是控制端都绑定AndroidUpnpServiceImpl或其子类(UPNP下的点都是对等的,服控之分只是根据具体需求人为界定)
getApplicationContext().bindService(new Intent(this,AndroidUpnpServiceImpl.class),serviceConnection,Context.BIND_AUTO_CREATE);
}

//创建设备
private LocalDevice createDevice() throws Exception{

//设备类型
DeviceType type=new UDADeviceType("BinaryLight",1);

//设备详情
DeviceDetails details=new DeviceDetails(
"FriendlyBinaryLight",
new ManufactuererDetais("MicroSoft"),
new ModelDetais("AndroidLight","a light with remote control.","v1")
);

//搭载服务
LocalService service=new AnnotationLocalServiceBinder().read(SwitchPower.class);
service.setManager(new DefaultServiceManager<SwitchPower>(service,SwitchPower.class));

//返回该伟大设备
return new LocalDevice(
new DeviceIdentity(udn),
type,
details,
createDeviceIcon(),
service
);
}

//(由设备中)拿取服务
private LocalService<SwitchPower> getSwitchPowerService(){

//老大为空,返回空
if(upnpService==null){
return null;
}

//设备为空,返回空
LocalDevice localDevice;
if((localDevice=upnpService.getRegistry().getLocalDevice(udn,true))==null){
return null;
}

//由设备中拿取服务并返回
LocalService localService=(LocalService<SwitchPower>)localDevice.findService(new UDAServiceType("SwitchPower",1));
return localService;
}

private Icon createDeviceIcon(){
Icon icon=null;
try{
icon=new Icon("image/png",48,48,8,new URI("icon.png"),"一个极长、且纯洁、且无足重轻的——String data!!!");
}catch(Exception e){
e.printStackTrace();
}
return icon;
}

----------------------------------------------------------------------------------------------------------------------------------------

//业务事件监听
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals("status")) {
setLightbulb((Boolean) event.getNewValue());
}
}

//业务方法
private void setLightbulb(final boolean on) {
runOnUiThread(new Runnable() {
public void run() {
ImageView imageView = (ImageView) findViewById(R.id.light_imageview);
imageView.setImageResource(on ? R.drawable.light_on: R.drawable.light_off);
imageView.setBackgroundColor(on ? Color.parseColor("#9EC942"): Color.WHITE);
}
});
}

-----------------------------------------------------------------------------------------------------------------------------------------

//一点添头,重置路由器
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, R.string.switchRouter).setIcon(android.R.drawable.ic_menu_revert);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
if (upnpService != null) {
SwitchableRouter router = (SwitchableRouter) upnpService.get().getRouter();
try {
if (router.isEnabled()) {
router.disable();
} else {
router.enable();
}
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
return false;
}

}
0 0