Camera interface is for all camera maker can intergrate their camera into Infairy and called by all other bundles.
The Camera interface as follows:
The Camera interface as follows:
/** * Codec: RTSP */ public String Codec_RTSP="rtsp"; /** * Codec: Mpeg4 */ public String Codec_MPEG4="mpeg4"; /** * Codec: Mothion Jpeg */ public String Codec_MJPEG="mjepg"; /** * Image codec */ public String ImageCodec="codec"; /** * M-JPeg URL of this camera */ public String Item_imageCGI="imageCGI"; /** * H.264 URL of this camera */ public String Item_h264CGI="h264CGI"; /** * RTSP Port */ public String Item_rtspPort="rtspport"; /** * MPeg4 URL of this camera */ public String Item_mpeg4CGI="mpeg4CGI"; /** * is Still image */ public String Item_isStill="isStill"; /** * PTZ control of Tilt UP */ public String Item_PTZUpCGI="PTZUpCGI"; /** * PTZ control of Tilt Down */ public String Item_PTZDownCGI = "PTZDownCGI"; /** * PTZ control of pan left */ public String Item_PTZLeftCGI = "PTZLeftCGI"; /** * PTZ control of pan right */ public String Item_PTZRightCGI = "PTZRightCGI"; /** * PTZ control of zoom in */ public String Item_PTZZoomINCGI = "PTZZoomINCGI"; /** * PTZ control of zoom out */ public String Item_PTZZoomOutCGI = "PTZZoomOutCGI"; /** * PTZ control of near */ public String Item_PTZNearCGI = "PTZNearCGI"; /** * PTZ control of far */ public String Item_PTZFarCGI = "PTZFarCGI"; /** * PTZ control of stop pan tilt */ public String Item_PTZStopCGI = "PTZSTOPCGI"; /** * PTZ property */ public String Item_PTZ="ptz"; /** * RTPS URL of camera */ public String Item_rtspCGI_H264="rtspCGI_H264"; /** * change size url of camera */ public String Item_SizeCGI="SizeCGI"; /** * change quality url of camera */ public String Item_QualityCGI="QualityCGI"; /** * @deprecated * HTML index page */ public String Item_authenPage="authenPage"; /** * Category */ public String Item_Category="category"; /** * Item of camera id */ public String Item_CameraID="ZID"; /** * Item of camera alias */ public String Item_CameraAlias="CameraAlias"; /** * Item of camera brand */ public String Item_CameraBrand="CameraBrand"; /** * Item of camera type */ public String Item_CameraType="CameraType"; /** * Item of camera ip */ public String Item_IP="IP"; /** * Item of camera port */ public String Item_Port="Port"; /** * Item of camera Area */ public String Item_Area="area"; /** * Item of camera username */ public String Item_Username="Username"; /** * Item of camera password */ public String Item_Password="Password"; /** * Item of camera's connection timeout */ public String Item_ConnectTimeoutMillis="ConnectTimeoutMillis"; /** * Item of camera's mac address */ public String Item_MacAddress="MACAddress"; /** * check is the camera same as by Camera brand and camera type, if developer does not implement this function, the bundle will reture false to denied all the in coming camera. * @param CameraBrand camera brand * @param CameraType camera type * @return */ public boolean checkIsCamera(String CameraBrand, String CameraType); /** * Get Supported Camera Type array * @return supported camera type array */ public String[] getSupportCameraType(); /** * Get property of camera * @param cameraType camera type * @param property camera property, please refer to {@link #Item_CameraAlias} {@link #Item_CameraBrand} {@link #Item_xxx}... * @return property */ public String getProperty(String cameraType, String property); /** * get camera M-Jpeg image url by camera type * @param cameraType camera type * @return M-Jpeg image url */ public String getImageUrl(String cameraType); /** * Zoom in control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean ZoomIn(String cameraID); /** * Zoom out control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean ZoomOut(String cameraID); /** * pan left control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean PanLeft(String cameraID); /** * pan right control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean PanRight(String cameraID); /** * tilt up control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean TiltUp(String cameraID); /** * tilt down control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean TiltDown(String cameraID); /** * far control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean Far(String cameraID); /** * near control by camera id * @param cameraID camera id * @return true: success, false:fail */ public boolean Near(String cameraID); /** * remove camera setting by camera id * * @param cameraID camera id * @return true:success, false:fail */ public boolean removeCamera(String cameraID); /** * Set camera's alias by camera id * @param cameraID camera id * @param alias * @return true:success false:fail */ public boolean setAlias(String cameraID, String alias); /** * Set camera's username by camera id * @param cameraID camera id * @param username * @return true:success false:fail */ public boolean setUsername(String cameraID, String username); /** * Set camera's password by camera id * @param cameraID camera id * @param password * @return true:success false:fail */ public boolean setPassword(String cameraID, String password); /** * Set camera's ip & Port by camera id * @param cameraID camera id * @param IP camera's ip * @param Port camera's port * @return true:success false:fail */ public boolean setIpPort(String cameraID, String IP, String Port); /** * get all Camera * @return camera object */ public CameraImpl[] getCameraImpl();If you are a camera maker, how can you build a bundle for all other developer to use your camera and view the camera's image?
let us do it step by step:
First, you have to implement two Interface, one is "CameraInterface" and another is "P2PHandlerInterface" (refer to P2P DNA and P2P Listener), but if your camera was not porvide P2P function , you can skip it:
package myCamera; import com.infairy.cocina.SDK.P2P.CameraImpl; import com.infairy.cocina.SDK.P2P.CameraInterface; import com.infairy.cocina.SDK.P2P.P2PHandlerInterface; import com.infairy.cocina.SDK.device.DevicePool; public class Camera implements BundleActivator, CameraInterface, P2PHandlerInterface { }Next, add p2p2 device into Infairy:
String[] tipImages=new String[]{ "UPnP_1.jpg", "UPnP_2.jpg", "UPnP_3.jpg", "UPnP_4.jpg", "UPnP_5.jpg" }; device.addP2PDevice(this, tipImages, false); //refer to com.infairy.cocina.SDK.device.DevicePool"tipImages" is for "OneShot installation" bundle , shows the instruction to user by image, the order of images represent the step of camera search step.
Implement search function in the P2PSearch(),
public boolean P2PSearch() { isCamSearchDone=false; myCameraSearch(); return true; } private void myCameraSearch(){ //do the camera search process .... //if the camera was found, then, add camera: //alias is camera alias //brand is camera brand //type is camera brand type //ip, port is camera's ip & port //account is camera's default account, user can change the account by CloudNVR bundle //password is camera's default password, user can change the password by CloudNVR bundle //macaddress is camera's macaddress CameraImpl cam=new CameraImpl(alias, brand, type, ip, Integer.parseInt(port,10), account, password, macaddress); //save camera to database DBTools.saveHashObject(this, "FoundCamera", cam, true); //add camera device.addP2PCamera(cam); }Note, before you add camera, you have to check the camera was existed or not:
boolean isExisted=device.checkIsP2PCameraExisted(ip, port);The most import function is getProperty(), which defined properties of your camera:
public String getProperty(String CameraType, String item){ if(item.equals(CameraInterface.ImageCodec)) return CameraInterface.Codec_RTSP; else if(item.equals(CameraInterface.Item_imageCGI)) return "cgi-bin/getVideo.cgi"; else if(item.equals(CameraInterface.Item_h264CGI)) return "/live.sdp"; else if(item.equals(CameraInterface.Item_rtspPort)) return "554"; else if(item.equals(CameraInterface.Item_PTZUpCGI)) return "/cgi-bin/ptz.cgi?up"; else if(item.equals(CameraInterface.Item_PTZDownCGI)) return "/cgi-bin/ptz.cgi?down"; else if(item.equals(CameraInterface.Item_PTZLeftCGI)) return "/cgi-bin/ptz.cgi?left"; else if(item.equals(CameraInterface.Item_PTZRightCGI)) return "/cgi-bin/ptz.cgi?right"; ..... }these item values are specific value defined in the individual camera.
If you are a bundle developer, how can you control the camera?
There are three methods can get the camera image and control the camera:
Method 1: cgi command, used by mobile client used purpose, such Android/iOS App.
http://ip:1188/cgi-bin/GetCamImage.cgi?id={camera id}ip: Infairy platform IP
1188 is Infairy platform default port.
this command reply the image byte stream to the client.
camera id is get from :
http://ip:1188/cgi-bin/Get.cgi?CAMERAwhich response all the cameras in the Infairy:
ZID=00e70801121e\n
KIND=CAMERA\n
IP=192.168.1.108\n
PORT=80\n
ALIAS=AXIS\n
CAMBRANDID=AXIS\n
CAMTYPE=MT-3510\n
TOTALCHANNEL=\n
INITCHANNEL=\n
VIEWQUALITY=\n
VIEWSIZE=\n
Area=\n
MacAddress=00e70801121e\n
CATEGORY=CAMERA\n
PTZ=000\r\n
ZID=......\n
...
...\r\n
Method 2: Layout of Camera
You can define a Camera layout to show the camera image in the UI, please refer to Camera Layout
LayoutCamera lcam=new LayoutCamera(); lcam.LayoutID=LayoutID; lcam.left=172; lcam.top=48; lcam.width=491; lcam.height=331; lcam.CameraID=cameraId; camID=layout.createUI(this, lcam); lcam=null; layout.update(BundleID);"cameraId" is camera id, developer can get by:
Fig-1-10-1. Camera Layout
String[] CAM_ID=device.getAllAssignedDeviceZID(device.DEVICE_CATERORY_CAMERA);"CAM_ID" is all camera id array list.
Method 3: use NVR SDK
First, import NVR & Camera class
import com.infairy.cocina.SDK.NVR.Camera; import com.infairy.cocina.SDK.NVR.LiveView;get camera service:
public class showCamera implements BundleActivator{ Camera camera; public void start(BundleContext context) throws Exception { camera=(Camera)Tools.getService(context, Camera.class.getName(), "(FUNCTION=CAMERA)"); } }Then, Enable camera live view process:
boolean isAlreadyRunning=camera.enableLiveView(cameraid); LiveView lv=camera.getLiveViewObjectByCamID(cameraid);New a output stream and set into liveview (lv) object:
if(lv!=null){ ByteArrayOutputStream bo=new ByteArrayOutputStream(); DataOutputStream dout=new DataOutputStream(bo); String id=lv.setImageStream(dout); }Get image from output stream:
while(true){} byte[] data=bo.toByteArray(); //analysis image process as follow ... }data is image stream.