Archive

Archive for March, 2008

Ubuntu和手机通过蓝牙互传文件

March 30th, 2008

Ubuntu 7.10 Gutsy,手机Nokia 6120c,蓝牙适配器是让朋友帮买的,朋友不懂Linux,卖这个的也不懂,随便买了一个叫什么艾思凯(issk)蓝牙博士(BLUETOOTH DOCTOR)的,还行,一插机器上就认出来了,就是不知道各种参数如何,初步使用感觉传输距离或者说穿透力不强:

$ lsusb
Bus 001 Device 002: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter

首先安装一些必要的东东:

sudo aptitude install gnome-bluetooth gnome-phone-manager

然后配置/etc/bluetooth/hcid.conf

# Security Manager mode
# 安全设置模式,改成auto
security auto; 
...
# Default PIN code for incoming connections
# 匹配码/通行码,为安全起见,建议自己设一个。
passkey "1234"; 
...
# Local device name
#   %d - device id
#   %h - host name
# 电脑在蓝牙设备中显示的名称,改不改无所谓,自己认识就行。
name "%h-%d"; 

重启服务/etc/init.d/bluetooth,从手机上查找匹配设备,找到电脑以后,输入刚才设定的匹配码;匹配成功之后,提示“授权设备自动连接”选“是”。

配置/etc/bluetooth/rfcomm.conf

rfcomm0 {
    # 启动时自动绑定地址(什么意思?)
    bind yes;
    # 蓝牙设备地址(用$ hcitool scan查找,用$ sdptool browse [地址]查看频道)
    device 00:1C:D6:AC:7D:88;
    # 通迅频道
    channel 11;
    # 说明,自己随便写
    comment "Fwolf Nokia 6120c";
}

然后就可以用rfcomm connect 0连接手机了(测试一下):

$ rfcomm connect 0
Connected /dev/rfcomm0 to 00:1C:D6:AC:7D:88 on channel 1
Press CTRL-C for hangup
Disconnected

现在就可以传文件了:从电脑向手机发送文件用gnome-obex-send 文件名,按照提示选择蓝牙设备后,成功完成文件传输;从手机向电脑发送文件,电脑上要先运行gnome-obex-server,收到文件发送信号之后,会提示是否接收,接收完成后还会弹出一个如何处理的提示框,同时传多个文件的时候会比较烦人。传过来的文件都保存在$HOME/Desktop下,重名文件会自动更名。不过两个方向的传送方式传中文文件名都会乱码,文件内容没事(用usb数据线传没这问题)。

但gnome-phone-manager能发现手机但就是连不上,不知道是不是channel设置的问题,又好像是软件本身的问题,不知道回头升级到Hardy能好些不。

下面是一些网上搜到可能有用的东东:

电脑上寻找蓝牙设备:
$ hcitool scan
Scanning ...
        00:1C:D6:AC:7D:88       Fwolf Nokia 6120c
电脑上查询蓝牙手机(有时候只在适配器刚插上的时候能查询出数据,后来再用就连接超时):
$ sdptool browse 00:1C:D6:AC:7D:88
Service Name: AVRCP Target
Service Description: Audio Video Remote Control
Service Provider: Symbian Software Ltd.
Service RecHandle: 0x10000
Service Class ID List:
  "AV Remote Target" (0x110c)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x100
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0100

Service Name: Hands-Free Audio Gateway
Service RecHandle: 0x10004
Service Class ID List:
  "Handfree Audio Gateway" (0x111f)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Handsfree" (0x111e)
    Version: 0x0105

Service Name: Headset Audio Gateway
Service RecHandle: 0x10005
Service Class ID List:
  "Headset Audio Gateway" (0x1112)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0100

Service Name: Audio Source
Service RecHandle: 0x10011
Service Class ID List:
  "Audio Source" (0x110a)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 25
  "AVDTP" (0x0019)
    uint16: 0x100
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Advanced Audio" (0x110d)
    Version: 0x0100

Service Name: AVRCP Controller
Service Description: Audio Video Remote Control
Service Provider: Symbian Software Ltd.
Service RecHandle: 0x10012
Service Class ID List:
  "AV Remote" (0x110e)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x100
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0100

Service Name: SyncMLClient
Service RecHandle: 0x10013
Service Class ID List:
  UUID 128: 00000002-0000-1000-8000-0002ee000002
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 10
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "" (0x00000002-0000-1000-8000-0002ee000002)
    Version: 0x0100

Service Name: OBEX File Transfer
Service RecHandle: 0x10014
Service Class ID List:
  "OBEX File Transfer" (0x1106)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 11
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "OBEX File Transfer" (0x1106)
    Version: 0x0100

Service Name: Nokia OBEX PC Suite Services
Service RecHandle: 0x10015
Service Class ID List:
  UUID 128: 00005005-0000-1000-8000-0002ee000001
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 12
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "" (0x00005005-0000-1000-8000-0002ee000001)
    Version: 0x0100

Service Name: Nokia SyncML Server
Service RecHandle: 0x10016
Service Class ID List:
  UUID 128: 00005601-0000-1000-8000-0002ee000001
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 13
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "" (0x00005601-0000-1000-8000-0002ee000001)
    Version: 0x0100

Service RecHandle: 0x10017
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 3

Service Name: OBEX Object Push
Service RecHandle: 0x10018
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 9
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

Service Name: Dial-Up Networking
Service RecHandle: 0x10019
Service Class ID List:
  "Dialup Networking" (0x1103)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 4
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100

Service Name: Imaging
Service RecHandle: 0x1001a
Service Class ID List:
  "Imaging Responder" (0x111b)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 15
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Imaging" (0x111a)
    Version: 0x0100

这个可以用来查channel号码,不同手机的号码可能会不同,大概是要选择OBEX File Transfer所在的channel(我的手机是11),也有人说是用OBEX Object Push的频道(我的手机是9),再好像有时候瞎设一个或者干脆用1也能进行文件传输,总之有点深奥没弄明白,期待明白人发言。

在手机上查看蓝牙设备地址:*#2820
备注:gnome-obex-send找不到手机的解决办法(未测试)
sudo hciconfig hci0 inqmode 0

参考

Update @ 2008-07-04

升级到Ubuntu 8.04 hardy后,可以用bluetooth-sendto从电脑向手机发送文件,但从手机向电脑发总是不成功,可能和适配器有关系,也有人遇到了同样的问题还有很多,怀疑是和无线局域网的信号有干扰,但关闭无线网之后仍不行;最后,终于发现是bluz-utils的问题,按照其中有一个留言的提示,把intrepid里的bluez-utils包下载下来装上,就ok啦。

Related posts

Linux , , , , ,

virtualbox连接usb设备

March 27th, 2008

环境:Ubuntu 7.10 Gutsy, VirtualBox 1.5.6

网上虽然已经有很多介绍的文章了,但我还是遇到了一点小问题,别人好像没有说到。

首先就是得使用virtualbox的闭源版本,也就是非ose版本,如果你细心上virtualbox的开源、闭源版本区别页面去看看的话,可以清楚的看到ose版本是没有包含usb设备支持的,怪不得我的vb窗口右下角没有usb图标呢。

其次就是不用加什么usbfs组,只要在/etc/fstab中添加一句:

none /proc/bus/usb usbfs devgid=1002,devmode=664 0 0

其中1002用你机器上真实的vboxusers组的id替换,然后sudo mount -a就可以正常使用了。

参考

顺便再多说一句,virtualbox支持网络要想设置成桥接(结果是client就像局域网中正常的另外一台电脑一样)好像是麻烦了些,其实我觉得nat模式挺好挺够用的,虽然通讯上要麻烦一些,但client中的winxp就像是运行在一个“纯净”的网络环境当中一样,非常安全,杀毒软件什么的一概不用装,很好。

再补充

又遇波折,usb设备已经能够正常识别了,Nokia 6120c插上也能够被winxp识别出来,但pc套件就是找不到设备,到virtualbox的论坛上查了一下,发现很多人使用1.5以后的版本都是这样,降级(卸载再安装)到1.4就没事了。

降级之后默认1.5的虚拟机无法启动,根据错误提示删掉几行1.5添加的专用属性就可以了,比较简单:

Could not load the settings file '/home/fwolf/.VirtualBox/Machines/WinXP/WinXP.xml' (VERR_OPEN_FAILED).
FATAL ERROR: Unknown element 'Uart'
Location: '/home/fwolf/.VirtualBox/Machines/WinXP/WinXP.xml', line 45, column 15.

另外,还需要usb 2.0 ?? 找了一台usb 2.0接口的电脑试了还不行,没有办法了,关掉virtualbox,用vmware一连接就ok了,郁闷至极。

用obex连接Nokia 6120c

首先,把电话的控制权限赋予当前用户,通过dialout用户组,编辑/etc/udev/rules.d/40-permissions.rules文件,在最后添加上:

# NOKIA 6120
BUS=="usb", SYSFS{idVendor}=="0421", SYSFS{idProduct}=="002f", GROUP="dialout"

其中的0421和002f是手机设备的供应商和产品号,可以用lsusb看:

$ lsusb
Bus 005 Device 014: ID 0421:002f Nokia Mobile Phones 

然后将当前用户加入dialout组:

$ sudo adduser fwolf dialout

最后重启udev:

$ sudo /etc/init.d/udev restart

第二步,安装obex相关程序:

$ sudo aptitude install openobex-apps obexftp obextool

根据环境不同,可能还会要求装一些其他的包,比如bwidget, tablelist什么的。装好以后,启动obextool:

$ obextool --obexcmd "obexftp -t /dev/ttyACM0 -u 1"

等待一会儿,会提示错误:

It seems, that your device does not support the memory status feature.
Memory status will be disabled

/etc/obextools/obextool.cfg中找到下列内容:

###
### Enable memory status display - only works with Siemens :-( 
###
set ObexConfig(config,memstatus) 1
# set ObexConfig(config,memstatus) 0

###
### Enable file move command - only works with Siemens :-( 
###
set ObexConfig(config,filemove) 1
# set ObexConfig(config,filemove) 0

看到没有,这两项只对西门子有效,所以要把设置值改为0。上传文件的时候还有错误提示:

FIle '/path/to/upload/file' could not be uploaded to '/'!
Please check your file permissions.

还是在/etc/obextools/obextool.cfg中,有如下内容:

### Nokia 6670 requires the trailing slash on all directory names
# set ObexConfig(config,dir_slash) 1
set ObexConfig(config,dir_slash) 0

如果是Nokia手机,还是设置为0,但是。。。但是始终无法连接上手机,很不情愿的放弃了。参考:

闲话

又搜寻了很久,目前没有软件能在Linux下实现Nokia pc suite的全部功能,大部分都只解决了文件传送问题,二我所想要的却是电话本、短信、日历同步功能。

恼啊,Nokia的pc suite巨慢还不说,连Linux版也没有。又从网上找了很多参考以后,我决定搞一种自助、土点儿的通讯录同步方法(这个是最重要的,短信、日历没准儿也可以照葫芦画瓢一样搞定):

  1. 备份通讯录:打开名片夹->选项->全部标记->复制->至存储卡。
  2. 准备数据:用php写一个小程序,同步abook数据和存储卡中的vcf文件,usb数据通讯模式还是很好用的,同步的处理得智能一些,让手机和abook里的更新都有效。
  3. 恢复通讯录:打开名片夹->选项->复制->从存储卡。

短信输出使用MsgExport_v1.00汉化版,感觉还不错,剩下的就是需要正则表达式发威了。

Related posts

Linux , , , , ,

adodb5连接sybase的一个错误

March 25th, 2008

这个错误比较蹊跷,所以拿出来说一说。环境:php 5.2.3, adodb 5.04, ubuntu 7.10 Gutsy.

前两天为了使用adodb和sqlite3,就把adodb升级成了只支持php5的adodb5(5.0.4),过两天发现另外一个使用sybase的程序不正常了,运行时不工作直接退出,没有任何错误信息,通过添加die('hi');的方式定位到错误发生在$db = &ADONewConnection('sybase');这一行。

adodb对sybase的支持一直不强,不过还没有到不工作的地步,但这个错误没有任何提示,实在是不好找,无奈之下用ZendStudio来跟踪一下,弄了一个最简单的小程序,当然,它是不工作没错误直接结束:

#! /usr/bin/php
<?php
require_once('adodb/adodb.inc.php');
$db = &ADONewConnection('sybase');
print_r($db);
$db->Connect('server3', 'sa', '', 'dbname');
$rs = $db->Execute('select 1');
print_r($rs);
?>

ZendStudio下Debug就报错了:

Compile Error: /home/fwolf/dev/include/adodb5/drivers/adodb-sybase.inc.php line 271 - Cannot make static method ADOConnection::UnixDate() non static in class ADODB_sybase

拿着错误信息上网一查,原来是在adodb-sybase.inc.php文件中,180行开始的地方定义了两个函数UnixDate()和UnixTimeStamp()(提示错误在271行,271行是类ADODB_sybase的定义结束位置,所以这个错误是在代码编译是产生的,而不是运行时),而这两个函数在adodb.inc.php中是作为static函数定义的(2481、2505行),php5不允许覆盖static函数(这个在oop中好像是叫重载,太长时间没摸书本,记不清了),所以产生编译错误,程序中止。在adodb.inc.php的4089行,包含adodb-sybase.inc.php的时候又加上了@符号:

@include_once($file);

所以错误信息被屏蔽,不显示了。ZendStudio由于Debug的原因,可能所有的错误都捕捉到了,忽略@。去掉@之后,直接运行就也可以报错了。

问题弄清楚了,如何改呢,我想大概有两种方式:

  1. 修改adodb.inc.php,不将UnixDate()函数定义为static。
  2. 修改adodb-sybase.inc.php,取消两个函数的重复定义。

相比之下,觉得第一种方法更好一些,第二种方法可能会引发其它的错误。所以改下来一共是去掉四个static:

Line 2481: ADOConnection::UnixDate()
Line 2505: ADOConnection::UnixTimeStamp()
Line 3204: ADORecordSet::UnixDate()
Line 3215: ADORecordSet::UnixTimeStamp()

简单测试了一下,基本工作正常。

参考

PS: ZendStudio使用单独的一套php.ini,放在/path/to/ZendStudio-5.5.0/bin/php5目录下,我总是忘记,每次include path不对劲的时候都要找半天。

Related posts

PHP , , , , , , ,

两部“小”片

March 23rd, 2008

也是奇怪,周末休息随便找了两部电影看,居然全都是“小”电影,“小”是相对于制作华丽、场景宏大的大片而言的,但“小”并不代表就不精彩,两部电影让我看得一点儿也不困。

The Man From Earth/这个男人来自地球/地球男人/地底奇人/长生不老/不死之身

首先就是这个啦,第一个译名还是不错的,其它的中文译名简直就是胡扯。整个影片就没出那栋房子,从一开始要搬家,到片子结束也没搬走。几个所谓的科学家,其中一个还泡了个学生,在一起絮絮叨叨,听老男人讲故事,一会儿相信一会儿不信的。而那14000年的历史,按照豆瓣上网友说的,都在老男人的嘴里了

但是,这部电影也向我们证明了,科幻就是科幻,虽然动画技术能够让科幻更加“直观”的展现在观众面前,但科幻的精髓依然是人的想像。高明的科幻电影都是已勾起人的想像为核心吸引力的,The Man From Earth就是一个成功的证明,老男人先说自己不得不搬走,又说自己活了14000年,然后在众人的烘托之下,把这14000年的经历颠三倒四的娓娓道出。在观众快要听烦了的时候,又拐弯抹角借一个教徒的嘴,表明了这个男人就是耶酥,神哪,从那一刻,我也开始怀疑他到底是不是个大骗子了。

最后骗子终于“承认”了自己的谎言,不过谁都知道这是假的,可科学家们却如获重视,借这个台阶下台一一回家了。导演还不罢休,在片尾又给老男人安插了一个孩子,得,故事的真实性终于板上钉钉,剩下的,就是观众们自己去想像了。

Bloody Numbers/血腥数字/带血的号码

虽然稍逊于上面那个,但依然是一部以小搏大的优秀作品。场景小了,就一个房间而已,“外景”有三个,楼梯间、卫生间和透过窗户看到的楼下。

剧情也是简单到不能再简单,某人捡到彩票,给主人留言,想还给人家,后来一看中奖了,就不想还了,用自己那张替了过去。后来人家上门来拿,一个不愿给,一个由于各种机缘不能离开,僵持之下之后和室友一起玩扑克,满满又发展为用彩票作为赌注。奇妙的事情来了,有的人知道彩票已中奖而有的人不知道,一场牌桌上和牌桌下的博弈演得有滋有味。最终某人良心发现,而室友则丧心病狂,好在事情还在控制当中,某人把彩票交给了警察,让警察完成归还的任务。

看到这里,猪都知道某人给警察的是一张没中奖的彩票,果不奇然,在大结局中,某人顺利将彩票归还他的主人,开始专心搞定女友的事情。。。。咚咚,又有人敲门,打开一看,真正的彩票主人刚刚来到。。。

如果你是看到这里才睡醒的人,强烈建议睡饱之后再重看一遍。故事的前面虽然的确有点拖沓,但也是必要的铺垫,人物心理的飘忽不定、左右摇摆才是最有滋味的。不要只想着最后时刻的那点“噱头”,怀疑那只是叫醒电影院中沉睡着的一个惯用伎俩而已。

带血的号码,真的是名副其实,还一点也不暴力,不看可惜哦。

Related posts

Movie

[PHP]在bash中输出彩色文本

March 18th, 2008

先看图吧:

PHP在bash中输出彩色文本

乱不乱?这是我自己用的一个web游戏机器人程序的输出,游戏自然一切都是数字说了算,可每次看这一大堆数字实在是让我头疼,从中找出有用的数据太难了,对齐、缩进都办法也不怎么见效,突然我想到,如果用escape color输出彩色的文本,应该看起来会舒服很多吧?

说到escape color,用过bash的人应该都见过,只是不知道它叫这么名字而已。ls中彩色的文件、目录名就是用escape color来实现的。早些年用得比较多的telnet形式的bbs,它的颜色也是escape color,最明显的特征就是bbs文章被转贴到别处的时候,经常会多出一些ESC什么的字符出来,这就是escape color的控制字符。

想完整的了解escape color,资料很多,wikipedia – ANSI escape code就有比较完整的解释,中文的资料也不少,比如啦啦~在bash下输出彩色的文本,甚至还有人做出了颜色表:The 256 color mode of xterm

不用觉得眼花缭乱,简单说来,escape code就是在终端(terminal)中输出的控制字符,不光包括文字颜色,还可以控制很多其它内容,当然,颜色是比较常用的,所以习惯称之为escape color。我在这里也只讲颜色,其它控制字符的使用方式大同小异,但需要主意不同的终端类型可能会略有区别。

escape color的格式为:

<ESC>[{attr};{fg};{bg}m

其中<ESC>[是起始字符,在bash中一般是16进制的0×1b,也就是八进制的033,十进制的27,另外一种表现方式就是^[,熟悉吧,在bash中按一下Ctrl+v再按ESC它就出来了。后面分别是attr模式、fg前景色、bg背景色,中间用逗号;间隔,最后用字母m结尾。

attr的取值有:

0   Reset All Attributes (return to normal mode) #重置所有设置,回归自然
1   Bright (Usually turns on BOLD) # 高亮/加粗
2   Dim
3   Underline
5   Blink
7   Reverse
8   Hidden

fg的取值有:

30  Black
31  Red
32  Green
33  Yellow
34  Blue
35  Magenta
36  Cyan
37  White

bg的取值有:

40  Black
41  Red
42  Green
43  Yellow
44  Blue
45  Magenta
46  Cyan
47  White

可以看到,attr/fg/bg的用值范围不重叠,所以空缺哪个无所谓。

在用php输出的时候,只需要在正常字符串内容中,加入适当的escape color代码就可以了,其实其它应用程序也是类似操作的,并不需要额外的设置,比如:

$ php -r 'echo "\x1b[5;31;44m第一种色彩\x1b[3;34;41m第二种色彩\x1b[0m 回归自然\n";'

看到彩色了吧?秀一下我那个机器人美化之后的界面:

PHP在bash中输出彩色文本

顺便说一句,把字符串储存到文件中的时候,escape color也可以一起存上的,浏览时,cat和tail默认就支持颜色显示,less则需要带上-R参数才行。

Related posts

Linux, PHP , ,