Pages

2011-10-28

手機簡訊Proxy代發伺服器

一般而言,我們用手機發簡訊(大陸慣用語為「短信」),大陸的簡訊費用為台灣的1/4,平均約為每則0.5元台幣,所以大陸的短信聯絡方式極為發達,尤其在旅遊業上,異地直接電話聯絡因為各省有口音溝通不易,短信是重要的通知媒介。尤其三大電信公司還有大量的短信包,平均價格更可低到每則0.25元台幣。

中國移動門號有提供稱為「飛信」的網上服務來發短信,讓人們不用因手機不好打字而痛苦,但它不能跨電信公司門號使用。為了消耗每個月用不完的短信包,我決定寫一個網路代理媒介,來讓朋友藉由我的手機發免費短信。

系統架構圖:
image 
電腦之所以能透過手機發短信,就是靠到手機內建的COM埠,我們稱為「GSM Modem」介面,它有一定的通訊協定。大陸有人純做GSM Modem的嵌入式硬體(大陸稱為短信貓),就比較方便聯結,否則得視手機廠商是否提供GSM Modem驅動程式,讓電腦能夠與手機溝通。

我是使用Sony Eicsson K750i這隻手機,它沒有x64平台驅動程式,因此它得活在VMware虛擬系統下,加上家裏網路也沒有固定IP,勢必我得在中間成立一個手機Proxy伺服器,來讓兩端沒固定IP的端點通訊。為了能突破重重防火牆及家庭NAT,選擇使用TCP Server來控制。另一端GSM Modem並不限定只有一台,可以很多手機一起加入分享行列。
 image

如此一來,User端只需要執行Client程式,連上該Proxy主機,即可發短信:
image 
紅1: 因為大陸短信費用低廉考量,先綁住大陸門號,當然它傳至台灣門號也行的,只是費用高昂。
紅2: 訊息內容的顯示手機號碼,一律是我的GSM手機,我是辦廣州聯通的新勢力短信套餐,9塊RMB每月免費150則短信包。
紅3: 所謂訊息是指文字內容+簽名檔,因為是代發,得考慮到簽名檔。
紅4: 主機端有發送密碼,必須輸入正確的密碼才能發訊。
紅5: 每月手機短信包數量有限,因此也設定一個總Quota控制。

有了中間媒介的Proxy伺服器,每個人若能加入一起分享自己的GSM手機連結,就能形成一個龐大而免費的短信資源網,反正自己每個月用不完也是白白損失,何不貢獻出來?只是現實問題是每個人的手機不容易驅動連接至電腦,加上台灣的短信費太昂貴讓人沒有想像空間,因此目前只掛上我一人的GSM手機端點,物盡其用每月的短信包。

2011-10-24

TCP/IP Server的實作議題

在.NET下如何建立TCP Server,基本的概念如以下文章程式碼:
Building a TCP/IP server using C# | Martijn's C# Programming Blog
http://www.dijksterhuis.org/building-a-tcpip-server-using-c/

文章中提到建立TCP Server的三種程式版本,Version1是使用內建的TcpListener及TcpClient類別
它們是高階包裝物件,雖然使用簡單,但本質還是使用底下的Socket類別在實作。
微軟為何謙虛稱其為「TcpListener」而非「TcpServer」,等你實作多人連線時就會發現,
事情絕不是想像中般簡單。

網路程式大部分工作就是在Read()/Write()封包,為了提高效能,Version2就是使用純Socket類別作範例
為了減少等待及多執行緒管理,Version3提供非同步方式來處理Client的連入及資料傳送工作。

要真正實作一個名副其實的TcpServer,文章中的程式內容還不足以擔任此重責,
TCP Server最大的技術門檻不在於Socket資料傳送,而是在處理多連線的非常規中斷
例如Server端或Client端的網路Cable突然出了問題(ex.斷電),或者是基於流程必須強制中斷
身為TcpServer得去捕捉這樣千奇百怪的例外錯誤。

鑽研至底層Socket控制,又有區分Graceful及Linger等斷線的方式,各有不同的效果。
完成Session管理後,傳輸指令的Command封包資料格式也需要兩造定義
(此部分可參考此Packet封包結構與解析文章)

資料接收完成後,倘若是大量的視訊資料,UI可能會來不及消耗這些資料封包,也必須實作緩衝Buffering及快取Cache技術
這些都是實作TcpServer的實務技術課題,新的WCF架構被創造的動機,即是用來解決及簡化這些連線問題。
但WCF目前無法相容異質平台,其大量傳輸的效能也可能備受質疑 (出了很多Metadata資訊)

我以多年的Socket實作經驗,實作了一個技術還堪用的TcpServer類別:
image

配合Packet封包結構協助類別PacketFrame,提供較高質量的安全網絡傳輸行為。

Packet封包結構與解析

兩年前寫的封包資料驗證文章主要應用在網路封包或RS232資料,後來從事嵌入式與單晶片程式工作,發現TI德州儀器的ZigBee通訊資料結構也差不多如此,只不過為了快速辨別封包類型,把Data欄位的前兩個bytes拉出來作為CMD0, CMD1兩個欄位.

SOF

LEN0長度

LEN1長度

CMD0

CMD1

DATA資料

FCS檢查碼

長度

1

1

1

1

1

N

1

SOF (Start of Frame)就是每個封包Packet的起始辨別字元,TI的資料長度只有1個byte,我將其擴充為2bytes。
FCS (Frame Check Sequence)即是針對LEN0至DATA這部分的陣列作xor運算之值。

網路Socket傳輸,這樣的格式也是一個很不錯的bytes陣列包裝方式,透過PacketFrame這樣的Helper Class,可以快速得到這樣的資料結構。
image 
我們可以快速建立一個符合結構的pkt[] array, 而其封包有效的資料長度即為pktLen值.
為什麼這函式不直接傳回新陣列呢? 因為重複使用buffer位址來存寫資料,可大大增加效能。

建立該結構的陣列,並沒有什麼困難,比較有門檻的是如何在陸續進來的封包緩衝區(Buffer)裏,解析(Parsing)出一個個完整的Packet結構。
image

為單一封包準備一個足夠大的Packet Buffer及SOF辨識字元,透過Parse(queue, startIndex, length)函式即可觸發事件。
事件參數為:
image
以上的Event Arguments資訊,就足夠判斷進來的封包資料所為何事了!

2011-10-16

SqliteCrypt資料庫加解密工具

SQLite是一個輕量化的檔案資料庫,它支援對稱式加密方式,官方DLL使用Windows API來實作RC4加密法
也有一些管理工具使用AES加密法。你可以下載SQLite的源碼修改加解密方式,不過通常不會這樣生事!
為了簡化SQLite加解密的過程,我寫了一個Console程式,可以利用程式佈署時作資料庫自動化加密工作。
image
當你為一個db加密時,你在開啟db時必須輸入密碼,否則會得到一個被加密的錯誤提示:
image
此程式除了作加解密工具外,也實現執行一個SQL Script File的功能,用來做相關SQL指令的操作。

軟體下載 (411KB, 2014/02/28更新)
http://pan.baidu.com/s/1gdp9gPX

*** 軟體綠色免安裝,系統需支援.NET 4.0 ***

2011-10-08

HTML Converter 編碼轉換工具

本人原創的小工具,將所貼的文字轉換成HTML編碼或URL編碼方式。
它被實作的動機是有時候要在網頁上貼些網址代碼,卻和線上編輯器衝突,因此需要轉成HTML可接受的編碼。

軟件擷圖:
image

軟件下載(2011.10.08更新, 6KB):
MegaUpload | EverBox 

*** 軟件免安裝,系統需支援.NET 4.0 ***

將Web頁面內大圖過濾專頁顯現

喜歡在網頁看美圖的人可有福了,只要把以下代碼放在網頁的url欄裡,就能過濾圖片size大於300x300的圖片,
你也可以把這jscript加入「我的最愛」裡。

javascript:var html='';for(var i=0;i<document.images.length;i++){var img=document.images[i];if(img.width>200 && img.height>300){html+='<img src='+img.src+' /><br/>';}};document.write(html);


所有大圖片會單頁顯示,你就可顯過一些下載工具,批次把圖片全下載到硬碟裡收藏。

2011-10-07

從源碼方式安裝Mono 2.10.5

原以為mono專案計劃隨著Novell被併購而中止沒想到原開發人成立Xamarin公司全力開發iOS及Android套件外還繼續維護原mono專案程式碼,真是佛心來也。

雖然mono發展因重心轉移不會像過去那麼快,但至少將就用還行,透過源碼安裝方式很方便
尤其自行編譯需要解決程式相依性,可使用以下的文章直接執行其安裝script即可:
Install Mono 2.10.5 on Ubuntu Using Bash Script
image 

Xamarin所研發的mono for Android也已經釋出正式版了,連iOS上也有相對的商業應用。
感覺mono還能實實在在地存活一段時間,用來解決非windows的.NET方案,依然是最佳選擇。

Ubuntu 10.04 LTS 套件更新Source List

Ubuntu系統預設的套件更新來源都是美國官方主機,為了加快存取宜設為台灣的伺服器位置
網上很多常見的網路主機,無奈也會隨著時間過去而相繼仆倒,
目前以下的位置是2011/10/07日測試可正常存取的來源。

編輯原檔:
# vi /etc/apt/sources.list

替代成以下內容:

# deb cdrom:[Ubuntu 10.04 LTS _Lucid Lynx_ - Release i386 (20100429)]/ lucid main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://free.nchc.org.tw/ubuntu/ lucid main restricted
deb-src http://free.nchc.org.tw/ubuntu/ lucid main restricted

deb http://free.nchc.org.tw/ubuntu/ lucid-updates main restricted
deb-src http://free.nchc.org.tw/ubuntu/ lucid-updates main restricted

deb http://free.nchc.org.tw/ubuntu/ lucid universe
deb-src http://free.nchc.org.tw/ubuntu/ lucid universe

deb http://free.nchc.org.tw/ubuntu/ lucid-updates universe
deb-src http://free.nchc.org.tw/ubuntu/ lucid-updates universe

deb http://free.nchc.org.tw/ubuntu/ lucid multiverse
deb-src http://free.nchc.org.tw/ubuntu/ lucid multiverse

deb http://free.nchc.org.tw/ubuntu/ lucid-updates multiverse
deb-src http://free.nchc.org.tw/ubuntu/ lucid-updates multiverse


套用新的來源位置

# apt-get update