Linux应用程序--USB设备
文章摘要:本文描述了基于Linux系统的USB设备访问方法的实现
操作系统:Debian8
安装USB开发支持包:libusb-dev
编译选项需加入-lusb参数
示例代码:
#include <stdio.h>
#include <usb.h>
int main(int argc, char** argv)
{
int ret;
usb_init();
// 查找USB总线
ret = usb_find_busses();
printf("ret = %d\r\n", ret);
// 查找USB设备
ret = usb_find_devices();
printf("ret = %d\r\n", ret);
struct usb_bus *bus;
struct usb_device *dev;
// 遍历设备(输出VID/PID)
for(bus = usb_busses;bus;bus=bus->next)
{
for(dev=bus->devices;dev;dev=dev->next)
{
printf("VID = %04X, PID=%04X\r\n",
dev->descriptor.idVendor,
dev->descriptor.idProduct);
}
printf("\r\n");
}
return 0;
}
注意事项:
usb_busses为全局变量;
Linux应用程序--基于hidraw模式的HID设备访问
操作系统:Debian 8
硬件设备:IC卡读写器
HID报告长度:21字节
读写测试
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/hidraw.h>
#inclde <sys/ioctl.h>
#define DEVNAME "/dev/hidraw3"
int main(int argc, char** argv)
{
char wbuf[30] = {0x06, 0x03, 0x01, 0x00};
char rbuf[30];
int rxlen;
int fd;
int i;
fd = open(DEVNAME, O_RDWR);
if(fd < 0)
{
printf("Can not Open Device.\r\n");
exit(1);
}
// 获取设备信息,主要是pid,vid
struct hidraw_devinfo devinfo;
ret = ioctl(fd,HIDIOCGRAWINFO,&devinfo);
if(ret == 0)
{
printf("VID = %04x, PID = %04X\r\n",
(unsigned short)devinfo.vendor,
(unsigned short)devinfo.product);
}
else
{
perror("HIDIOCGRAWINFO");
}
write(fd, wbuf, 21);
rxlen = read(fd, rbuf, 21);
for(i = 0; i < rxlen; i++)
{
printf("%d ",rbuf[i]);
}
printf("\r\n");
close(fd);
return 0;
}
注意事项:
1.读操作时,如果无数据,则会阻塞至数据到达;
2.一般规定读写操作的长度应该等于报告描述符规定的长度;
3.若读操作时指定长度小于报告描述符规定的长度时,自动舍弃其余字节;
4.若读操作时指定长度大于报告描述符规定的长度时,返回实际长度;
警惕你身边的程序员
“你们用着盗版软件的时候,有想过辛辛苦苦做出这款软件的程序员吗?他们也要养家糊口啊!”
“哈哈哈,别TM逗了,程序员连女朋友都没有,哪儿有家要养啊!”
程序员绝对是自黑起来最疯狂的工种,关于他们“人傻钱多单身狗”的段子简直生生不息。然而,就在他们刻意营造的“屌丝”形象背后,隐藏着一个惊天秘密!
今天的故事,作者是个记者,为了做一个关于梦游症的专题调查报告,采访了许多人。而这一次,采访的是一个程序员。
我特地跟他约好时间,挑了个明朗的周六下午来拜访他,而他却在忙碌地进行着繁复的编程工作。
“没事儿,等你忙完我们再开始。”
我很有耐心地坐在一旁,看着他飞快地敲击着键盘,屏幕上,一行行看不懂的代码在飞速地刷新着屏幕。
半个小时后,他敲下了回车键,如释重负,深吸了一口气,转过身对我道:“好啦,终于搞定啦!”
我微微一笑,假装关切地问道:“每天都这么忙吗?”
程序员道:“也不一定,有时候,我会提前完成好几天的工作,然后休息。”
我问:“你为哪家公司工作?腾讯、百度、阿里巴巴?”
程序员歪了歪脑袋:“以前在百度混过,半年前辞职了。”
我问:“现在呢?”
程序员道:“一直在家里。可以开始了么?”
我道:“啊,好,你是从什么时候开始梦游的?”
程序员道:“八个月前。”
我道:“当时什么情况?”
程序员道:“那天我在公司……应该说是前公司,加班到很晚才回家,回到家倒头便睡下了。”
我道:“不好意思,打断你一下,你一直都是一个人住?”
程序员苦笑道:“我们这种人,成天跟程序打交道,很难交到女朋友的。”
我尴尬一笑:“你继续。”
程序员点了点头:“其实当天还有一些程序没有完成,但我实在太累了,回到家脑袋一沾枕头就着了。第二天一早醒来,才想起昨晚的工作没完成,上班就得把完整的程序交上去。于是我一阵手忙脚乱,打开电脑,准备硬着头皮将程序赶完。可是当我打开电脑看到……”
我被吸引住了:“看到什么?”
程序员道:“所有的程序,都已经完成了。”
我吸了口气:“所以你由此判断自己梦游。你认为自己在梦游状态下完成了工作。”
程序员道:“不仅仅如此。最开始我并没有反应过来,我是说,我并不知道这和梦游有半毛钱的关系。
我以为是自己头天晚上完成了工作,只是因为压力太大,情绪紧张给忘掉了。
后来这种事情连续发生了很多次,直到有次在公司加班,我实在太困,就在办公桌前睡着了。
没一会儿就听到同事在我耳边呼喊我的名字,当我睁开眼睛的时候,发现自己在椅子上坐了起来,双手还抚在键盘上,面对着屏幕,屏幕上的代码比之前多了三十多行。
我还以为这是同事的恶作剧,当时有些生气。可同事们都说被我给吓到了,所有人都看见我睡着睡着就坐了起来,然后闭着眼睛在键盘上打代码。”
我道:“看过医生么?”
程序员点了点头:“看过,没有用。自从知道自己梦游,那段时间,我晚上都不敢睡觉,每天都睁着眼,撑到很晚,实在忍不住了才睡。”
我问:“你梦游的时候在梦里是怎样的?”
程序员道:“一开始我记不清梦的内容,后来那梦就越来越清晰了。我梦到自己打开了一扇门……”
我:“一扇门?你是说,你梦游的时候,走出了家门?”
程序员摇了摇头道:“就是一扇门,一扇黑暗中的门。没错,每次都是相同的梦境,一开始是一片黑暗,紧接着不远处会出现一道门,我会不由自主地朝着那扇门走去。”
我问:“你推开那扇门了么?” 程序员点了点头。
我问:“门后面有什么?”
程序员道:“像是一家公司,里面有很多人,像是公司里的员工,每个人面前都有一台电脑,所有人都面无表情,在电脑上飞快地敲击着代码。里面有一台电脑是空出来的,那是我的电脑。每次在梦里,我都会在那台电脑前无休无止地输入代码。直到第二天早上醒来,我都会发现,自己的电脑里多了一些代码文件,但是,我几乎看不懂那些代码。”
我:“看不懂?”
程序员点了点头:“那些代码和我的工作无关,是一些十分高级的程序语言,甚至不属于我们已知范围内的任何一种程序语言。”
我道:“我有些听不明白了。你的意思好像是说,那是一堆乱码。”
程序员摇了摇头说:“对于普通人来说,那的确是一对乱码。可是对一个资深的程序员来说,尽管我看不懂这种程序语言,但是我能够发现这语言当中的某种规则,乱码是不存在规则可言的。所以,这些程序语言是有意义的。”
我没说话,等待着他继续说下去。
程序员接着道:“后来我发现,每个月都会有一笔钱打到我的账上。”
我:“工资?”
程序员摇了摇头:“不是工资,是额外的钱。”
我好奇地问:“多少?”
程序员道:“总之数额不小。”
我问:“谁打的?”
程序员半晌没有说话,嘴角蠕动,像是在酝酿着什么难以表达的东西。
半分钟后,他十分神秘地对我说:“你相信上帝存在么?”
我不知道他为什么会突然这么问,耸了耸肩道:“我不知道。但科学上认为,上帝是不存在的。”
程序员说:“有人,创造了我们!”
我道:“你是说上帝?神创论早就被达尔文的进化论推翻了,所有人都知道,我们是由森林古猿进化而来的。在最早之前,我们是无机物,然后无机物变成了有机物,变成了早期单细胞生物,布拉布拉布拉布拉的一大堆,我生物学得不是很好,总之最后我们进化成了现在的样子。每一个生命都是这么进化过来的。”
程序员道:“如果达尔文是程序设定好的呢?”
我愣了一下:“我不明白你的意思。”
程序员说:“我知道让你理解起来有点困难。这样吧,我从你能够理解的地方说起。你喜欢打游戏么?”
我:“还好吧。”
程序员说:“玩过GTA么?”
我:“你说侠盗飞车啊,这么经典的游戏,当然玩过。”
程序员点了点头:“侠盗飞车里面,用程序建造了一座现代化的大都市,那座大都市里有晴天,有雨天,有高楼大厦,有花草树木,有公园,有长椅,甚至有坐在长椅上的老人,在草坪里奔跑的猫。有形形色色的路人,来来往往的车辆,有医院,有警察局,你犯了案,警察会来抓你。你不能飞,只能和现实世界里一样,做个普通人,一切都遵循我们熟知的物理学原理。我们为什么不能飞?”
我:“万有引力。”
程序员:“GTA里的NPC(游戏内置角色)为什么不能飞?”
我:“万有……”我突然呆住了,觉得有什么不对。
程序员得意一笑:“游戏里也存在万有引力么?那只是程序员为了模仿现实世界制定的规则,一串代码而已。”
我点了点头:“你刚好说了我想说的。”
程序员道:“那又是什么,制定了所谓现实世界的规则?为什么会有万有引力?为什么我朝着你的鼻梁打你一拳你会流鼻血,为什么我朝着墙壁打一拳我的手可能会骨折?为什么我们需要呼吸?为什么我们需要喝水?这些规则,是谁制定的?”
我无法回答。
程序员接着道:“还没明白?这个世界,就像一个程序,是由程序员创造出来的。”
我觉得他疯了,顺着他的话说:“那个程序员就是上帝?”
程序员道:“没错。准确地说,他是我们的BOSS。BOSS负责分配任务,由公司里的程序员来完成。这个世界很大,一个人远远不能完成,所以需要很多个程序员合作。就像游戏,一组程序员负责建模,一组程序员负责这,负责那,总之各司其职,才能维护整个程序的稳定运行。”
我笑了笑说:“你《黑客帝国》看多了。”
程序员说:“随你怎么说。”
我道:“如果你说的都是真的,那么你又是怎么知道这些的?”
程序员道:“我当然知道,我就是构建这个世界的程序员之一,我负责NPC(游戏内置角色)的构建。”
我呵呵一笑:“你不会想说,你每晚梦游写的程序,其实是在构建这个世界的NPC吧?”
程序员点了点头说:“没错,看来你挺聪明的,不愧是我创造出来的NPC。”
我一阵无语:“好啊,你说我是你创造的,咱俩今天才见面,以前从不认识,你说说我以前是干什么的?”
程序员道:“我怎么会知道?”
我说:“不是你创造了我么?”
程序员道:“我只负责构建NPC的外观,但是每一个NPC的角色设定和身份背景,都有专门的设计师来打造,我们分工是很明确的。所以,我不知道很正常。”
我又问:“如果我是你创造的,我为什么会来找你?”
程序员道:“这是个巧合。我们只负责创造你,设定你的过去,但是从不会干涉你的未来。是你自己选择要来找我的,这是个巧合。另外,你上个月才诞生。”
我差点儿笑喷:“看来今天到这里来采访你的,是个刚出生不到一个月的婴儿。”
程序员道:“你没理解我的意思。我说的诞生,并不是指你从娘胎里出来,而是指,你被创造出来。你被创造出来的时候,就已经是现在这副尊容了。”
我道:“那我为什么会感觉自己活了二十来年?”
程序员道:“那是因为另外一个组的设计师给你灌输了二十来年的记忆。人对时间的感受,大多来自于自己的记忆。包括你的父母,你的整个家庭,都诞生于上个月,和你同时诞生。这是程序升级所要做出的必要的NPC调整。为此,我们还修改了不少已经存在的NPC的记忆,让他们认识你们,好像一开始你们就存在于他们的生活当中。这样,你们的出现就是浑然天成的,没有谁会对此产生怀疑。”
他顿了顿,接着说,“对了,其实这个世界的历史也没有你想象得那么长。大概……只有几百年的历史。这里说回到达尔文。其实达尔文是我们程序员精心设计的NPC。因为那时候的NPC相信神创论,一些NPC开始用毕生精力来寻找上帝的存在。所以程序员害怕有一天NPC会发现这个世界只是个巨大的程序,于是创造达尔文,提出进化论,让人相信自己是进化而来,而不是被创造出来的。达尔文进化论的出现,是为了维护程序的稳定。”
我质疑道:“那华夏五千年文明从何而来?冰河世纪,恐龙时代……那又是怎么回事儿?”
程序员有些无奈:“你从哪里了解到的五千年文明?又是从何处知道冰河世纪与恐龙时代的存在?”
我道:“书本上。”
程序员扬了扬眉毛:“没错,书本上,书本又是谁创造的呢?你所了解到的这些东西,有关这个世界,那么多乱七八糟的历史,你真正经历过吗?实践才能出真知,纸上得来终觉浅。”我哑口无言。
那天结束了采访,回到家后,我突然收到了程序员发给我的邮件,正文写着:送给你的礼物,一个月后开启。我点开附件,果然,附件加了密,解密时间设置在一个月之后。
半个月后,我得到消息,程序员被家人送进了精神病院。果然,那天下午和他的对话,不过只是在听一个精神病患者的呓语罢了。
又过了半个月,我忽然想到一个月前,程序员发给我的加密邮件,已经到解密时间了。
我点开邮件,附件已经完成了自动解密。
我迫不及待地点开附件,看到附件中是一个女人的3D建模像。
而那个女人,和我刚认识的女朋友,一模一样。
看完故事,望向办公室那些整天对着电脑啪啪啪写代码的背影们,感觉整个人都不好了……
对不起,以后再也不黑你们了……
rsyslog配置文件说明
加载模块
# /etc/rsyslog.conf
# 本地日志系统模块
$ModLoad imuxsock
# 内核日志系统模块
$ModLoad imklog
# provides --MARK-- message capability
#$ModLoad immark
# 提供UDP日志接收
#$ModLoad imudp
#$UDPServerRun 514
# 提供TCP日志接收
#$ModLoad imtcp
#$InputTCPServerRun 514
全局指令
# 使用传统时间戳格式(注释掉后使用高精度时间戳)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# 设置日志文件的默认属性及权限
# 文件属主/群组/权限/目录权限/操作掩码
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
# 卷轴和状态文件的位置(什么东东??)
$WorkDirectory /var/spool/rsyslog
# 导入所有配置文件
$IncludeConfig /etc/rsyslog.d/*.conf
规则
# 标准日志文件(登陆设备/服务类别)
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
#
# 邮件日志记录,分开记录是为了处理方便.
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
# 新闻日志
news.crit /var/log/news/news.crit
news.err /var/log/news/news.err
news.notice -/var/log/news/news.notice
#
# 根据信息级别来定义日志文件
# =xxx表示等于xxx级别的信息
# 等于debug级别的信息,保存在/var/log/debug文件中
# none表示排除掉该服务
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
# 等于info,notice,warn级别的信息,保存在/var/log/messages中
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
过滤日志
#
# Emergencies are sent to everybody logged in.
#
*.emerg :omusrmsg:*
.xxx: 表示大于等于xxx级别的信息
.=xxx:表示等于xxx级别的信息
.!xxx:表示在xxx之外的等级的信息
服务类别
Linux的syslog服务定义了一些规范的服务类别,建议按照规范来生成日志;
auth: 主要与认证/授权有关的机制,例如 login, ssh, su 等需要账号/密码的服务;
authpriv: 与auth类似,但记录较多账号私人信息,包括 pam 模块等;
user: 用户级信息
日志等级
一共分为7个等级
参考文档
http://linux.vbird.org/linux_basic/0570syslog.php#syslog_conf_default