基于手机遥控的远程打印

2009/11/19 | 23:23 | 分类:Web与移动平台 | 标签: | 675次阅读

  场景:假设实验室的打印机距离你的工位比较远,现需要打印一些文章,但不知道打印机里有没有放纸、是不是合适的纸(A4/B5;新纸/旧纸反面)。贸然打印有可能造成浪费,而如果把合适的纸拿过去放进打印机再回来发送打印命令则需要跑两个来回,中途别人还有可能发送打印命令把你的纸给用了。懒人有懒道,要是能在打印机旁遥控电脑就好了!想想用什么做遥控器呢?身边最好找的远程通信器件应该是手机了。于是,我们来实现基于手机遥控的远程打印(以 Windows 环境为例)——
  我的手机可以使用语音、短信、红外、蓝牙、GPRS 等通信手段,软件支持 Email、MSN、Gtalk、Fetion 等应用。考虑到成本,排除语音和短信;考虑到距离,排除红外和蓝牙;Email 没有实时性,也排除;剩下三个 IM,其中基于 Jabber 的 Gtalk 由于其简单性和开放性,成为了我的首选。
  接着考虑如何操作应用程序进行打印。对于 Windows GUI 的自动化操作,AutoHotkey (AHK) 大神当然是不二之选。
  现在可以动手了。首先建立一个 Jabber Message Handler 来接收手机 Gtalk 客户端发来的消息。如果收到事先定义好的某个消息,则通知特定的应用程序执行打印操作。这种简易的 Handler 用 Python + xmpppy 实现即可,代码如下(gthandler.py):

  1. import os
  2. import xmpp
  3.  
  4. def msgHndl(clnt, mess):
  5.     text = mess.getBody()
  6.     user = mess.getFrom()
  7.     if user.getNode() == 'xxx' and user.getDomain() == 'linjian.org' and text.startswith('p'):
  8.         os.system('doprint.ahk')
  9.  
  10. if __name__ == '__main__':
  11.     login = 'yyy'
  12.     pwd = 'zzz'
  13.     clnt = xmpp.Client('linjian.org')
  14.     clnt.connect(server = ('talk.google.com', 5223))
  15.     clnt.auth(login, pwd, 'botty')
  16.     clnt.RegisterHandler('message', msgHndl)
  17.     clnt.sendInitPresence()
  18.     while clnt.Process(1):
  19.         pass

  这段代码很好理解。Handler 端使用“yyy@linjian.org”账号登录 Gtalk,如果收到来自手机端联系人“xxx@linjian.org”发来的“p”消息,则执行 doprint.ahk 脚本。该 AHK 脚本负责向应用程序发出打印命令(这里是以 Microsoft Word 为例的,向 Word 发送 Ctrl-P 并回车,即可使用默认打印机来打印文档),内容如下:

  1. IfWinExist MyDoc.doc
  2. {
  3.     WinActivate
  4.     Send ^{p}{Enter}
  5. }

  好了,现在打开 MyDoc.doc,再运行 gthandler.py,然后在手机上登录 Gtalk,从“xxx@linjian.org”向“yyy@linjian.org”发送一个“p”,看看有没有效果?当然,实验时可以先用 Ctrl-G 之类不浪费纸的命令做测试。
  这就是程序员,本来可以通过内线电话或免费的 VPMN、利用社会工程学手段解决的问题,也要设法把它程序化了。这到底是折腾呢,还是不折腾呢?但至少有一点是肯定的:脚本的优点是一劳永逸。

vCard Assistant:将 vCard 导入 Nokia S60v2 手机的辅助工具

2009/09/02 | 00:17 | 分类:Web与移动平台 | 标签: | 1,298次阅读

  晚上为 Nokia S60v2 老机型用户写了一个 PC 端的小工具——vCard Assistant,用于将含有中文姓名的 vCard 文件(可以是 GB、UTF-8 或 UTF-16LE 编码的)转换成 ASCII 字节编码 UTF-8 形式;并可将 vCard 3.0 格式转为 2.1 格式,便于在某些对 vCard 中文姓名或 3.0 标签支持不好的手机中导入联系人。效果如下:
  输入:

BEGIN:VCARD
VERSION:3.0
N:;张三
FN:张三
TEL;TYPE=CELL;TYPE=VOICE:13811112222
EMAIL;TYPE=PREF;TYPE=INTERNET:foo@bit.edu.cn
REV:20090901T035836Z
END:VCARD
BEGIN:VCARD
VERSION:3.0
N:;李四
FN:李四
EMAIL;TYPE=PREF;TYPE=INTERNET:bar@gmail.com
REV:20090901T035835Z
END:VCARD
...

  输出:

BEGIN:VCARD
VERSION:2.1
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:;=E5=BC=A0=E4=B8=89
FN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E5=BC=A0=E4=B8=89
TEL;CELL;VOICE:13811112222
EMAIL;PREF;INTERNET:foo@bit.edu.cn
REV:20090901T035836Z
END:VCARD
BEGIN:VCARD
VERSION:2.1
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:;=E6=9D=8E=E5=9B=9B
FN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E6=9D=8E=E5=9B=9B
EMAIL;PREF;INTERNET:bar@gmail.com
REV:20090901T035835Z
END:VCARD
...

  这种格式可以被 Best vCard for S60 等软件读取,导入手机通信录。
  vCard Assistant 下载地址(包含源代码):
  http://files.linjian.org/dotNet/VCardAssistant.zip
  http://www.linjian.cn/files/dotNet/VCardAssistant.zip
  (需要 .Net Framework 3.5 平台支持)


  我为什么要写这个东西呢?主要还是自己的需求。我使用的 Nokia 6600 的 PC Suite 只支持从 IBM Lotus Notes、Microsoft Outlook 这类庞大的程序或 Windows Address Book 这种已被放弃的格式中导入联系人。我没有使用这两个商业软件,也不愿使用已经失去官方支持的 WAB 格式,而选择使用跨平台的、广为各类软件支持的 vCard 格式管理联系人,以便在多个系统、软件中直接共享。以前同步联系人时,先将 vCard 导出为 CSV,再使用虚拟机中的 Windows XP 通信录将 CSV 转换成 WAB 格式,然后通过 PC Suite 同步,比较折腾。现在只需要将 vCard 转换一次,通过蓝牙或 Email 发到手机上,用手机端的软件做同步,简便不少。
  事实上我以前也尝试过用 Google Sync 服务在线同步联系人(Gmail 也支持 vCard 导入导出),但同步过程总是异常停止。换用其它一些 SyncML 同步服务问题依旧。最终我在 mobical 网站发现一句话:“Nokia 6600: This device has a known issue where the synchronization may stop working at any time. As far as we can tell this is a bug in the Nokia software.”原来这是 Nokia 6600 的 bug……我也没有找到其它免费的 SyncML for S60v2 客户端,只能作罢。

浅度挖掘“0298008708333”

2009/04/20 | 23:52 | 分类:生活空间 | 标签: | 1,152次阅读

  半个多月前我接到一个电话,号码是“0298008708333”。一接听就发现有骗子嫌疑(姑且称为骗子吧,尽管不准确。礼貌一点叫“恶意行销”?)。我随即将计就计,一边和对方周旋,一边google这个号码。对方声称是什么红酒俱乐部的,要给我寄宣传材料。她知道我的姓名(这种买卖个人信息的事情太普遍了),似乎是想套出我的更多个人资料。我只告诉她了一个临时且不完整的地址,并拒绝透露其它任何信息。在google过程中,一系列返回结果几乎都是对同一段文字的引述,声称这是一个来自美洲法罗群岛(国际区号:+298)的国际吸费诈骗电话。但我凭借着对国际长途的常识性认识,以及对这种人云亦云的搜索结果的严重不信任,还是把这个电话打完了。目的就是检验我对这个骗子电话目的的理解,并检验网上这些不负责任转帖的可信度。
 
  挂了骗子电话之后,我立即咨询北京移动的10086,从客服人员处得到的信息是:
  1.的确存在一接听就收费的电话,主要是一些声讯台。号码一般是本地的“168/160/116XXXXX”、本省的“96XXX”和全国的“95XXX”等。但并不是所有这类号码都会接听收费,绝大多数情况下只接听、不回拨声讯台都是免费的(或由他人付费,如点歌台一般收点歌人的钱)。
  2.的确存在一类不法技术手段,可以修改来电显示的号码。
  3.他们不知道“0298008708333”属于哪类号码,但经查询不是西安(区号:029)的固定电话或800免费电话。从格式上看也不像国际长途。
 
  我之前就了解的一些信息是:
  1.正常的国际长途来电显示为“00XXX……”或“00019AXXXYYY”,“A”为运营商代码、“XXX”为国家代码(可变长)、“YYY”为国际局号。如果真是法罗群岛来电,显示应该为“00298……”或“00019A298YYY”的形式,而不是“0298……”。
  2.我所见过的非法修改来电显示的号码,都是在一些IP号码或SP号码后面加上马甲号码。一般手机显示来电对应的联系人名称时只判断后几位数字,故可以伪装成对方手机中存在的其他联系人。如果查看通话详单,或在手机中使用“提取号码”功能(Nokia手机中为此名称),或者你的手机中根本没有存储这个联系人,这种伎俩就会露出破绽。这种手段是不可能制造出“0298……”的马甲的。当然,不排除有更高明的手段可以任何修改来电显示号码。如果有,我们就有必要责问运营商了。
 
  4月6日,动感地带月账单出来的日子,我查询了一下详单,这个号码仍被记录为“0298008708333”,并没有额外的长途费和代收费产生。
  今天(4月20日),我通过曲折的手段(因为地址故意给的有问题)收到了那个有关红酒的宣传材料,是一个塑封的印刷品,没有寄件人信息,邮戳显示为“上海 共和新路1,沪 C122”:
浅度挖掘“0298008708333”
 
  由此得出以下结论:
  1.这个骗子电话的目的一是套取个人信息,二是推销红酒,孰重孰轻暂不得知。至于“国际吸费”的说法,理论和实践均证明不属实。掌握他人信息一方面可以拿来买钱,另一方面可以作为更一步诈骗的资本。
  2.中文网络世界不负责任的复制粘贴、人云亦云、以讹传讹是一个大问题,搜索引擎、IM和SNS在客观上为垃圾信息的传播推波助澜。很多看似在帮助大家的转载信息,其源头本身就有可能不负责任,有时甚至一定的利益诱导。
 
  建议大家:
  1.不要对陌生来电透露个人真实信息。有兴趣有条件可以用虚假信息忽悠对方。如果对方知道你的姓名……那就看你的公关水平了,能忽悠对方把你的名字和电话号码解除绑定或者重新绑定到虚假信息上是最好的;不想废话的话直接挂掉。
  2.也不要相信网络和某些无知的媒体描述的“国际吸费电话”之类的危言耸听。恶意收费电话的威胁确实存在,但只要有一些号码方面的常识,同时做到不回拨,就可以将这个风险降到最低。
  3.在有了一些号码方面的常识后,一些“怪”号码也就见怪不怪了,没有必要一律拒接。比如“0001901213”google到的结果也几乎都是骗子电话,但这事实上只是一个正常的国际长途局号,很多来自美国的长途都可能显示这个号码(如godaddy的来电),接听它是不存在吸费陷阱的。如果发现是骗子挂掉就成,不用担心被吸费而漏接一个可能很重要的国际长途。

你的手机号码是质数吗?

2009/03/14 | 13:30 | 分类:数学类文档 | 标签: | 827次阅读

  Happy PI Day !
  PI Day当然要装模作样研究一下数学了。刚才做了一项无聊的工作,统计了一下北京移动动感地带早期号段(13810000000~13811999999)以及我的手机通信录中的质数手机号码。结果见下表:

你的手机号码是质数吗?

  Wikipedia的Prime number页面提供了一些在线的质数计算、生成、校验工具的链接。你的手机号码是质数吗?如果一眼看不出来,可以上去查查。
  进一步统计了以下数据(写了一个isprime小程序,然后用shell脚本东拼西凑来计算:

你的手机号码是质数吗?

  1、3、7、9结尾的所有1~4位数均是13810000000~13811999999号段中至少一个质数号码的结尾。不知道这个性质对于所有11位数是否全部成立。或者推广开,1、3、7、9结尾的所有m~n位数是否至少是一个p~q位质数的结尾?这东西我就不会证明了,不知道前人有没有相关的工作。
  数学迷们是否愿意选择一个质数手机号码呢?至少有人喜欢以质数结尾的。不过我想更Geek一些的人可能会选择包含PI或e之类的号码吧。包含的位数越多,这样的号码越少。1314159号段属于湖南郴州联通,当地的数学迷有福了。
  冠仔的手机号码就是一个质数。他觉得手机号码可以用作数据挖掘。嗯,我暂时没有想到能从中挖出什么特别的东西(所谓的“吉祥号”就算了,这个不用挖也看得出来),想来想去总觉得像是算命。

查询手机所在地理位置的简单方法

2008/08/13 | 18:19 | 分类:Web与移动平台 | 标签: | 4,563次阅读

  有时候坐在长途汽车或火车上,想知道现在到什么地方了,可以通过手机来简单定位。对于没有GPS功能的手机,要想知道当前所在地理位置,可以通过基站定位。具体有以下几种方法:

1、直接查看基站编号

  使用某些手机的工程模式,或者利用专门的软件(比如S60下的CellTrack)可以直接查看基站编号。基站编号包括CellID、LAC、Net等字段。对于中国移动(Net字段为460 00),其LAC字段的十六进制表示的前三位基本上是按国内长途电话区号编排的。比如LAC为“4726”,则手机当前所在地为包头市(0472)。不过也有部分地区的LAC字段与电话区号不完全一致,例如甘肃、内蒙古交界部分地区的LAC为“93E*”、“47A*”等,此时只能判断到省一级;北京市LAC有“11**”等形式。对于一般用户来说,无法通过CellID字段确定手机的精确位置。

查询手机所在地理位置的简单方法

2、使用基站定位软件

  基于上述原理,有人开发出了一些基于基站信息的定位软件(比如Windows Mobile下的CPS),这类软件包含CellID、LAC到基站所在地名映射表的数据库。使用这类软件可以直接获知地理位置信息,不用手工查询区号;但这些数据一般并非移动运营商公开,而是以个人收集为主,故难免有缺漏。

3、通过移动运营商提供的定位服务

  CellID、LAC到基站所在地名的映射表在移动运营商手中,自然成为了他们营利的手段。中国移动本身提供了定位服务,可以通过STK菜单中的短信定位功能,或移动梦网的地图软件(map.monternet.com)来查询手机当前位置。对于一些大城市,移动的数据库存储到了基站一级的地标信息,可以让用户较为精确地知道自己附近有哪些主要建筑和服务设施。但对于一些小城市,定位服务是盲区。使用中国移动的定位服务,每次收费一般在1元之内。

4、通过客服或特服电话

  手机在漫游过程中,拨打漫游所在地电话不需要加拨长途区号。因此,可以拨打移动(10086)、联通(10010)或其它一些电信、金融等机构的全国统一客服电话,通过语音提示(如“中国移动山西分公司”)得知精确到省一级的位置信息。有些特服电话,比如天气预报:12121,则可以听到精确到地级市的位置信息,不过12121一般是要收取费额外的信息费的。

5、通过GPRS网络的IP地址

  使用手机上的浏览器登录一些查询本机IP和地理位置的网站(如www.ip.cn),可以得知手机当前接入点的位置信息,进而得知手机所在位置。需要注意的是,有些情况下手机是通过代理服务器接入;有些情况下浏览器需要通过特定的服务器对网页进行预处理,在这些情况下取得的IP和地理位置就不是手机所在地的信息了。此外,这些网站的IP数据库本身的正确性也需要考量。

查询手机所在地理位置的简单方法

页面存档: 上页 1 2 下页