身边的烟民
| 发表时间:2004-11-10 06:05:40 | 评论:0 |
他们无处不在,我们无处躲藏。
北京机场,刚刚飞了16个小时,还没有来得及倒一倒时差就晕头转向的
上了辆烟民的车。那位三大五粗的司机在高速上一手拨动方向盘以超过
100 公里时速的速度在车流中蛇行,一手从口袋里摸出根香烟来叼在嘴
里又摸出个打火机来喀嚓一声点上。在阔别北京四年之后我第一次感受
到了北京出租车的粗野与疯狂 -- 直行要骑着线走,一分钟内要换五次
线,一路上不停的按喇叭同时用某种暧昧的语言问候路上其他司机的家
长 -- 还有,不停的抽烟。虽然司机在我的极力要求下熄掉了烟,然而
车里沉积多年的烟味却无孔不入的侵蚀我紧绷的神经。三十多分钟的路
程里我一直用衣角捂紧鼻子,等到终于到了家里的时候,竟然浑身都是
烟味。
后来我们再次打车,都是先把车拦下来然后将鼻子伸进去嗅一下,如果
有问题的话就拦下一辆车。然而我们终究不是猎犬,因此屡屡有出现失
误的时候。后来我们干脆就锁定北气等几个大公司的出租车,因为据司
机介绍说公司有要求,要吸烟必须把车停下来到车外去,这样车箱里面
基本上就没有烟味了。
在北京住了一段时间后,我们悲哀地发现我们竟然无法下馆子 -- 必须
承认在北京还是有无数馆子做的菜比我做的更好吃的,然而吃一顿饭要
来回换N 张桌子乃至无处可换的经历会让任何一个美食家都倒尽胃口。
每次没有其他选择只能够在馆子里就餐的时候我都精神高度紧张的四处
了望,一旦发现火光或者是烟雾等敌情便迅速冲过去点头哈腰陪笑然后
问是不是可以把烟熄掉。多次实战之后我总结出的经验是:如果对方是
位女士或者是多位女士,那么我百分百是在找骂;如果对方是位女士旁
边还坐着位男士,那么我百分百是在找打;如果对方是位男士或者是多
位男士,那么我有三成成功的希望;如果对方是位男士旁边还坐着位女
士,那么我就有七成的把握了。
不过我们发现也有声明禁止吸烟的地方,半亩园,面爱面,还有一些素
食为主的馆子。不过去的次数多了,便逐渐觉得饭菜的质量平平,并且
偶尔还是会有烟民出没。后来我们发现西餐馆里面吸烟的人就比较少,
即使是那馆子里并没有禁止吸烟的标志,想来大多数上西餐馆的人都明
白在西餐馆里吸烟是相当不文明的标志吧。可惜的是他们并没有把同样
的心得体会带到中餐馆去,大概是因为中餐馆的地位要比西餐馆低,或
者是上中餐馆的人的地位比上西餐馆的人的地位低,反正是中西有别就
是了。然而对于麦当劳和肯德基还有比萨饼这种垃圾,我们始终提不起
兴趣来。不过一次偶然的机会我们去了季诺,发现了相当地道的意大利
面条,让我们大饱口福了一番。季诺在当代,中友还有华清嘉园都有店
面,当代和中友的条件都很不错,华清嘉园分店的布局要差一点,所以
我们不是很喜欢。
最为糟糕的事情,是我们发现我们楼下的邻居竟然在阳台上吸烟,或者
是在楼梯里吸烟。我想他们肯定知道吸烟对别人是有害的吧,不然他们
为甚么不在自己的家里吸烟而要跑到阳台或者是楼梯去呢?我们出门的
时候通常要记得关上阳台的门,不然的话回来了就是满屋子的烟味,这
些都是我们友好的邻居慷慨的赠与给我们的。小区的传达室那里经常有
一堆老大爷聚在一起吸烟,我们每次走过去的时候都要小心的捂着鼻子
屏着气。在工字厅抑或是荷塘散步的时候,在那狭窄的小道上冷不防的
会有一个吞云吐雾的人迎面向你走来。我们无法躲藏,无法呼吸。
要到哪里,才能够找到一片没有人吸烟的天空?
休息一段时间
| 发表时间:2004-09-30 18:06:38 | 评论:2 |
从明天开始休假,10.01 -- 10.17,然后到S 公司去报到。
假期里要做的事情:
1 睡几个大觉,好不容易有个假期啦。
2 要坚持去锻炼,西大操场,每天跑五到十圈,引体向上,举重,俯卧撑。
3 每天给咪咪做好吃的,早饭,午饭,晚饭,宵夜,三天以内不能够有重样的。咪
咪喜欢吃鱼和豆腐,多做点。
4 每天陪咪咪散步,看书,练习摇篮曲。过了十一以后如果有好天气的话,和咪咪
一起去植物园转转,换换新鲜空气。
5 给咪咪准备临产时的家当,包括衣服,洗漱用具,消毒棉垫,牙膏牙刷,餐具,
纸巾,拖鞋,记事本和笔,还有零食。
6 给小宝宝准备家当,该买的东西实在是太多啦,小床垫,小被子,小毛巾,小毯
子,小衣服,小帽子,小奶瓶,小奶嘴,温度计,水温计,吸鼻器,小尿布,小
玩具....哇哇,都数不过来啦,上同学在摇篮网的主页找了找,发现了一篇宝贝
文章,贴过来回头好好看看。
-----
2003年11月12日
产前准备全攻略
需要为宝宝准备的东西:
(所有东西可清洗消毒的要先清洗消毒)
一:尿布、衣物、被褥
1.尿布:商店有卖成包的纱布尿布,10块一包。初生儿要用最小码的,且要买柔软
的,不过洗多了就会很软。尿布的缺点是要经常换,不利宝宝睡眠,优点是透气。夏
天白天我只给宝宝穿短裤,尿湿就换裤子,更透气凉快。有妈咪把用过的帮宝适的芯
掏掉,剩其外壳固定尿布,透气又方便,商店卖的尿布包不透气,建议别用。
2.纸尿裤:晚上用,冬天或开空调的夏天也可以用,这样不会打扰宝宝的睡眠。喂
奶前换。注意防止尿布疹,一发现宝宝PP红就要擦些润肤露。我用帮宝适超薄干爽的,
另外妈咪宝贝、妙奇也不错。
3.隔尿垫(象浴巾那么大的那种):垫在宝宝身下,防止尿湿褥子。建议买2-3个,
便于替换,可用到1-2岁。冬天我全部用纸尿裤,所以夏天才用上隔尿垫,表层棉质底
层塑料尽量柔软。
4、衣服:夏天小短袖上衣+尿布,可以不穿裤子,或者穿连体短衣裤;冬天和尚服内
衣+连体长衣裤,冷的话外面再加外套。两三套就够了,宝宝长得很快,衣服可以现
买。有的宝宝6个月即可穿1岁衣服。能要到其他宝宝穿过的旧衣服更好,多次洗过更
柔软。商店卖的裤子一般皮筋都很紧勒到宝宝,需要换皮筋。宝宝的皮肤与身体体积
的比例,比大人的要大,所以冬天比大人怕冷,夏天比大人怕热,出生24小时内要注
意保暖。
5、袜子手套:冬天才用。现在的宝宝都比较胖,袜子经常勒出痕迹,要买弹性好宽松
的,尽量不用手套除非防止宝宝抓伤自己,手套要买薄的,让手多活动有利于智力发
育。
6、帽子:夏天用太阳帽,冬天用柔软棉毛的。各一顶即够。
7、被褥:有卖一套包括棉被褥子床围枕头。冬天可以穿睡袍,防止蹬被,宝宝又不会
钻到被子里窒息,夏天用一条浴巾盖住肚子即可。
8、枕头:为了宝宝头形好,可用枕头,但不要太高。
9、抱被、抱袋:初生儿冬天用。抱袋可当初生宝宝的睡袋,非常好。
10、床:有木头和金属的。木头的更好些。买床一般配蚊帐,夏天一般要用蚊帐。摇
篮式的床并不好,经常摇晃对宝宝大脑发育不好。
11、童车:宝宝可睡觉的,满月后早晨和傍晚可推宝宝出去晒太阳(不照正脸),有
利于宝宝钙的吸收和妈妈身体恢复。宝宝大了以后按需要可再买个小型只坐的。
12、护脐:保护宝宝肚脐,两个。
13、背带:不一定需要,但出门时用背带背宝宝可腾出双手拿其他东西。
14、小衣架、带夹子的圆形衣架。
15、小尿盆:给宝宝把尿用,也可直接抱宝宝到马桶把尿。
16、安全别针:大一些的好用。冬天可以用来包襁褓或固定被子。
二:洗护用品
1、洗澡液、洗头液:要买无泪配方的,我用施巴的。
2.润肤露:宝宝出门可以擦脸,PP有点红的时候可用来擦。
3、护臀霜:宝宝PP很红或出诊的时候擦。强生的不好,据说较好的有郁美净和“复方
磺胺氧化锌软膏”,俗名叫“双氧膏”,是广州何济公制药生产的。
4、润肤油:做抚触时用。
5.浴盆:一天洗澡一次,因为宝宝的新陈代谢很快,而且夏天有助于降温,还可以锻
炼宝宝的身体。一般宝宝都很喜欢洗澡。
6.浴网或浴床:我用的是浴网。用浴巾裹住宝宝的身体,抱着宝宝先洗脸和洗头,再
让他躺在上面洗身体,很方便。
7.纱布:洗脸一条大的,洗澡一条大的,洗PP几块小(可在换尿布或宝宝大便时用)。
8.大浴巾:洗澡前后包裹宝宝用。(最好大些,宝宝长的很快)
9、湿纸巾:擦宝宝PP,但太浪费。用纱布沾温水洗更好。
10、脸盆:一个大些洗宝宝衣服,一个洗宝宝PP,一个洗尿布。衣服尿布最好立刻洗,
没时间可备一个桶把尿布浸泡起来。可以用宝宝洗衣液和肥皂,不用洗衣粉。
11、指甲剪刀/钳:一般的指甲钳很不安全,弯曲型的指甲剪刀很好:贝亲,黄小鸭和
艾比熊都有。
12、75%酒精、棉签:清洗宝宝肚脐。(出院时医院有送)
13、块状棉球:洗澡时可擦PP柔嫩处和皮肤皱褶处,比如脖子。宝宝便后清洗也可以用。
14、洗澡水温计。
15、体温计。
16、痱子粉。
17、吸鼻器:可吸清鼻涕和块状的,要买反逆流的。
18、电动剪发器。
南下列车
| 发表时间:2004-09-29 06:04:05 | 评论:0 |
大年三十,特快79次,北京西到武昌。
08:10 北京西
列车开动的时候,天还有点黑。尽管是大年三十,仍然加挂了两节客车,行李
架上塞满的大包小包,车厢里弥漫着一股馊袜子的味道。搭乘这一趟车的,大
都是在北京打工的农民,他们有的已经老迈,有的依然年轻,脸上却无一例外
的写满了苍苍和期待。是的,忙碌的整整一年,总算可以回家休息一阵子了,
怎么说也是件令人欢喜的事情。
09:36 保定
姗姗来迟的太阳出现在地平线上。路边只有光秃秃的树木,血红的阳光照在一
望无际的黄土地上,满目荒凉。
10:55 石家庄
一路上都是农田,冬天里没有什么庄稼,那些高高的坟墓便显得特别的突出起
来。满地里都是挑着担子背着孩子上坟的农家,隔着车窗听不见鞭炮的声响,
但还是能够远远的看见白酒洒在燃烧的纸钱上腾起的火团,还有炮竹炸响时候
的闪光和浓烟。大人们捧来土块压在坟头上 -- 坟头垫高了,风水才会好,来
年才会有好收成,甚至会影响到子孙后代的前程。大一点的孩子也跟在大人的
后面忙活,小一点的孩子则眼巴巴的看着担子里的鸡蛋和肉 -- 这虽然是献给
祖先的祭品,然而每次鞭炮声响过之后他们都可以分得一点点来吃。
12:26 邯郸
列车员推车餐车过来叫卖。一个荤菜,两个素菜,很硬的米饭,竟然要卖20块
钱。有几个乘客从座位上站起来问价,不过没有什么人买。推过去再推回来的
时候,变成15块。一个满脸尘灰的女孩,大概有七八岁的样子,看着即将离去
的餐车伸手轻轻的拉了拉她母亲的衣角,抬起头来仰望着母亲的眼睛,一脸马
上就要哭出来的样子。当母亲的深深地叹了口气,脱下鞋从里面掏出两张钞票
来地给乘务员。乘务员皱了皱眉头,指着餐车旁边的一个小盒子努了努嘴:你
就给我扔那里吧。
小女孩开心的打开饭盒,里面的饭菜却已经凉了。
13:05 安阳
自从进了河南,地平线上便开始出现些许绿色;到了安阳,更是可以看见大片
大片的菜地。铁道两侧时不时可以看见一些小的溪流,虽然背阴处还有尚未消
融的冰块,然而那跳跃的浪花总能够让仍感觉到一点暖意。
在安阳站开始有乘客搬了行李下车,他们大声的互相招呼着同伴,抑或是把没
有吃完的水果留给旁边座位上的乘客。
14:48 郑州
在路边看到一条标语:集体上访违法。那是一片旷野中一栋独立的矮小农房,
红砖上面刷了一道白石灰,大红的字。
想起前面路段的另外一条标语:不嫁流氓,不娶文盲。这字就刷在站台对面的
墙上,却记不起到底是哪个站了。
16:09 漯河
过了漯河,天色便开始暗了下来。暮色中看见一个农民挑着担子从田埂上疾步
走过。在田野的尽头,有几座冒着袅袅炊烟的农屋。
16:45 驻马店
列车在夜色里穿行,车厢里已经没有多少乘客了。已经坐了整整一天的车,剩
下的乘客都明显的流露出些倦意来。有的人趴在座位前面的小几上睡觉,有的
人默默地吸烟,更多的人则焦虑的看着窗外飞流而过的灯光。他们的心里,是
不是都盼着这列车开的更快一点呢?
车厢里静极了,没有什么人说话,只听见车轮碾过铁轨发出的轰鸣。
17:42 信阳
爆竹炸响的声音竟然能够穿透列车上的双层玻璃。一小团红色的火光从地平线
上飞起,在夜空里爆裂开来,绽放出一朵灿烂的礼花。紧接着又是一朵,好几
朵,好多朵,五颜六色的,很美。
那些放礼花的,都是些什么样的人呢?他们的餐桌上,想必都有丰盛的年夜饭
吧。
19:32 孝感
一位稍微有点胖的中年妇女,正在给身边的乘客讲述她在北京打工的事情。她
是个回民,是个小时工,扫地,做饭,整理房子,有什么活就做什么活。大年
二十九那天还给一个人家干了超过八个小时的活,得到的报酬是35块钱,外加
一瓶大可乐。她有一个17岁的女儿,初中没有上完就到深圳打工去了,在一个
加工毛绒玩具的工厂,刚开始的时候当学徒,每个月的工资是300 元,还好干
了一年多就涨到500 元了。
“她的心真硬,累了也不哭,一个月才给我打一次电话。”那妇女眼角稍微有
点红,从包袱里掏出两张照片来给身边的人看。
照片上的女孩,长得清清秀秀的,眼睛很亮。
20:12 汉口
川流不息的灯光从窗外摇曳而过。诺大个车厢,只剩下四五个乘客了,两个在
吸烟,一个在打手机。虽然座位旁边有暖气,但是仍然感觉到丝丝的冷意穿透
鞋底直达心脾。
乘务员锁上厕所,开始打扫车厢。
20:33 武昌
列车缓缓的驶进站台,车门打开的时候一股潮湿的空气迎面扑来。仅剩下的几
位乘客提着行李急匆匆的踏上站台,刚刚打扫过的车厢里,又多出了几堆新扔
下的垃圾。
走出站台的时候,听见两位乘务员的聊天:今年的年夜饭,咱们是赶不上了。
期待一些改变
| 发表时间:2004-09-22 06:03:17 | 评论:0 |
最近读写能力颓降,需要锻炼乐。
妹妹即将硕士毕业,找工作中。上午在QQ上碰见她,问起最近的情况,听到
这么一句:现在特别的迷茫,不知道要做什么,该去什么样的企业做什么性
质的工作。
我听了只是笑。困惑和迷茫,谁没有过呢?咱都奔三的人了,98年找到第一
份工作,过完国庆节马上就要到第四家公司去上班,虽说对未来仍然一无所
知,不过暂时也还没有被饿死的危险。说句公道话只要你不缺胳膊断腿并且
要求不算太高的话找份工作应该说是比较容易的,再不济昌平那里也有晒沙
子的机会。对于刚刚毕业的学生来说,我觉得有个位置能够养活自己就是个
不错的起点,反正还年轻,有的是折腾的时间和精力。就像Hug 前段时间的
说明档里面说的那样:要知道自己喜欢什么工作的最好方法是挨个去试,这
话说得虽然有点偏激但是我始终认为它充满了生活的哲理。
不过我得承认我一向是不鼓励女孩子做程序员这个行当的,并不是因为女孩
子不具备做程序员的天赋和智慧,而是因为这个行当实在是太累。我身边的
同事,也包括我,在8 小时工作时间内的对话通常不超过50句,在椅子上坐
下来半天也不会舒展一下身体或者活动一下手脚,最常见的姿势就是鸭子般
的伸长了脖子睁大眼睛死死的瞪着屏幕。老实说几年前当我第一次听到IT等
于I'm Tired 这种说法的时候还是颇不以为然的,然而实践证明这个理论至
少对于我来说是正确的。前段时间上某节课的时候又听老师说到人的各种能
力都要服从用进废退的约束,这也从某个角度揭示了为什么像咱这种IT工程
师为什么看起来都比较木呐的秘密。
然而我确实没有想到转变的机会竟然会自己找到我,不过经过几个星期的谈
判我终于确定过了这个国庆节就不再做程序员了。我的下一任雇主S 公司认
为我在某方面的能力虽然已经有了较大幅度的退化,但是仍然有被重新激活
的潜力,因此让我负责该公司某IT产品的宣传和推广工作。不过在这里我必
须承认这个职位最吸引我的地方并不是工作职责上的转变,而是上班距离上
的转变 -- 现在我骑自行车上班需要25分钟,马上就要变成5 分钟了 -- 这
对于即将承担起更多家庭责任的我来说显然是有重大的现实意义的。
将来会怎么样?我不知道。这个星期一提前到S 公司参加了一个培训,也见
过了将来的同事。女同事的比例比目前的A 公司要高很多,也很PP,吃饭的
时候有很多与工作无关的话题,看来是个好兆头。
生命就是不停的走啊走,只要走的时候留神边走边看,想来就不会错过路边
的风景。
一首旧词
| 发表时间:2004-09-08 02:20:50 | 评论:0 |
弹指等闲 秋月春朝
只道是少年情怀早消
而今方知 物非人是
故我虽去未遥
异乡谁料与君逢
倾盖如故语平生
前身有缘也何
此时无酒怎可
逸兴飞 杯酒击节纵歌
相对笑 漫吟苏旷辛豪
叹人生事 别多聚少
秋叶尽时君当去
别后雪满山 空寂寥
明月渡帘再相访
思静静 影悄悄
秋色几回 燕归人未
他年里 会否记取
软语相偎
素发低垂
今宵薄醉
舒克
2000.10.31
整理计算机,翻出一首多年前的旧词,想起一位多才多艺的女子。
qyjohn@SMTH
2004.09.08
在QNX平台上开发Java应用程序 (更新版)
| 发表时间:2004-09-06 05:20:00 | 评论:0 |
1. QNX 实时操作系统介绍
QNX 实时操作系统(QNX Real Time Operating System)是由位于加拿大渥太华的QNX软件系统公司开发的一个针对嵌入式应用的微内核操作系统。QNX软件系统公司成立于1981年,在过去的20 多年中一直致力于微内核实时操作系统的研究与开发。目前的QNX 实时操作系统已经发展成一个可以使用在严实时应用中的高可靠性实时操作系统,能够运行在x86/Pentium, PowerPC, ARM, StrongARM, XScale, MIPS, SH-4等一系列硬件平台上,是在关键任务应用中首选的两个实时操作系统之一(另外一个是VxWorks)。
QNX 是一个与电气工程师协会(Institute of Electrical and Electronics Engineers,IEEE)发表的便携式操作系统界面标准(Portable Operating System Interface, POSIX) 相兼容的实时操作系统。该操作系统提供了一系列可裁剪的功能全面的高可靠性高性能组件,包括分布式计算,资源管理,网络应用,图形窗口系统,文件系统,以 及对Java的支持等等。此外,QNX还是一个与Linux高度兼容的操作系统,由于gcc和gmake等Linux 平台上常用的应用程序开发工具已经被移植到QNX 平台上,很多为Linux平台编写的应用程序可以直接拿到QNX平台上编译运行。此外,QNX还提供了一个类似于Visual C++的应用程序集成开发环境,称为Photon Applicatioin Buider (PhAB)。在这个集成开发环境里程序开发人员能够很方便的开发和调试基于图形用户界面的QNX 应用程序。
更 为重要的是,对于应用程序开发人员来说,QNX是一个完全免费的实时操作系统。根据QNX软件系统公司发布的使用授权协议,在一个产品商业化之前应用程序 开发人员可以自由的使用QNX实时操作系统而无须向QNX 公司交付任何软件使用费用。同样,QNX的应用程序集成开发环境PHAB对于软件开发人员来说也是免费的。QNX 实时操作系统以及QNX应用程序集成开发环境均可以从QNX公司的主页(http://www.qnx.com/) 下载,目前可以下载到的版本是6.2.1。将下载得到的映象文件的内容刻录到一张光盘上,然后利用该光盘启动计算机即可开始安装QNX 操作系统。总的来说安装的过程相当的简单,只需要选择启动方式以及指定QNX 文件系统所在的位置即可。系统文件拷贝完成后将自动的重新启动机器,然后需要用root登录进入系统并且自动安装其它应用程序。在一台500 MHz + 128 MB的计算机上,安装过程通常都小于15分钟。插图一展示了一个正在运行的QNX操作系统。

插图一、 QNX操作系统
2. QNX对Java语言的支持
目前支持QNX操作系统的Java虚拟机有两个,一个是IBM公司开发的J9虚拟机,另外一个是Aonix公司开发的PERC虚拟机。J9和PERC都是 专门为实时的嵌入是应用开发的虚拟机,在其设计中对速度优化,内存管理,线程管理,本地方法,垃圾回收,及时编译,可移植性以及可裁剪性能方面做了很大的 努力。在6.2之后版本的QNX操作系统中缺省地提供了J9虚拟机的基本配置,只是没有将其放入系统路径中。我们只需要对系统进行一些简单的配置即可以开 始在QNX操作系统上开发简单的Java应用程序。
在QNX 6.2.1上J9虚拟机被缺省安装在/usr/qde/eclipse/jre这个目录里(在QNX 6.2上是/usr/eclipse/ive目录),我们将这个目录定义为J9_HOME,相当于我们在PC上的JAVA_HOME。在这个目录里包含了 J9虚拟机及其编译器的可执行文件,我们需要将其包括在环境变量PATH中。在$J9_HOME/bin目录下包含了一些运行J9虚拟机及其编译器所必需 的一些动态连接库,因此需要将这个目录包含在环境变量LD_LIBRARY_PATH中。为方便起见,我们将这些配置写到用户根目录下的.profile 文件中:
export J9_HOME=/usr/qde/eclipse/jre
# QNX 6.2
# export J9_HOME=/usr/eclipse/ive
export PATH=$PATH:$J9_HOME/bin:.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$J9_HOME/bin
在QNX 的缺省安装中仅仅包含了J9虚拟机以及编译器的最基本组件,不包括对图形用户界面的支持。在嵌入式Java应用程序中,通常采用AWT或者是SWT来构建 图形用户界面。J9虚拟机的AWT支持包含在WebSphere用户环境升级包(WebSphere Custom Environment Update)中,QNX专业版用户可以直接从QNX公司的网站下载,其他用户可以从IBM公司的WebSphere网站(http://www.ibm.com/embedded/) 下载。将从WebSphere网站下载到的ZIP文件解压缩后,在features/com.ibm.ive.personalConfig_5.5.0 目录中有一个wsdd5.0.jar的文件。将该文件解压缩,在wsdd5.0\local\ive\runtimes\qnx\common\ive\ lib\jclMax目录下有一个prsnlqnx.jar的文件,这就是J9虚拟机所需要的AWT类库,将其拷贝到你的$J9_HOME/lib目录 下。在wsdd5.0\local\ive\runtimes\qnx\x86\ive\bin目录下还有一个libswt-photon- 2130.so文件,是支持AWT所必需的动态连接库,将其拷贝到你的$J9_HOME/bin目录下。最后,修改用户根目录下的.profile文件, 将prsnlqnx.jar加入到环境变量CLASSPATH中:
export CLASSPATH=$CLASSPATH:$J9_HOME/lib/prsnlqnx.jar:.
到 此为止我们已经成功的配置了最基本的Java应用程序开发工具。与PC平台上的Java SDK相类似,J9虚拟机也提供了编译和运行Java应用程序的相应命令: j9c命令用来编译Java源代码,j9命令启动J9虚拟机运行命令行中指定的Java应用程序。坚持要使用javac/java命令的开发人员,可以自 行创建指向j9c/j9命令的符号链接(ln -s)或者是别名(alias)。
下面我们编译运行一个简单的AWT图形界面以确认我们已经正确的安装配置了Java开发环境。将下面的代码保存为HelloAwt.java,使用下面的命令编译运行该程序:
j9c –classpath $CLASSPATH HelloAwt.java
j9 HelloAwt
插图二是HelloAwt应用程序在QNX平台上运行的屏幕截图。
import java.awt.*;
import java.awt.event.*;
public class HelloAwt extends Frame
{
public HelloAwt()
{
Label label = new Label("Hello AWT!");
add(label);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
HelloAwt hello = new HelloAwt();
hello.setTitle("I Love Java!");
hello.setSize(200, 200);
hello.setVisible(true);
}
}

插图二、运行在QNX操作系统上的HelloAwt程序
3. Eclipse集成开发环境
习惯于使用集成开发环境进行开发的工程师可能会急着问:有没有能够在QNX平台上开发Java应用程序的集成开发环境呢?答案是肯定的:确实存在基于QNX平台的Java集成开发环境,它就是著名的Eclipse项目。
Eclipse 组织是由Borland、IBM、Red Hat、SuSE、QNX等公司于2001年11月创建的。该组织的目的是为开发人员提供一个开放并且免费的平台,在该平台上可以利用多种程序设计语言为 不同的操作系统和硬件平台开放应用程序。通过一个开放的插件框架,开发人员可以自由的创造、集成和使用各种各样的软件开发工具,从而有效的提高软件开发的 效率。目前Eclipse集成开发环境已经可以在AIX、HP UNIX、Linux、Mac OS X、QNX、Solaris和Windows等多个平台上运行。
为 了在QNX平台上使用Eclipse,我们需要从Eclipse的网站下载Eclipse平台和针对J9虚拟机的启动插件。在Eclipse的网站上列出 了多个提供下在服务的镜像站点,你可以选择其中的任意一个开始下载。进入某个下载站点后你可能会发现有多个版本的Eclipse可供选择,我们推荐的版本 是发行版本2.1(R-2.1-200303272130),进入对应的目录后下载Eclipse平台eclipse-platform-2.1-qnx -photon.zip。在该目录下还有一个名为j9_read_me.html的文件,根据该文件中的说明并进入相应下载页面下载针对J9虚拟机的启动 插件org.eclipse.jdt.launching.j9_20030213.zip。将Eclipse平台解压缩至 /usr/qde/eclipse目录(即$J9_HOME的上一级目录)下,将启动插件解压缩至/usr/qde/eclipse/plugins目录 下。在/usr/qde/eclipse/plugins/org.eclipse.swt.photon_2.1.0/os/qnx/x86目录下有一 个名为libswt-photon-2133.so的文件,是启动SWT图形界面所必需的动态连接库。由于Eclipse平台是基于SWT的,因此在启动 Eclipse平台之前需要将该文件所在的路径加入环境变量LD_LIBRARY_PATH之中。为了简单起见,我们干脆把这个文件拷贝到$ J9_HOME/bin目录,因为在前面的配置中我们已经将这个目录添加到环境变量LD_LIBRARY_PATH里面了。
启 动Eclipse集成开发环境的命令是/usr/qde/eclipse目录中的eclipse脚本。在终端模拟器中运行该命令,如果看到如图三所示的界 面,就表示Eclipse已经正确的安装和配置好了。如果在运行中出现任何错误信息,可以参考 /usr/qde/eclipse/workspace/.metadata目录中的.log文件中的记录排除错误。

插图三、运行在QNX操作系统上的Eclipse集成开发环境
为方便起见,可以修改用户配置文件./profile将/usr/qde/eclipse目录添加到系统环境变量PATH中,这样每次启动Eclipse的时候就不用输入前面的目录名了。
export PATH=$PATH:/usr/qde/eclipse
需要进一步学习如何使用Eclipse集成开发环境的读者,可以自行参考Eclipse网站上所提供的文档和教程。
4. 基于SWT的图形用户界面
使用Java语言开发过图形用户界面的工程师都知道,基于Java的图形用户界面的运行速度是相当慢的。在配置不高的低端系统上,即使是简单的键盘输入或 者是鼠标点击动作也会让应用程序陷入停顿。虽然基于AWT的图形用户界面在执行效率上要优于基于Swing的图形用户界面,但是仍然与基于C/C++或者 其他高级程序设计语言的图形用户界面存在较大的差距。使用过Eclipse的读者可能会发现,Eclipse运行起来不象我们所常见的Java应用程序那 样慢,这是因为Eclipse使用了SWT来构建图形用户界面。SWT直接调用了操作系统的图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SWT 的Java应用程序的运行速度。
最 早的时候SWT是作为Eclipse平台的一部分出现的,只有基于Eclipse平台的应用程序才能够使用SWT。SWT逐步走向成熟之后被设计成一个独 立的Java类库,这使得那些习惯于使用其他开发环境(例如命令行)的工程师也能够在其应用程序中使用SWT。如果你已经按照本文中第三节的说明安装配置 了Eclipse集成开发环境,你只需要将/usr/qde/eclipse/plugins/ org.eclipse.swt.photon_2.1.0/ws/photon目录下的swt.jar加入到系统环境变量CLASSPATH中即可开始 使用SWT。如果你没有安装Eclipse集成开发环境,但是仍然希望在QNX上使用SWT来构建图形用户界面,你可以从Eclipse网站或者任意镜像 站点下载发行版本2.1的SWT类库swt-2.1-qnx-photon.zip。将下载到的ZIP文件解压缩,把文件swt.jar添加到系统环境变 量CLASSPATH中,将文件libswt-photon-2133.so所在的目录添加到系统环境变量LD_LIBRARY_PATH中。
通常来说,构建一个基于SWT 的图形用户界面需要经过如下步骤:
(1) 创建一个Display对象,该对象代表一个SWT 进程(session)。
(2) 创建一个或者是多个Shell对象,一个Shell对象相当于我们在AWT/Sing里面所说的顶极容器,也就是应用程序的主窗口。
(3) 在Shell对象上面创建用户所需要的控件。
(4) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(5) 打开主窗口。
(6) 启动事件处理循环,一直到用户结束程序的运行。
(7) 垃圾回收。
下面我们编译运行一个简单的SWT图形界面以确认我们已经正确的安装配置了SWT类库和动态连接库。将下面的代码保存为HelloSwt.java,使用下面的命令编译运行该程序:
j9c –classpath $CLASSPATH HelloSwt.java
j9 HelloSwt
插图四是HelloSwt应用程序在QNX平台上运行的屏幕截图。
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
public class HelloSwt
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello SWT!");
label.setBounds(shell.getClientArea());
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}

插图四、运行在QNX操作系统上的HelloSwt程序
需要进一步学习如何使用SWT来构建图形用户界面的读者,可以自行参考Eclipse网站上所提供的文档和教程。
5. 小结
本文简单地介绍了QNX实时操作系统以及在QNX操作系统上开发Java应用程序所需要的配置和工具。作为一个优秀的实时操作系统,QNX对Java语言的支持丝毫不逊色于我们常用的Windows或者Linux平台。功能强大的Eclipse集成开发环境使得开发人员摆脱了传统的“主机/目标机”开发模式,能够游刃有余的在QNX平台上直接开发调试Java应用程序。对AWT和SWT的支持,使得两个战营的开发人员都能够在一个平台上开发出漂亮美观的图形用户界面。因此,QNX是一个开发嵌入式Java产品的绝妙平台,在基于PC-104构架的嵌入式系统中有着广阔的应用前景。
读者如果需要进一步了解本文中提及的QNX实时操作系统、IBM WebSphere软件、Eclipse集成开发环境或者是Java编程语言,请自行参考如下网站所提供的文档和教程。
QNX公司: http://www.qnx.com/
IBM WebSphere: http://www.ibm.com/embedded/
Eclipse网站: http://www.eclipse.org/
Java主页: http://java.sun.com/
一些与Java技术相关或者无关的水木BLOG
| 发表时间:2004-09-02 05:18:34 | 评论:0 |
在BLOG首页针对BLOG名称和BLOG描述搜索Java、J2SE, J2EE, J2ME,Eclipse 等
Java技术关键词,并且针对作者熟悉的水木ID的BLOG进行了一番扫描,得出如下
初步的名单。因为水木BLOG的搜索功能比较有限,因此不免有一些与Java相关的
BLOG没有能够被列入下表,请知道的朋友补充一下吧。
总的看来,用BLOG来发表技术文章在水木还没有形成潮流,也没有在BLOG进行技
术讨论的风气。但是,如果能够将所有这些与Java技术相关的文章做一个集合,
想来能够造成一定的影响,因为如果不是作者觉得自己写得还算不错,是不会费
心收录到自己的BLOG里面去的。
有一个网站,叫做www.javablogs.com ,集中了大量关于Java技术的BLOG。虽然
该网站本身不提供BLOG服务,但是却集中了大量优秀的关于Java技术的文章。这
有点类似于groups.google.com (可惜在国内访问不了这个好东西),是个很有
用的东西。我的javablogs看到了dev的BLOG,然而当我试图将我的BLOG添加到其
中的时候,发现我所提供的RSS FEED不能够通过验证。对一些其他水木BLOG做了
验证测试之后,发现主要有两个问题,一个是语言不通,另外一个是生成的XML
信息太大了。
oosky J2EE
文章数目比较多,内容也很出色,一直保持旺盛的精力不断更新。就象
其BLOG名称所描述的一样,以J2EE技术为主,强烈推荐。
qyjohn 婉兮清扬
这不是一个以技术为主的BLOG,但是近期收录了很多作者在过去4 年里
不断发表的一些关于Java技术的文章。
1 chjoke 听着音乐,学着java
似乎已转载收藏为主。
2 coolair Java的森林
没有文章。
3 fy2000 Java服务器开发之路
有几篇关于字符集处理的文章,似乎是原创。
4 hrry 阿波吃得
基本上与Java技术无关
5 kotcw java学习者
没有文章。
6 wweigo 冷萧寒@Blogging-Java创造未来
写得很好的BLOG,不过最近没有文章啦。
7 yongsheng javalinux
没有文章。
8 yyygao Bear's Eye
只有一篇关于Java的文章。
9 zms Java技术
只有一篇文章,并且基本上与Java技术无关。
10 tanyang 基于J2EE的快速开发
尚没有实质性的内容。
11 quijote 等待戈多
相当不错的一个BLOG,似乎已读书笔记为主,不过已经有将近三个星期
没有更新了。
12 bakkh0s 瓶子-Think different
有“技术·潮流”一篇关于Java的文章,关于内存泄漏的。
13 dev 无间
很有意思的BLOG,很有意思的文章,有一个“Java相关”栏目,不过文
章不多。
14 fwinner mathematics computing
有几篇关于Java的文章,不过似乎是转载。
15 jackywang 风花雪月的故事
在其“技术专区”中有一些关于Java的文章,写得挺好的。
16 quest 惠人悦己
有一个“编程技能”栏目,有一些关于Java的文章,似乎是转载。
17 jiangsukid 随心所欲
有几篇跟Java相关的文章。
18 ahxu 一切为了总结经验
类似于学习笔记,写得很认真,也很好。
泽泽的歌
| 发表时间:2004-08-31 05:54:31 | 评论:0 |
山歌
http://scms.whedu.net/feeling/8.mp3词:王泽 曲:王泽 演唱:王泽
花儿花儿,开了 鸟儿鸟儿,唱歌了
春天到了,回声响了
慢慢地走啊走啊 到哪里去啊
随着溪流走啊走啊 沿着山路走啊走啊
口琴在悠悠,流年在水中
他们说年少的往事 山谷回响潮湿
春雨低吟未完的诗 年华已逝
一棵叫Feeling的植物
http://scms.whedu.net/feeling/3.mp3
曲:王泽 演唱:王泽 制作人:侯钧 编曲:孟可
MIDI工程:戴劲松 录音、混音:顾评
朋友,走的时候 留给我一个礼物
那是一棵叫做Feeling的植物
我知道他的一路
都曾有它的相处
他的成长带它一起生长
它的生长支撑他的脚步
它喜欢我心里面的土壤和阳光
偶尔的降雨能使它茁壮
所以它在冬天静静等待一双美丽的翅膀
它在雨天静静接受失败的漫长
它说你看你有一些总有一天要实现的梦想
你有一年四季可以喜怒哀乐心里有种下Feeling的地方
希望它能长成一棵漂亮的树
一棵漂亮的绿色植物
一棵飞舞的树 可以让我的一路
都有它的帮助 再不怕变的麻木
变得庸庸碌碌
航行
http://scms.whedu.net/zhijue/3.mp3
词:王泽 曲:王泽 演唱:王泽
我的心啊 有一片云 飘啊飘啊
漂泊不定 我的心啊 很少下雨
我总用快乐把它挂在天际 我的船啊
不停的划啊 一直到天边 找不到家
我的船啊 轻轻的摇啊 你知道我
什么也不怕 我把春天全都挂在桅杆
让它飘扬 让大海看见
我把阳光全都写在脸上 让它灿烂
让蓝天看见
心愿
http://scms.whedu.net/zhijue/8.mp3
词:王泽 曲:王泽 演唱:王泽&杨颖
湖水是你的眼神 梦想满天星辰
心情是一个传说 亘古不变地等候
成长是一扇树叶的门
童年有一群亲爱的人
春天是一段路程 沧海桑田的拥有
那些我爱的人 那些离逝的风
那些永远的誓言一遍一遍
那些爱我的人 那些沉淀的泪
那些永远的誓言一遍一遍
我们都曾有过一张天真而忧伤的脸
手握阳光我们望着遥远
轻轻的一天天一年又一年
长大间我们是否还会再唱起 心愿
长大间我们是否还会再唱起 心愿
基于Java的GPS接收机解析器
| 发表时间:2004-08-31 05:17:37 | 评论:16 |
[摘要]本文介绍了一个基于Java的GPS 接收机解析器。这个Java类通过解析标准GPS接收机的输出信号,能够为导航与控制系统提供GPS 时钟、经度、纬度、高程等一系列信息。本类库使用标准Java语言编写,不需要任何第三方通讯类库(包括Sun 公司的Java通讯API )的支持,稍加修改即可被广泛应用在各种便携式设备和嵌入式系统中。
[介绍]
全球定位系统 (Global Position System,简称GPS )是由美国研制的导航、授时和定位系统。该系统包括空中卫星、地面跟踪监测站、地面卫星数据注入站、地面数据处理中心和数据通讯网络等部分。这个系统通过 24颗地球同步卫星全天候向地面发送授时和定位信号,其中高精度的信号仅供美国军方和北约盟军使用,普通用户只能够接收和解析低经度的民用信号。如果对接 收到的民用信号进行差分处理,也可以得到精度很高的定位数据。目前一般的差分GPS 接收机都可以得到1 米精度的定位数据,在欧美市场上已经出现了厘米级的差分GPS 接收机。普通用户只需购买GPS 接收机,就可享受免费的导航、授时和定位服务。目前全球定位系统技术在农业、林业、水利、交通、航空、测绘、安全防范、军事、电力、通讯、城市管理等领域 都有广泛应用。
在上述所述应用领域中,GPS 接收机通常是某些便携式设备或者是嵌入式系统的外接输入设备。一般的GPS 接收机均通过串行通讯口主动向主机发送数据,其通讯参数为4800(波特率),8(数据位),1(停止位),0(奇偶校验位)。 由于 Java语言的平台无关性,很多基于便携式设备和嵌入式系统的应用程序都采用Java 语言进行开发。因此,一个基于标准Java语言的GPS 接收机解析器,无疑具有广泛的应用前景。
本文所介绍的基于Java的GPS 接收机解析器从标准GPS 接收机的GGA 输出信息中解析标准时钟(Universal Time Coordinate, UTC)、纬度(Latitude)、经度(Longitude )和高程(Altitude)等基本授时和定位信息。根据美国海军电子设备标准接口规定,该信息包含标准时间、经纬度、高程等数据,每个数据之间用逗号分 隔,以一个回车符号结束,一般格式如下:
$--GGA,标准时间,纬度,南北,经度,东西,信号质量,卫星总数,水平精度,高程,米,地理间隔,米,差分数据龄期,差分基准站ID*hh
$--GGA -- GGA 信息标示符,根据接收机的不同,该标示符中的第二和 第三个字节会有所不同。
标准时间 -- 一个浮点数,数据格式hhmmss.ss。
纬度 -- 数据格式ddmm.mm,其中dd为度(整数,0 到90);mm.mm为 分(浮点数,0 到60)。
南北 -- 南北半球标示符号,一个字节,S 为南半球,N 为北半球。
经度 -- 数据格式dddmm.mm,其中ddd为度(整数,0到180);mm.mm 为分(浮点数,0 到60)。
东西 -- 东西半球标示符号,一个字节,E 为东半球,W 为西半球。
信号质量 -- 一个整数,从0 到8。
卫星总数 -- 一个整数,从0 到24。
水平精度 -- 一个浮点数。
高程 -- 该地点在平均海平面以上的高程,一个浮点数。
米 -- 长度单位标示符,一个字节,M。
地理间隔 -- WGS-84地球椭球表面与平均海平面表面之间的距离,一个浮 点数。
米 -- 长度单位标示符,一个字节,M。
差分数据龄期 -- 上一次SC-104标定到当前的总秒数,一个浮点数。
查分基准站ID -- 一个整数,从0000到1023。
除 了GGA 信息以外,一般的GPS 接收机还会输出其他类型的信息,例如AAM 信息,ACK 信息,GNS 信息等等。本文所介绍的Java类库持续的监听GPS 接收机所在的串行通讯口,从其输出信息中截获GGA 信息并进行解析,从而获得当前的时间和定位信息。本类库包括三个Java模块以及一组测试数据:
GPS 数据模块 -- 实时保存当前数据(GpsInfo.java)。
GPS 接收机模块 -- 供外部程序调用(GpsReceiver.java)。
数据接收与解析模块 -- 接收与解析GPS 信息(GpsParser.java)。
测试模块 -- 功能测试与范例(TestGps.java)。
测试数据 -- 一组实际GPS 测量数据(gps.dat)。
[GPS 数据模块]
GPS 数据模块用来保存经过解析的授时与定位数据,同时提供访问与更新这些数据的方法。数据接收与解析模块通过数据更新方法SetXyz()实时更新授时与定位 数据,用户应用程序通过数据访问方法GetXyz()使用授时与定位数据。考虑到可能存在多个应用程序(线程)同时对GPS 数据进行修改的情况,所有的数据更新方法都利用synchronized关键字和notifyAll() 方法实现了数据同步。在这个类中包含的数据访问与更新方法比较多,部分列举如下:
数据访问方法:
public float GetTime()
此方法返回当前标准时间,其返回值是一个浮点数,数据格式hhmmss.ss。
public float GetLatitude()
此方法返回当前纬度信息,数据格式ddmm.mm,其中dd为度(整数,0 到90); mm.mm为分(浮点数,0 到60)。
public String GetNS()
此方法返回南北半球标示符号,一个字节,S 为南半球,N 为北半球。
public float GetLongitude()
此方法返回当前经度信息,数据格式dddmm.mm,其中ddd为度(整数,0到180) ;mm.mm为分(浮点数,0 到60)。
public String GetEW()
此方法返回东西半球标示符号,一个字节,E 为东半球,W 为西半球。
public float GetAltitude()
此方法返回当前平均海平面以上高程,一个浮点数。
数据更新方法:
public void SetTime(float time)
此方法更新当前标准时间,输入参数是一个浮点数,数据格式hhmmss.ss。
public void SetLatitude(float latitude)
此方法更新当前纬度信息,参数格式ddmm.mm,其中dd为度(整数,0 到90); mm.mm为分(浮点数,0 到60)。
public void SetNS(String ns)
此方法更新南北半球标示符号,一个字节,S 为南半球,N 为北半球。
public void SetLongitude(float longitude)
此方法更新当前经度信息,参数格式dddmm.mm,其中ddd为度(整数,0到180) ;mm.mm为分(浮点数,0 到60)。
public void SetEW(String ew)
此方法更新东西半球标示符号,一个字节,E 为东半球,W 为西半球。
public void SetAltitude(float altitude)
此方法更新当前平均海平面以上高程,输入参数是一个浮点数。
[GPS 接收机模块]
GPS 接收接模块是本类库于其他应用程序的接口,本模块为其他应用程序提供了连接、启动、切断GPS 接收机以及实时查询GPS 数据的方法。具体介绍如下:
构造方法:
public GpsReceiver(String GpsDevice, int Factor)
public GpsReceiver(String GpsDevice, int Factor, boolean Record)
其中:
GpsDevice -- 即将使用的GPS 设备名称。如果GPS 接收机与计算机的串口COM1 或者是COM2相连接,则使用"COM1"或者是"COM2"作为设备名称, 以此类推;如果使用GPS 数据文件代替GPS 接收机的输入,则使 用该文件名作为设备名称,例如"gps.dat"。
Factor -- 如果使用GPS 数据文件代替GPS 接收机的输入,则可以利用此变 量制定一个加速系数,用于快速回放等功能。普通GPS 接收机每 秒钟更新一次数据,如果指定加速系数为5 ,则每秒钟回放5 秒 钟的实际测量数据。如果从GPS 接收机接收数据,则需要将该参 数设定为0 。
Record -- 如果使用了GPS 接收机,则可以通过将该参数设定为true来记录 GPS 接收机的输出数据。这些数据可以在程序测试中模拟GPS 接 收机的输入。
操作方法:
public void StartReceiver()
此方法启动与GPS 接收机的连接,并且开始更新授时与定位数据。
public void StopReceiver()
此方法停止更新授时与定位数据,并且切断与GPS 接收机的连接。
public GpsInfo GetGpsData()
此方法返回当前的授时与定位数据。
用 户在使用本类库的时候,通常是先声明一个GpsReceiver 对象,然后利用上述StartReceiver() 方法启动与GPS 接收机的连接并且开始接收与解析授时与定位信息。当用户不再需要使用来自GPS 接收机的信息时,可以利用StopReceiver()方法切断与GPS 接收机的连接并且释放所占用的系统资源。
[数据接收与解析模块]
数 据接收与解析模块是本类库的核心部分,这个模块负责监听GPS 设备输出的信号,从中截获并解析GGA 信息,从而得到最新的授时与定位数据。该模块可以使用实时和模拟两种方式工作,在实时模式下使用GPS 接收机作为输入设备,在模拟模式下使用GPS 数据文件模拟GPS 接收机的输入。此外,数据接收与解析模块还能够将GPS 接收机的输出数据保存到数据文件中供程序测试等使用。因此,数据接收与解析模块的构造方法与GPS 接收机模块的构造方法是类似的。
构造方法:
public GpsParser(String GpsDevice, int Factor, boolean Record, GpsInfo Info)
其中:
GpsDevice -- 即将使用的GPS 设备名称。如果GPS 接收机与计算机的串口COM1 或者是COM2相连接,则使用"COM1"或者是"COM2"作为设备名称, 以此类推;如果使用GPS 数据文件代替GPS 接收机的输入,则使 用该文件名作为设备名称,例如"gps.dat"。
Factor -- 如果使用GPS 数据文件代替GPS 接收机的输入,则可以利用此变 量制定一个加速系数,用于快速回放等功能。普通GPS 接收机每 秒钟更新一次数据,如果指定加速系数为5 ,则每秒钟回放5 秒 钟的实际测量数据。如果从GPS 接收机接收数据,则需要将该参 数设定为0 。
Record -- 如果使用了GPS 接收机,则可以通过将该参数设定为true来记录 GPS 接收机的输出数据。这些数据可以在程序测试中模拟GPS 接 收机的输入。
Info -- 用来保存授时与定位信息的GPS 数据对象。
数 据接收与解析模块的核心部分是一个线程,该线程被设计成一个内置类,这样的设计是的外部程序能够通过该类自定义的start() 和stop()方法来启动和终止该线程。在start() 方法中将一个名为DevOn 的逻辑变量设置为真并且启动数据接收与解析线程,在stop()方法中则将DevOn 设置为假。数据接收与解析线程在运行过程中不断监测DevOn 的值,如果DevOn 为假,则终止自身的执行。这个设计避免了已经不鼓励使用的(deprecated)的stop()方法来强制终止线程的执行,从而保证了该线程的安全终 止。
在数据接收与解析模块中把GPS 输入设备统一当作文件进行处理,因为大多数的操作系统均将串行端口设置为系统保留文件,应用程序只需要对该文件进行读写即可以通过串行端口与外界设备进行 通讯。一个GPS 接收机解析器只需要从串行端口实时读取数据而并不需要向GPS 接收机发送控制指令,使用标准文件输入函数来读取GPS 接收机的输入信号,完全能够满足功能上的要求。这样的设计使得数据接收与解析模块在实时模式和模拟模式下都能够使用同样的数据接收与解析程序,大大的简化 了整个程序的结构。此外,利用标准文件输入函数来对GPS 接收机进行操作,避免了在类库中使用例如javax.comm等第三方通讯API ,大大的提高了本类库的可移植性。
由于GPS 接收机的每一条信息均以回车换行符号结束,在数据接收与解析模块中使用了BufferedReader来读取GPS 接收机的输入信息。GPS 接收机的所有输入信号,首先被系统存放在一个缓冲区里面。数据接收与解析模块利用readLine()方法每次从该缓冲区里面读取一行数据,如果该行数据 包含GGA 数据标示符,则利用该数据解析授时与定位信息,反之则将该行数据舍弃继续读取下一行数据进行判断和处理。
由于普通GPS 接收机的数据更新频率为1 秒,在模拟模式下,数据接收与解析模块每读取到一条GGA 数据就暂停1 秒钟,从而模拟GPS 接收机的输入。如果用户指定了一个大于1 的加速系数,则根据加速系数计算暂停的时间,例如在加速系数为5 的情况下暂停时间为200 毫秒,因此回放模拟的速度相当于实际速度的5 倍。这个功能在耗时较长的程序测试中非常有用。考虑到一般应用程序所能够获得的时钟信号的精度不是很高的缘故,我们不推荐使用大于50的加速系数。
此外,数据接收与解析模块还提供了数据记录功能。利用数据记录功能能够将实测到GPS 信号保存到一个数据文件里面供回放和测试使用。该功能自动产生一个扩展名为.gps的数据文件,主文件名根据当时的系统时间自动生成,在通常的情况下不会发生数据覆盖的问题。
[程序测试]
在 本类库中提供了一个测试程序和一组测试数据。利用这个程序和数据用户可以使用实时和模拟两种方式对本类库进行测试,也可以在这个测试程序的基础上开发自己 的应用程序。测试环境包括多种版本的Windows 95/98/2000操作系统,四个不同型号的差分GPS 接收机,两个常规Java虚拟机以及两个嵌入式Java虚拟机。测试结果表明,本类库在以上不同条件的各种组合下均能够利用实时和模拟两种模式正常工作。
[结论]
本文设计和实现了一个基于Java的GPS 接收机解析器,全面测试结果表明,这个GPS 接收机解析器能够实现如下功能:
(1) 在实时模式下,从GPS 接收机接收与解析授时与定位数据。
(2) 在模拟模式下,利用GPS 数据文件回放授时与定位数据。用户可以通过设 定一个加速系数来改变数据回访的速度。
(3) 能够将实测到GPS 信号保存到一个数据文件里面供回放和测试使用。
(4) 本类库不需要任何第三方通讯类库(包括Sun 公司的Java通讯API )的支 持,稍加修改即可被广泛应用在各种便携式设备和嵌入式系统中。
[其他]
很早的一篇文章了,大概是2001年写的,很多东西已经跟不上形式了,放在这里做个记录吧。
Access USB devices from Java applications
| 发表时间:2004-08-30 05:15:51 | 评论:1 |
Introduction
The Java platform has traditionally prided itself on its platform independence. While that independence has many benefits, it makes the process of writing Java applications that interact with hardware quite tricky. In this article, research scientist Qingye Jiang examines two projects that are making the process easier by providing APIs through which Java applications can make use of USB devices. While both projects are still in embryo form, both show promise and are already serving as the foundations of some real-world applications.
The first version of the Universal Serial Bus (USB) specification was released in January 1996. Because of its low cost, high data-transfer rate, ease of use, and flexibility, USB has gained wide acceptance in the computer industry. Today, many peripherals and devices connect to computers through USB interfaces. Currently, most general-purpose operating systems provide support for USB devices, and it is relatively easy to develop applications in C or C++ that access such peripherals. However, the Java programming language by design provides very little support for hardware access, so writing Java applications that interact with USB devices has proved quite difficult.
Efforts to provide access to USB devices in the Java language were initiated in 1999 by Dan Streetman at IBM. In 2001, his project was accepted as a candidate extended standard of the Java language through the Java Specification Request (JSR) process. The project is now called JSR-80 and has been officially assigned the Java package
javax.usb. Meanwhile, in June 2000, Mojo Jojo and David Brownell started the jUSB project at SourceForge. Both of these projects have since produced usable packages for Linux developers, although neither is close to perfect. Both projects also have begun attempts to provide access to USB devices for Java applications on other operating systems, though usable packages have not yet emerged from either. (See Resources for references to these and other projects discussed in this article.)
In this article, you'll get a brief introduction to the jUSB and JSR-80 projects; first, however, we'll take a look at the nuts and bolts of the USB protocol, so that you can understand how both of those projects interact with USB devices. We'll also offer code snippets to show how you'd use both projects' APIs to access USB devices.
An introduction to USB
In 1994, an alliance of four industrial partners (Compaq, Intel, Microsoft, and NEC) started specifying the USB protocol. The original goal of the protocol was to connect the PC to the telephone and to provide I/O interfaces that were easy to expand and reconfigure. In January 1996, the first version of the USB specification was released, and a subsequent revision (version 1.1) was released in September 1998. The specification allowed 127 devices to be connected together at the same time, with the total communication bandwidth limited to 12 Mbps. Later on, three more members (Hewlett-Packard, Lucent, and Philips) joined the alliance. In April 2000, version 2.0 of the USB specification, which supports transfer rates up to 480 Mbps, was released. Today, USB plays a key role in high-speed (video, imaging, storage) and full-speed (audio, broadband, microphone) data-transfer applications. It also connects a variety of low-speed devices (keyboards, mice, game peripherals, virtual reality peripherals) to the PC.
The USB protocol is strictly hierarchical. In any USB system there is only a single host, and the USB interface to the host computer is referred to as the host controller. There are two standards for host controllers -- the Open Host Controller Interface (OHCI, by Compaq) and the Universal Host Controller Interface (UHCI, by Intel). Both standards provide the same capabilities and work with all USB devices; the hardware implementation of a UHCI is simpler, but requires a more complex device driver (and thus puts more load onto the CPU).
The USB physical interconnect is a tiered star topology, with up to seven tiers. A hub is at the center of each star, and the USB host is considered the root hub. Each wired segment is a point-to-point connection between a hub and USB device; the latter can be either another hub that provides additional attachment points to the system, or a device of some sort that provides functional capabilities. The host uses a master/subordinate protocol to communicate with the USB devices. This approach solves the problem of packet collision but also prevents the attached devices from establishing direct communication with each other.
All the data transfers are initiated by the host controller. Data directed from the host to a device is called downstream or out transfer; data directed from a device to the host is called upstream or in transfer. Data transfer occurs between the host and a particular endpoint on the USB device, and the data link between the host and the endpoint is called a pipe. A given USB device may have many endpoints, and the number of data pipes between the host and the device is the same as the number of endpoints on the device. A pipe may be uni-directional or bi-directional, and the data flow in one pipe is independent of the data flow in any other pipes.
Communication on the USB network can use any one of four different data transfer types:
- Control transfers: These are short data packets for device control and configuration, particularly at attach time.
- Bulk transfers: These are data packets in relatively large quantities. Devices like scanners or SCSI adapters use this transfer type.
- Interrupt transfers: These are data packets that are polled periodically. The host controller will automatically post an interrupt at a specified interval.
- Isochronous transfers: These are data streams in real time with higher requirements for bandwidth than for reliability. Audio and video devices generally use this transfer type.
Like a serial port, each USB port on a computer is assigned a unique identification number (port ID) by the USB controller. When a USB device is attached to a USB port, this unique port ID is assigned to the device and the device descriptor is read by the USB controller The device descriptor includes information that applies globally to the device, as well as information on the configuration of the device. A configuration defines the functionality and I/O behavior of a USB device. A USB device may have one or more configurations, which are described by their corresponding configuration descriptors. Each configuration has one or more interfaces, which can be considered as a physical communication channel; each interface has zero or more endpoints, which can be either data providers or data consumers, or both. Interfaces are described by interface descriptors, and endpoints are described by end-point descriptors. Furthermore, a USB device might also have string descriptors to provide additional information such as vendor name, device name, or serial numbers.
As you can see, a protocol like USB offers challenges to developers who use the Java language, which strives for platform- and hardware-independence. Let's now take a look at two projects that have tried to bridge the gap.
The jUSB API
The jUSB project was created by Mojo Jojo and David Brownell in June 2000. Its objective was to provide a set of free software Java APIs to access USB devices on Linux platforms. The API is distributed under the Lesser GPL (LGPL), which means that you can use it in proprietary as well as free software projects. The API provides multithreaded access to multiple physical USB devices, and supports both native and remote devices. Devices with multiple interfaces can be accessed by multiple applications (or device drivers) simultaneously, with each application (or device driver) claiming a different interface. The API supports control transfers, bulk transfers, and interrupt transfers; isochronous transfers are not supported because these are used for media data (such as audio and video) that are already well supported by the JMF API (see Resources) over other standardized device drivers. Currently, the API works on GNU/Linux distributions with either the Linux 2.4 kernel or a back port into 2.2.18 kernel. Thus, most recent distributions are supported; for example, the API works on Red Hat 7.2 and 9.0 without any patches or other upgrades.
The jUSB API includes the following packages:
usb.core: This package is the core part of the jUSB API. It allows Java applications to access USB devices from USB hosts.usb.linux: This package contains a Linux implementation of ausb.core.Hostobject, bootstrapping support, and other classes leveraging Linux USB support. This implementation accesses the USB devices through the virtual USB device file system (usbdevfs).usb.windows: This package has a Windows implementation of ausb.core.Hostobject, bootstrapping support, and other classes leveraging Windows USB support. This implementation is still in its very early stage.usb.remote: This package is a remote version of theusb.coreAPI. It includes an RMI proxy and a daemon application, which allow Java applications to access USB devices on a remote computer.usb.util: This package provides some useful utilities to download firmware to USB devices, dump the content of the USB system into XML, and convert a USB device with only bulk I/O into a socket.usb.devices: This optional package collects Java code to access a variety of USB devices with the jUSB API, including Kodak digital cameras and Rio 500 MP3 Players. These APIs were specially written to simplify the process of accessing the designated USB devices and cannot be used to access other devices. The APIs were built upon theusb.coreAPIs, and they will work on any operating system where jUSB is supported.usb.view: This optional package provides a simple USB tree browser based on Swing. It is a very good example program illustrating the use of the jUSB API.
Although the implementation of the
usb.core.Host object varies from operating system to operating system, a Java programmer needs to understand only the usb.core package to start developing applications with the jUSB APIs. Table 1 outlines the interfaces and classes from usb.core with which a Java programmer should be familiar:
Table 1. Interfaces and classes in jUSB
| Interface | Description |
Bus |
Connects a set of USB devices to a Host |
Host |
Represents a USB controller with one or more Buses |
| Class | Description |
Configuration |
Provides access to a USB configuration supported by a device and to the interfaces associated with that configuration |
Descriptor |
Base class for entities with USB typed descriptors |
Device |
Provides access to a USB device |
DeviceDescriptor |
Provides access to a USB device descriptor |
EndPoint |
Provides access to a USB end-point descriptor, structuring device data input or output in a given device configuration |
HostFactory |
Contains bootstrapping methods |
Hub |
Provides access to a USB hub descriptor and some hub operations |
Interface |
Describes sets of endpoints, and is associated with a particular device configuration |
PortIdentifier |
Provides stable string identifiers for USB devices, appropriate for use in operations and troubleshooting |
The normal procedure to access a USB device with the jUSB API is as follows:
- Bootstrap by getting the USB
Hostfrom theHostFactory. - Access the USB
Busfrom theHost, then access the USB root hub (which is a USBDevice) from theBus. - Obtain the number of USB ports available on the hub, and traverse through all the ports to find the appropriate
Device. - Access the USB
Devicethat is attached to a particular port. ADevicecan be accessed directly from theHostwith itsPortIdentifier, or can be found by traversing the USBBusstarting from the root hub. - Interact with the
Devicedirectly withControlMessage, or claim anInterfacefrom the currentConfigurationof theDeviceand perform I/O with theEndpointavailable on theInterface.
Listing 1 illustrates how to obtain the content of a USB system with the jUSB API. The program as written simply looks at the root hub for available USB devices, but it would be easy to improve it to traverse the whole USB tree. The logic here corresponds to steps 1 through 4 above.
Listing 1. Obtaining the content of a USB system with the jUSB API
|
Listing 2 illustrates how to perform bulk I/O with
Interface and EndPoint, assuming that the application has successfully located the Device. This code snippet can also be modified to perform control or interrupt I/O. It corresponds to step 5 above.
Listing 2. Performing bulk I/O with the jUSB API
|
The jUSB project was very active from June 2000 to February 2001. The most recent release of the API, version 0.4.4, was made available on February 14, 2001. Only some minor progress has been reported since that time, probably due to the success of the IBM group in becoming a candidate extended standard of the Java language. However, several third-party applications have been developed based on jUSB, including the JPhoto project (an application using jUSB to connect to digital cameras) and the jSyncManager project (an application using jUSB to synchronize with a Palm OS-based PDA).
The JSR-80 API (javax.usb)
As noted earlier, the JSR-80 project was created by Dan Streetman at IBM in 1999. In 2001, the project was accepted as a candidate extended standard of the Java language through the Java Specification Request (JSR) process. The project is now called JSR-80 and has been officially assigned the Java package
javax.usb. The project is licensed under the Common Public License and is developed using the Java Community Process. The objective of this project is to develop a USB interface for the Java platform that will allow full access to the USB system for any Java application or middleware component. The JSR-80 API provides full support for all four transfer types defined by the USB specification. Currently, the Linux implementation of the API works on most recent GNU/Linux distributions with 2.4 kernel support, such as Red Hat 7.2 and 9.0.
The JSR-80 project includes three packages:
javax-usb (the javax.usb API), javax-usb-ri (the common part of the OS-independent reference implementation), and javax-usb-ri-linux (the reference implementation for the Linux platform, which connects the common reference implementation to the Linux USB stack). All three parts are required to form a complete functioning java.usb API on the Linux platform. Independent efforts aimed at porting the API to other operating systems (primarily Microsoft Windows) have been reported on the project e-mail list, but no functioning packages have been released yet.
Although the OS-dependent implementation of the JSR-80 APIs varies from operating system to operating system, a Java programmer needs to understand only the
javax.usb package to start developing applications. Table 2 lists the interfaces and classes in javax.usb with which a Java programmer should be familiar:
Table 2. Interfaces and classes in the JSR-80 APIs
| Interface | Description |
UsbConfiguration |
Represents a configuration of a USB device |
UsbConfigurationDescriptor |
Interface for a USB configuration descriptor |
UsbDevice |
Interface for a USB device |
UsbDeviceDescriptor |
Interface for a USB device descriptor |
UsbEndpoint |
Interface for a USB endpoint |
UsbEndpointDescriptor |
Interface for a USB endpoint descriptor |
UsbHub |
Interface for a USB hub |
UsbInterface |
Interface for a USB interface |
UsbInterfaceDescriptor |
Interface for a USB interface descriptor |
UsbPipe |
Interface for a USB pipe |
UsbPort |
Interface for a USB port |
UsbServices |
Interface for a javax.usb implementation |
| Class | Description |
UsbHostManager |
Entry point for javax.usb |
The normal procedure for accessing a USB device with the JSR-80 API is as follows:
- Bootstrap by getting the appropriate
UsbServicesfrom theUsbHostManager. - Access the root hub through the
UsbServices. The root hub is considered as aUsbHubin the application. - Obtain a list of the
UsbDevices that are connected to the root hub. Traverse through all the lower-level hubs to find the appropriateUsbDevice. - Interact with the
UsbDevicedirectly with a control message (UsbControlIrp), or claim aUsbInterfacefrom the appropriateUsbConfigurationof theUsbDeviceand perform I/O with theUsbEndpointavailable on theUsbInterface. - If a
UsbEndpointis used to perform I/O, open theUsbPipeassociated with it. Both upstream data (from the USB device to the host computer) and downstream data (from the host computer to the USB device) can be submitted either synchronously or asynchronously through theUsbPipe. - Close the
UsbPipeand release the appropriateUsbInterfacewhen the application no longer needs access to theUsbDevice.
In Listing 3, we obtain the content of the USB system with the JSR-80 API. The program recursively traverses through all the USB hubs on the USB system and locates all the USB devices connected to the host computer. The code corresponds to steps 1 through 3 above.
Listing 3. Obtaining the content of the USB system with the JSR-80 API
|
Listing 4 illustrates how to perform I/O with
Interface and EndPoint, assuming that the application has successfully located a Device. This code snippet can also be modified to perform I/O of all four data transfer types. It corresponds to steps 4 through 6 above.
Listing 4. Performing I/O with the JSR-80 API
|
The JSR-80 project has been very active from its very beginning. Version 0.10.0 of the
javax.usb API, RI, and RI for Linux were released in February 2003. It is likely that this version will be submitted to the JSR-80 committee for final approval. It is expected that implementations for other operating systems will soon be available after JSR-80 formally becomes an extended standard of the Java language. The Linux developer community seems to show more interest in the JSR-80 project than the jUSB project, and there have been an increasing number of projects launched using the javax.usb API on the Linux platform.
Conclusion
Both the jUSB API and the JSR-80 API provide Java applications with the capability to access USB devices from a machine running the Linux operating system. The JSR-80 API provides more functionality than the jUSB API, and has the potential of becoming an extended standard of the Java language. Currently, only Linux developers can take advantage of the jUSB and JSR-80 APIs. However, active efforts to port both APIs to other operating systems have been reported. Java developers should be able to access USB devices on other operating systems in the near future. By familiarizing yourself with these APIs now, you can be ready to add USB functionality to your applications when these projects are ready for prime time on multiple platforms.
Resources
- For more information on the USB specification, visit USB.org.
- Visit the home page of the jUSB project at SourceForge.
- For more information on the JSR-80 project, visit its home page or its page at the Java Community Process.
- Find out more about the jPhoto project.
- Learn about the jSyncManager project.
- For more on the JMF project, see Eric Olson's comprehensive "Java Media Framework basics" tutorial (developerWorks, May 2002).
- You'll find hundreds of articles about every aspect of Java programming in the developerWorks Java technology zone.
其他
本文于2003年9月发表于IBM DeveloperWorks美国网站:
http://www-106.ibm.com/developerworks/java/library/j-usb.html
| 更晚内容 | 更早内容 |
云与清风常拥有,
冰雪知音世难求。
击节纵歌相对笑,
案上诗书杯中酒。
2020年12月31日
洛杉矶
最新评论
2026-07-23 11:37:04
qyjohn 评论了 《几句翻译》
2026-07-21 20:11:28
wells 评论了 《几句翻译》
2025-11-15 06:29:51
qyjohn 评论了 《青桔》
2025-11-14 01:55:04
wells 评论了 《青桔》
2025-10-24 18:04:06
Ted Wang 评论了 《关于作者(About Me)》
2025-03-27 08:28:09
Max 评论了 《父亲走了》
2025-03-08 04:13:52
W 评论了 《我不想颂扬普京大帝》
2024-07-22 16:02:03
云思 评论了 《无题》
2024-06-27 10:01:54
yiming 评论了 《致访客(Welcome)》
2024-05-06 08:50:06
qyjohn 评论了 《致访客(Welcome)》
2024-05-03 19:49:00
jimmie 评论了 《致访客(Welcome)》
2024-02-19 03:32:57
林小静 评论了 《埋剑渡》
2024-01-05 03:54:28
路过者 评论了 《2023年度盘点》
2024-01-04 10:22:05
qyjohn 评论了 《致访客(Welcome)》
2024-01-04 08:05:13
qyjohn 评论了 《2023年度盘点》