2014-09-01 136 views
0

读我无法通过节点红色USB HID设备使用C VS的Javascript

这里从我Temper1 USB温度传感器读取的温度是我的代码:

var HID = require('node-hid'); 
var readCommand=[0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00]; 
exports.readTemperatures=function(devices) { 
}; 

exports.getDevices=function() { 
var devices=HID.devices(); 
var list=[]; 
devices.forEach(function(item) { 
    if(item.product==="TEMPerV1.4" && 
     item.vendorId===3141 && 
    //1 returns path 
     //item.interface===0){ list.push(item.path); 
    //2 returns device 
    item.interface===0){ list.push(item); 
    } 
}); 
return list; 
} 

exports.readTemperature=function(path, callback, converter){ 
if(!converter) { 
    converter=exports.toDegreeCelcius; 
} 
var device = new HID.HID(path); 
device.write(readCommand); 
device.read(function(err,response){ 
    if(err) { 
    callback.call(this,err,null); 
    } else { 
    callback.call(this,null, converter(response[2],response[3])); 
    } 
}); 
} 

exports.toDegreeCelcius=function(hiByte, loByte) { 
var sign = hiByte & (1 << 7); 
var temp = ((hiByte & 0x7F) << 8) | loByte; 
if (sign) { 
    temp = -temp; 
} 
return temp * 125.0/32000.0; 
} 

的代码是从https://www.npmjs.org/package/temper1 提供但是我已经编辑了它,因为它们的温度传感器版本有点不同,我发现代码中的接口是不同的。因此将接口从1改为1,并更改了设备名称。因此我可以通过红色节点读取设备细节。但我的疑问可能是由于USB读取命令我的代码不起作用。但我无法检测到什么是正确的,我的意思是如何改变。我给一个C代码,效果很好,如果从Ubuntu的终端运行:

#include <usb.h> 
#include <stdio.h> 
#include <time.h> 

#include <string.h> 
#include <errno.h> 
#include <signal.h> 


#define VERSION "0.0.1" 

#define VENDOR_ID 0x0c45 
#define PRODUCT_ID 0x7401 

#define INTERFACE1 0x00 
#define INTERFACE2 0x01 

const static int reqIntLen=8; 
const static int reqBulkLen=8; 
const static int endpoint_Int_in=0x82; /* endpoint 0x81 address for IN */ 
const static int endpoint_Int_out=0x00; /* endpoint 1 address for OUT */ 
const static int endpoint_Bulk_in=0x82; /* endpoint 0x81 address for IN */ 
const static int endpoint_Bulk_out=0x00; /* endpoint 1 address for OUT */ 
const static int timeout=5000; /* timeout in ms */ 

const static char uTemperatura[] = { 0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00 }; 
const static char uIni1[] = { 0x01, 0x82, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00 }; 
const static char uIni2[] = { 0x01, 0x86, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00 }; 

static int bsalir=1; 
static int debug=0; 
static int seconds=5; 
static int formato=0; 
static int mrtg=0; 


/* EDIT THIS TO SUBSTRACT x DEGRESS CELSIUS FROM THE OUTPUT! - SOME TEMPer DEVICES SHOW TOO MUCH */ 
static int substract = 0; 


void bad(const char *why) { 
     fprintf(stderr,"Fatal error> %s\n",why); 
     exit(17); 
} 


usb_dev_handle *find_lvr_winusb(); 

void usb_detach(usb_dev_handle *lvr_winusb, int iInterface) { 
     int ret; 

    ret = usb_detach_kernel_driver_np(lvr_winusb, iInterface); 
    if(ret) { 
     if(errno == ENODATA) { 
      if(debug) { 
       printf("Device already detached\n"); 
      } 
     } else { 
      if(debug) { 
       printf("Detach failed: %s[%d]\n", 
         strerror(errno), errno); 
       printf("Continuing anyway\n"); 
      } 
     } 
    } else { 
     if(debug) { 
      printf("detach successful\n"); 
     } 
    } 
} 

usb_dev_handle* setup_libusb_access() { 
    usb_dev_handle *lvr_winusb; 

    if(debug) { 
     usb_set_debug(255); 
    } else { 
     usb_set_debug(0); 
    } 
    usb_init(); 
    usb_find_busses(); 
    usb_find_devices(); 


    if(!(lvr_winusb = find_lvr_winusb())) { 
       printf("Couldn't find the USB device, Exiting\n"); 
       return NULL; 
     } 


     usb_detach(lvr_winusb, INTERFACE1); 


     usb_detach(lvr_winusb, INTERFACE2); 


     if (usb_set_configuration(lvr_winusb, 0x01) < 0) { 
       printf("Could not set configuration 1\n"); 
       return NULL; 
     } 


     // Microdia tiene 2 interfaces 
     if (usb_claim_interface(lvr_winusb, INTERFACE1) < 0) { 
       printf("Could not claim interface\n"); 
       return NULL; 
     } 

     if (usb_claim_interface(lvr_winusb, INTERFACE2) < 0) { 
       printf("Could not claim interface\n"); 
       return NULL; 
     } 

     return lvr_winusb; 
} 



usb_dev_handle *find_lvr_winusb() { 

    struct usb_bus *bus; 
     struct usb_device *dev; 

     for (bus = usb_busses; bus; bus = bus->next) { 
     for (dev = bus->devices; dev; dev = dev->next) { 
         if (dev->descriptor.idVendor == VENDOR_ID && 
           dev->descriptor.idProduct == PRODUCT_ID) { 
           usb_dev_handle *handle; 
           if(debug) { 
            printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n", VENDOR_ID, PRODUCT_ID); 
           } 

           if (!(handle = usb_open(dev))) { 
             printf("Could not open USB device\n"); 
             return NULL; 
           } 
           return handle; 
         } 
       } 
     } 
     return NULL; 
} 


void ini_control_transfer(usb_dev_handle *dev) { 
    int r,i; 

    char question[] = { 0x01,0x01 }; 

    r = usb_control_msg(dev, 0x21, 0x09, 0x0201, 0x00, (char *) question, 2, timeout); 
    if(r < 0) 
    { 
      perror("USB control write"); bad("USB write failed"); 
    } 


    if(debug) { 
     for (i=0;i<reqIntLen; i++) printf("%02x ",question[i] & 0xFF); 
     printf("\n"); 
    } 
} 

void control_transfer(usb_dev_handle *dev, const char *pquestion) { 
    int r,i; 

    char question[reqIntLen]; 

    memcpy(question, pquestion, sizeof question); 

    r = usb_control_msg(dev, 0x21, 0x09, 0x0200, 0x01, (char *) question, reqIntLen, timeout); 
    if(r < 0) 
    { 
      perror("USB control write"); bad("USB write failed"); 
    } 

    if(debug) { 
     for (i=0;i<reqIntLen; i++) printf("%02x ",question[i] & 0xFF); 
     printf("\n"); 
    } 
} 

void interrupt_transfer(usb_dev_handle *dev) { 

    int r,i; 
    char answer[reqIntLen]; 
    char question[reqIntLen]; 
    for (i=0;i<reqIntLen; i++) question[i]=i; 
    r = usb_interrupt_write(dev, endpoint_Int_out, question, reqIntLen, timeout); 
    if(r < 0) 
    { 
      perror("USB interrupt write"); bad("USB write failed"); 
    } 
    r = usb_interrupt_read(dev, endpoint_Int_in, answer, reqIntLen, timeout); 
    if(r != reqIntLen) 
    { 
      perror("USB interrupt read"); bad("USB read failed"); 
    } 

    if(debug) { 
     for (i=0;i<reqIntLen; i++) printf("%i, %i, \n",question[i],answer[i]); 
    } 

    usb_release_interface(dev, 0); 
} 

void interrupt_read(usb_dev_handle *dev) { 

    int r,i; 
    unsigned char answer[reqIntLen]; 
    bzero(answer, reqIntLen); 

    r = usb_interrupt_read(dev, 0x82, answer, reqIntLen, timeout); 
    if(r != reqIntLen) 
    { 
      perror("USB interrupt read"); bad("USB read failed"); 
    } 

    if(debug) { 
     for (i=0;i<reqIntLen; i++) printf("%02x ",answer[i] & 0xFF); 

     printf("\n"); 
    } 
} 

void interrupt_read_temperatura(usb_dev_handle *dev, float *tempC) { 

    int r,i, temperature; 
    unsigned char answer[reqIntLen]; 
    bzero(answer, reqIntLen); 

    r = usb_interrupt_read(dev, 0x82, answer, reqIntLen, timeout); 
    if(r != reqIntLen) 
    { 
      perror("USB interrupt read"); bad("USB read failed"); 
    } 


    if(debug) { 
     for (i=0;i<reqIntLen; i++) printf("%02x ",answer[i] & 0xFF); 

     printf("\n"); 
    } 

    temperature = (answer[3] & 0xFF) + (answer[2] << 8); 
    *tempC = temperature * (125.0/32000.0); 

} 

void bulk_transfer(usb_dev_handle *dev) { 

    int r,i; 
    char answer[reqBulkLen]; 

    r = usb_bulk_write(dev, endpoint_Bulk_out, NULL, 0, timeout); 
    if(r < 0) 
    { 
      perror("USB bulk write"); bad("USB write failed"); 
    } 
    r = usb_bulk_read(dev, endpoint_Bulk_in, answer, reqBulkLen, timeout); 
    if(r != reqBulkLen) 
    { 
      perror("USB bulk read"); bad("USB read failed"); 
    } 


    if(debug) { 
     for (i=0;i<reqBulkLen; i++) printf("%02x ",answer[i] & 0xFF); 
    } 

    usb_release_interface(dev, 0); 
} 


void ex_program(int sig) { 
     bsalir=1; 

     (void) signal(SIGINT, SIG_DFL); 
} 

int main(int argc, char **argv) { 

    usb_dev_handle *lvr_winusb = NULL; 
    float tempc; 
    int c; 
    struct tm *local; 
    time_t t; 

    while ((c = getopt (argc, argv, "mfcvhl::")) != -1) 
    switch (c) 
     { 
     case 'v': 
     debug = 1; 
     break; 
     case 'c': 
     formato=1; //Celsius 
     break; 
     case 'f': 
     formato=2; //Fahrenheit 
     break; 
     case 'm': 
     mrtg=1; 
     break; 
     case 'l': 
     if (optarg!=NULL){ 
      if (!sscanf(optarg,"%i",&seconds)==1) { 
      fprintf (stderr, "Error: '%s' is not numeric.\n", optarg); 
      exit(EXIT_FAILURE); 
      } else {   
       bsalir = 0; 
       break; 
      } 
     } else { 
      bsalir = 0; 
      seconds = 5; 
      break; 
     } 
     case '?': 
     case 'h': 
     printf("pcsensor version %s\n",VERSION); 
    printf("  Aviable options:\n"); 
    printf("   -h help\n"); 
    printf("   -v verbose\n"); 
    printf("   -l[n] loop every 'n' seconds, default value is 5s\n"); 
    printf("   -c output only in Celsius\n"); 
    printf("   -f output only in Fahrenheit\n"); 
    printf("   -m output for mrtg integration\n"); 

    exit(EXIT_FAILURE); 
     default: 
     if (isprint (optopt)) 
      fprintf (stderr, "Unknown option `-%c'.\n", optopt); 
     else 
      fprintf (stderr, 
        "Unknown option character `\\x%x'.\n", 
        optopt); 
     exit(EXIT_FAILURE); 
     } 

    if (optind < argc) { 
     fprintf(stderr, "Non-option ARGV-elements, try -h for help.\n"); 
     exit(EXIT_FAILURE); 
    } 

    if ((lvr_winusb = setup_libusb_access()) == NULL) { 
     exit(EXIT_FAILURE); 
    } 

    (void) signal(SIGINT, ex_program); 

    ini_control_transfer(lvr_winusb); 

    control_transfer(lvr_winusb, uTemperatura); 
    interrupt_read(lvr_winusb); 

    control_transfer(lvr_winusb, uIni1); 
    interrupt_read(lvr_winusb); 

    control_transfer(lvr_winusb, uIni2); 
    interrupt_read(lvr_winusb); 
    interrupt_read(lvr_winusb); 



    do { 
      control_transfer(lvr_winusb, uTemperatura); 
      interrupt_read_temperatura(lvr_winusb, &tempc); 
     tempc = (tempc - substract); 

      t = time(NULL); 
      local = localtime(&t); 

      if (mrtg) { 
       if (formato==2) { 
        printf("%.2f\n", (9.0/5.0 * tempc + 32.0)); 
        printf("%.2f\n", (9.0/5.0 * tempc + 32.0)); 
       } else { 
        printf("%.2f\n", tempc); 
        printf("%.2f\n", tempc); 
       } 

       printf("%02d:%02d\n", 
          local->tm_hour, 
          local->tm_min); 

       printf("pcsensor\n"); 
      } else { 
       if (formato==2) { 
        printf("%.2f\n", (9.0/5.0 * tempc + 32.0)); 
       } else if (formato==1) { 
        printf("%.2f\n", tempc); 
       } else { 
        printf("%04d/%02d/%02d %02d:%02d:%02d ", 
           local->tm_year +1900, 
           local->tm_mon + 1, 
           local->tm_mday, 
           local->tm_hour, 
           local->tm_min, 
           local->tm_sec); 

        printf("Temperature %.2fF %.2fC\n", (9.0/5.0 * tempc + 32.0), tempc); 
       } 
      } 

      if (!bsalir) 
       sleep(seconds); 
    } while (!bsalir); 

    usb_release_interface(lvr_winusb, INTERFACE1); 
    usb_release_interface(lvr_winusb, INTERFACE2); 

    usb_close(lvr_winusb); 

    return 0; 
} 

由于传感器的版本是不同的,可能是USB写控制也不同。我不知道USB控制很多。请帮助我

回答

0

你不说,但我会假设你试图在Node-Red Function节点中使用该节点代码。您不能在Node-Red功能块中使用require。如果您想包含额外的模块,您需要将它们添加到settings.js文件的末尾,以便它们包含在上下文对象中。例如

functionGlobalContext: { bonescript:require('bonescript') } 

您将访问bonescript对象是这样的:

context.global.bonescript 

说了这么多,你可能不应该在一个功能节点做这个,你应该看看写输入节点。你可以找到写作节点这里的DOC:http://nodered.org/docs/creating-nodes/

+0

是的,我在节点红色的工作,我的设置已经添加 'functionGlobalContext:{温度计:需要(“temper1”)}' 我写的函数在功能块中获取温度: var device = context.global.thermometers.readTemperature(“0002:0004:00”,function(err,value){ console.log(“Result:”+ value); }); 返回设备;' – 2014-09-01 12:23:54

+0

但是它显示无法打开这个路径的设备,这条路是正确的,因为我测试了这个命令: 'var devices = context.global.thermometers.getDevices();' '返回设备;'得到了路径并添加。 – 2014-09-01 12:30:24