2016年3月31日 星期四

Socket Option : TCP_NODELAY


Linux Socket Option : TCP_NODELAY


int init_socket(mqtt_broker_handle_t* broker, const char* hostname, short port, int keepalive)
{
int flag = 1;

// Create the socket
if((socket_id = socket(PF_INET, SOCK_STREAM, 0)) < 0)
return -1;

// Disable Nagle Algorithm
if (setsockopt(socket_id, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag)) < 0)
return -2;

struct sockaddr_in socket_address;
// Create the stuff we need to connect
socket_address.sin_family = AF_INET;
socket_address.sin_port = htons(port);
socket_address.sin_addr.s_addr = inet_addr(hostname);

// Connect the socket
if((connect(socket_id, (struct sockaddr*)&socket_address, sizeof(socket_address))) < 0)
return -1;

// MQTT stuffs
mqtt_set_alive(broker, keepalive);
broker->socket_info = (void*)&socket_id;
broker->send = send_packet;

return 0;
}

Disable Nagle Algorithm:  
為了提升TCP傳送效率, 不要送一點資料就送出一個TCP/IP封包, 若只送1 byte , 先不看MAC層header 光TCP+IP Header 就有40byte了, overhead 太大, 所以Nagle 這個人, 就提一個方法, 累積一定的大小才送..
if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if


2016年3月28日 星期一

TCP RTO計算方式




When TCP sends a segment it maintains a timer, waiting for the other end to acknowledge reception of the segment. If an acknowledgment isn't received in time, the segment is retransmitted.


這個timer 就是RTO (Retransmission TimeOut) ,它的時間並不是固定的, 而是依當下的網路擁塞程度做動態的調整。


To compute the current RTO, a TCP sender maintains two state variables, SRTT (smoothed round-trip time) and RTTVAR (round-trip time variation).

init : RTO=3 秒

1) 取得第一個RTT後, RTO 計算如下

SRTT <- R
RTTVAR <- R/2 
RTO <- SRTT + max (G, K*RTTVAR)

其中 K = 4 , clock granularity of G seconds. (G: 100ms~500ms )

2) 之後每收到一個RTT,  RTO 計算如下

RTTVAR <- (1 - beta) * RTTVAR + beta * |SRTT - R'|
SRTT <- (1 - alpha) * SRTT + alpha * R'
RTO <- SRTT + max( G, K * RTTVAR )
其中 alpha = 1/8, beta = 1/4,
若 RTO小於1s, 則進位至1秒


When segment 4 is transmitted 2.4 ms later, it cannot be timed, since the timer for this connection is already in use. 


  1. 在TCP中,同一時間下只能處理一個 RTT 的量測程序。
  2. Retransmission Timer只有一組
  3. 有重送(retransmit)過的封包的RTT不可以拿來計算, 因為沒有辦法知道所收到的確認封包(Ack) 第一次送出的封包回覆的還是重送的封包回覆的
https://tools.ietf.org/html/rfc2988
   (5.1) Every time a packet containing data is sent (including a
         retransmission), if the timer is not running, start it running
         so that it will expire after RTO seconds (for the current value
         of RTO).
         每次送出封包,若當時timer沒啓動,則要啓動

   (5.2) When all outstanding data has been acknowledged, turn off the
         retransmission timer.
         若送出的全都封包, 已全部都有ACK回來, 關閉 timer
(5.3) When an ACK is received that acknowledges new data, restart the retransmission timer so that it will expire after RTO seconds (for the current value of RTO).
        若有ACK回來是回應新封包 (即非dup ACK), 則 timer須更新,使得再經過RTO秒後會發生timeout


   When the retransmission timer expires, do the following:
   (5.4) Retransmit the earliest segment that has not been acknowledged
         by the TCP receiver.
        timeout 發生了, 把Window還沒被ACK的(Outstanding Packet)全部重送
            

   (5.5) The host MUST set RTO <- RTO * 2 ("back off the timer").  The
         maximum value discussed in (2.5) above may be used to provide an
         upper bound to this doubling operation.
          把RTO乘以2 (RTO <- RTO * 2 )

   (5.6) Start the retransmission timer, such that it expires after RTO
         seconds (for the value of RTO after the doubling operation
         outlined in 5.5).
      timer再重新啓動,使得再經過RTO秒後會發生timeout

例子, 


當SYN區段傳送出去時,RTTM、RTTS、及 RTTD 尚未有值,而 RTO 的值被設定為 3 秒。

2.當SYN+ACK區段抵達,其 R 被量測後為 1.5 秒,其變數的值如下所示:


R = 1.5
SRTT = 1.5
RTTVAR = 1.5 / 2 = 0.75 
RTO = 1.5 + 4 . 0.75 = 4.5



3.當第一個資料區段傳送出去時,一個新的 RTT 量測程序被啟動。請注意,當傳送端傳送ACK區段時並不會啟動 RTT 量測程序,因為它不會消耗序號也不會啟動計時器。第二個資料區段也不會啟動 RTT 量測程序,因為已經有一個量測程序正在進行中。最後一個ACK區段的抵達被用來計算下一個 RTTM 的值。儘管最後一個ACK區段是用來回應兩個資料區段 ( 累計式 ),它的抵達完成了第一個區段之R的值。其變數的值如下所示:


RTT = 2.5
SRTT = 7/8 (1.5) + 1/8 (2.5) = 1.625
RTTVAR = 3/4 (0.75) + 1/4 |1.625 − 2.5| = 0.78
RTO = 1.625 + 4 (0.78) = 4.74



2016年3月26日 星期六

V2V (Vehicle-to-Vchicle) 車聯網


關鍵的M2M應用--V2V (Vehicle-to-Vchicle) 車聯網


捷銳行動 Cloud Fleet 結合3G Cloud GPS Vehicle Tracker (CT-02) 實現車聯網解決方案。

CT-02傳輸車輛位置及其他GPS資訊到Cloud Fleet 平台。Cloud Fleet 車隊管理平台,可即時監控追踨車輛及產生數據報表,顯示如航跡記錄、每輛車的行駛公里數、某定點停留時間、車輛怠速時間,報表可用來評估車隊績效及成本控管,燃料費用、統計高速公路通行費用等。

若再加一個符合OBD-II 或EUOBD  的儀表板車上診斷裝置,可額外收集並傳輸車輛自己本身的資訊,如行車速度、引擎轉速、電壓、瞬間百公里油耗、百公里平均油耗、水箱水溫等,可進一步進行資料分析,如駕駛行為分析或商業成效分析。例如,能預測可能拋錨前就先進廠保養,以減少意外的拋錨次數,進而降低整體營運成本。

關鍵詞:V2V、M2M、V2I、IoT、OBD-II、Fleet management、車隊管理

2016年3月24日 星期四

快速呈現你的專題內容



為快速呈現你的專題內容,一定會用系統架構圖、軟體流程圖等來呈現自己所做的內容,但常常不知如何來呈現,所以這裡整理幾個不錯示意圖供大家參考。

任何說明都比不上圖, 記住"字不如表, 表不如圖"



系統架構圖或硬體架構圖: 呈現系統的全貌









2016年3月21日 星期一

使用XMPP進行遠端設備控制



物聯網(Internet of Things, IOT)時代的興起,不僅人跟人之間可以透過網路相互聯繫外,人跟物品、物品與物品之間,也可以透過網路環境互通。當許多設備或物品都可以連上Internet時,我們開始思考著一件事,如果可以用即時通訊(Instant Messaging,簡稱IM)軟體,如LINE、Google Hangout之類的軟體和我們的機器進行對話,不就可以達成即時的Internet遠端設備監控。本組的專題就對此一機制將它具體實現。


關鍵詞: Instant Messaging, IoT, M2M, XMPP, 物聯網

2016年3月15日 星期二

銀髮幼童健康定位手環



隨時瞭解老人心跳以及溫度的狀態,當超過預期符合的範圍,能夠透過簡訊傳送至親人手機,再將老人及時位置用 3G 網路推播至伺服器網站,親人可以上網站或用手機 APP 觀看資訊位置 主要功能 :


1. GPS 定位
2. 心跳
3. 溫度
4. SOS 緊急求救以及推播簡訊
5. 網站及手機觀看資訊


關鍵詞:SIM5320E、GPS、 3GPP、SMS、Lua、PHP、MYSQL、AT Command






無線遙控自走車



本專題基於Raspberry Pi 實做出一個多功能之無線WiFi探測車,並可使用Web控制。我們利用一顆L293D完成H-橋式(H-Bridge)電路以驅動兩個DC馬達並分別透過PWM訊號來控制馬達轉速,以達到不同方向控制的目的。由於車體各位置載重不同、馬達本身可能的誤差及左右車輪受的摩擦力可能不同,會使車體直線前進變成一個要解決的問題。我們運用了自動控制的PID反饋的機制,利用實際測得的車輪轉速(RPM,rounds per minute),和目前的轉速作比較後,來調節下一次PWM的訊號輸出,促使2顆馬達轉速達到一致。為了量測車輪實際轉速,我們在左右車輸的側邊加裝光遮斷器(Photoswitch),利用計數光遮斷數來推算出車輪轉速。在我們圓型車體,我們透過個超音波距離感測器,進行前端障礙物偵測。車體上,利用Raspberry Pi USB界面連接802.11 WiFi Dongle及Webcam,達到遠端即時監看畫面。

關鍵詞:Raspberry pi、Embedded Linux、H-Bridge、WiFi、L293D、Encoder、PWM、Photoswitch、PID、自動控制