如何使用jssc SerialPort获取( java-simple-serial-connector)的设备描述符
getPortName()方法给出了端口名(e.g. COM2),但是描述符会更有帮助。
如果有必要对这个开源API进行修补以获得设备描述符,那么如何实现呢?
发布于 2016-04-06 15:32:31
看看gohai/java-简单串行连接器,SerialPortList类有一个getPortProperties(字符串portName)方法来获取端口属性,不幸的是,windows还没有实现它,但是很容易完成一个实现并重新编译以使其工作。
我希望这能帮到你。
发布于 2016-04-06 15:47:14
在萨马尼洛的帮助下,我现在可以自己回答这个问题。使用jssc 2.8.0是不可能的。
有正在进行的行动来扩展jssc,但是我不知道发布时间表,也不知道如何解决这个问题。扩展是用于linux和mac的jssc2.8.0修改版本中可用的SerialPortList->getPortProperties(String portName)实现的方法。Windows实现更难(找到)。
下面是从基/jssc.cpp获取的linux和mac代码
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;
}对于windows,我只在使用自定义dll的处理中找到了解决方案。
发布于 2016-04-05 18:51:21
设备描述符是描述符树的根,包含基本设备信息。唯一的数字,idVendor和idProduct,识别连接的设备。Windows操作系统使用这些数字来确定要加载的设备驱动程序。
idVendor是分配给每家生产基于USB的设备的公司的号码。USB执行者论坛负责管理供应商ID的分配。
idProduct是另一个16位字段,包含制造商指定的标识特定产品的数字。
从jantje的问题
我需要的是windows 10在连接的设备中显示的名称吗?
Ans:打开"Settings app"并单击设备。单击“设备”将打开一个选项卡,您可以在该选项卡中调整所有打印机、连接设备、蓝牙设备、鼠标和触摸屏、键入设置和自动播放设置的设置。此连接设备选项卡显示连接到您的PC的硬件。点击添加一个设备,你的电脑将自动扫描连接的设备。蓝牙选项卡非常简单,可以通过蓝牙将设备连接到PC上。单击蓝牙按钮,设备将自动开始扫描范围内的任何蓝牙设备。
如果有任何问题,显示设备或提供不可用,那么我们需要以下的工作。
删除并添加蓝牙设备
允许蓝牙设备连接到这台计算机
无法从启用蓝牙的设备连接到计算机?确保已允许蓝牙设备连接到计算机。尝试以下步骤: 1.转到控制面板。点击“硬件和声音”和“蓝牙设备”。2.单击Options选项卡。3.确保选中“允许蓝牙设备连接到此计算机”复选框。
如何将蓝牙设备连接到Windows 10计算机?
要连接启用蓝牙的移动电话:
资源链接:
修复网络连接问题
有7种解决网络连接问题的方法:
更新:
你的答案是如何与jssc联系的?
我正在检查你的问题。我发现在windows 7中,它工作得很好,而在windows 10中,有一些与硬件相关的问题导致了问题。
开发人员正在这一领域工作。但它还没有修好。issue#63和issue#85会澄清你的意思。
/**
* 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()]);
}我知道了,他们在各种操作系统上都使用了一些模式。
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("");Suggestions:只使用官方和最新的驱动程序。
jSSC-2.8.0发行版(24.01.2014)
修正:重要!修正了端口处理潜在泄漏的错误。 此版本包含本机libs for Windows(x86,x86-64)、Linux(x86,x86-64、ARM软和硬浮点数)、Solaris(x86,x86-64)、Mac (x86,x86-64、PPC、PPC64)。所有本机库都包含在jssc.jar文件中,您不需要手动管理本机库。
资源链接:
https://stackoverflow.com/questions/33755211
复制相似问题