發表文章

LTE筆記: 5G 的起始點

圖片
[改寫自 itcom 2019 陳儒雅博士的演講] 2020 年, 被描述為 5G 的元年, 隨著越來越多的裝置以及網路布建成形, 5G 網路的上線, 對於大眾來說, 似乎是近在眼前, 但對於學術界來說, 卻也是一個好時機來檢視電信研究的發展, 所謂的 5G 網路, 和我們之前討論/想像的 5G 網路有甚麼差別? 來自:  https://www.slideshare.net/DrDavidSoldani/soldani-the-pathto5gvtcspring2017final 根據 roadmap, 我們可以看到原本三位一體的 5G 網路: eMBB, URLLC, mMTC, 將專注在前兩項 (尤其是 eMBB, 也就是電信網路的部分), 主要仍是透過提高傳輸速度, 提供給使用者高速的上網體驗, 這部分也和我們目前看到的 5G 宣傳符合, 例如: 高傳輸率, eMBB ( 連結 ), 低延遲性 URLLC ( 連結 ) 至於 mMTC 則先交由 NB-IoT 來進行. 在技術項上, 則從三方面提出改進: 頻譜利用效率: Massive MIMO, channel coding, mini slot , lean carrier 其中, 前兩項是 phy 層直觀的改進, mini slot 對應於 low latency 的應用, lean carrier 修改了 MAC 層的機制,  取消 REF signal, 會產生比較有趣的改變 頻譜延伸: sub-6G, mmWave (28 GHz, 39 GHz) 針對 mmWave, 我們需要 beam sweeping , 增加頻寬從 20 MHz -> 100 MHz, 並加入省電的機制 ( bandwidth parts ) 以及針對變動的頻寬不同的調變技術 ( multiple numerologies ) 網路密集化: 小基地台與不同接取技術 (RAT) 的整合 4G / 5G 的共存, 小基地台的布建與基地台間的協作   其中, 值得注意的是, New Waveform 和 NOMA 不含於這次的標準中, 原因就是, 雖然在理論上有改善, 但實務上卻沒有顯著性, 作為學術界的一員, 雖然沒有參...

[BLE 5.0] BLE MESH Network 簡介

圖片
在過往的 BLE 應用中, 其網路架構為點對點通訊, 換句話說,  藍牙連線的兩端, 為 master - client 的架構, 對於這樣的通訊連線, 兩個裝置在進行連線的開始, 會先藉由在特定頻帶上的廣播訊息 (advertising), 取得連線的需求, 先交換雙方跳頻序列 (hopping sequence), 為之後展頻通訊進行準備. 考慮到 BLE 的架構, 連線兩端分享共同的 hopping sequence, 在此通訊框架上, 難以擴展成廣播, 或是一對多通訊的模式, 在舊有的 BLE 星狀網路 (star network) 中, 雖然支援一對多的網路架構, 但對 master 節點來說負擔頗重, 對於多個 client 連線時, 也會導致資源分配下降, 在 2017 年, BLE 也提出了 Mesh 的架構, 其主要的想法在於: 透過廣播訊息和 relay 方法, 將傳輸資料從原始節點擴散出去, 如下圖所示: https://wiki.makerdiary.com/nrf52832-mdk/mesh/ 考慮到 BLE 的特性, 我們可以看到所有的節點必須分享相同的 hopping sequence, 同時, 節點 (Ndoe) 透過廣播 (ADV bearer) 將資訊傳出, 接著, 這些資訊再透過 Relay 節點 (Relay Node) 把資訊向外轉傳, 轉傳的數量, 則透過 TTL (time-to-life) 來限制轉傳的次數, 此流程稱為 message flooding. 此方法可以方便的建立一個 BLE 區域網路, 特別適用於智慧家庭等應用環境, 而無須特別針對裝置連線設定, 然而, 另一方面, 則會犧牲了傳送的 throughput, 對於大量的資訊流量而言, 也將因為相同的 hopping sequence, 而產生如 WiFi 般封包碰撞的問題, 而減損的展頻通訊抗干擾的能力, 比較適合 IoT 網路中, 小資訊的資訊 (如: 溫度, 狀態等) 回報.

[New WiFi] Uplink/Downlink MU-MIMO in 802.11ax

圖片
回顧行動網路 (telecom) 和電腦網路 (datacom) 之爭, 其中一個爭論要點, 就是分散式架構與中央式架構, 結果, 在邁向 5G 的今日, 我們可以看到兩者的融合發展, 一方面, 3GPP 陣營思考在小基地台架構下, 賦予基地台更多權力, 甚至讓資料可以不透過核心網路, 就在裝置間進行交換, 另一方面, WiFi 陣營, 在 802.11ax 的版本中, 也引入了更多 scheduling-based 的機制, 而非透過競爭解決, 以目前的趨勢觀看, 5G 的共識應該會是小基地台架構, 分散式的小基地台接取 (減少網路產生的延遲), 以及小基地台內的中央調控式資源分配 (增加頻譜利用率), 最後, 留下的問題仍然是: 要如何處理小基地台間的干擾, 對此, 雙方都有一些看法, 但最終有效方案仍未明... 好吧, 閒聊到此為止, 回到主題, 對於 downlink 的 MU-MIMO, 在之前 WiFi 的協定中已經定義完成, 主要透過 AP 將不同使用者的封包, 放在同一個 OFDM 區間中, 分時傳送不同使用者的資訊, 如下圖 (左) 所示, 原始圖片來自:  https://www.slideshare.net/CiscoCanada/cisco-connect-winnipeg-2018-optimizing-your-clients-wifi-experience-v4-public 圖右是 802.11ax 加入的新機制, 也就是 OFDMA 機制, 簡單來說, OFDMA 允許 AP 對資源做更詳細的切分 (對時間和頻率), 而不只是分時傳送資料給使用者, 增加頻譜的利用效率, 考慮到 downlink 的特性, 封包統一由 AP 配置後發出, 此部分的修改, 的確可以有效的減少使用者競爭, 但是對於 uplink 而言, 事情就沒有這麼簡單, 考慮到在舊有的 WiFi 網路中, 使用者各自競爭通道資源, 其中並沒有機制能讓 WiFi 使用者 "共同的" 在同一時間中分享通道資源, 為了解決此困難, 在 802.11ax 中定義了 uplink MU-MIMO 的機制, 如下圖所示: 來自:  https://www.ni.com/zh-tw...

[New WiFi] Dueling NAVs in 802.11ax

圖片
在之前的文章中, 介紹了在新 WiFi 協定中討論的空間重複利用方案, 而在這一篇文章中, 則是介紹在 802.11ax 實作的方案, 主要內容來自:  https://blog.aerohive.com/dueling-navs-in-802-11ax/ 在介紹 802.11ax 特殊的 NAV 機制之前, 我們先介紹標準 802.11 下的標準 NAV 機制 (RTS-CTS 機制), 原始的 RTS-CTS 機制 NAV  為 Network Allocation Vector 的簡寫, 當使用 RTS-CTS 傳出機制時,  在 RTS, CTS 封包中, 都會在 duration field 中填入 NAV 的長度, 當其他使用者收到 RTS/CTS 封包時, 會根據 NAV 的長度, 凍結 backoff window, 換句話說, 在宣告的 NAV 時間內, 都不會嘗試傳送封包 原本的 RTS-CTS 機制是為了解決 hidden node/explore node 問題, 然而, 考慮其實作的方式, 只可以解決 hidden node (潛在的干擾), 但是, 對於 explore node (潛在的傳送機會), 卻沒有幫助, 在此保守的設計下, 使用者當聽到附近基地台的訊號時, 也會停止嘗試傳送封包, 特別是在一般 WiFi 網路下, 由於 AP 使用的功率高於使用者不少, 容易發生由 AP 發送的 RTS 阻斷多數使用者傳輸機會的狀況, 對於密集佈建的 WiFi 網路而言, 將減低網路效率. 因此, 802.11ax 設計了一個新的 NAV 機制, 將 NAV 分成 Intra-NAV 以及 Basic NAV,  對應於鄰近網路的 NAV 以及所屬網路的 NAV, 如下圖所示: 來自:  https://blog.aerohive.com/dueling-navs-in-802-11ax/ 在 802.11ax 的機制下, 可以針對此兩種 NAV 設定不同的門檻, 換句話說, 對於 Intra-BSS NAV, 可以設置一較高的門檻, 只有其能量夠高 (隱含距離較近), 才設置 NAV 的保護...

[REST] callback function in node.js

圖片
不太確定放在此類別是否正確, 不過, 之前 node.js 的程式碼都歸於此類別, 也就先暫時這樣分類吧... 主要參考的內容如下: http://larry850806.github.io/2016/06/16/nodejs-async/ https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm node.js 為平行化 (非同步) 架構, 因此, 當我們執行一個 function 時, 會先放入 event loop 中, 並在背景繼續執行其他程式流程, 如下圖所示: https://blog.outsource.com/2018/09/26/understanding-the-event-loop-in-node-js-outsource/ 此平行化架構, 不同於 c / java 按程式一行一行執行的架構, node.js 可允許同時執行多項程式, 有利於利用多執行緒處理, 然而, 當一個程式需要另一個程式的結果時, 就需要 callback 來完成. 舉例來說: var fs = require('fs'); // fs.readFile(filename, callback(err, content)) fs.readFile('test.txt', function(err, content) {     var str = content.toString();     console.log(str.length);     console.log('finish'); }); console.log('not finish'); 此程式目的為讀一個檔案 (test.txt) 並顯示長度, 紅字部分為 callback 部分, 在這部分的程式將等到 readFile 執行完之後才會執行, 執行結果如下: $ node callback.js not finish 245 finish 我們可以看到先出現: not finish, 來自於最後一行的程式: console.log('not finish')...

[RTLS] Bluetooth 5.1 對室內定位的標準化

圖片
對於室內定位的應用而言, Bluetooth 由於其低功耗, 普及, 以及覆蓋範圍小等特性, 一直以來, 都是室內定位的熱門選擇, 在過去, Apple 就曾經以信號強度 (RSSI) 為依據, 推出室內定位用的 iBeacon 作為定位的解決方案, 其定位精度約為 1-5 公尺. 在新的 Bluetooth 協定中, 加入了 AoA/AoD 的支援, AoA (Angle of Arrive) 只需要接收端有多天線系統 (傳送端可為單天線), 可以分辨來自不同天線訊號的時間/相位差, 就可以計算出傳送端相對接收端的角度資訊, 類似的, AoD (Angle of Departure) 則要求傳送端有多天線系統, 就可以藉由 ACK 等資訊, 計算出接收端相對於傳送端的角度資訊, 來自:  http://dev.ti.com/tirex/content/simplelink_academy_cc2640r2sdk_2_30_02_00/ modules/blestack/ble_aoa/ble_aoa.html 在 Bluetooth 5.1 中, 距離資訊仍是來自於 RSSI 訊號強度, 而不是用 ToA (Time of Arrival) 來取得距離資訊, 這應該是因為希望和過往的 Bluetooth 裝置相容, (ToA 需要裝置間同步與硬體的支援, 無法相容於之前的裝置) 因此, 只希望修改 Bluetooth Gateway 的硬體與演算法, 來提供定位的結果. 在目前的架構下, AoA 資訊的取得, 的確能夠改善定位誤差, 特別是在直視路徑 (LoS, Light of Sight) 的環境中, 然而, 針對 Bluetooth 定位所遇到的其他問題, 例如: 過多的布建數量, 仍無法提出解答, 同時, 考慮 AoA/AoD 對於天線排列的要求, 如何提供一種均一, 容易開發, 且準確的 AoA/AoD 資訊, 將會是此標準能否廣泛應用的關鍵.

[Note] 在 ubuntu 上用 python 連接 mySQL

參考:  https://www.opencli.com/perl/python-install-mysqldb 和 Java, C 引入 library 的方法不同, 對 python 而言, 所使用的套件需要先安裝 (如這篇文章), 或是, 將 make 好後的檔案放入指定路徑 (如 libsvm 的方法), 在這篇文章中, 使用 pip 的方式, 安裝連接 mySQL 的套件, 因此, 第一個步驟, 就是安裝或是升級 pip: $ apt-get install python-pip $ pip install -U pip 如果在升級 pip 後, 出現以下錯誤: Traceback (most recent call last):   File "/usr/bin/pip", line 9, in <module>     from pip import main ImportError: cannot import name main 需要修改 /usr/bin/pip 中的變數為: from pip import __main__ if __name__ == '__main__':     sys.exit(__main__._main()) 接著, 安裝必要套件與 python 插件: $ apt-get install python-dev libmysqlclient-dev $ pip install MySQL-python 我們一樣寫一隻簡單的程式來操作 mySQL database, 參考自:  http://www.runoob.com/python/python-mysql.html import MySQLdb db = MySQLdb.connect("localhost", "USERNAME", "PASSWORD", "DB_NAME", charset='utf8' ) cursor = db.cursor() cursor.execute("SELECT VERSION()...