[技術] 在Ubuntu使用Holux M-1000C GPS配合Google Earth

Written on 12:10 下午 by Yu Lai

本篇介紹為了這次出差買的Holux M-1000C GPS在Ubuntu
下配合Google Earth來達到即時定位.

1. 首先當然是要先讓Ubuntu與Holux M-1000C連線
Holux M-1000C本身主要是用藍芽的方式與NB或手機連線,
它也有提供特殊的USB線可以直接轉成RS-232的方式連結,
但這條線我沒買,有機會下次再介紹這條特別的線。

在Ubuntu下用GUI的藍芽只能完成初步的連線,至於GPS常用
的SPP只能在Terminal下指令了,方式如下:
先scan藍芽,把M-1000C的MAC記下來。

# hcitool scan
Scanning ...
00:1B:C1:05:9C:64 Holux M-1000C

接著查看GPS使用的RFCOMM的channel。
# sdptool browser 00:1B:C1:05:9C:64
Browsing 00:1B:C1:05:9C:64 ...
Service Name: SPP slave
Service RecHandle: 0x10000
Service Class ID List:
"Serial Port" (0x1101)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100

最後編輯/etc/bluetooth/rfcomm.conf建立rfcomm介面:
rfcomm0 {
bind yes;
device 00:1B:C1:05:9C:64;
channel 1;
comment “Holux M-1000C”;
}

重啟Bluetooth services
/etc/init.d/bluetooth stop
(wait a while)
/etc/init.d/bluetooth start


2. 安裝與設定Google Earth
Google Earth自行到Google網頁上抓就有了,我是抓5.1beta版本。
接下來我們要利用了Google Earth的KML以及KML可以refresh的功能,
來達到即時定位的目的。

預設Google Earth會安裝在/opt/google-earth目錄下,
在該目錄下建立一個Realtime GPS.kml,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<NetworkLink>
<name>Realtime GPS</name>
<open>1</open>
<Link>
<href>./realtime/Realtime GPS.kml</href>
<refreshMode>onInterval</refreshMode>
</Link>
</NetworkLink>
</kml>

接著把相關目錄realtime建立出來:
# mkdir /opt/google-earth/realtime

接著打開Google Earth,它建好的KML開啟放在Places下(檔案 -> 開啟...)。

3. 從M-1000C取出NMEA定位資料
我們剛才己經將RFCOMM介面設定好了,接著只要下
# rfcomm connect 0
syntax error line 23
Connected /dev/rfcomm0 to 00:1B:C1:05:9C:64 on channel 1
Press CTRL-C for hangup

然後另外開一個Terminal就可以從/dev/rfcomm0內取到M-1000C回報的定位資料了。
e.g.
# cat /dev/rfcomm0 
$GPGGA,044423.000,0910.5038,N,09916.9805,E,1,9,0.89,8.6,M,-24.3,M,,*72
$GPRMC,044423.000,A,0910.5038,N,09916.9805,E,0.03,0.00,311009,,,A*67
$GPVTG,0.00,T,,M,0.03,N,0.06,K,A*38
$GPGGA,044424.000,0910.5038,N,09916.9805,E,1,9,0.89,8.6,M,-24.3,M,,*75
$GPRMC,044424.000,A,0910.5038,N,09916.9805,E,0.06,0.00,311009,,,A*65
$GPVTG,0.00,T,,M,0.06,N,0.10,K,A*3A
...

所以接下來就是要拆NMEA的format將它轉成剛才在Google Earth設定realtime的KML檔,
提供給Google Earth讀取並顥示即時位置了。
(PS:NMEA格式可以到GPS - NMEA sentence information參考。)
以下是我自己寫的C Code,是將NMEA中的GPRMC格式轉成KML,
當然可以依照自喜歡的格式和語言自己改寫。
/*
* filename: gps2kml.c
* author: lazyf (lazyflai (at) gmail.com)
* date: 2009/10/31
* copyright: http://creativecommons.org/licenses/by-nc-nd/2.5/tw/
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#define DEV_FILE "/dev/rfcomm0"
#define KML_FILE "/opt/google-earth/realtime/Realtime GPS.kml"


int main(int argc, char *argv[]) {

char strbuf[256];
char *strp;
FILE *fp, *fp2;
float latitude, latitude_in, latitude_degrees, latitude_minutes;
float longitude, longitude_in, longitude_degrees, longitude_minutes;
float altitude, speed;

/* Call rfcomm connect */
system("rfcomm release 0");
sleep(3);
system("rfcomm connect 0 &");
sleep(5);

/* Open device file */
if((fp = fopen(DEV_FILE, "r"))) {
/* Call Google Earth up */
system("/opt/google-earth/googleearth &");
while(1) {
/* Read text */
memset(strbuf, 0, sizeof(strbuf));
fscanf(fp, "%s\n", strbuf);
if(strlen(strbuf) < 58)
continue;

/* Parse GPRMC format */
if(memcmp(strbuf, "$GPRMC", 6)==0) {
strp = (char *)strtok(strbuf, ","); /* $GPRMC */
strp = (char *)strtok(0, ","); /* Time */
strp = (char *)strtok(0, ","); /* Avalible or Void */

strp = (char *)strtok(0, ","); /* Latitude */
latitude_in = atof(strp);
strp = (char *)strtok(0, ","); /* N or S */
if(strcmp(strp, "S") == 0)
latitude_in = -latitude_in;
latitude_degrees = (int)(latitude_in/100);
latitude_minutes = latitude_in - latitude_degrees*100;
latitude = latitude_degrees + (latitude_minutes/60);

strp = (char *)strtok(0, ","); /* Longitude */
longitude_in = atof(strp);
strp = (char *)strtok(0, ","); /* E or W */
if(strcmp(strp, "W") == 0)
longitude_in = -longitude_in;
longitude_degrees = (int)(longitude_in/100);
longitude_minutes = longitude_in - longitude_degrees*100;
longitude = longitude_degrees + (longitude_minutes/60);

strp = (char *)strtok(0, ","); /* Speed */
speed = atof(strp) * 1.852;
if(speed < 3)
speed = 0;

strp = (char *)strtok(0, ","); /* Altitude */
altitude = atof(strp);

/* Output KML file */
if((fp2 = fopen(KML_FILE, "w"))) {
fprintf(fp2,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<kml xmlns=\"http://earth.google.com/kml/2.0\">\n"
"\t<Placemark>\n"
"\t\t<name>GPS %d.%d km/h</name>\n"
"\t\t<description></description>\n"
"\t\t<Point>\n\t\t\t<coordinates>%f,%f,%f</coordinates>\n\t\t</Point>\n"
"\t</Placemark>\n"
"</kml>\n",
(int)speed, ((int)(speed*10))%10, longitude, latitude, altitude);
fflush(fp2);
fclose(fp2);
}
}
}
fclose(fp);
}

return 0;

}

最後把它compile出來執行,就會自動建好rfcomm0和開啟Google Earth啦。

[技術] 在Ubuntu安裝SCM SCR-243 PCMCIA Card Reader

Written on 2:55 上午 by Yu Lai

之前買的pcmcia介面的SmartCard Reader,沒想到裝在Linux上有點麻煩。
首先到官網上 http://www.scm-pc-card.eu/ 抓Driver回來。
安裝前請先透過apt-get安裝以下套件:

apt-get install libusb-0.1-4 libpcsclite1 libpcsclite-dev pcscd pcsc-tools build-essential autoconf libccid

接著把Driver解開,執行它的install檔,不過我抓的v4.2.6好像在判斷pcsclite有問題,
手動將install內的判斷式修改一下即可。
./install

接著到 /dev 下手動將device node建立出來
cd /dev
mknod SCR24x0 c 251 0

udev也要
cd /lib/udev/devices
mknod SCR24x0 c 251 0

然後重新啟動電腦,讓剛才編好的driver與pcscd載入,
可用以下指令來判斷是否載作成功:
# lspcmcia -v
Socket 0 Bridge: [yenta_cardbus] (bus ID: 0000:06:09.0)
Configuration: state: on ready: unknown
Voltage: 5.0V Vcc: 5.0V Vpp: 0.0V
Socket 0 Device 0: [scr24x_cs] (bus ID: 0.0)
Configuration: state: on
Product Name: SCR243 PCMCIA Smart Card Reader
Identification: manf_id: 0xffff card_id: 0x0001
prod_id(1): "SCR243 PCMCIA" (0x2054e8de)
prod_id(2): "Smart Card Reader" (0xf5a90d5d)
prod_id(3): --- (---)
prod_id(4): --- (---)

# lsmod |grep pcmcia
pcmcia 43052 1 SCR24x
pcmcia_core 43412 4 SCR24x,pcmcia,yenta_socket,rsrc_nonstatic

使用讀卡機前可以用 pcsc_scan 指令來檢查,
不過我在使用上需先重插卡片再重啟pcscd才能正常使用,
算了,能用就好。最後就是上玉山的WebATM使用囉。

[技術] 在Thinkpad T60上安裝Ubuntu一些Note

Written on 2:31 上午 by Yu Lai

最近出差到泰國,真的被XP當到快發瘋了,
待出差回去後,把T60整個format掉裝起Ubuntu。
期間有一些安裝上的Note,就記錄在這裡囉。
(PS: 本篇會持續修改與增加內容。)

1. Track-Point的中鍵scroll功能
(Updated on 2010/07/05)
原本的方法在Ubuntu 10.04後就失效了QQ,
還好有人把該設定打包成套件直接使用。
先安裝gpointing-device-settings,
裝好執行後把Use wheel emulation打勾,
Button選2按Ok即可正常運作。

2. 把該死的dash拿掉
這個之前就有一篇在說明了,這裡再補記一下= =。
cd /bin
ln -sf bash sh

3. 使用root登入
這點很不建議,不過由於工作上的關係,常常需要compile到Linux Kernel,
加上又是NB,所以只好偷雞一下啦。
到/etc/gdm/gdm.conf內加入 AllowRoot=true 即可。

4. 安裝SCM SCR-243 PCMCIA Card Reader
這篇內容太多了,所以獨立出來。
Link: [技術]在Ubuntu安裝SCM SCR-243 PCMCIA Card Reader

5. 使用GPS配合Google Earth
Link: [技術] 在Ubuntu使用Holux M-1000C GPS配合Google Earth

6. 使用Wine存取Serial COM Port
Link: [技術] 在Wine中存取Serial COM Port

7. 取消udisks-daemon去polling光碟機
就算光碟機裡沒放光碟片,它還是偶爾會去讀取,一整個超怪。
# sudo hal-disable-polling --device /dev/sr0

8. 永久取消Pointer can be controlled using the keypad
修改/usr/share/X11/xkb/compat/complete檔,把augment "mousekeys"和augment "accessx(full)"取消掉。
如下:

// $XKeyboardConfig$
// $Xorg: complete,v 1.3 2000/08/17 19:54:34 cpqbld Exp $
default xkb_compatibility "complete"  {
include "basic"
augment "iso9995"
//    augment "mousekeys"
//    augment "accessx(full)"
augment "misc"
augment "xfree86"
augment "level5"
};

9. 永久取消NumLock
使用gconf-editor,使用Ctrl+F,勾選"Search also in key names",找"numlock"。
然後Turn off "remember_numlock_state"和Turn off numlock "numlock_on"。