Linux系统应用--wifi应用


文章摘要: 本文描述了linux下的wifi应用


适用范围: Debian/raspbian


扫描可用网络(非必要):

# iwlist wlan0 scan

生成配置文件:

# wpa_passphrase dachun 123456789 >> /etc/wpa_supplicant.conf

文件格式如下:

network={
        ssid="dachun "
        #psk="123456789"
        psk=a61c76565757a9b757ce94fbd73e3a38be17f8633eee31b8786a4ecf32785758
}

注意事项:
SSID:dachun
PSK: 指定网络密码,可以用加密后的密码也可以用明文密码(大概是双引号区分吧)
该配置文件可有多个network,系统从第一个开始尝试连接;


连接WIFI(重要)

# wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf&

注意事项: 需要指定后台运行;


配置IP

# udhcpc -i wlan0

或者手动指定:

# ifconfig wlan0 192.168.9.66

断开连接

# wpa_cli term wlan0

查看当前wifi连接状态:

# iwconfig wlan0

- 阅读全文 -

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

- 阅读全文 -


Copyright©2025 春天花会开, All Rights Reserved. Email: webmaster@oroct.com