Java 使用jssc获取SerialPort的设备描述符
如何使用jsscJava 使用jssc获取SerialPort的设备描述符,java,serial-port,jssc,Java,Serial Port,Jssc,如何使用jssc(java简单串行连接器)获取串行端口的设备描述符 getPortName()方法提供端口名(例如COM2),但描述符更有用 如果有必要修补此开源API以获取设备描述符如何操作?设备描述符是描述符树的根,包含基本设备信息。唯一编号idVendor和idProduct用于标识连接的设备。Windows操作系统使用这些数字来确定要加载的设备驱动程序 idVendor是分配给每个生产基于USB设备的公司的编号。USB实施者论坛负责管理供应商ID的分配 idProduct是另一个16位字
(java简单串行连接器)
获取串行端口的设备描述符
getPortName()
方法提供端口名(例如COM2
),但描述符更有用
如果有必要修补此开源API以获取设备描述符如何操作?设备描述符是描述符树的根,包含基本设备信息。唯一编号idVendor和idProduct用于标识连接的设备。Windows操作系统使用这些数字来确定要加载的设备驱动程序
idVendor
是分配给每个生产基于USB设备的公司的编号。USB实施者论坛负责管理供应商ID的分配
idProduct
是另一个16位字段,其中包含制造商分配的用于识别特定产品的编号
从jantje的问题来看
我需要的是windows 10在连接的应用程序中显示的名称 设备 回答:打开
“设置应用程序”
,然后单击设备。单击设备将打开一个选项卡,您可以在其中调整所有打印机、已连接设备、蓝牙设备、鼠标和触摸板、键入设置和自动播放设置的设置。此连接的设备选项卡显示连接到电脑的硬件。单击添加设备,电脑将自动扫描连接的设备。Bluetooth选项卡非常简单,具有通过Bluetooth将设备连接到PC的简单设置。单击蓝牙按钮,设备将自动开始扫描范围内的任何蓝牙设备
如果有任何类型的问题,显示设备或给予不可用,那么我们需要以下工作
如何将蓝牙设备连接到Windows 10计算机? 要连接支持蓝牙功能的移动电话,请执行以下操作:
有7种方法可以解决网络连接问题:
/**
* Get serial port names in Windows
*
* @since 2.3.0
*/
private static String[] getWindowsPortNames(Pattern pattern, Comparator<String> comparator) {
String[] portNames = serialInterface.getSerialPortNames();
if(portNames == null){
return new String[]{};
}
TreeSet<String> ports = new TreeSet<String>(comparator);
for(String portName : portNames){
if(pattern.matcher(portName).find()){
ports.add(portName);
}
}
return ports.toArray(new String[ports.size()]);
}
建议:
仅使用官方和最新的驱动程序
jSSC-2.8.0发布版本(2014年1月24日)
修正:重要!修复了端口处理潜在泄漏的错误
此版本包含适用于Windows(x86、x86-64)、Linux(x86、,
x86-64、ARM软硬浮动)、Solaris(x86、x86-64)、Mac OS X(x86、,
x86-64,PPC,PPC64)。jssc.jar文件和
您不需要手动管理本机lib
资源链接:
请看,该类有一个获取端口属性的方法,不幸的是,它还没有在windows中实现,但是很容易实现并重新编译以使其工作
我希望这有帮助。在扎曼尼罗的帮助下,我现在可以自己回答这个问题了。 使用jssc 2.8.0不可能做到这一点 目前正在采取行动来扩展jssc,但我不知道发布时间表,也不知道如何解决这个问题。 扩展就是方法
SerialPortList->getPortProperties(字符串portName)
在linux和mac的jssc 2.8.0修改版本中提供了实现。Windows实现更难(找到)
下面是linux和mac的代码取自
对于windows,我只在使用自定义dll的处理中找到了一个解决方案。这个问题不是要求找到工具或任何建议。API已经被标识为java简单串行连接器。问题是找到/tweek/patch这个开源API来获取设备描述符。请删除“暂停”我想知道这个问题的答案,以便我的arduino eclipse IDE识别连接到com端口的“设备”。我需要的是windows 10在连接的设备中显示的名称。请看,SerialPortList->getPortProperties(String portName)@vzamanillo感谢您的回答。但是,当我在eclipse中时,我只有SerialPortList.getPortNames。在您提供的链接中,我找不到GetPortProperties感谢您的回复。然而,我无法在这个问题和你的答案之间找到联系。你的答案如何链接到jssc?@jantje我已经更新了一些信息。希望它能帮助你做出正确的决定
OS_LINUX: Pattern.compile("(ttyS|ttyUSB|ttyACM|ttyAMA|rfcomm|ttyO)[0-9]{1,3}");
OS_SOLARIS: Pattern.compile("[0-9]*|[a-z]*");
OS_MAC_OS_X: Pattern.compile("tty.(serial|usbserial|usbmodem).*");
OS_WINDOWS: Pattern.compile("");
JNIEXPORT jobjectArray JNICALL Java_jssc_SerialNativeInterface_getPortProperties
(JNIEnv *env, jclass cls, jstring portName) {
const char* portNameChar = (const char*)env->GetStringUTFChars(portName, NULL);
jclass stringClass = env->FindClass("Ljava/lang/String;");
jobjectArray ret = env->NewObjectArray(5, stringClass, NULL);
#ifdef __APPLE__
// this code is based on QtSerialPort
CFMutableDictionaryRef matching = IOServiceMatching(kIOSerialBSDServiceValue);
io_iterator_t iter = 0;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matching, &iter);
if (kr != kIOReturnSuccess) {
env->ReleaseStringUTFChars(portName, portNameChar);
return ret;
}
io_registry_entry_t service;
while ((service = IOIteratorNext(iter))) {
// compare portName against cu and tty devices
bool found = false;
CFTypeRef cu = 0;
cu = IORegistryEntrySearchCFProperty(service, kIOServicePlane, CFSTR(kIOCalloutDeviceKey), kCFAllocatorDefault, 0);
if (cu) {
char buffer[MAXPATHLEN];
CFStringGetCString(CFStringRef(cu), buffer, sizeof(buffer), kCFStringEncodingUTF8);
//fprintf(stdout, "getPortProperties: %s\n", buffer);
//fflush(stdout);
if (strcmp(portNameChar, buffer) == 0) {
found = true;
}
CFRelease(cu);
}
CFTypeRef tty = 0;
tty = IORegistryEntrySearchCFProperty(service, kIOServicePlane, CFSTR(kIODialinDeviceKey), kCFAllocatorDefault, 0);
if (tty) {
char buffer[MAXPATHLEN];
CFStringGetCString(CFStringRef(tty), buffer, sizeof(buffer), kCFStringEncodingUTF8);
//fprintf(stdout, "getPortProperties: %s\n", buffer);
//fflush(stdout);
if (strcmp(portNameChar, buffer) == 0) {
found = true;
}
CFRelease(tty);
}
if (!found) {
// not port we're looking for
//fprintf(stderr, "getPortProperties: %s not found", portNameChar);
//fflush(stderr);
IOObjectRelease(service);
continue;
}
io_registry_entry_t entry = service;
do {
int val = 0;
char buffer[255];
CFTypeRef idProduct = 0;
idProduct = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBProductID), kCFAllocatorDefault, 0);
if (idProduct && !env->GetObjectArrayElement(ret, 0)) {
CFNumberGetValue(CFNumberRef(idProduct), kCFNumberIntType, &val);
sprintf(buffer, "%04x", val);
jstring tmp = env->NewStringUTF(buffer);
env->SetObjectArrayElement(ret, 0, tmp);
env->DeleteLocalRef(tmp);
CFRelease(idProduct);
}
CFTypeRef idVendor = 0;
idVendor = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBVendorID), kCFAllocatorDefault, 0);
if (idVendor && !env->GetObjectArrayElement(ret, 1)) {
CFNumberGetValue(CFNumberRef(idVendor), kCFNumberIntType, &val);
sprintf(buffer, "%04x", val);
jstring tmp = env->NewStringUTF(buffer);
env->SetObjectArrayElement(ret, 1, tmp);
env->DeleteLocalRef(tmp);
CFRelease(idVendor);
}
CFTypeRef manufacturer = 0;
manufacturer = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBVendorString), kCFAllocatorDefault, 0);
if (manufacturer && !env->GetObjectArrayElement(ret, 2)) {
CFStringGetCString(CFStringRef(manufacturer), buffer, sizeof(buffer), kCFStringEncodingUTF8);
jstring tmp = env->NewStringUTF(buffer);
env->SetObjectArrayElement(ret, 2, tmp);
env->DeleteLocalRef(tmp);
CFRelease(manufacturer);
}
CFTypeRef product = 0;
product = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBProductString), kCFAllocatorDefault, 0);
if (product && !env->GetObjectArrayElement(ret, 3)) {
CFStringGetCString(CFStringRef(product), buffer, sizeof(buffer), kCFStringEncodingUTF8);
jstring tmp = env->NewStringUTF(buffer);
env->SetObjectArrayElement(ret, 3, tmp);
env->DeleteLocalRef(tmp);
CFRelease(product);
}
CFTypeRef serial = 0;
serial = IORegistryEntrySearchCFProperty(entry, kIOServicePlane, CFSTR(kUSBSerialNumberString), kCFAllocatorDefault, 0);
if (serial && !env->GetObjectArrayElement(ret, 4)) {
CFStringGetCString(CFStringRef(serial), buffer, sizeof(buffer), kCFStringEncodingUTF8);
jstring tmp = env->NewStringUTF(buffer);
env->SetObjectArrayElement(ret, 4, tmp);
env->DeleteLocalRef(tmp);
CFRelease(serial);
}
kr = IORegistryEntryGetParentEntry(entry, kIOServicePlane, &entry);
} while (kr == kIOReturnSuccess);
IOObjectRelease(entry);
IOObjectRelease(service);
}
IOObjectRelease(iter);
#endif // __APPLE__
env->ReleaseStringUTFChars(portName, portNameChar);
return ret;
}