关于onvif在Android上实现,与IPC之间的通讯
实现局域网下搜索IPC,显示修改编码配置,显示修改网络配置
直接上代码
首先,要写一个server,并在放listview的页面监听
写server所需一下几步
创建CamCameraDevice.java
interface OnSoapDoneListener {
void onSoapDone(CameraDevice device, boolean success);
}
public class CameraDevice implements IPCam {
public UUID uuid;
public String serviceURL;
private int id;
private String name;
private String ipAddr;
private boolean isOnline = false;
private String rtspUri = "";
private FFmpegFrameGrabber mGrabber;
private SurfaceView mSurfaceView;
private OnSoapDoneListener mListener;
public int width;
public int height;
public int rate;
public String username;
public String password;
public CameraDevice(UUID uuid, String serviceURL) {
this.uuid = uuid;
this.serviceURL = serviceURL;
}
public void setSecurity(String username, String password) {
this.username = username;
this.password = password;
}
public void setProperties(int width, int height, int rate) {
this.width = width;
this.height = height;
this.rate = rate;
}
public void setId(int id) {
this.id = id;
}
public void setIpAddr(String ipAddr) {
this.ipAddr = ipAddr;
}
public void setOnline(boolean isOnline) {
this.isOnline = isOnline;
}
@Override
public void IPCamInit() {
if (this.isOnline) {
HttpSoap soap = new HttpSoap(this);
soap.setOnHttpSoapListener(listener);
soap.start();
}
}
public void setOnSoapDoneListener(OnSoapDoneListener listener) {
mListener = listener;
}
private OnHttpSoapListener listener = new OnHttpSoapListener() {
@Override
public void OnHttpSoapDone(CameraDevice camera, String uri, boolean success) {
if (success) {
rtspUri = uri.substring(0, uri.indexOf("//") + 2) + camera.username
+ ":" + camera.password + "@"
+ uri.substring(uri.indexOf("//") + 2);
mGrabber = new FFmpegFrameGrabber(rtspUri);
mGrabber.setImageWidth(width);
mGrabber.setImageHeight(height);
try {
mGrabber.start();
} catch (Exception e) {
e.printStackTrace();
}
}
if (mListener != null) {
mListener.onSoapDone(CameraDevice.this, success);
}
}
};
@Override
public int getId() {
return this.id;
}
@Override
public String getName() {
return this.name;
}
@Override
public String getIpAddress() {
return this.ipAddr;
}
@Override
public boolean isOnline() {
return this.isOnline;
}
@Override
public void setSurfaceView(SurfaceView surfaceView) {
// TODO what to do ?
mSurfaceView = surfaceView;
}
@Override
public IplImage grab() {
if (mGrabber != null) {
try {
return mGrabber.grab();
} catch (Exception e) {
e.printStackTrace();
return null;
}
} else {
return null;
}
}
@Override
public void IPCamRelease() {
try {
mGrabber.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建CameraFinder.java
interface OnCameraFinderListener {
public void OnCameraListUpdated();
}
public class CameraFinder{
public static final String DISCOVERY_PROBE_TDS = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:tds=\"http://www.onvif.org/ver10/device/wsdl\" xmlns=\"http://www.w3.org/2003/05/soap-envelope\"><Header><wsa:MessageID xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">uuid:5101931c-dd3e-4f14-a8aa-c46144af3433</wsa:MessageID><wsa:To xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action></Header><Body><Probe xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"><Types>dn:NetworkVideoTransmitter</Types><Scopes /></Probe></Body></Envelope>";
public static final int BROADCAST_SERVER_PORT = 3702;
public static final String TAG = "CameraFinder";
private DatagramSocket mSocket;
private DatagramPacket mPacket;
private Context mContext;
private boolean mIsSearching = false;
private OnCameraFinderListener mListener;
private List<CameraDevice> mCameraList;
public CameraFinder(Context context) {
mContext = context;
mCameraList = new ArrayList<CameraDevice>();
new Thread(mSearchingRunnable).start();
}
public List<CameraDevice> getCameraList() {
return mCameraList;
}
public void setOnCameraFinderListener(OnCameraFinderListener onCameraFinderListener) {
mListener = onCameraFinderListener;
}
private Runnable mSearchingRunnable = new Runnable() {
@Override
public void run() {
initSocket();
sendProbe();
mIsSearching = true;
byte[] Buff = new byte[4096];
DatagramPacket packet = new DatagramPacket(Buff,
Buff.length);
while (mIsSearching) {
try {
mSocket.receive(packet);
if (packet.getLength() > 0) {
String strPacket = new String(packet.getData(), 0,
packet.getLength());
Log.v("ws-discovery", " receive packets:" + strPacket );
processReceivedPacket(strPacket);
}
} catch (InterruptedIOException e) {
Log.d(TAG, "receive timeout!!");
} catch (IOException e) {
e.printStackTrace();
break;
}
}
mSocket.close();
}
};
private String getMid(String src, String head, String foot) {
int headIndex = src.indexOf(head);
if (headIndex == -1) {
return null;
}
String tmp = src.substring(headIndex + head.length());
int footIndex = tmp.indexOf(foot);
if (footIndex == -1) {
return null;
}
return tmp.substring(0, footIndex);
}
private void processReceivedPacket(String packet) {
try {
String uuid = getMid(packet, "Address>", "<").split(":")[2];
String url = getMid(packet, "XAddrs>", "<").split(" ")[0];
if (uuid != null && url != null) {
UUID myUUID = UUID.fromString(uuid);
if (!isUuidExistInCameraList(myUUID)) {
CameraDevice cd = new CameraDevice(
UUID.fromString(uuid), url);
cd.setOnline(true);
mCameraList.add(cd);
if (mListener != null) {
mListener.OnCameraListUpdated();
}
}
}
} catch (Exception e) {
}
}
private boolean isUuidExistInCameraList(UUID uuid) {
boolean result = false;
for (CameraDevice device : mCameraList) {
if (device.uuid.equals(uuid)) {
result = true;
}
}
return result;
}
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
}
return null;
}
public static String getBroadcast() throws SocketException {
System.setProperty("java.net.preferIPv4Stack", "true");
for (Enumeration<NetworkInterface> niEnum = NetworkInterface
.getNetworkInterfaces(); niEnum.hasMoreElements();) {
NetworkInterface ni = niEnum.nextElement();
if (!ni.isLoopback()) {
for (InterfaceAddress interfaceAddress : ni
.getInterfaceAddresses()) {
if (interfaceAddress.getBroadcast() != null) {
return interfaceAddress.getBroadcast().toString()
.substring(1);
}
}
}
}
return null;
}
private void initSocket() {
try {
mSocket = new DatagramSocket();
mSocket.setBroadcast(true);
mSocket.setSoTimeout(10000);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sendProbe() {
new Thread(new Runnable() {
@Override
public void run() {
mCameraList.clear();
if (mListener != null) {
mListener.OnCameraListUpdated();
}
byte[] buf = DISCOVERY_PROBE_TDS.getBytes();
try {
String strBroadcast = getBroadcast();
if (strBroadcast == null) {
t