2008年3月30日 星期日

NS2---Scanning procedure

由於我的研究領域主要先從network selection著手,因此就必須先了解NS2中,SS與BS是如何進行scanning procedure來達到handoff的目的. 在NS2中scanning procedure分成幾個步驟:
Step 1. SS會監測incoming packet其singal level,若是singal level超過某一threshold,MS則會傳送MOB_SCN_REQ給serving BS.
Step 2. BS收到後會回傳MOB_SCN_RSP給SS,告知SS是否可進行scanning,若是可以則SS會開始進行scanning

Continue......

2008年3月29日 星期六

C的內建function與macro

由於NS2是由OTcl與C所架構出來的,在NS2底層的code大部分都是用C所完成.在我研究其.16底層的code時,有時都會看到一些C內建的function或macro,例如strcmp(),assert()...等等,以下我將簡述這些function與macro的基本功能:
1. int strcmp(string s, string t)---
功用: 字串之間的比較.此function主要是判斷s與t之間的大小,若是s = t則傳回整數0;若s大於t則傳回任一正數;若s小於t則傳回任意負數.

2. assert(condition)---
功用: 防止程式因某些condition而出現嚴重錯誤. assert()主要是判斷condition是否滿足開發者所設定的要求,若是滿足則可繼續執行後續的程式,反之,終止整個程序.另外ASSERT()與assert()兩者主要差別是前者只在Debug模式中才有效,後者則是在Debug與Release兩種模式中都有效.

3. atof(const char *sc)---
功用: 字元轉型. atof()主要會先scan參數sc,將其面空白符號先跳過,直到遇上數字或是正負號才開始進行轉換.遇到非數字或是參數sc結束時才會停止轉換,並將結果傳回.除此之外,類似的function還有: atoi(), atol(), strtod(), strtol(), strtoul().

4. memset(void *s, char ch, unsigned n)---
功用: 將s中的字元取代成ch,取代長度為n. memset()可應用於字元陣列的清空...等等,目的在於將A,依自己所需取代成B.以下為一範例: #include
#include
void main( void )
{
char buffer[] = "This is a test of the memset function";
printf( "Before: %s\n", buffer );
memset( buffer, '*', 4 );
printf( "After: %s\n", buffer );
}

結果:
Before: This is a test of the memset function
After: **** is a test of the memset function

5.malloc/free ---
功用:動態配置/釋放記憶體. malloc與new的用法類似,不一樣的地方在於使用malloc時不能同時給予初值.以下為malloc格式與範例:
格式:
變數型態* point = (變數型態*) malloc (記憶體空間大小);
範例:
int* p = (int*) malloc (sizeof(int));
free主要是將一配置的記憶體空間,經由所輸入的記憶體空間之起始指標來加以釋放.以下為其格式與範例
格式:
free(point);
範例:
free(*p);

6. sqrt()---
功用: 將傳入之參數開根號.

7. int abs()---
功用: 將傳入的參數取絕對值. 另外還有應付回傳各種型態的abs, 如: double cabs(), double fabs(), long labs()等.

若是還有遇到其他的function或macro我會繼續更新此篇文章~
Continue......

2008年3月27日 星期四

.Net農民曆改版V2.0

前篇文章所提到的國曆轉農曆小程式,後來經測試發現有Bug,沒有做到檢查閏月的程序,因此有時候會造成13月,或是某些月份與正常的月份多一個月,因此就進行些許的修改,以下為完整程式碼 (此程式在線上跑時還是有做些許修改,但是此程式的轉換功能算是已經完整):
using System;
using System.Collections.Generic;
using System.Text;using System.Globalization;
namespace TimeTran{
class Program {
static int Main(string[] args) {
string s = "91 / 2 / 9";
int L_ly,ly,lm,y,ny,nm=0,iToken1,iToken2;
string strny,tT,S;
string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd", "yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd", "yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd", "yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd", "yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d", "yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d", "yyyy/M/d","yyy/M/d","yy/M/d","y/M/d", "yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
ChineseLunisolarCalendar tl = new ChineseLunisolarCalendar();
S = s.Replace(" ", "");
iToken1 = S.IndexOf("/", 0);
iToken2 = S.IndexOf("/", iToken1 + 1);
string iYear = S.Substring(0, iToken1).Trim();
string iMonth = S.Substring(iToken1+1, iToken2-iToken1-1).Trim();
string iDay = S.Substring(iToken2+1).Trim();
ny = int.Parse(iYear) + 1911;
strny = ny.ToString();
tT = strny + "/" + iMonth + "/" + iDay;
DateTime dy = DateTime.ParseExact(tT, dateFormats, null, DateTimeStyles.AllowWhiteSpaces);
ly = tl.GetYear(dy);
lm = tl.GetMonth(dy);
if (tl.IsLeapYear(ly)) //判斷此農曆年是否為閏年
{
L_ly = tl.GetLeapMonth(ly); //抓出此閏年閏何月
switch(L_ly)
{
case 1:
if (lm >= 1)
lm--;
break;
case 2:
if (lm >= 2)
lm--;
break;
case 3:
if (lm >= 3)
lm--;
break;
case 4:
if (lm >= 4)
lm--;
break;
case 5:
if (lm >= 5)
lm--;
break;
case 6:
if (lm >= 6)
lm--;
break;
case 7:
if (lm >= 7)
lm--;
break;
case 8:
if (lm >= 8)
lm--;
break;
case 9:
if (lm >= 9)
lm--;
break;
case 10:
if (lm >= 10)
lm--;
break;
case 11:
if (lm >= 11)
lm--;
break;
case 12:
if (lm >= 12)
lm--;
break;
default:
if (lm >= 13)
lm--;
break;
}
}
else
lm = tl.GetMonth(dy);
Console.WriteLine(DateTime.Now);
Console.WriteLine("國曆:" + tT);
Console.WriteLine("陰曆:" + tl.GetYear(dy) + "/" + lm + "/" + tl.GetDayOfMonth(dy));
return 0;
}
}
}

2008年3月22日 星期六

.Net之農民曆轉換

由於在仁耀的系統中需要做到陽曆轉陰曆的功能,所以嘗試用.Net所開發的System.Globalizatoin (namespace) -- http://msdn2.microsoft.com/zh-tw/library/system.globalization(VS.80).aspx 來達到此目的.
因為需要用到台灣陽曆轉陰曆的功能,因此我使用了TaiwanLunisolarCalendar 類別 -- http://msdn2.microsoft.com/zh-tw/library/system.globalization.taiwanlunisolarcalendar(VS.80).aspx ,此類別是專門針對台灣的曆法所發展出來的類別,透過其已開發好的method便可將所輸入的陰曆轉換成農曆!!以下為我所寫的C#範例:

using System;using System.Collections.Generic;
using System.Text;
using System.Globalization;
namespace TimeTran
{
class Program
{
static int Main(string[] args)
{
string s = "58 / 12 / 23";
int y,ny,sToken1,sToken2;
string ly,strny,tT,S;
string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd", "yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd", "yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd", "yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd", "yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d", "yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d", "yyyy/M/d","yyy/M/d","yy/M/d","y/M/d", "yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
TaiwanLunisolarCalendar tl = new TaiwanLunisolarCalendar();
S = s.Replace(" ", ""); //將字串內的空白消去
sToken1 = S.IndexOf("/", 0); //抓出字串內第一個/的位置
sToken2 = S.IndexOf("/", iToken1 + 1);
string nYear = S.Substring(0, iToken1).Trim(); //抓出字串中的新曆年
string nMonth = S.Substring(iToken1+1, iToken2-iToken1-1).Trim();
string nDay = S.Substring(iToken2+1).Trim();

ny = int.Parse(iYear) + 1911; //將民國轉成西元
strny = ny.ToString();
tT = strny +"/"+ iMonth +"/"+ iDay;
DateTime dy = DateTime.ParseExact(tT, dateFormats, null, DateTimeStyles.AllowWhiteSpaces); //須先將字串轉成DataTime的型態,以供TaiwanLunisolarCalendar的物件tl使用
Console.WriteLine(DateTime.Now);
Console.WriteLine("國曆:" + tT);
Console.WriteLine("陰曆:" + tl.GetYear(dy) + "/" + tl.GetMonth(dy) + "/" + tl.GetDayOfMonth(dy)); //將欲轉換的日期傳進.Net以寫好的方法內,接著再傳回轉換好的農曆
return 0;
}
}
}

End~

2008年3月13日 星期四

[C++]的argc & argv

在coding的時候,有時main會需要傳入參數,而寫成 int main(int argc, char *argv[]),那argc與argv又分別代表什麼意思呢??以下將用例子說明讓大家快速的了解這兩個變數的用處!!
Ex.
若是你寫好一隻程式叫Hell.cc並且已經將其編譯成Hello.exe,當你在Terminal要執行Hello.exe的時候,你則又可能執行以下的command:
$Hello.exe hello all
那這時你的argc則為3,argv[0]=Hello.exe,argv[1]=hello,argv[2]=all.
由此看來,argc則為你在command line所下的參數個數,argv[]則分別存放你所下的每個參數.

End~~

2008年3月10日 星期一

設定BS的覆蓋範圍

由於我的論文主要是考慮two-tier架構,所以需要調整節點的接收threshold(RXThresh_),可偵測其他網路活動的範圍(CSThresh_)...等等參數.在/ns-2.29/tcl/lib/ns-default.tcl內有預設相對應數值:
# Initialize the SharedMedia interface with parameters to make
# it work like the 914MHz Lucent WaveLAN DSSS radio interface
Phy/WirelessPhy set CPThresh_ 10.0
Phy/WirelessPhy set CSThresh_ 1.559e-11
Phy/WirelessPhy set RXThresh_ 3.652e-10
Phy/WirelessPhy set bandwidth_ 2e6
Phy/WirelessPhy set Pt_ 0.28183815
Phy/WirelessPhy set freq_ 914e+6
Phy/WirelessPhy set L_ 1.0
Phy/WiredPhy set bandwidth_ 10e6


在ns-2.29/indep-utils/propagation/threshold.cc內可以得知,FreeSpace與TwoRayGround兩種model計算Pr的方式:

double TwoRay(double Pt, double Gt, double Gr, double ht, double hr, double L, double d, double lambda)
{
/*
* if d <>= crossover_dist, use two ray model
*
* Two-ray ground reflection model.
*
* Pt * Gt * Gr * (ht^2 * hr^2)
* Pr = ----------------------------
* d^4 * L
*
* The original equation in Rappaport's book assumes L = 1.
* To be consistant with the free space equation, L is added here.
*/

double Pr; // received power
double crossover_dist = (4 * M_PI * ht * hr) / lambda;

if (d < pr =" Friis(Pt," pr =" Pt">

Pr:在程式中即為RXThresh_也就是要在tcl所設定的數值
Pt = transmit power
Gt = transmit antenna gain
Gr = receive antenna gain
ht = transmit antenna height
hr = receive antenna height
d = distance (例如250m)

根據網路上鎖參考的資料,我們可以透過編譯threshold.cc來產生一個執行檔,再經由輸入相對應的參數至所產生的執行檔,即可得到RXThresh_,以下敘述如何產生出RXThresh_:

Step1.
ns-2.29/indep-utils/propagation/ 執行以下的編譯指令:
$g++ threshold.cc -o calculate

Step2.
若要執行計算某distance其相對應的RXThresh_,則執行以下指令:

$./calculate -m TwoRayGround -fr 3.5e+9 250

(計算model為TwoRayGround,且frequency為3.5MHz,距離250M)
如此即可計算出RXThresh_ .


reference:

http://hi.baidu.com/vvfang/blog/item/bf834c0fc3b4ab296159f344.html
http://blog.pixnet.net/NS2lab/post/10050300


End~



2008年3月9日 星期日

Grey Prediction!!

前幾天利用C#終於把Grey Prediction的第一階段寫完了~~在撰寫的這段期間內,遇到唯一較大的問題居然是反矩陣XDDDD,太久沒用數學忘記反矩陣怎麼求了(囧rz),問問同學拜拜google大神後,終於有點印象了...呼~為了避免日後又忘或是要再次用到,我今天就把例子寫在網誌上!!

假設有Array A[2,2]
Step1.
計算det(A) = (A[0,0]*A[1,1]) - (A[0,1]*A[1,0])

Step2.
A反矩陣之[0,0]= 1/(-det(A)) * A[1,1]
A反矩陣之[0,1]= 1/(-det(A)) * -A[0,1]
A反矩陣之[1,0]= 1/(-det(A)) * -A[1,0]
A反矩陣之[1,1]= 1/(-det(A)) * A[0,0]

End~