集成佳明相机sdk

This commit is contained in:
qiji4215 2023-04-07 13:41:24 +08:00
parent 26982dffbf
commit c740953f24
24 changed files with 2787 additions and 2 deletions

View File

@ -23,8 +23,8 @@ class MainActivity : PermissionsActivity(), FSAFActivityCallbacks {
setContentView(binding.root)
// val navController = findNavController(R.id.nav_host_fragment_content_main)
// appBarConfiguration = AppBarConfiguration(navController.graph)
// setupActionBarWithNavController(navController, appBarConfiguration)
//// appBarConfiguration = AppBarConfiguration(navController.graph)
//// setupActionBarWithNavController(navController, appBarConfiguration)
fileChooser.setCallbacks(this@MainActivity)
// binding.fab.setOnClickListener { view ->

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,100 @@
package com.navinfo.collect.library.garminvirbxe;
import android.graphics.Bitmap;
import com.android.volley.VolleyError;
import java.util.ArrayList;
import com.navinfo.collect.library.sensor.SensorEventListener;
import com.navinfo.collect.library.sensor.ISensor.enmConnectionStatus;
/**
* @author dongpuxiao
* @version V1.0
* @ClassName: CameraEventListener.java
* @Date 2017年8月22日 下午2:24:43
* @Description: 相机操作接口定义
*/
public interface CameraEventListener extends SensorEventListener{
/**
*拍照成功
*
* @return
*/
public void OnSnapPictureResponse(HostBean hostBean, Bitmap bitmap, String picName, int tag);
/** 错误 */
public void requestError(HostBean hostBean, VolleyError e, CameraGarminVirbXE.enmCommandType commandType, int tag);
/**
* 开始自动拍照回调
*/
public void OnStartRecordResponse(HostBean hostBean, int tag);
/**
* 停止自动拍照回调
*/
public void OnStopRecordResponse(HostBean hostBean, int tag);
/**
* 停止自动拍照回调
*/
public void OnStatusResponse(HostBean hostBean, int tag);
/**
* 局域网搜索相机完成回调
* @param tag
* @param scanIpList
*/
public void OnSearchResponse(int tag,ArrayList<HostBean> scanIpList);
/**
* 状态发生改变时候回调
* @param connectStatus
*/
public void OnConnectStatusChanged(HostBean hostBean, enmConnectionStatus connectStatus, int tag);
/**
* 返回设备id
* @param devicesId
*/
public void OnGetDeviceInfo(HostBean hostBean, String devicesId, int tag);
/**
* 返回是否有gps信息
* @param status
*/
public void OnGetGpsStatusResponse(HostBean hostBean, boolean status, int tag);
/**
* 状态发生改变时候回调
* @param hostBean 相机
* @param cs
*/
public void OnConnectionStatusChanged(HostBean hostBean, enmConnectionStatus cs, int tag);
/**
* 设置自动拍照为1s
*/
public void OnContinuousPhototTimeLapseRateResponse(HostBean hostBean, int tag);
/**
* 启动自动拍照
*/
public void OnContinuousPhototTimeLapseRateStartResponse(HostBean hostBean, int tag);
/**
* 启动自动拍照
*/
public void OnContinuousPhototTimeLapseRateStopResponse(HostBean hostBean, int tag);
/**
* 单拍照
*/
public void OnContinuousPhototSingle(HostBean hostBean, String url, String name, int tag);
/**
* 获取多媒体信息
*
*/
public void OnGetMediaList(HostBean hostBean, String json, int tag);
}

View File

@ -0,0 +1,442 @@
package com.navinfo.collect.library.garminvirbxe;
import android.content.Context;
import android.location.Location;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import org.json.JSONException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.navinfo.collect.library.sensor.Camera;
import com.navinfo.collect.library.sensor.SensorEventListener;
import com.navinfo.collect.library.utils.SensorUtils;
public class CameraGarminVirbXE extends Camera /*implements LocationCallBack*/ {
private Command conmand;
private boolean bSnapPicProgress = false; // 每秒自动拍照标示
private boolean bMonitoring = false; //
private final Context mContext;
SensorWorkingMode mSensorWorkingMode;
private CameraEventListener cameraEventListener;
private WifiDiscovery mDiscoveryTask;
private static String mSavePath; // 保存照片路径
private enmConnectionStatus emuConnectionStatus;
private SimpleDateFormat formatter;
private long gpstime = 0;
private long ntptime = 0;
//private MyLocationManager myLocation;
public static String mPicUuid;
private Calendar calendar = Calendar.getInstance();
private Calendar gpscalendar = Calendar.getInstance();
private HostBean mHostBean;
private int mTag;
private boolean mContinuousPhototTimeLapseRate;
private boolean mNTPTimeFlag;
private boolean mGoogleTimeFlag;
public enum enmCommandType {
COMMAND_CAMERA_SNAPPICTURE, COMMAND_CAMERA_RECORD, COMMAND_CAMERA_STOP_RECORD,COMMAND_CAMERA_MONITORING,COMMAND_CAMERA_GETSTATUS, COMMAND_CAMERA_GETDEVICESINFO, COMMAND_CAMERA_GETGPSSTATUS,COMMAND_CAMERA_LIVEPREVIEW,
COMMAND_UNKNOW,COMMAND_PHOTO_MODE,COMMAND_PHOTO_TIME_LASPE_RATE,COMMAND_PHOTO_TIME_LASPE_RATE_STOP,COMMAND_CAMERA_SNAPPICTURE_SINGLE/*单独拍照*/,COMMAND_CAMERA_MEDIA_LIST/*多媒体信息集合*/
}
public CameraGarminVirbXE(Context mcontext) {
super(mcontext);
this.mContext = mcontext;
conmand = new Command(mContext);
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
/* // 初始化google gps 定位
MyLocationManager.init(mContext, CameraGarminVirbXE.this);
myLocation = MyLocationManager.getInstance();*/
mNTPTimeFlag = true;
new Thread(mGetNtpTimeProgress).start();
}
@Override
public enmSensorType GetSensorType() {
return enmSensorType.SENSOR_CAMEAR;
}
@Override
public enmConnectionStatus GetConnectionStatus() {
return emuConnectionStatus;
}
public enmConnectionStatus Connect(HostBean hostBean, SensorParams params) {
try {
setmHostBean(hostBean);
conmand.SetHandle(mCameraHandler);
RequestApi.setApiIp(getmTag(),params.getParams().get("ip").toString());
emuConnectionStatus = enmConnectionStatus.CONNECTTING;
cameraEventListener.OnConnectionStatusChanged(hostBean,emuConnectionStatus,mTag);
conmand.getStatus(hostBean,getmTag());
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
public enmConnectionStatus DisConnect() {
emuConnectionStatus = enmConnectionStatus.DISCONNECTTED;
return null;
}
@Override
public enmSignalQuality GetSignalQuality() {
// TODO Auto-generated method stub
return null;
}
@Override
public void GetGpsStatus() {
conmand.getGpsStatus(getmHostBean(),getmTag());
}
@Override
public void snapPicture(String picuuid) {
CameraGarminVirbXE.mPicUuid = picuuid;
if (mSensorWorkingMode == SensorWorkingMode.CAMEAR_VEDIO_720P
|| mSensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_1080P
|| mSensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_TIMELAPSE) {
if(getGoogleGpsTime() != 0) {
cameraEventListener.OnSnapPictureResponse(getmHostBean(),null, formatter.format(new Date(getGoogleGpsTime())),getmTag());
}
else
cameraEventListener.OnSnapPictureResponse(getmHostBean(),null,
formatter.format(new Date(System.currentTimeMillis())),getmTag());
}else if(mSensorWorkingMode==SensorWorkingMode.CAMERA_PHOTO_SINGLE){//单拍流程时间校验使用
conmand.snapSinglePicture(getmHostBean(),getmTag());
} else {
if (bSnapPicProgress) { // 代表一秒拍照线程开启
Log.e("CamerGarminVirb", "直接取路径");
conmand.getBitmapByUrl(getmHostBean(),getmTag());
} else {
Log.e("CamerGarminVirb", "拍照进行取路径");
conmand.snapPicture(getmHostBean(),true,getmTag());
}
}
}
@Override
public void StartRecording() {
if (mSensorWorkingMode == SensorWorkingMode.CAMEAR_PHOTO_12MP
|| mSensorWorkingMode == SensorWorkingMode.CAMEAR_PHOTO_7MP) {
if (!bSnapPicProgress) {
mSnapPicProgress.run();
bSnapPicProgress = true;
if(cameraEventListener != null)
cameraEventListener.OnStartRecordResponse(getmHostBean(),getmTag());
}
} else if (mSensorWorkingMode == SensorWorkingMode.CAMEAR_VEDIO_720P
|| mSensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_1080P
|| mSensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_TIMELAPSE) {
conmand.StartRecording(getmHostBean(),getmTag());
bMonitoring = true;
mCameraHandler.postDelayed(mGetStatusProgress, 5000/*调大值域,对应录像命令处理结束后再执行*/);
} else if(mSensorWorkingMode == SensorWorkingMode.CAMEAR_PHOTO_CONTINUOUS_PHOTO){
// 其他模式下干其他事情
//conmand.snapPicture(getmHostBean(),false,getmTag());
//优先设置缩时时间为1s
if(!mContinuousPhototTimeLapseRate){
conmand.setContinuousPhototTimeLapseRate(getmHostBean(),getmTag());
mContinuousPhototTimeLapseRate = true;
}
else {
conmand.snapPicture(getmHostBean(),false,getmTag());
bMonitoring = true;
mCameraHandler.postDelayed(mGetStatusProgress, 5000/*调大值域,对应录像命令处理结束后再执行*/);
}
}
}
@Override
public void StopRecording() {
if (mSensorWorkingMode == SensorWorkingMode.CAMEAR_PHOTO_12MP
|| mSensorWorkingMode == SensorWorkingMode.CAMEAR_PHOTO_7MP) {
mCameraHandler.removeCallbacks(mSnapPicProgress);
if(cameraEventListener != null)
cameraEventListener.OnStopRecordResponse(getmHostBean(),getmTag());
bSnapPicProgress = false;
} else if (mSensorWorkingMode == SensorWorkingMode.CAMEAR_VEDIO_720P
|| mSensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_1080P
|| mSensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_TIMELAPSE) {
conmand.StopRecording(getmHostBean(),getmTag());
mCameraHandler.removeCallbacks(mGetStatusProgress);
bMonitoring = false;
} else if(mSensorWorkingMode == SensorWorkingMode.CAMEAR_PHOTO_CONTINUOUS_PHOTO){
mContinuousPhototTimeLapseRate = false;
conmand.stopContinuousPhototTimeLapseRate(getmHostBean(),getmTag());
mCameraHandler.removeCallbacks(mGetStatusProgress);
bMonitoring = false;
}
}
@Override
public void Search(boolean isReadCache) {
//先停止当前搜索
StopSearch();
mDiscoveryTask = new WifiDiscovery(mContext, cameraEventListener,isReadCache);
mDiscoveryTask.setTag(getmTag());
mDiscoveryTask.execute();
}
@Override
public void StopSearch() {
if(mDiscoveryTask!=null){
if(!mDiscoveryTask.isCancelled()){
boolean result = mDiscoveryTask.cancel(true);
Log.e("StopSearch",result+"===");
}
mDiscoveryTask = null;
}
}
@Override
public int RegisterSensorEvent(SensorEventListener sensorEventLister) {
cameraEventListener = (CameraEventListener) sensorEventLister;
return conmand.RegisterSensorEvent(cameraEventListener);
}
@Override
public void SetMode(SensorWorkingMode sensorWorkingMode) {
mSensorWorkingMode = sensorWorkingMode;
if (sensorWorkingMode == SensorWorkingMode.CAMERA_VEDIO_TIMELAPSE){
/*外业需求变更,不在强制设置缩时模式,有作业员自己设置相机*///conmand.setTimeLapse(getmHostBean(),getmTag());
}
else if(sensorWorkingMode==SensorWorkingMode.CAMEAR_PHOTO_CONTINUOUS_PHOTO){
conmand.setContinuousPhoto(getmHostBean(),getmTag());
}else if(sensorWorkingMode==SensorWorkingMode.CAMERA_PHOTO_SINGLE){
conmand.setContinuousPhotoSingle(getmHostBean(),getmTag());
}
}
//获取指定目录多媒体信息
public void mediaList(String path){
conmand.mediaList(getmHostBean(),getmTag(),path);
}
//获取相机模式
public SensorWorkingMode GetMode() {
return mSensorWorkingMode;
}
// 每隔30s进行一次获取连接
private Runnable mGetStatusProgress = new Runnable() {
@Override
public void run() {
/*if(1==1)
return;*/
conmand.getMonitoringStatus(getmHostBean(),getmTag());
if(bMonitoring)
mCameraHandler.postDelayed(mGetStatusProgress, 1000*30l/*降低频率,解决机器性能下降导致命令无效*/);
}
};
// 每隔1000s进行一次拍照
private Runnable mSnapPicProgress = new Runnable() {
@Override
public void run() {
conmand.snapPicture(getmHostBean(),false,getmTag());
}
};
//停止时间线程
public void stopTimeThread(){
mGoogleTimeFlag = false;
mNTPTimeFlag = false;
ntptime = 0;
gpstime = 0;
}
private Runnable mGetNtpTimeProgress = new Runnable() {
@Override
public void run() {
while (mNTPTimeFlag) {
if (SensorUtils.isNetworkAvailable(mContext)) {
Date dateNTP = SensorUtils.syncNow();
if (dateNTP != null) {
ntptime = dateNTP.getTime();
calendar.setTime(dateNTP);
//Log.e("AAA", "ntp time :" + DateUtils.formatTime(dateNTP));
mNTPTimeFlag = false;
mGoogleTimeFlag = true;
//获取NTP时间后开始启动计时线程
new Thread(mNtpClockTimeProgress).start();
new Thread(mGpsClockTimeProgress).start();
}
}
//30秒执行一次降低频率节省电量
try{
Thread.sleep(30000);
}catch (Exception e){
}
}
}
};
/**
* 计时器
*/
private Runnable mNtpClockTimeProgress = new Runnable() {
@Override
public void run() {
while (mGoogleTimeFlag) {
if(ntptime != 0) {
int second = calendar.get(Calendar.SECOND);
second += 1;
calendar.set(Calendar.SECOND, second);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try{
Thread.sleep(1);
}catch (Exception e){
}
}
}
}
};
/**
* 计时器
*/
private Runnable mGpsClockTimeProgress = new Runnable() {
@Override
public void run() {
while (mGoogleTimeFlag) {
if(gpstime != 0) {
int second = gpscalendar.get(Calendar.SECOND);
second += 1;
gpscalendar.set(Calendar.SECOND, second);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try{
Thread.sleep(1);
}catch (Exception e){
}
}
}
}
};
private Handler mCameraHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SensorUtils.HADNLE_CONNECT_OK:
emuConnectionStatus = enmConnectionStatus.CONNECTTED;
cameraEventListener
.OnConnectionStatusChanged(getmHostBean(),emuConnectionStatus,getmTag());
break;
case SensorUtils.HADNLE_CONNECT_FAIL:
Log.e("AAA", "断开连接~~~~~~~~~~");
emuConnectionStatus = enmConnectionStatus.DISCONNECTTED;
cameraEventListener
.OnConnectionStatusChanged(getmHostBean(),emuConnectionStatus,getmTag());
break;
case SensorUtils.HADNLE_SNAPPICTURE:// 定时拍照返回
if (bSnapPicProgress)
mCameraHandler.post(mSnapPicProgress);
case SensorUtils.HADNLE_MONITORING:
Log.e("AAA", "状态监测中....");
break;
default:
break;
}
}
};
/**
* 设置照片保存路径
*
* @param savePath
*/
public void SetCameraPictureSavaPath(String savePath) {
mSavePath = savePath;
}
//获取google定位时间
public Long getGoogleGpsTime() {
long time = 0;
if (ntptime != 0) {
time = calendar.getTime().getTime();
return time;
} else {
if(gpstime != 0 )
time = gpscalendar.getTime().getTime();
return time;
}
}
/**
* 获取照片保存路径
*
* @return
*/
public static String getCameraPcitureSavePath() {
if ("".equals(mSavePath) || null == mSavePath)
return SensorUtils.STR_CAMERA_PICTURE_SAVEPATH;
else
return mSavePath;
}
/* @Override
public void onCurrentLocation(Location location) {
if(location != null) {
Log.e("AAA", "onCurrentLocation");
gpstime = location.getTime();
gpscalendar.setTime(new Date(gpstime));
}
else
gpstime = 0;
if (myLocation != null)
myLocation.destoryLocationManager();
}*/
public HostBean getmHostBean() {
return mHostBean;
}
public void setmHostBean(HostBean mHostBean) {
this.mHostBean = mHostBean;
}
public int getmTag() {
return mTag;
}
public void setmTag(int mTag) {
this.mTag = mTag;
}
}

View File

@ -0,0 +1,224 @@
package com.navinfo.collect.library.garminvirbxe;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import com.navinfo.collect.library.utils.PreferencesUtils;
public class Command {
private Context mContext;
private static CameraEventListener cameraEventListener;
String mPicUrl; // 返回照片的uri
Bitmap mBitmap;
private RequestManager requestManager;
private Handler mHandle;
public static Boolean createBitmap = false; // 是否生成bitmap
public Command(Context mContext) {
this.mContext = mContext;
requestManager = new RequestManager(mContext);
}
public void SetHandle(Handler mHandle){
this.mHandle = mHandle;
requestManager.SetRequestHandle(mHandle);
}
/**
* 拍照命令 返回照片
*/
public void snapPicture(HostBean hostBean,Boolean createBitmap,int tag) {
SensorParams params = new SensorParams();
params.put("command", "snapPicture");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_SNAPPICTURE,hostBean,tag);
Command.createBitmap = createBitmap;
}
/**
* 单拍照拍照命令 返回照片
*/
public void snapSinglePicture(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "snapPicture");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_SNAPPICTURE_SINGLE,hostBean,tag);
}
/**
* 获取指定目录多媒体信息
*/
public void mediaList(HostBean hostBean,int tag,String path) {
SensorParams params = new SensorParams();
params.put("command", "mediaList");
params.put("path",path+"");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_MEDIA_LIST,hostBean,tag);
}
/**
* 获取相机状态
*/
public void getStatus(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "status");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETSTATUS,hostBean,tag);
}
/**
* (主要用于测试请求)
*/
public void getWifiTestStatus(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
//params.put("command", "status");解决相机性能下降后获取status慢问题
params.put("command", "deviceInfo");
sendConmandWifi(params, true, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETSTATUS,hostBean,tag);
}
/**
* (主要用于监控状态请求)
*/
public void getMonitoringStatus(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "deviceInfo");//解决相机性能下降后获取status慢问题
//测试代码
//params.put("command", "mediaList");
//D:/DCIM/797_VIRB/VIRB0110.jpg
//..\/DCIM\/797_VIRB\/VIRB0110.jpg
//D:/DCIM/797_VIRB/VIRB0110
//params.put("path",RequestApi.getApiMediaUri(tag)+"/media/photo/DCIM/797_VIRB/VIRB0110.jpg");
//params.put("path","D:/DCIM/797_VIRB/");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_MONITORING,hostBean,tag);
}
/**
* 获取设备信息
*/
public void getDeviceInfo(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "deviceInfo");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETDEVICESINFO,hostBean,tag);
}
/**
* 获取gps是否连接
*/
public void getGpsStatus(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "status");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETGPSSTATUS,hostBean,tag);
}
/**
* 设置缩时模式
*/
public void setTimeLapse(HostBean hostBean,int tag){
SensorParams params = new SensorParams();
params.put("command", "updateFeature");
params.put("feature", "videoMode");
params.put("value", "缩时");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_UNKNOW,hostBean,tag);
}
/**
* 停止录像
*/
public void StopRecording(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "stopRecording");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_STOP_RECORD,hostBean,tag);
}
/**
* 开始录像
*/
public void StartRecording(HostBean hostBean,int tag) {
SensorParams params = new SensorParams();
params.put("command", "startRecording");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_RECORD,hostBean,tag);
}
/**
* 设置连续拍照模式
*/
public void setContinuousPhoto(HostBean hostBean,int tag){
SensorParams params = new SensorParams();
params.put("command", "updateFeature");
params.put("feature", "photoMode");
params.put("value", "Timelapse");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_MODE,hostBean,tag);
}
/**
* 设置单拍照模式
*/
public void setContinuousPhotoSingle(HostBean hostBean,int tag){
SensorParams params = new SensorParams();
params.put("command", "updateFeature");
params.put("feature", "photoMode");
params.put("value", "Single");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_MODE,hostBean,tag);
}
public void setContinuousPhototTimeLapseRate(HostBean hostBean,int tag){
SensorParams params = new SensorParams();
params.put("command", "updateFeature");
params.put("feature", "photoTimeLapseRate");
params.put("value", "1s");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_TIME_LASPE_RATE,hostBean,tag);
}
/**
* 停止连拍
*/
public void stopContinuousPhototTimeLapseRate(HostBean hostBean,int tag){
SensorParams params = new SensorParams();
params.put("command", "stopStillRecording");
sendConmand(params, false, com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_TIME_LASPE_RATE_STOP,hostBean,tag);
}
public int RegisterSensorEvent(CameraEventListener cameraEventListener) {
Command.cameraEventListener = cameraEventListener;
return 0;
}
/**
* 发送命令
*
* @param params
* isDebug 参数用来测试当测试连接时候需要将超时时间该短普通拍照请求超时时间设长
* * @param tag
* @return
*/
public void sendConmand(SensorParams params, Boolean isDebug,
com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType type,HostBean hostBean,int tag) {
IRequest.post(mContext, RequestApi.getApiUri(tag), params, isDebug,
cameraEventListener, type,hostBean,tag);
}
/**
* 发送命令
*
* @param params
* isDebug 参数用来测试当测试连接时候需要将超时时间该短普通拍照请求超时时间设长
* * @param tag
* @return
*/
public void sendConmandWifi(SensorParams params, Boolean isDebug,
com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType type,HostBean hostBean,int tag) {
IRequest.post(mContext, RequestApi.getApiWifiIp(), params, isDebug,
cameraEventListener, type,hostBean,tag);
}
/**
*
* @param hostBean
* * @param tag
*/
public void getBitmapByUrl(HostBean hostBean,int tag) {
String path = PreferencesUtils.getSpText(mContext, "pictureUri");
IRequest.getbitmap(mContext, hostBean,path, false, cameraEventListener,tag);
}
}

View File

@ -0,0 +1,107 @@
package com.navinfo.collect.library.garminvirbxe;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import com.navinfo.collect.library.utils.NetScanInfo;
import java.util.ArrayList;
import java.util.HashMap;
public class HostBean implements Parcelable {
public static final String PKG = "info.lamatricexiste.network";
public static final String EXTRA = PKG + ".extra";
public static final String EXTRA_POSITION = PKG + ".extra_position";
public static final String EXTRA_HOST = PKG + ".extra_host";
public static final String EXTRA_TIMEOUT = PKG + ".network.extra_timeout";
public static final String EXTRA_HOSTNAME = PKG + ".extra_hostname";
public static final String EXTRA_BANNERS = PKG + ".extra_banners";
public static final String EXTRA_PORTSO = PKG + ".extra_ports_o";
public static final String EXTRA_PORTSC = PKG + ".extra_ports_c";
public static final String EXTRA_SERVICES = PKG + ".extra_services";
public static final int TYPE_GATEWAY = 0;
public static final int TYPE_COMPUTER = 1;
public int deviceType = TYPE_COMPUTER;
public int isAlive = 1;
public int position = 0;
public int responseTime = 0; // ms
public String ipAddress = null;
public String hostname = null;
public String hardwareAddress = com.navinfo.collect.library.utils.NetScanInfo.NOMAC;
public String nicVendor = "Unknown";
public String os = "Unknown";
public HashMap<Integer, String> services = null;
public HashMap<Integer, String> banners = null;
public ArrayList<Integer> portsOpen = null;
public ArrayList<Integer> portsClosed = null;
public HostBean() {
// New object
}
public HostBean(Parcel in) {
// Object from parcel
readFromParcel(in);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(deviceType);
dest.writeInt(isAlive);
dest.writeString(ipAddress);
dest.writeString(hostname);
dest.writeString(hardwareAddress);
Log.e("AAA", "writeToParcelipAddress"+ipAddress);
Log.e("AAA", "writeToParcelhardwareAddress"+hardwareAddress);
dest.writeString(nicVendor);
dest.writeString(os);
dest.writeInt(responseTime);
dest.writeInt(position);
dest.writeMap(services);
dest.writeMap(banners);
dest.writeList(portsOpen);
dest.writeList(portsClosed);
}
@SuppressWarnings("unchecked")
private void readFromParcel(Parcel in) {
deviceType = in.readInt();
isAlive = in.readInt();
ipAddress = in.readString();
hostname = in.readString();
hardwareAddress = in.readString();
Log.e("AAA", "readFromParcelParcelipAddress"+ipAddress);
Log.e("AAA", "readFromParcelhardwareAddress"+hardwareAddress);
nicVendor = in.readString();
os = in.readString();
responseTime = in.readInt();
position = in.readInt();
services = in.readHashMap(null);
banners = in.readHashMap(null);
portsOpen = in.readArrayList(Integer.class.getClassLoader());
portsClosed = in.readArrayList(Integer.class.getClassLoader());
}
@SuppressWarnings("unchecked")
public static final Creator CREATOR = new Creator() {
@Override
public HostBean createFromParcel(Parcel in) {
return new HostBean(in);
}
@Override
public HostBean[] newArray(int size) {
return new HostBean[size];
}
};
}

View File

@ -0,0 +1,34 @@
package com.navinfo.collect.library.garminvirbxe;
import android.content.Context;
public class IRequest {
/**
*
* @param context
* @param url
* @param params
* @param isDebug
* @param cmaeralistener
*/
public static void post(Context context, String url, SensorParams params,
Boolean isDebug, CameraEventListener cmaeralistener,
com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType type,HostBean hostBean,int tag) {
RequestManager
.post(url, context, params, isDebug, cmaeralistener, type,hostBean,tag);
}
/**
*
* @param context
* @param hostBean
* @param url
* @param isthumb
*/
public static void getbitmap(Context context, HostBean hostBean,String url, Boolean isthumb,
CameraEventListener cameralistener,int tag) {
RequestManager.getbitmap(context, hostBean,url, isthumb, cameralistener,tag);
}
}

View File

@ -0,0 +1,83 @@
/*
* Copyright (C) 2009-2010 Aubort Jean-Baptiste (Rorist)
* Licensed under GNU's GPL 2, see README
*/
package com.navinfo.collect.library.garminvirbxe;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RateControl {
private final String TAG = "RateControl";
private static final int BUF = 512;
private final int REACH_TIMEOUT = 5000;
private final String CMD = "/system/bin/ping -A -q -n -w 3 -W 2 -c 3 ";
private final String PTN = "^rtt min\\/avg\\/max\\/mdev = [0-9\\.]+\\/[0-9\\.]+\\/([0-9\\.]+)\\/[0-9\\.]+ ms.*";
private Pattern mPattern;
private String line;
public String indicator = null;
public int rate = 800; // Slow start
public RateControl() {
mPattern = Pattern.compile(PTN);
}
public void adaptRate() {
int response_time = 0;
if ((response_time = getAvgResponseTime(indicator)) > 0) {
if (response_time > 100) { // Most distanced hosts
rate = response_time * 5; // Minimum 500ms
} else {
rate = response_time * 10; // Maximum 1000ms
}
if (rate > REACH_TIMEOUT) {
rate = REACH_TIMEOUT;
}
}
}
private int getAvgResponseTime(String host) {
// TODO: Reduce allocation
BufferedReader reader = null;
Matcher matcher;
try {
final Process proc = Runtime.getRuntime().exec(CMD + host);
reader = new BufferedReader(new InputStreamReader(proc.getInputStream()), BUF);
while ((line = reader.readLine()) != null) {
matcher = mPattern.matcher(line);
if (matcher.matches()) {
reader.close();
return (int) Float.parseFloat(matcher.group(1));
}
}
reader.close();
} catch (Exception e) {
Log.e(TAG, "Can't use native ping: " + e.getMessage());
try {
final long start = System.nanoTime();
if (InetAddress.getByName(host).isReachable(REACH_TIMEOUT)) {
Log.i(TAG, "Using Java ICMP request instead ...");
return (int) ((System.nanoTime() - start) / 1000);
}
} catch (Exception e1) {
Log.e(TAG, e1.getMessage());
}
} finally {
try {
if (reader != null) {
reader.close();
}
} catch(IOException e){
}
}
return rate;
}
}

View File

@ -0,0 +1,55 @@
package com.navinfo.collect.library.garminvirbxe;
import java.util.HashMap;
/**
* @author dongpuxiao
* @version V1.0
* @ClassName: RequestApi
* @Date 2017/1/12
* @Description: ${TODO}(请求地址类)
*/
public class RequestApi {
// 该类用于管理http请求地址以及接口函数
private static String apiWifiIp;
//缓存多地址集合
private static HashMap<Integer,String> hashMap = new HashMap<Integer,String>();
// 获取测试服务器接口
public static String getApiUri(int key) {
String apiIp = hashMap.get(key);
if (apiIp == null || "".equals(apiIp))
return "http://192.168.0.1/virb";
else
return "http://"+apiIp+"/virb";
}
// 获取测试服务器接口
public static String getApiMediaUri(int key) {
String apiIp = hashMap.get(key);
if (apiIp == null || "".equals(apiIp))
return "http://192.168.0.1";
else
return "http://"+apiIp+"";
}
//设置地址ip
public static void setApiIp(int key,String ip) {
hashMap.put(key,ip);
}
//获取wifi测试地址ip
public static String getApiWifiIp() {
if (apiWifiIp == null || "".equals(apiWifiIp))
return "http://192.168.0.1/virb";
else
return "http://"+apiWifiIp+"/virb";
}
//设置wifi测试ip
public static void setApiWifiIp(String apiWifiIp) {
RequestApi.apiWifiIp = apiWifiIp;
}
}

View File

@ -0,0 +1,17 @@
package com.navinfo.collect.library.garminvirbxe;
import com.android.volley.VolleyError;
public interface RequestJsonListener<T> {
/**
* 成功
*
* @param <T>
*/
public void requestSuccess(T result);
/**
* 错误
*/
public void requestError(VolleyError e);
}

View File

@ -0,0 +1,14 @@
package com.navinfo.collect.library.garminvirbxe;
import android.graphics.Bitmap;
import com.android.volley.VolleyError;
public interface RequestListener {
/** 成功 */
public void requestSuccess(Bitmap bitmap,String savePath);
/** 错误 */
public void requestError(VolleyError e);
}

View File

@ -0,0 +1,326 @@
package com.navinfo.collect.library.garminvirbxe;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Handler;
import android.util.Log;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.navinfo.collect.library.utils.PreferencesUtils;
import com.navinfo.collect.library.utils.SensorUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
@SuppressLint("NewApi")
public class RequestManager {
public static RequestQueue mRequestQueue;
private static Context mContext;
static String picThumbUrl;
private static String picUrl;
private static Handler mHandle;
private static int currentFailCount = 0; // 记录发送命令失败次数
private static int failCount = 3; // 记录发送命令失败次数
public RequestManager(Context mContext) {
mRequestQueue = Volley.newRequestQueue(mContext);
RequestManager.mContext = mContext;
}
public void SetRequestHandle(Handler mHandle) {
RequestManager.mHandle = mHandle;
}
public static void getbitmap(Object object, HostBean hostBean, String url, Boolean isThumb,
CameraEventListener listener, int tag) {
ImageRequest imageRequest = new ImageRequest(url,
responseBitmapListener(listener, url, isThumb, hostBean, tag), 0, 0,
Config.RGB_565, responseError(listener, false, null,hostBean, tag));
addRequest(imageRequest, tag);
}
/**
* 返回String
*
* @param url 接口
* @param tag 上下文
* @param params post需要传的参数
* @param listener 回调
*/
public static void post(String url, Object object, SensorParams params,
Boolean isDebug, CameraEventListener listener,
com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType commandType, HostBean hostBean, int tag) {
JsonObjectRequest jsonRequest;
if (isDebug) {
jsonRequest = new JsonObjectRequest(Request.Method.POST, url,
params.getParams(), responseListener(listener, commandType,
isDebug, hostBean, tag), responseError(listener, isDebug, commandType,hostBean, tag));
jsonRequest
.setRetryPolicy(new DefaultRetryPolicy(1 * 1000, 1, 1.0f));
} else {
jsonRequest = new JsonObjectRequest(Request.Method.POST, url,
params.getParams(), responseListener(listener, commandType,
isDebug, hostBean, tag), responseError(listener, isDebug, commandType,hostBean, tag));
//超时时间
int timeOut = 10 * 1000;
//如果为获取GPS状态修改超时时间解决连续拍照导致相机性能下降获取时间过长问题
if (commandType == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETSTATUS)
timeOut = 100 * 1000;
//解决性能问题
if (commandType == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_MEDIA_LIST) {
timeOut = 100 * 1000;
}
jsonRequest.setRetryPolicy(new DefaultRetryPolicy(timeOut, 1,
1.0f));
}
addRequest(jsonRequest, tag);
}
/**
* 成功消息监听 返回String
*
* @param listener String 接口
* @return
*/
protected static Listener<JSONObject> responseListener(
final CameraEventListener listener, final com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType type,
final Boolean isDebug, final HostBean hostBean, final int tag) {
return new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject json) {
try {
if (isDebug) {
mHandle.sendEmptyMessage(SensorUtils.HADNLE_STATUS_OK);
} else {
try {
Log.e("AAA", type + (json == null ? "" : json.toString()));
} catch (Exception e) {
}
if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_MONITORING) {
currentFailCount = 0;
mHandle.sendEmptyMessage(SensorUtils.HADNLE_MONITORING);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETSTATUS) {
currentFailCount = 0;
mHandle.sendEmptyMessage(SensorUtils.HADNLE_CONNECT_OK);
if (listener != null)
listener.OnStatusResponse(hostBean, tag);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_RECORD) {
if (listener != null)
listener.OnStartRecordResponse(hostBean, tag);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_STOP_RECORD) {
if (listener != null)
listener.OnStopRecordResponse(hostBean, tag);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_TIME_LASPE_RATE) {
if (listener != null)
listener.OnContinuousPhototTimeLapseRateResponse(hostBean, tag);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_SNAPPICTURE) {
if (listener != null)
listener.OnContinuousPhototTimeLapseRateStartResponse(hostBean, tag);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_SNAPPICTURE_SINGLE) {/*增加单独拍照流程,增加时间校验流程*/
if (listener != null) {
JSONObject mediajson;
try {
if(json!=null){
mediajson = new JSONObject(json.getString("media").toString());
String url = mediajson.get("url").toString();
String name = mediajson.get("name").toString();
listener.OnContinuousPhototSingle(hostBean, url, name, tag);
Log.e("AAA", "获取单张拍照" + url);
}
} catch (JSONException e) {
e.printStackTrace();
listener.OnContinuousPhototSingle(hostBean, null, null, tag);
}
}
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_MEDIA_LIST) {
if (listener != null&&json!=null){
listener.OnGetMediaList(hostBean, json.toString(), tag);
}
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_TIME_LASPE_RATE_STOP) {
if (listener != null)
listener.OnContinuousPhototTimeLapseRateStopResponse(hostBean, tag);
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETGPSSTATUS) {
if (listener != null&&json!=null) {
String lat = "";
String lon = "";
try {
lat = json.get("gpsLatitude").toString();
lon = json.get("gpsLongitude").toString();
Log.e("AAA", "获取设备time" + json.get("recordingTime").toString());
} catch (JSONException e) {
e.printStackTrace();
}
if (!lat.equals("") && !lon.equals(""))
listener.OnGetGpsStatusResponse(hostBean, true, tag);
else
listener.OnGetGpsStatusResponse(hostBean, false, tag);
}
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_CAMERA_GETDEVICESINFO) {
JSONArray jsonobj;
try {
if(json!=null){
jsonobj = new JSONArray(json.getString("deviceInfo").toString());
JSONObject ob = (JSONObject) jsonobj.get(0);
if (listener != null)
Log.e("AAA", "获取设备id");
listener.OnGetDeviceInfo(hostBean, ob.getString(
"deviceId").toString(), tag);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else if (type == com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType.COMMAND_PHOTO_MODE) {//相机模式设置增加容错防止错误解析影响到预览功能
} else {//预览命令解析
JSONObject mediajson;
try {
if(json!=null){
mediajson = new JSONObject(json.getString("media").toString());
picUrl = mediajson.get("url").toString();
picThumbUrl = mediajson.get("thumbUrl").toString();
PreferencesUtils.saveSpText(mContext, "pictureUri",
picThumbUrl);
PreferencesUtils.saveSpText(mContext,
"pictureThumbUri", picUrl);
mHandle.sendEmptyMessage(SensorUtils.HADNLE_SNAPPICTURE);
if (Command.createBitmap) {
getbitmap(mContext, hostBean, picThumbUrl, false, listener, tag);
}
}
// Toast.makeText(mContext, "成功" + picThumbUrl,Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
protected static Listener<Bitmap> responseBitmapListener(
final CameraEventListener listener, final String url,
final Boolean isThumb, final HostBean hostBean, final int tag) {
return new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
File file = new File(url);
if (!isThumb) {
listener.OnSnapPictureResponse(hostBean,
bitmap,
CameraGarminVirbXE.mPicUuid
+ "_thumbnail."
+ SensorUtils.getExtensionName(file
.getName()), tag);
String url = PreferencesUtils.getSpText(mContext,
"pictureThumbUri").toString();
getbitmap(mContext, hostBean, url, true, listener, tag);
} else {
SaveFileRunnable runable = new SaveFileRunnable(bitmap,
CameraGarminVirbXE.mPicUuid
+ "."
+ SensorUtils.getExtensionName(file
.getName()));
Thread th = new Thread(runable);
th.start();
}
}
};
}
/**
* String 返回错误监听
*
* @param listener String 接口
* @return
*/
protected static Response.ErrorListener responseError(
final CameraEventListener listener, final Boolean isDebug, final com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE.enmCommandType commandType, final HostBean hostBean, final int tag) {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError e) {
try {
if (isDebug) {
mHandle.sendEmptyMessage(SensorUtils.HADNLE_STATUS_FAIL);
} else {
if (listener != null)
listener.requestError(hostBean, e, commandType,tag);
currentFailCount++;
if (currentFailCount == failCount)
mHandle.sendEmptyMessage(SensorUtils.HADNLE_CONNECT_FAIL);
}
} catch (Exception e1) {
Log.e("AAA",e1.getStackTrace()+"");
}
}
};
}
public static void addRequest(Request<?> request, Object tag) {
if (tag != null) {
request.setTag(tag);
}
mRequestQueue.add(request);
}
/**
* 当主页面调用协议 在结束该页面调用此方法
*
* @param tag
*/
public static void cancelAll(Object tag) {
mRequestQueue.cancelAll(tag);
}
public static class SaveFileRunnable implements Runnable {
private Bitmap mBitmap;
private String fileName;
public SaveFileRunnable(Bitmap mBitmap, String fileName) {
this.mBitmap = mBitmap;
this.fileName = fileName;
}
@Override
public void run() {
try {
SensorUtils.saveFile(mBitmap, fileName + ".temp");
String savePath = CameraGarminVirbXE.getCameraPcitureSavePath();
File oldName = new File(savePath + fileName + ".temp");
if (oldName != null) {
oldName.renameTo(new File(savePath + fileName));
}
Log.e("AAA", "保存图片成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

View File

@ -0,0 +1,41 @@
package com.navinfo.collect.library.garminvirbxe;
import org.json.JSONException;
import org.json.JSONObject;
public class SensorParams extends JSONObject {
private JSONObject params;
public SensorParams() {
init();
}
public SensorParams(String key, String value) {
init();
put(key, value);
}
private void init() {
params = new JSONObject();
}
/**
* @param key
* @param value
*/
public void put(String key, String value) {
if (key != null && value != null) {
try {
params.put(key, value);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public JSONObject getParams() {
return params;
}
}

View File

@ -0,0 +1,509 @@
package com.navinfo.collect.library.garminvirbxe;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.util.Log;
import com.navinfo.collect.library.utils.NetScanInfo;
import com.navinfo.collect.library.utils.NetScanPrefs;
import com.navinfo.collect.library.utils.PreferencesUtils;
import com.navinfo.collect.library.utils.SensorUtils;
import static com.navinfo.collect.library.utils.NetScanInfo.NOMAC;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WifiDiscovery extends AsyncTask<Void, HostBean, Void> {
private final String TAG = "DefaultDiscovery";
private final static int[] DPORTS = {139, 445, 22, 80};
private final static int TIMEOUT_SCAN = 3600; // seconds
private final static int TIMEOUT_SHUTDOWN = 10; // seconds
private final static int THREADS = 25; // FIXME: Test, plz set in options
// again ?
private final int mRateMult = 5; // Number of alive hosts between Rate
private int pt_move = 2; // 1=backward 2=forward
private ExecutorService mPool;
private boolean doRateControl;
private RateControl mRateControl;
private int mSearchStatus = 0; // 0为使用缓存ip进行连接测试 1从新扫描ip进行连接测试
private boolean mBstatus = false;
protected long ip;
protected long start = 0;
protected long end = 0;
protected long size = 0;
protected int hosts_done = 0;
private Context mContext;
private Command command;
private int addressIndex = 0;
private SharedPreferences prefs;
private NetScanInfo net;
private CameraEventListener cameraEventListener;
private ArrayList<HostBean> scanHostBeanList;
private ArrayList<HostBean> hosts;
private ArrayList<HostBean> hostsCache;
private int tag;
public WifiDiscovery(Context mContext,
CameraEventListener cameraEventListener, boolean isReadCache) {
this.mContext = mContext;
this.cameraEventListener = cameraEventListener;
command = new Command(mContext);
command.SetHandle(mHandler);
scanHostBeanList = new ArrayList<HostBean>();
hosts = new ArrayList<HostBean>();
hostsCache = new ArrayList<HostBean>();
prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
net = new NetScanInfo(mContext);
mRateControl = new RateControl();
setScanInfo();
if (isReadCache)
getLocalIpSend();
else{
mBstatus = true;
Log.e("mBstatus","WifiDiscovery==="+mBstatus);
}
}
//优先本地缓存记录连接
private void getLocalIpSend() {
String cacheHostBean = PreferencesUtils.getSpText(mContext, "cacheHostBean").toString();
if (!"".equals(cacheHostBean)) {
mSearchStatus = 0;
try {
JSONArray jsonArray = new JSONArray(cacheHostBean);
if (jsonArray != null && jsonArray.length() > 0) {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jobj = jsonArray.getJSONObject(i);
if (jobj != null) {
HostBean hostBean = new HostBean();
if (jobj.has("ipAddress"))
hostBean.ipAddress = jobj.getString("ipAddress");
if (jobj.has("hardwareAddress"))
hostBean.hardwareAddress = jobj.getString("hardwareAddress");
hostsCache.add(hostBean);
}
}
}
} catch (Exception e) {
Log.e("AAA", "getLocalIpSend异常" + e.toString());
}
//如果缓存转换失败重新执行扫描
if (hostsCache == null || hostsCache.size() == 0) {
mBstatus = true;
} else {
//不启动扫描
mBstatus = false;
Log.e("mBstatus","getLocalIpSend==="+mBstatus);
sendConnectCommand();
}
} else {
mBstatus = true;
}
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SensorUtils.HADNLE_STATUS_OK:
scanHostBeanList.add(mCurrentHostBean);
sendCommand();
break;
case SensorUtils.HADNLE_STATUS_FAIL:
//使用缓存获取状态失败了代表ip发生编化需要重新扫描
if (mSearchStatus == 0) {
//重置索引
addressIndex = 0;
scanHostBeanList.clear();
hostsCache.clear();
mBstatus = true;
//扫描失败后重新启动搜索
mSearchStatus = 0;
pingAllIp();
} else {
sendCommand();
}
break;
default:
break;
}
}
};
private HostBean mCurrentHostBean;
private void setScanInfo() {
ip = NetScanInfo.getUnsignedLongFromIp(net.ip);
if (prefs.getBoolean(NetScanPrefs.KEY_IP_CUSTOM,
NetScanPrefs.DEFAULT_IP_CUSTOM)) {
// Custom IP
start = NetScanInfo.getUnsignedLongFromIp(prefs.getString(
NetScanPrefs.KEY_IP_START, NetScanPrefs.DEFAULT_IP_START));
end = NetScanInfo.getUnsignedLongFromIp(prefs.getString(
NetScanPrefs.KEY_IP_END, NetScanPrefs.DEFAULT_IP_END));
} else {
// Custom CIDR
if (prefs.getBoolean(NetScanPrefs.KEY_CIDR_CUSTOM,
NetScanPrefs.DEFAULT_CIDR_CUSTOM)) {
net.cidr = Integer.parseInt(prefs.getString(
NetScanPrefs.KEY_CIDR, NetScanPrefs.DEFAULT_CIDR));
}
// Detected IP
int shift = (32 - net.cidr);
if (net.cidr < 31) {
start = (ip >> shift << shift) + 1;
end = (start | ((1 << shift) - 1)) - 1;
} else {
start = (ip >> shift << shift);
end = (start | ((1 << shift) - 1));
}
// Reset ip start-end (is it really convenient ?)
Editor edit = prefs.edit();
edit.putString(NetScanPrefs.KEY_IP_START,
NetScanInfo.getIpFromLongUnsigned(start));
edit.putString(NetScanPrefs.KEY_IP_END,
NetScanInfo.getIpFromLongUnsigned(end));
edit.commit();
}
}
public void setNetwork(long ip, long start, long end) {
this.ip = ip;
this.start = start;
this.end = end;
}
@Override
protected void onPreExecute() {
size = (int) (end - start + 1);
scanHostBeanList.clear();
doRateControl = prefs.getBoolean(NetScanPrefs.KEY_RATECTRL_ENABLE,
NetScanPrefs.DEFAULT_RATECTRL_ENABLE);
}
@Override
protected void onProgressUpdate(final HostBean... host) {
if (!isCancelled()) {
if (host[0] != null) {
host[0].position = hosts.size();
//android 10 获取不到mac地址所以不进行过滤
if (Build.VERSION.SDK_INT >= 29 || !host[0].hardwareAddress.equalsIgnoreCase(NOMAC)/*&&host[0].hardwareAddress.startsWith("14:")*/)
hosts.add(host[0]);
Log.e("AAA", "hardwareAddress" + host[0].hardwareAddress + "\n" + host[0].hostname);
}
if (size > 0) {
// discover.setProgress((int) (hosts_done * 10000 / size));
}
}
}
@Override
protected void onPostExecute(Void unused) {
Log.e("AAA", "扫描完成");
sendConnectCommand();
}
@Override
protected Void doInBackground(Void... params) {
//与董普校讨论去掉while调用时自己控制
//while (true) {
Log.e("mBstatus", "doInBackground===" + mBstatus);
/*if (mBstatus) {
if (mSearchStatus == 1)
return null;*/
pingAllIp();
//}
return null;
}
private void pingAllIp() {
if (mBstatus) {
if (mSearchStatus == 1)
return;
}
mSearchStatus = 1;
Log.v(TAG, "start=" + NetScanInfo.getIpFromLongUnsigned(start) + " ("
+ start + "), end=" + NetScanInfo.getIpFromLongUnsigned(end)
+ " (" + end + "), length=" + size);
mPool = Executors.newFixedThreadPool(THREADS);
if (ip <= end && ip >= start) {
Log.i(TAG, "Back and forth scanning");
// gateway
launch(start);
// hosts
long pt_backward = ip;
long pt_forward = ip + 1;
long size_hosts = size - 1;
if (size_hosts > 0) {
for (int i = 0; i < size_hosts; i++) {
// Set pointer if of limits
if (pt_backward <= start) {
pt_move = 2;
} else if (pt_forward > end) {
pt_move = 1;
}
// Move back and forth
if (pt_move == 1) {
launch(pt_backward);
pt_backward--;
pt_move = 2;
} else if (pt_move == 2) {
launch(pt_forward);
pt_forward++;
pt_move = 1;
}
}
}
} else {
Log.i(TAG, "Sequencial scanning");
for (long i = start; i <= end; i++) {
launch(i);
}
}
mPool.shutdown();
//暂时注释掉线程池管理类阻塞住等待线程返回的相关代码
try {
if (!mPool.awaitTermination(TIMEOUT_SCAN, TimeUnit.SECONDS)) {
mPool.shutdownNow();
Log.e(TAG, "Shutting down pool");
if (!mPool.awaitTermination(TIMEOUT_SHUTDOWN, TimeUnit.SECONDS)) {
Log.e(TAG, "Pool did not terminate");
}
}
} catch (InterruptedException e) {
Log.e(TAG, e.getMessage());
mPool.shutdownNow();
Thread.currentThread().interrupt();
} finally {
}
}
@Override
protected void onCancelled() {
if (mPool != null) {
synchronized (mPool) {
mPool.shutdownNow();
}
}
super.onCancelled();
}
private void launch(long i) {
if (!mPool.isShutdown()) {
mPool.execute(new CheckRunnable(NetScanInfo
.getIpFromLongUnsigned(i)));
}
}
private int getRate() {
if (doRateControl) {
return mRateControl.rate;
}
return Integer.parseInt(prefs.getString(
NetScanPrefs.KEY_TIMEOUT_DISCOVER,
NetScanPrefs.DEFAULT_TIMEOUT_DISCOVER));
}
private class CheckRunnable implements Runnable {
private String addr;
private String hardwareAddress;
CheckRunnable(String addr) {
this.addr = addr;
}
@Override
public void run() {
// Log.e(TAG, "run=" + addr);
// Create host object
final HostBean host = new HostBean();
host.responseTime = getRate();
host.ipAddress = addr;
try {
InetAddress h = InetAddress.getByName(addr);
// Rate control check
if (doRateControl && mRateControl.indicator != null
&& hosts_done % mRateMult == 0) {
mRateControl.adaptRate();
}
// Arp Check #1
//android10 不能访问proc/net 目录
if (Build.VERSION.SDK_INT < 29) {
hardwareAddress = getHardwareAddress(addr);
}
if (hardwareAddress != null && !NOMAC.equals(hardwareAddress)) {
host.hardwareAddress = hardwareAddress;
Log.e(TAG, "CheckRunnable" + addr);
Log.e(TAG, "CheckRunnable" + host.hardwareAddress + "===" + hardwareAddress);
publish(host);
return;
}
// Native InetAddress check
if (h.isReachable(getRate())) {
Log.e(TAG, "found using InetAddress ping " + addr);
publish(host);
if (doRateControl && mRateControl.indicator == null) {
mRateControl.indicator = addr;
mRateControl.adaptRate();
}
return;
}
} catch (IOException e) {
publish(null);
Log.e(TAG, e.getMessage());
}
}
}
//解析地址
public String getHardwareAddress(String ip) {
try {
if (ip != null) {
String hw = NOMAC;
String ptrn = String.format(NetScanInfo.MAC_RE, ip.replace(".", "\\."));
Pattern pattern = Pattern.compile(ptrn);
BufferedReader bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"), NetScanInfo.BUF);
String line;
Matcher matcher;
while ((line = bufferedReader.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.matches()) {
hw = matcher.group(1);
break;
}
}
bufferedReader.close();
return hw;
} else {
Log.e(TAG, "ip is null");
}
} catch (IOException e) {
Log.e(TAG, "Can't open/read file ARP: " + e.getMessage());
return NOMAC;
}
return NOMAC;
}
private void publish(final HostBean host) {
hosts_done++;
if (host == null) {
publishProgress((HostBean) null);
return;
}
// if (mDiscover != null) {
// final ActivityNet discover = mDiscover.get();
// if (discover != null) {
// Is gateway ?
if (net.gatewayIp.equals(host.ipAddress)) {
host.deviceType = HostBean.TYPE_GATEWAY;
}
// FQDN
// Static
if (host.hostname == null) {
// DNS
if (prefs.getBoolean(NetScanPrefs.KEY_RESOLVE_NAME,
NetScanPrefs.DEFAULT_RESOLVE_NAME) == true) {
try {
host.hostname = (InetAddress.getByName(host.ipAddress))
.getCanonicalHostName();
} catch (UnknownHostException e) {
Log.e(TAG, e.getMessage());
}
}
}
publishProgress(host);
}
// 发送测试命令
private void sendConnectCommand() {
sendCommand();
}
/**
* 发送
*/
private void sendCommand() {
if (!mBstatus && addressIndex < hostsCache.size()) {
mCurrentHostBean = hostsCache.get(addressIndex);
addressIndex++;
//Log.e(TAG, "ipAddress:" + mCurrentHostBean.ipAddress.toString());
RequestApi.setApiWifiIp(mCurrentHostBean.ipAddress.toString());
command.getWifiTestStatus(mCurrentHostBean, getTag());
} else if (mBstatus && addressIndex < hosts.size()) {
mCurrentHostBean = hosts.get(addressIndex);
addressIndex++;
//Log.e(TAG, "ipAddress:" + mCurrentHostBean.ipAddress.toString());
RequestApi.setApiWifiIp(mCurrentHostBean.ipAddress.toString());
command.getWifiTestStatus(mCurrentHostBean, getTag());
} else {
if (scanHostBeanList != null && scanHostBeanList.size() > 0) {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < scanHostBeanList.size(); i++) {
try {
JSONObject jobj = new JSONObject();
jobj.put("ipAddress", scanHostBeanList.get(i).ipAddress);
jobj.put("hardwareAddress", scanHostBeanList.get(i).hardwareAddress);
//过滤重复内容
if (!jsonArray.toString().contains(jobj.toString()))
jsonArray.put(jobj);
} catch (Exception e) {
}
}
PreferencesUtils.saveSpText(mContext, "cacheHostBean", jsonArray.toString());
}
cameraEventListener.OnSearchResponse(getTag(), scanHostBeanList);
}
}
public int getTag() {
return tag;
}
public void setTag(int tag) {
this.tag = tag;
}
}

View File

@ -0,0 +1,96 @@
package com.navinfo.collect.library.sensor;
import android.content.Context;
import com.navinfo.collect.library.garminvirbxe.Command;
import com.navinfo.collect.library.garminvirbxe.SensorParams;
public class Camera extends ISensor {
private Context mContext;
private Command conmand;
public Camera(Context mContext) {
this.mContext = mContext;
conmand = new Command(mContext);
}
@Override
public enmSensorType GetSensorType() {
return enmSensorType.SENSOR_CAMEAR;
}
@Override
public enmConnectionStatus GetConnectionStatus() {
return null;
}
@Override
public enmConnectionStatus Connect(SensorParams params) {
// TODO Auto-generated method stub
return null;
}
@Override
public enmConnectionStatus DisConnect() {
// TODO Auto-generated method stub
return null;
}
@Override
public enmSignalQuality GetSignalQuality() {
// TODO Auto-generated method stub
return null;
}
@Override
public void snapPicture(String picuuid) {
}
@Override
public void StopRecording() {
conmand.StopRecording(null,0);
}
@Override
public void StartRecording() {
conmand.StartRecording(null,0);
}
@Override
public int RegisterSensorEvent(SensorEventListener sensorEventLister) {
// TODO Auto-generated method stub
return 0;
}
@Override
public void SetMode(SensorWorkingMode sensorWorkingMode) {
// TODO Auto-generated method stub
}
@Override
public void Search(boolean isReadCache) {
// TODO Auto-generated method stub
}
@Override
public void StopSearch() {
// TODO Auto-generated method stub
}
@Override
public void GetGpsStatus() {
// TODO Auto-generated method stub
}
public void OnConnectionStatusChanged(enmConnectionStatus cs){
}
}

View File

@ -0,0 +1,83 @@
package com.navinfo.collect.library.sensor;
import com.navinfo.collect.library.garminvirbxe.SensorParams;
public abstract class ISensor {
public enum enmSensorType {
SENSOR_LOCATION, /* !< 位置传感器 */
SENSOR_CAMEAR /* !< 图像传感器 */
};
public enum enmSensorModel {
LOCATION_GPS_INTERANL, /* !< 设备内部GPS */
LOCATION_GPS_BLUETOOTH, /* !< 蓝牙GPS */
LOCATION_SINS,
LOCATION_BAIDU, /* !< BaiDu location api */
CAMERA_GARMIN_VIRB_XE, /* !< Garmin Virb xe 运动相机 */
CAMERA_UNKNOWN, /* !< 未知相机类型 */
LOCATION_SINS_BAIDU_MIX /* 百度和惯导混合定位*/
}
//连接状态枚举
public enum enmConnectionStatus {
DISCONNECTTED/*断开连接*/, CONNECTTING/*连接中*/, CONNECTTED/*连接*/
}
//信号质量枚举
public enum enmSignalQuality {
NO_SIGNAL/*无信号*/, POOR/*弱信号*/, MODERATE/*中等信号*/, PERFECT/*强信号*/
}
public enum SensorWorkingMode {
LOCATION_GPS_INTERNAL, /* !< 设备内部GPS */
LOCATION_GPS_BLUETOOTH, /* !< 外接蓝牙GPS */
LOCATION_GPS_HYBIRD, /* !< 混合模式 */
CAMEAR_PHOTO_12MP, /* !< 相机拍照模式 1200万像素 */
CAMEAR_PHOTO_7MP, /* !< 相机拍照模式 7百万像素 */
CAMEAR_PHOTO_CONTINUOUS_PHOTO, /* !< 相机自身连拍模式 */
CAMERA_VEDIO_1080P, /* !< 相机录像模式 1008P */
CAMEAR_VEDIO_720P, /* !< 相机录像模式 720P */
CAMERA_VEDIO_TIMELAPSE, /* !< 相机录像模式 缩时 */
CAMERA_PHOTO_SINGLE/*单拍模式*/
}
public abstract enmSensorType GetSensorType();
public abstract enmConnectionStatus GetConnectionStatus();
public abstract enmConnectionStatus Connect(SensorParams params);
public abstract enmConnectionStatus DisConnect();
public abstract enmSignalQuality GetSignalQuality();
public abstract void GetGpsStatus();
public abstract void snapPicture(String picuuid);
public abstract void Search(boolean isReadCache);
public abstract void StopSearch();
public abstract void StartRecording();
public abstract void StopRecording();
public abstract int RegisterSensorEvent(
SensorEventListener sensorEventLister);
public abstract void SetMode(SensorWorkingMode sensorWorkingMode);
}

View File

@ -0,0 +1,14 @@
package com.navinfo.collect.library.sensor;
import com.navinfo.collect.library.sensor.ISensor.enmConnectionStatus;
import com.navinfo.collect.library.sensor.ISensor.enmSignalQuality;
public interface SensorEventListener {
public void OnSensorEvent();
public void OnConnectionStatusChanged(enmConnectionStatus cs);
public void OnSignalQualityChanged(enmSignalQuality sq);
}

View File

@ -0,0 +1,60 @@
package com.navinfo.collect.library.utils;
import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.NtpV3Packet;
import org.apache.commons.net.ntp.TimeInfo;
import java.io.IOException;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* @author manle
*
* Contains function adapt date times
*/
public class DateUtils {
/**
* Get date after sync from NTP
* @param hosts {@link String[]} hosts server NTP
* @param timeOut {@link Integer} milisecod
* @return Date
*/
public static Date getNTPDate(String[] hosts, int timeOut) {
NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(timeOut);
for (String host : hosts) {
try {
InetAddress hostAddr = InetAddress.getByName(host);
TimeInfo info = client.getTime(hostAddr);
NtpV3Packet message = info.getMessage();
long serverTime = message.getTransmitTimeStamp().getTime();
Date date = new Date(serverTime);
return date;
}
catch (IOException e) {
}
}
client.close();
return null;
}
/**
* Format time
* @param date
* @return
*/
public static String formatTime(final Date date){
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String time = timeFormat.format(date);
return time;
}
}

View File

@ -0,0 +1,330 @@
package com.navinfo.collect.library.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// TODO: IPv6 support
public class NetScanInfo {
private final static String TAG = "NetInfo";
public static final int BUF = 8 * 1024;
private static final String CMD_IP = " -f inet addr show %s";
private static final String PTN_IP1 = "\\s*inet [0-9\\.]+\\/([0-9]+) brd [0-9\\.]+ scope global %s$";
private static final String PTN_IP2 = "\\s*inet [0-9\\.]+ peer [0-9\\.]+\\/([0-9]+) scope global %s$"; // FIXME:
// Merge
// with
// PTN_IP1
private static final String PTN_IF = "^%s: ip [0-9\\.]+ mask ([0-9\\.]+) flags.*";
private static final String NOIF = "0";
public static final String NOIP = "0.0.0.0";
public static final String NOMASK = "255.255.255.255";
public static final String NOMAC = "00:00:00:00:00:00";
private Context ctxt;
private WifiInfo info;
private SharedPreferences prefs;
public String intf = "eth0";
public String ip = NOIP;
public int cidr = 24;
public int speed = 0;
public String ssid = null;
public String bssid = null;
public String carrier = null;
public String macAddress = NOMAC;
public String netmaskIp = NOMASK;
public String gatewayIp = NOIP;
private final static String REQ = "select vendor from oui where mac=?";
// 0x1 is HW Type: Ethernet (10Mb) [JBP]
// 0x2 is ARP Flag: completed entry (ha valid)
public final static String MAC_RE = "^%s\\s+0x1\\s+0x2\\s+([:0-9a-fA-F]+)\\s+\\*\\s+\\w+$";
public NetScanInfo(final Context ctxt) {
this.ctxt = ctxt;
prefs = PreferenceManager.getDefaultSharedPreferences(ctxt);
getIp();
getWifiInfo();
}
@Override
public int hashCode() {
int ip_custom = prefs.getBoolean(NetScanPrefs.KEY_IP_CUSTOM,
NetScanPrefs.DEFAULT_IP_CUSTOM) ? 1 : 0;
int ip_start = prefs.getString(NetScanPrefs.KEY_IP_START,
NetScanPrefs.DEFAULT_IP_START).hashCode();
int ip_end = prefs.getString(NetScanPrefs.KEY_IP_END, NetScanPrefs.DEFAULT_IP_END)
.hashCode();
int cidr_custom = prefs.getBoolean(NetScanPrefs.KEY_CIDR_CUSTOM,
NetScanPrefs.DEFAULT_CIDR_CUSTOM) ? 1 : 0;
int cidr = prefs.getString(NetScanPrefs.KEY_CIDR, NetScanPrefs.DEFAULT_CIDR)
.hashCode();
return 42 + intf.hashCode() + ip.hashCode() + cidr + ip_custom
+ ip_start + ip_end + cidr_custom + cidr;
}
public void getIp() {
intf = prefs.getString(NetScanPrefs.KEY_INTF, NetScanPrefs.DEFAULT_INTF);
try {
if (intf == NetScanPrefs.DEFAULT_INTF || NOIF.equals(intf)) {
// Automatic interface selection
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface ni = en.nextElement();
intf = ni.getName();
ip = getInterfaceFirstIp(ni);
if (ip != NOIP) {
/* Log.i("AAA",intf+"");
Log.i("AAA",new String(ni.getHardwareAddress())+"");*/
break;
}
}
} else {
// Defined interface from Prefs
ip = getInterfaceFirstIp(NetworkInterface.getByName(intf));
}
} catch (SocketException e) {
Log.e(TAG, e.getMessage());
}
getCidr();
}
private String getInterfaceFirstIp(NetworkInterface ni) {
if (ni != null) {
for (Enumeration<InetAddress> nis = ni.getInetAddresses(); nis
.hasMoreElements();) {
InetAddress ia = nis.nextElement();
if (!ia.isLoopbackAddress()) {
if (ia instanceof Inet6Address) {
Log.i(TAG, "IPv6 detected and not supported yet!");
continue;
}
return ia.getHostAddress();
}
}
}
return NOIP;
}
private void getCidr() {
if (netmaskIp != NOMASK) {
cidr = IpToCidr(netmaskIp);
} else {
String match;
// Running ip tools
try {
if ((match = runCommand("/system/xbin/ip",
String.format(CMD_IP, intf),
String.format(PTN_IP1, intf))) != null) {
cidr = Integer.parseInt(match);
return;
} else if ((match = runCommand("/system/xbin/ip",
String.format(CMD_IP, intf),
String.format(PTN_IP2, intf))) != null) {
cidr = Integer.parseInt(match);
return;
} else if ((match = runCommand("/system/bin/ifconfig", " "
+ intf, String.format(PTN_IF, intf))) != null) {
cidr = IpToCidr(match);
return;
} else {
Log.i(TAG, "cannot find cidr, using default /24");
}
} catch (NumberFormatException e) {
Log.i(TAG, e.getMessage()
+ " -> cannot find cidr, using default /24");
}
}
}
// FIXME: Factorize, this isn't a generic runCommand()
private String runCommand(String path, String cmd, String ptn) {
try {
if (new File(path).exists() == true) {
String line;
Matcher matcher;
Pattern ptrn = Pattern.compile(ptn);
Process p = Runtime.getRuntime().exec(path + cmd);
BufferedReader r = new BufferedReader(new InputStreamReader(
p.getInputStream()), BUF);
while ((line = r.readLine()) != null) {
matcher = ptrn.matcher(line);
if (matcher.matches()) {
return matcher.group(1);
}
}
}
} catch (Exception e) {
Log.e(TAG, "Can't use native command: " + e.getMessage());
return null;
}
return null;
}
public boolean getMobileInfo() {
TelephonyManager tm = (TelephonyManager) ctxt
.getSystemService(Context.TELEPHONY_SERVICE);
if (tm != null) {
carrier = tm.getNetworkOperatorName();
}
return false;
}
public boolean getWifiInfo() {
WifiManager wifi = (WifiManager) ctxt
.getSystemService(Context.WIFI_SERVICE);
if (wifi != null) {
info = wifi.getConnectionInfo();
// Set wifi variables
speed = info.getLinkSpeed();
ssid = info.getSSID();
bssid = info.getBSSID();
macAddress = info.getMacAddress();
gatewayIp = getIpFromIntSigned(wifi.getDhcpInfo().gateway);
// broadcastIp = getIpFromIntSigned((dhcp.ipAddress & dhcp.netmask)
// | ~dhcp.netmask);
netmaskIp = getIpFromIntSigned(wifi.getDhcpInfo().netmask);
return true;
}
return false;
}
public String getNetIp() {
int shift = (32 - cidr);
int start = ((int) getUnsignedLongFromIp(ip) >> shift << shift);
return getIpFromLongUnsigned(start);
}
public SupplicantState getSupplicantState() {
return info.getSupplicantState();
}
public static boolean isConnected(Context ctxt) {
NetworkInfo nfo = ((ConnectivityManager) ctxt
.getSystemService(Context.CONNECTIVITY_SERVICE))
.getActiveNetworkInfo();
if (nfo != null) {
return nfo.isConnected();
}
return false;
}
//获取本地ip地址
public static String getLocAddress(){
String ipaddress = "";
try {
Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
// 遍历所用的网络接口
while (en.hasMoreElements()) {
NetworkInterface networks = en.nextElement();
// 得到每一个网络接口绑定的所有ip
Enumeration<InetAddress> address = networks.getInetAddresses();
// 遍历每一个接口绑定的所有ip
while (address.hasMoreElements()) {
InetAddress ip = address.nextElement();
if (!ip.isLoopbackAddress()
&& ip instanceof Inet4Address) {
ipaddress = ip.getHostAddress();
}
}
}
} catch (SocketException e) {
Log.e("", "获取本地ip地址失败");
e.printStackTrace();
}
return ipaddress;
}
public static long getUnsignedLongFromIp(String ip_addr) {
String[] a = ip_addr.split("\\.");
return (Integer.parseInt(a[0]) * 16777216 + Integer.parseInt(a[1])
* 65536 + Integer.parseInt(a[2]) * 256 + Integer.parseInt(a[3]));
}
public static String getIpFromIntSigned(int ip_int) {
String ip = "";
for (int k = 0; k < 4; k++) {
ip = ip + ((ip_int >> k * 8) & 0xFF) + ".";
}
return ip.substring(0, ip.length() - 1);
}
public static String getIpFromLongUnsigned(long ip_long) {
String ip = "";
for (int k = 3; k > -1; k--) {
ip = ip + ((ip_long >> k * 8) & 0xFF) + ".";
}
return ip.substring(0, ip.length() - 1);
}
private int IpToCidr(String ip) {
double sum = -2;
String[] part = ip.split("\\.");
for (String p : part) {
sum += 256D - Double.parseDouble(p);
}
return 32 - (int) (Math.log(sum) / Math.log(2d));
}
//根据ip解析mac
public String getHardwareAddress(String ip) {
try {
synchronized (this){
if (ip != null) {
Log.e(TAG, "开始=="+ip);
String hw = NOMAC;
String ptrn = String.format(MAC_RE, ip.replace(".", "\\."));
Pattern pattern = Pattern.compile(ptrn);
BufferedReader bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"), BUF);
String line;
Matcher matcher;
while ((line = bufferedReader.readLine()) != null) {
matcher = pattern.matcher(line);
if (matcher.matches()) {
hw = matcher.group(1);
break;
}
}
bufferedReader.close();
Log.e(TAG, "结束=="+hw);
return hw;
} else {
Log.e(TAG, "ip is null");
}
}
} catch (IOException e) {
Log.e(TAG, "Can't open/read file ARP: " + e.getMessage());
return NOMAC;
}
return NOMAC;
}
}

View File

@ -0,0 +1,32 @@
package com.navinfo.collect.library.utils;
public class NetScanPrefs {
public final static String KEY_RESOLVE_NAME = "resolve_name";
public final static boolean DEFAULT_RESOLVE_NAME = true;
public static final String KEY_RATECTRL_ENABLE = "ratecontrol_enable";
public static final boolean DEFAULT_RATECTRL_ENABLE = true;
public final static String KEY_TIMEOUT_DISCOVER = "timeout_discover";
public final static String DEFAULT_TIMEOUT_DISCOVER = "500";
public static final String KEY_INTF = "interface";
public static final String DEFAULT_INTF = null;
public static final String KEY_IP_START = "ip_start";
public static final String DEFAULT_IP_START = "0.0.0.0";
public static final String KEY_IP_END = "ip_end";
public static final String DEFAULT_IP_END = "0.0.0.0";
public static final String KEY_IP_CUSTOM = "ip_custom";
public static final boolean DEFAULT_IP_CUSTOM = false;
public static final String KEY_CIDR_CUSTOM = "cidr_custom";
public static final boolean DEFAULT_CIDR_CUSTOM = false;
public static final String KEY_CIDR = "cidr";
public static final String DEFAULT_CIDR = "24";
}

View File

@ -0,0 +1,94 @@
package com.navinfo.collect.library.utils;
import android.content.Context;
import android.content.SharedPreferences;
public class PreferencesUtils {
protected static final String XML_NAME = "cjzq_trade";
protected static final String KEEP_NOTIFICATION_FLAG = "notification_flag";
private static SharedPreferences getSharedPreferences(Context context) {
return context.getSharedPreferences(XML_NAME, Context.MODE_PRIVATE);
}
public static String getMsgNotificationFlag(Context context) {
SharedPreferences sp = getSharedPreferences(context);
return sp.getString(KEEP_NOTIFICATION_FLAG, "1");
}
/**
*
* @param context
* @param flag
*/
public static void saveMsgNotificationFlag(Context context, String flag) {
SharedPreferences sp = getSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.putString(KEEP_NOTIFICATION_FLAG, flag);
editor.commit();
}
/**
* 保存sp值
*
* @param context
* @param name
* @param flag
*/
public static void saveSpText(Context context, String key, String value) {
SharedPreferences sp = getSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, value);
editor.commit();
}
/**
* 获取值
*
* @param context
* @param name
* @return
*/
public static String getSpText(Context context, String key) {
SharedPreferences sp = getSharedPreferences(context);
return sp.getString(key, "");
}
/**
* 移除值
*
* @param context
* @param name
* @return
*/
public static void removeSpText(Context context, String name) {
SharedPreferences sp = getSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.remove(name);
editor.commit();
}
public static String getConnectIp(Context context, String key) {
SharedPreferences sp = getSharedPreferences(context);
return sp.getString(key, "");
}
public static void saveConnectIp(Context context,String key, String ip) {
SharedPreferences sp = getSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, ip);
editor.commit();
}
public static String getConnectWifiName(Context context) {
SharedPreferences sp = getSharedPreferences(context);
return sp.getString("connectwifiname", "");
}
public static void saveConnectWifiName(Context context, String name) {
SharedPreferences sp = getSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.putString("connectwifiname", name);
editor.commit();
}
}

View File

@ -0,0 +1,124 @@
package com.navinfo.collect.library.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Environment;
import android.text.format.DateUtils;
import com.navinfo.collect.library.garminvirbxe.CameraGarminVirbXE;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
public class SensorUtils {
public static String STR_CAMERA_PICTURE_SAVEPATH = Environment
.getExternalStorageDirectory() + "/Sensor/Camera/DCIM/";
public static String ntpHosts = "0.ir.pool.ntp.org,1.ir.pool.ntp.org,2.ir.pool.ntp.org,3.ir.pool.ntp.org";
// 由于连接命令和扫描测试通讯命令相同需要通过不通返回来确认
public final static int HADNLE_STATUS_OK = 1; // 获取状态成功返回handle
public final static int HADNLE_STATUS_FAIL = 0; // 获取状态失败返回handle
public final static int HADNLE_CONNECT_OK = 2; // 连接成功返回handle
public final static int HADNLE_CONNECT_FAIL = 3; // 连接失败返回handle
public final static int HADNLE_SNAPPICTURE = 4; // 失败返回handle
public final static int HADNLE_MONITORING = 5; // 状态监控失败返回handle
/**
* 保存文件
*
* @param bm
* @param fileName
* @throws IOException
*/
public static void saveFile(Bitmap bm, String fileName) throws IOException {
String savePath = CameraGarminVirbXE.getCameraPcitureSavePath();
File dirFile = new File(savePath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
File myCaptureFile = new File(savePath + fileName);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
}
/*
* Java文件操作 获取文件扩展名
*/
public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
/*
* Java文件操作 获取不带扩展名的文件名
*/
public static String getFileNameNoEx(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length()))) {
return filename.substring(0, dot);
}
}
return filename;
}
/**
* 检测网络是否连接
*
* @return
*/
public static boolean isNetworkAvailable(Context context)
{
// 获取手机所有连接管理对象包括对wi-fi,net等连接的管理
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null){
return false;
}else{
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0){
for (int i = 0; i < networkInfo.length; i++){
System.out.println(i + "===状态===" + networkInfo[i].getState());
// System.out.println(i + "===类型===" + networkInfo[i].getTypeName());
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED){
return true;
}
}
}
}
return false;
}
/**
* 同步ntp服务器的网络时间
* @return
*/
public static Date syncNow(){
String[] hostsArrayNTP = null;
if(StringUtils.isNotBlank(ntpHosts)){
hostsArrayNTP =ntpHosts.trim().split(",");
}
Date dateNTP = com.navinfo.collect.library.utils.DateUtils.getNTPDate(hostsArrayNTP, 5000);
return dateNTP;
}
}