本文描述的示例代码都可在Demo工程源码中找到,故详细代码可阅读SDK开发包介绍中提到的Demo工程源码。
1. SDK初始化
APP_ID:激活与API调用校验使用的账号。
SECRET_KEY:API调用所需的签名密钥。
LICENSE:激活API所需的激活码。
IPCameraManager mIPCameraManager = IPCameraManager.getInstance(context);
mIPCameraManager.init(APP_ID, SECRET_KEY, LICENSE);
2.设备发现
当集成安卓SDK的机器和摄像头设备在同一个局域网内的时候,可以通过如下示例方法扫描到所有的摄像头设备。
设备发现listener返回的IPCameraInfo包含了IPC的SN、IP、MAC等基本信息。
mIPCameraManager.registerListener(new IPCameraListener() {
@Override
public void onDeviceOnline(IPCameraInfo device) {
showToast(getApplicationContext(), "[ " + device.getDeviceid() + " ]上线");
}
@Override
public void onDeviceOffline(IPCameraInfo device) {
showToast(getApplicationContext(), "[ " + device.getDeviceid() + " ]离线");
}
});
3.首次配网并激活
调用IPC前需要先获取到IPC的IP地址,故第一步是把IPC接入网络,IPC连接网络的方式有有线连接和无线连接两种方式。
由于有线网络相对不容易受到环境干扰,稳定性和可靠性较高,故首选是有线方式接入网络。
有线接入:
有线接入只需要通过网线把IPC设备和集成SDK的Android设备接入到同一局域网即可,不需要其它设置。
无线接入:
无线配网方式相对要复杂点,步骤如下:
- 使用手机/PC的无线网卡扫描IPC的AP热点,一般AP热点的名称为SUNMI_XXXX,其中XXXX为MAC地址最后2个字节的16进制数字,MAC地址可以通过设备机身后背的标贴或者包装盒的标贴查到,AP热点本身是无加密的。
- 使用手机/PC的无线网卡连接IPC的AP热点,此时手机/PC就会获取到IPC分配的IP地址(按照设备发现描述的方法即可获取到),一般会是192.168.200.XXX,手机/PC的网关地址就是IPC的地址,一般会是192.168.200.1。
- 调用无线配置 API(见获取无线扫描AP列表 (无需签名校验)的描述)获取IPC扫描到的AP热点。
- 调用无线配置 API(见设置无线参数(无需签名校验)的描述)设置IPC要连接的无线网络(例如无线路由器的SSID和密码),使得IPC能够从网关处获取到IP地址。
- 如果网络是可以正常上网的话,IPC取到IP地址后很快就会亮蓝灯,此时表明IPC可以正常连接Internet了。
// 获取IPC扫描的AP热点
private void getWifiList() {
BasicConfig.getInstance(context).getApListWithoutAuth(sunmiDevice.getDeviceid(),
new RPCCallback‹RPCResponse‹IpcApBean››() {
@Override
public void onComplete(RPCResponse‹IpcApBean› result) {
if (result.code() == RPCErrorCode.SUCCESS) {
wifiListGetSuccess(result.data());
} else {
Log.i(TAG, "getApListWithoutAuth failed, errcode: " + result.code());
}
}
});
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (wifiList.size() == 0) {
setNoWifiVisible(View.VISIBLE);
}
}
}, TIMEOUT_GET_WIFI);
}
// 设置IPC连接的AP热点
private void setIpcWifi(String ssid, String psw) {
showLoadingDialog();
BasicConfig.getInstance(context).setWifiConfWithoutAuth(sunmiDevice.getDeviceid(),
ssid, psw, new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
if (result.code() == RPCErrorCode.SUCCESS) {
hideLoadingDialog();
shortTip("配置成功,请等待设备联网,联网后指示灯会变成蓝色");
createWaitDialog();
} else {
hideLoadingDialog();
shortTip("配置失败");
}
}
@Override
public void onError(Throwable t) {
hideLoadingDialog();
shortTip("配置失败");
}
});
}
激活IPC:
配网成功后,使用IPC的其它API时需要签名校验,所以在使用API之前需要激活IPC。激活只需要在第一次使用IPC时进行,后续都不再需要激活。
DeviceManage.getInstance(context).activate(ipcList.get(postion).getDeviceid(),
new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
if (result.code() == RPCErrorCode.SUCCESS || result.code() == RPCErrorCode.DEVICE_ACTIVATED) {
Log.i(TAG, "activate ipc success");
} else {
Log.i(TAG, "activate ipc failed");
}
}
@Override
public void onError(Throwable t) {
Log.i(TAG, "activate ipc failed");
}
});
4. 画面调整
由于IPC的人脸识别对于人脸图像质量有一定要求,因此在使用IPC前需要调整IPC的画面,以达到最好的体验效果。画面调整包括镜头的调焦、对焦。
private BasicConfig mBasicConfig;
public void init() {
...
mBasicConfig = BasicConfig.getInstance(context);
...
}
// 调焦
private void func1(){
...
mBasicConfig.setZoom(mDevice.getDeviceid(), zfBean.zoom, new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
Log.i(TAG, "setZoom, code:" + result.code());
}
});
...
}
// 自动对焦
private void func2() {
...
mBasicConfig.autoFocus(mDevice.getDeviceid(), xRelative, yRelative, new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
Log.d(TAG, "autoFocus, code:" + result.code());
if (result.code() == RPCErrorCode.SUCCESS) {
mBasicConfig.getZoomFocusConf(mDevice.getDeviceid(), new RPCCallback‹RPCResponse‹RPCResponse.ZoomFocusBean››() {
@Override
public void onComplete(RPCResponse‹RPCResponse.ZoomFocusBean› result) {
if (result.code() == RPCErrorCode.SUCCESS) {
zfBean = result.data();
mSbZoom.setProgress(zfBean.zoom);
}
}
});
}
}
});
...
}
// 自动对焦如果不够清晰,可以手动对焦进行微调
private void func3() {
...
mBasicConfig.manualFocus(mDevice.getDeviceid(), focus, new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
if (result.code() == RPCErrorCode.SUCCESS) {
zfBean.focus = focus;
}
}
});
....
}
5. 设置门线
设置门线主要是更精确地判断人流的方向(进门、出门、路过),提高人流统计的准确度。
private void func() {
...
PeopleFlowStats.getInstance(context).setDoorLine(mDevice.getDeviceid(), 0, lineStart[0],
lineStart[1], lineEnd[0], lineEnd[1], new RPCCallback‹RPCResponse›() {
@Override
public void onComplete(RPCResponse result) {
if (result.code() == RPCErrorCode.SUCCESS) {
stopPlay();
finish();
startActivity(new Intent(context, MainActivity.class));
}
}
});
...
}
6. 监听人脸识别消息
mIPCameraManager.setFaceDetectListener(new FaceDetectListener() {
@Override
public void onFaceDetect(String userId) {
String userName = null;
if (userName == null) {
showToast(getApplicationContext(), "未注册的用户进店");
} else {
showToast(getApplicationContext(), "用户[ " + userName + " ]进店");
}
}
});