提交 ef939f38 authored 作者: wangqiang's avatar wangqiang

硬件热拔插

上级 2a8257cd
package com; package com;
import com.priusis.service.control.DeviceChangeCallbackImpl;
import com.priusis.utils.IHwPortController; import com.priusis.utils.IHwPortController;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -25,6 +26,12 @@ public class TestDemo { ...@@ -25,6 +26,12 @@ public class TestDemo {
// 初始化硬件接口管理模块 // 初始化硬件接口管理模块
int result = IHwPortController.instanceDll.APQ_HWPORT_Initialize(); int result = IHwPortController.instanceDll.APQ_HWPORT_Initialize();
log.info("APQ_HWPORT_Initialize ret:{}", result); log.info("APQ_HWPORT_Initialize ret:{}", result);
// 注册设备热插拔通知后,接收热插拔事件
DeviceChangeCallbackImpl deviceChangeCallback = new DeviceChangeCallbackImpl();
IHwPortController.instanceDll.APQ_HWPORT_Register_Device_Notification(deviceChangeCallback);
/* /*
// 获取普通设备权限 // 获取普通设备权限
int result31 = IHwPortController.instanceDll.APQ_HWPORT_get_normal_device_permit(4); int result31 = IHwPortController.instanceDll.APQ_HWPORT_get_normal_device_permit(4);
...@@ -41,7 +48,7 @@ public class TestDemo { ...@@ -41,7 +48,7 @@ public class TestDemo {
*/ */
// 获取存储设备权限 // 获取存储设备权限
int result31 = IHwPortController.instanceDll.APQ_HWPORT_get_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode()); /*int result31 = IHwPortController.instanceDll.APQ_HWPORT_get_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode());
log.info("APQ_HWPORT_get_storage_device_permit ret:{}", result31); log.info("APQ_HWPORT_get_storage_device_permit ret:{}", result31);
// APQ_HWPORT_STORAGE_PERM_ALLOW APQ_HWPORT_STORAGE_PERM_DENY // APQ_HWPORT_STORAGE_PERM_ALLOW APQ_HWPORT_STORAGE_PERM_DENY
...@@ -52,13 +59,25 @@ public class TestDemo { ...@@ -52,13 +59,25 @@ public class TestDemo {
log.info("APQ_HWPORT_Apply ret:{}", result5); log.info("APQ_HWPORT_Apply ret:{}", result5);
// 再次获取存储设备权限,验证 // 再次获取存储设备权限,验证
int result33 = IHwPortController.instanceDll.APQ_HWPORT_get_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode()); int result33 = IHwPortController.instanceDll.APQ_HWPORT_get_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode());
log.info("Check APQ_HWPORT_get_storage_device_permit ret:{}", result33); log.info("Check APQ_HWPORT_get_storage_device_permit ret:{}", result33);*/
/* // 获取网络设备权限 /* // 获取网络设备权限
int speed = 0; int speed = 0;
int result4 = IHwPortController.instanceDll.APQ_HWPORT_get_net_device_permit(0); int result4 = IHwPortController.instanceDll.APQ_HWPORT_get_net_device_permit(0);
log.info("APQ_HWPORT_get_net_device_permit ret:{}, speed:{}", result4, speed);*/ log.info("APQ_HWPORT_get_net_device_permit ret:{}, speed:{}", result4, speed);*/
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// --- 3. 清理资源 ---
// 停止监听并释放资源
IHwPortController.instanceDll.APQ_HWPORT_Unregister_Device_Notification();
// 清理硬件接口管理模块 // 清理硬件接口管理模块
int result2 = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize(); int result2 = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize();
log.info("APQ_HWPORT_Uninitialize ret:{}", result2); log.info("APQ_HWPORT_Uninitialize ret:{}", result2);
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.priusis.dto.HwPortControllerDto; import com.priusis.dto.HwPortControllerDto;
import com.priusis.service.control.DeviceChangeCallbackImpl;
import com.priusis.utils.IHwPortController; import com.priusis.utils.IHwPortController;
import com.priusis.vo.MqttRpcDataMessage; import com.priusis.vo.MqttRpcDataMessage;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -14,10 +15,14 @@ import org.springframework.scheduling.annotation.Scheduled; ...@@ -14,10 +15,14 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@Slf4j @Slf4j
@Component @Component
...@@ -30,6 +35,31 @@ public class ApqControlJob { ...@@ -30,6 +35,31 @@ public class ApqControlJob {
@Autowired @Autowired
private RestTemplate restTemplate; private RestTemplate restTemplate;
@Autowired
private DeviceChangeCallbackImpl deviceChangeCallback;
private ScheduledExecutorService scheduler;
@PostConstruct
public void init() {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.submit(() -> {
int result = IHwPortController.instanceDll.APQ_HWPORT_Initialize();
log.info("APQ_HWPORT_Initialize ret:{}", result);
result = IHwPortController.instanceDll.APQ_HWPORT_Register_Device_Notification(deviceChangeCallback);
log.info("APQ_HWPORT_Register_Device_Notification ret:{}", result);
});
}
@PreDestroy
public void destroy() {
int result = IHwPortController.instanceDll.APQ_HWPORT_Unregister_Device_Notification();
log.info("APQ_HWPORT_Unregister_Device_Notification ret:{}", result);
//清理硬件接口管理模块
result = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize();
log.info("APQ_HWPORT_Uninitialize ret:{}", result);
}
@Scheduled(fixedDelay = 60000L) @Scheduled(fixedDelay = 60000L)
protected void controlProgramTask() { protected void controlProgramTask() {
log.info("硬件监控上报================="); log.info("硬件监控上报=================");
...@@ -173,41 +203,27 @@ public class ApqControlJob { ...@@ -173,41 +203,27 @@ public class ApqControlJob {
if (mapRequest.size() > 0) { if (mapRequest.size() > 0) {
Map eventMapRequest = new HashMap(); Map eventMapRequest = new HashMap();
eventMapRequest.put("requestId", 3);
eventMapRequest.put("methodName", "control_warning"); eventMapRequest.put("methodName", "control_warning");
eventMapRequest.put("params", mapRequest); eventMapRequest.put("params", mapRequest);
Map map = restTemplate.postForObject("http://localhost:8765/uplink_event/oc-client", eventMapRequest, Map.class); Map map = restTemplate.postForObject("http://localhost:8765/uplink_event/oc-client", eventMapRequest, Map.class);
log.info("存在硬件接口扫码告警,上报告警事件: mapData:{}, ret:{}", mapRequest, map); log.info("存在硬件接口扫码告警,上报告警事件: mapData:{}, ret:{}", mapRequest, map);
} }
} }
// 清理硬件接口管理模块
int result2 = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize();
log.info("APQ_HWPORT_Uninitialize ret:{}", result2);
} else { } else {
log.info("未获取到获取硬件监控配置"); log.info("未获取到获取硬件监控配置");
} }
} else { } else {
log.info("未获取到获取硬件监控配置"); log.info("未获取到获取硬件监控配置");
//int result = IHwPortController.instanceDll.APQ_HWPORT_Initialize();
//log.info("APQ_HWPORT_Initialize ret:{}", result);
//int result2 = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize();
//log.info("APQ_HWPORT_Uninitialize ret:{}", result2);
} }
} }
public void testUsb() { public void testUsb() {
// 初始化硬件接口管理模块
int result = IHwPortController.instanceDll.APQ_HWPORT_Initialize();
log.info("APQ_HWPORT_Initialize ret:{}", result);
// APQ_HWPORT_STORAGE_PERM_ALLOW APQ_HWPORT_STORAGE_PERM_DENY // APQ_HWPORT_STORAGE_PERM_ALLOW APQ_HWPORT_STORAGE_PERM_DENY
int result32 = IHwPortController.instanceDll.APQ_HWPORT_set_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode(), IHwPortController.HwportStoragePermEnum.APQ_HWPORT_STORAGE_PERM_ALLOW.getCode(), null); int result32 = IHwPortController.instanceDll.APQ_HWPORT_set_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode(), IHwPortController.HwportStoragePermEnum.APQ_HWPORT_STORAGE_PERM_ALLOW.getCode(), null);
log.info("APQ_HWPORT_set_storage_device_permit ret:{}", result32); log.info("APQ_HWPORT_set_storage_device_permit ret:{}", result32);
//应用硬件接口管理模块的配置内容 //应用硬件接口管理模块的配置内容
int result5 = IHwPortController.instanceDll.APQ_HWPORT_Apply(); int result5 = IHwPortController.instanceDll.APQ_HWPORT_Apply();
log.info("APQ_HWPORT_Apply ret:{}", result5); log.info("APQ_HWPORT_Apply ret:{}", result5);
int result2 = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize();
log.info("APQ_HWPORT_Uninitialize ret:{}", result2);
} }
} }
...@@ -123,7 +123,7 @@ public class ApqInfoJob { ...@@ -123,7 +123,7 @@ public class ApqInfoJob {
.put(isNeedCollection(isNoneEven, cpuTemp, mapParams), cpuTemp, Double.parseDouble(new DecimalFormat("#.00").format(OshiUtil.getSensors().getCpuTemperature()))) .put(isNeedCollection(isNoneEven, cpuTemp, mapParams), cpuTemp, Double.parseDouble(new DecimalFormat("#.00").format(OshiUtil.getSensors().getCpuTemperature())))
.put(isNeedCollection(isNoneEven, cpuLoad, mapParams), cpuLoad, getCpuUsed()) .put(isNeedCollection(isNoneEven, cpuLoad, mapParams), cpuLoad, getCpuUsed())
.put(isNeedCollection(isNoneEven, memoryCap, mapParams), memoryCap, DataSizeUtil.format(OshiUtil.getMemory().getTotal())) .put(isNeedCollection(isNoneEven, memoryCap, mapParams), memoryCap, DataSizeUtil.format(OshiUtil.getMemory().getTotal()))
.put(isNeedCollection(isNoneEven, memoryAvailable, mapParams), memoryAvailable, DataSizeUtil.format(OshiUtil.getMemory().getAvailable())) .put(isNeedCollection(isNoneEven, memoryAvailable, mapParams), memoryAvailable, new DecimalFormat("#,##0.###").format(OshiUtil.getMemory().getAvailable() / Math.pow(1024, 3)))
.put(isNeedCollection(isNoneEven, diskModel, mapParams), diskModel, collect1) .put(isNeedCollection(isNoneEven, diskModel, mapParams), diskModel, collect1)
.put(isNeedCollection(isNoneEven, diskCap, mapParams), diskCap, collect) .put(isNeedCollection(isNoneEven, diskCap, mapParams), diskCap, collect)
.put(isNeedCollection(isNoneEven, diskFree, mapParams), diskFree, collect2) .put(isNeedCollection(isNoneEven, diskFree, mapParams), diskFree, collect2)
...@@ -174,6 +174,7 @@ public class ApqInfoJob { ...@@ -174,6 +174,7 @@ public class ApqInfoJob {
System.out.println(OshiUtil.getSensors().getCpuTemperature()); System.out.println(OshiUtil.getSensors().getCpuTemperature());
System.out.println(OshiUtil.getHardware().getDiskStores()[0].getModel()); System.out.println(OshiUtil.getHardware().getDiskStores()[0].getModel());
System.out.println(DataSizeUtil.format(OshiUtil.getHardware().getDiskStores()[0].getReads())); System.out.println(DataSizeUtil.format(OshiUtil.getHardware().getDiskStores()[0].getReads()));
//System.out.println("CPU内存使用率:" + new DecimalFormat("#.##%").format((OshiUtil.getMemory().getAvailable() * 1.0 / OshiUtil.getMemory().getTotal()))); //System.out.println("CPU内存使用率:" + new DecimalFormat("#.##%").format((OshiUtil.getMemory().getAvailable() * 1.0 / OshiUtil.getMemory().getTotal())));
while (true) { while (true) {
......
...@@ -148,13 +148,11 @@ public class ApqRegisterJob { ...@@ -148,13 +148,11 @@ public class ApqRegisterJob {
// 上报黑白名单异常 // 上报黑白名单异常
if (mapRequest.size() > 0) { if (mapRequest.size() > 0) {
Map eventMapRequest = new HashMap(); Map eventMapRequest = new HashMap();
eventMapRequest.put("requestId", 1); eventMapRequest.put("requestId", 2);
eventMapRequest.put("methodName", "BlackList"); eventMapRequest.put("methodName", "BlackList");
eventMapRequest.put("params", mapRequest); eventMapRequest.put("params", mapRequest);
Map map = restTemplate.postForObject("http://localhost:8765/uplink_event/oc-client", eventMapRequest, Map.class); Map map = restTemplate.postForObject("http://localhost:8765/uplink_event/oc-client", eventMapRequest, Map.class);
log.info("存在软件检测接口扫码告警,上报告警事件: mapData:{}, ret:{}", mapRequest, map); log.info("存在软件检测接口扫码告警,上报告警事件: mapData:{}, ret:{}", mapRequest, map);
// 上报黑名单属性todo
} }
} else { } else {
log.info("未获取到获取软件检测监控配置"); log.info("未获取到获取软件检测监控配置");
...@@ -162,8 +160,14 @@ public class ApqRegisterJob { ...@@ -162,8 +160,14 @@ public class ApqRegisterJob {
} else { } else {
log.info("未获取到获取软件检测监控配置"); log.info("未获取到获取软件检测监控配置");
} }
}
public static void main(String[] args) {
try {
WinExecuteUtils.killProc("Xshell.exe");
} catch (IOException e) {
log.error("杀进程异常", e);
}
} }
} }
package com.priusis.service.control;
import cn.hutool.core.util.StrUtil;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
public class DeviceChangeCallbackImpl implements IDeviceChangeCallback {
@Autowired
private RestTemplate restTemplate;
@Override
public void P_DEVICE_CHANGE_CB(int changeType, Pointer data) {
String changeData = data.getString(0);
log.info("回调成功!changeType: {}, data: {}", changeType, changeData);
Map mapRequest = new HashMap();
// 1代表插入,2代表拔出
mapRequest.put("changeType", changeType);
// 存放识别到的设备信息(易读信息文本,用逗号区分:"设备描述","友好名称","总线已报告设备描述","提供商", "class=Keyboard")
String[] changeDataSplits = changeData.split(";");
// 插入/拔出"设备描述xxx"("供应商"),备注: “总线已报告设备描述” “友好名称”
// 举例: 插入/拔出USB大容量存储设备(兼容USB存储设备),备注: Storage Media
// 拔出键盘
// 回调成功!changeType: 2, data: HID Keyboard Device;;;(标准键盘);class=Keyboard;
// 回调成功!changeType: 2, data: USB Composite Device;;Lenovo Traditional USB Keyboard;(标准 USB 主控制器);class=USB;
// 回调成功!changeType: 2, data: 符合 HID 标准的系统控制器;;;(标准系统设备);class=HIDClass;
// 回调成功!changeType: 2, data: 符合 HID 标准的用户控制设备;;;Microsoft;class=HIDClass;
String classData = changeDataSplits[4];
String changeDataDesc = changeDataSplits[0];
if (StrUtil.equalsIgnoreCase("class=Keyboard", classData)) {
changeDataDesc = "键盘";
} else if (StrUtil.equalsIgnoreCase("class=Mouse", classData)) {
changeDataDesc = "鼠标";
} else if (StrUtil.equalsIgnoreCase("class=DiskDrive", classData)) {
changeDataDesc = "USB";
}
String changeContent = String.format("%s%s", changeType == 1 ? "插入" : "拔出", changeDataDesc);
mapRequest.put("changeContent", changeContent);
mapRequest.put("changeRemark", changeData);
log.info("存在硬件接口扫码告警,上报告警事件!changeContent: {}, changeRemark: {}", changeContent, changeData);
Map eventMapRequest = new HashMap();
eventMapRequest.put("requestId", 4);
eventMapRequest.put("methodName", "control_dev_warning");
eventMapRequest.put("params", mapRequest);
Map map = restTemplate.postForObject("http://localhost:8765/uplink_event/oc-client", eventMapRequest, Map.class);
log.info("存在硬件接口扫码告警,上报告警事件: mapData:{}, ret:{}", mapRequest, map);
}
}
package com.priusis.service.control;
import com.sun.jna.Callback;
import com.sun.jna.Pointer;
/**
* 定义回调函数接口并继承StdCallCallback
* 必须继承自com.sun.jna.Callback接口 (如果回调函数是以stdcall输出,有时候可能引起jvm崩溃,
* 可以改成继承StdCallCallback接口试试,)
* 子接口必须定义单个公有方法或一个名为callback的公有方法。必须持有到回调对象的一个存活引用。一个回调应该不抛出异常。
*/
public interface IDeviceChangeCallback extends Callback {
void P_DEVICE_CHANGE_CB(int changeType, Pointer data);
}
package com.priusis.utils; package com.priusis.utils;
import com.sun.jna.Callback;
import com.sun.jna.Library; import com.sun.jna.Library;
import com.sun.jna.Native; import com.sun.jna.Native;
import lombok.Getter; import lombok.Getter;
...@@ -49,8 +50,25 @@ import lombok.Getter; ...@@ -49,8 +50,25 @@ import lombok.Getter;
******************************************************************************************************************************/ ******************************************************************************************************************************/
public interface IHwPortController extends Library { public interface IHwPortController extends Library {
IHwPortController instanceDll = (IHwPortController) Native.loadLibrary(ParseUrlUtil.parseAbsolutePath("/dact/Release/HwPortController.dll", System.getProperty("user.dir") + "\\HwPortController.dll"), IHwPortController.class); /**
//IHwPortController instanceDll = (IHwPortController) Native.loadLibrary("D:\\work\\priusis\\priusis-iot\\apq-iot\\apq-client\\apq-pc-control\\src\\main\\resources\\dact\\Release\\HwPortController.dll", IHwPortController.class); * 动态链接库编译时选择的平台。如果通过x86平台编译,那么只能使用32位jdk环境加载,如果要使用64位jdk,必须使用x64平台编译。
* <p>
* 接口内部需要一个公共静态常量:INSTANCE,通过这个常量,就可以获得这个接口的实例,从而使用接口的方法,也就是调用外部dll/so的函数。
* 该常量通过Native.loadLibrary()这个API函数获得,该函数有2个参数:
* <p>
* 第一个参数是动态链接库dll/so的名称,但不带.dll或.so这样的后缀,这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了。
* 搜索动态链接库路径的顺序是:先从当前类的当前文件夹找,如果没有找到,再在工程当前文件夹下面找win32/win64文件夹,
* 找到后搜索对应的dll文件,如果 找不到再到WINDOWS下面去搜索,再找不到就会抛异常了。
* 第二个参数是本接口的Class类型。JNA通过这个Class类型,根据指定的.dll/.so文件,动态创建接口的实例。
* 该实例由JNA通过反射自动生成。
* <p>
* 接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义,注意参数和返回值的类型,应该和链接库中的函数类型保持一致。
* 定义好接口后,就可以使用接口中的函数即相应dll/so中的函数了
*/
//如果本地类库不是线程安全的,可用Native.synchronizedLibrary
//IHwPortController instanceDll = (IHwPortController) Native.loadLibrary(ParseUrlUtil.parseAbsolutePath("/dact/Release/HwPortController.dll", System.getProperty("user.dir") + "\\HwPortController.dll"), IHwPortController.class);
IHwPortController instanceDll = (IHwPortController) Native.loadLibrary("D:\\work\\priusis\\priusis-iot\\apq-iot\\apq-client\\apq-pc-control\\src\\main\\resources\\dact\\Release\\HwPortController.dll", IHwPortController.class);
/** /**
* 初始化硬件接口管理模块 * 初始化硬件接口管理模块
...@@ -144,10 +162,10 @@ public interface IHwPortController extends Library { ...@@ -144,10 +162,10 @@ public interface IHwPortController extends Library {
* 注册设备热插拔通知(如USB设备) * 注册设备热插拔通知(如USB设备)
* 备 注:不使用时,需要调用 APQ_HWPORT_Unregister_Device_Notification 停止监听并释放资源 * 备 注:不使用时,需要调用 APQ_HWPORT_Unregister_Device_Notification 停止监听并释放资源
* *
* @param P_DEVICE_CHANGE_CB callback_fn: 指定事件发生时的回调函数 * @param callBack: 指定事件发生时的回调函数
* @return 成功返回 APQ_HWPORT_RESULT_OK,失败返回 APQ_HWPORT_RESULT_ERROR_开头的值 {@link HwportResultEnum} * @return 成功返回 APQ_HWPORT_RESULT_OK,失败返回 APQ_HWPORT_RESULT_ERROR_开头的值 {@link HwportResultEnum}
*/ */
//int APQ_HWPORT_Register_Device_Notification(IN P_DEVICE_CHANGE_CB callback_fn) int APQ_HWPORT_Register_Device_Notification(Callback callBack);
/** /**
* 停止监听并释放设备热插拔通知相关资源 * 停止监听并释放设备热插拔通知相关资源
......
...@@ -270,9 +270,9 @@ HWPORTCONTROLLERDLL_API APQ_HWPORT_NET_PERM_E APQ_HWPORT_get_net_device_permit(I ...@@ -270,9 +270,9 @@ HWPORTCONTROLLERDLL_API APQ_HWPORT_NET_PERM_E APQ_HWPORT_get_net_device_permit(I
/****************************************************************************************************************************** /******************************************************************************************************************************
*功 能:注册设备热插拔通知后,接收热插拔事件 *功 能:注册设备热插拔通知后,接收热插拔事件
*参 数: *参 数:APQ_HWPORT_Register_Device_Notification
int changeType: 代表该设备状态,1代表插入,2代表拔出 int changeType: 代表该设备状态,1代表插入,2代表拔出
char *devInfoBuf: 存放识别到的设备信息(易读信息文本,用逗号区分:"设备描述","友好名称","总线已报告设备描述","提供商") char *devInfoBuf: 存放识别到的设备信息(易读信息文本,用逗号区分:"设备描述","友好名称","总线已报告设备描述","提供商", "class=Keyboard"
******************************************************************************************************************************/ ******************************************************************************************************************************/
typedef void(*P_DEVICE_CHANGE_CB)(int changeType, char *devInfoBuf); typedef void(*P_DEVICE_CHANGE_CB)(int changeType, char *devInfoBuf);
......
APQ_HWPORT_NET_DEVID_ETH_CARD=APQ_HWPORT_NET_PERM_ALLOW
APQ_HWPORT_NET_DEVID_ETH_CARD_SPEED=1000000
APQ_HWPORT_NORMAL_DEVID_BT=APQ_HWPORT_NORMAL_PERM_ALLOW
APQ_HWPORT_NORMAL_DEVID_CAMERA=APQ_HWPORT_NORMAL_PERM_ALLOW
APQ_HWPORT_NORMAL_DEVID_DONGLE=APQ_HWPORT_NORMAL_PERM_UNKNOWN
APQ_HWPORT_NORMAL_DEVID_GPIO=APQ_HWPORT_NORMAL_PERM_UNKNOWN
APQ_HWPORT_NORMAL_DEVID_KEYBOARD=APQ_HWPORT_NORMAL_PERM_ALLOW
APQ_HWPORT_NORMAL_DEVID_MOUSE=APQ_HWPORT_NORMAL_PERM_ALLOW
APQ_HWPORT_NORMAL_DEVID_SERIAL=APQ_HWPORT_NORMAL_PERM_ALLOW
APQ_HWPORT_NORMAL_DEVID_USB_CONVERSION=APQ_HWPORT_NORMAL_PERM_ALLOW
APQ_HWPORT_STORAGE_DEVID_CDROM=APQ_HWPORT_STORAGE_PERM_UNKNOWN
APQ_HWPORT_STORAGE_DEVID_UDISK=APQ_HWPORT_STORAGE_PERM_UNKNOWN
KEY=value
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论