Yan
Yan Just a simple man.

如何在linux系统上获取扫描枪数据

如何在linux系统上获取扫描枪数据

Linux获取扫描枪数据,通过对/dev/input目录下的输节点监测,并读取其中的数据

原理分析

扫描枪的原理与键盘输入的原理相同,都属于输入设备.将扫描当成普通的输入事件处理即可,从/dev/input/eventX节点获取扫描的所有数据输入.

通过输入事件的type,value可以筛选出不同的事件,相应的data就是我们需要的扫描枪的输入的值

代码处理

获取节点的名字

在制定输入设备的时候,通常输入通过打印输入设备的名字,确认是否监测对了正确的节点.

1
ioctl (fd, EVIOCGNAME (sizeof (name)), name);

通过ioctl函数组的EVIOCGNAME获取事件节点的名称,并打印出来,确认节点的正确性

1
printf ("Reading From : %s (%s)\n", device, name);

获取扫描枪的数据

当你通过扫描枪扫描了一个条形码或者二维码时,数据就会通过输入事件的形式输入.

1
read(fd,&buff,sizeof(struct input_event))

关于input_event.事件结构体的定义和使用,可以参考Linux-C下的输入事件分析

处理获取的数据

  1. 按键的输入有按下和松开两个value.而扫描枪是类似键盘输入的形式,所以也有value=0value=1,选择其中一个即可
  2. 当数据的类型为1,也就是EV_KEY.数据才是我们需要的扫描枪的数据
1
2
3
if (buff.value == 1 && buff.type == 1 ){
    printf("i:%d,type:%d code:%d value:%d\n",i,buff.type,buff.code,buff.value);
}

示例

这里以扫描枪扫描MAC地址为例,扫描以后将数据存储到文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 if (argv[1] == NULL){
     printf("Please specify (on the command line) the path to the dev event interface devicen");
     exit (0);
 }

 if ((getuid ()) != 0)
     printf ("You are not root! This may not work...n");

 if (argc > 1)
     device = argv[1];

 if ((fd = open (device, O_RDONLY)) == -1)
     printf ("%s is not a vaild device.n", device);

 //Print Device Name
 ioctl (fd, EVIOCGNAME (sizeof (name)), name);
 printf ("Reading From : %s (%s)\n", device, name);

 while (1){
     while(read(fd,&buff,sizeof(struct input_event))==0);
     if (buff.value == 1 && buff.type == 1  && buff.code != 42){
         printf("i:%d,type:%d code:%d value:%d\n",i,buff.type,buff.code,buff.value);
         printf("convert:%c\n",convert[buff.code]);
         convert_value[i]=convert[buff.code];
         i++;
         if(i == 17){
             break;
         }
     }
 }
 printf("%s\n",convert_value);
 close(fd);
 fp = fopen("/tmp/eth_mac.txt", "w+");
 if(fp == NULL){
     printf("OPEN FILE ERROR\n");
 }
 size = sizeof(char);
 fwrite(convert_value, size, 17, fp);
 if(rd == EOF){
     printf("write eth_mac faile\n");
 }
 rewind(fp);
 fwrite(convert_value, size, 17, fp);
 if(rd == EOF){
     printf("write eth_mac faile\n");
 }
 fclose(fp);

完整的源码https://github.com/yan-wyb/source/tree/master/c/embedded/app/Scanner

Picturs

link

issues

如果有疑惑或错误,请提issues –> Issues If there are doubts or errors, please submit an issue –> Issues