QuecPython 是運行在無線通信模塊上的開發框架。對于首次接觸物聯網開發的用戶而言,無線通信模塊可能是一個相對陌生的概念。本文主要針對無線通信和蜂窩網絡本身,以及模塊的概念、特性和開發方式進行簡要的介紹。
無線通信和蜂窩網絡
物聯網對無線通信的需求
在?上一節?中,我們介紹了物聯網的四層結構。其中的網絡層承擔著設備接入和數據傳輸的重要功能。由于物聯網設備數量較多,分布的空間范圍極大,采用有線以太網方式接入網絡顯然無法滿足需要。因此,大部分物聯網設備都具備了無線通信的功能,即通過無線電波作為載體進行信號傳輸。當前,我們身邊常見的無線通信方式包括 Wi-Fi、藍牙等十余種,不同方式的通信速率和通信距離存在顯著差異。
不同的物聯網應用場景,對于無線通信的需求存在很大差別。下表展示了當前常見的物聯網無線通信技術的特性和使用場景差異。
通信技術 | 速率 | 傳輸距離 | 功耗 | 成本 | 應用場景 |
---|---|---|---|---|---|
Wi-Fi | 高 | 短 | 高 | 中 |
|
藍牙 | 中 | 短 | 中 | 低 |
|
Zigbee | 低 | 短 | 低 | 低 |
|
UWB | 高 | 短 | 高 | 高 |
|
4G | 高 | 長 | 高 | 高 |
|
NB-IoT | 低 | 長 | 低 | 中 |
|
LoRa | 低 | 長 | 低 | 中 |
|
蜂窩網絡的概念
蜂窩網絡(Cellular Network,又稱移動網絡 Mobile Network)是一種無線通信技術,它能夠讓移動設備(如手機、平板電腦等)在不同的地理區域內進行語音、數據和多媒體等業務的傳輸。蜂窩網絡是現代移動電話和個人通信系統的基礎架構之一,也是推動社會信息化進程的重要力量。
5G 毫米波蜂窩網絡結構示意圖
如上圖所示,蜂窩網絡的核心思想是將一個大的服務區域劃分為許多個小區(Cell),每個小區內部安裝一個基站(Base Station),負責與小區內的移動設備進行無線通信。這些基站之間通過有線或無線的方式連接起來,形成一個覆蓋整個服務區域的網絡。在傳統理論中,這些小區被設計為六邊形、圓形或正方形,以六邊形最為常見。小區之間彼此連接,實現區域的完整覆蓋,形如蜂巢,這也是該項技術被譯為蜂窩網絡的原因。如今,在實際場景中,很多基站的覆蓋區域已經不再是蜂窩形狀,但這個稱謂依舊流傳了下來。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 從 1G 到 5G 的演進
蜂窩網絡作為一種無線通信技術,從誕生至今已經經歷了五代的發展,每一代都對應著不同的技術和標準,為用戶提供了更高的數據傳輸速度,更好的語音通話質量,以及一系列新特性和新功能。從 1G 的模擬語音通信,到 5G 的全場景互聯,蜂窩網絡已經成為現代社會運轉的必不可少的信息基礎設施之一。
物聯網和蜂窩網絡
與其他無線通信方式相比,蜂窩通信方式依托電信運營商的已有網絡,無需手動在應用現場進行網絡部署,顯著降低了聯網的難度和工作量。在農業、環保等物聯網應用領域,蜂窩網絡已成為首選的無線通信方式之一。
上文提到,蜂窩網絡制式多樣、標準繁多。物聯網需要什么樣的蜂窩網絡呢?這就要看具體的應用場景和需求了。一般來說,大部分物聯網應用場景都包含以下的一些特點:
- 物聯網設備很多,連接數量很大。例如,一個智能城市可能需要連接數以萬計的傳感器和設備。
- 物聯網設備很小,功耗很低。例如,一個智能水表可能只有幾厘米大小,需要長時間工作而不用經常更換電池。
- 物聯網設備很分散,覆蓋范圍很廣。例如,一個智能農業系統可能需要覆蓋數百平方公里的農田和牧場。
- 物聯網設備很簡單,數據量很小。例如,一個智能停車場系統可能只需要上報車位的占用情況,每次只有幾個字節。
根據這些特點,我們可以看出,物聯網對蜂窩網絡的要求主要有以下幾個方面:
- 大連接:能夠支持每個小區同時連接數千甚至數萬個設備。
- 低功耗:能夠讓設備在低電量下長時間工作,延長電池壽命。
- 廣覆蓋:能夠提供更強的信號穿透力和覆蓋范圍,覆蓋城市和鄉村的各種環境。
- 低成本:能夠降低設備和運營的成本,提高物聯網的普及率和可持續性。
而對于速度和帶寬,物聯網并不需要太高的要求。因為物聯網設備傳輸的數據量相對較小,不需要類似手機和其他智能設備的高速率和高帶寬。而且速度和帶寬與功耗和成本是相互制約的,提高速度和帶寬往往會帶來功耗和成本的增加。由此可見,傳統的手機 4G 和 5G 網絡在很多場合是無法滿足物聯網應用的需要的。
目前,在國內,物聯網領域應用最多的蜂窩通信標準包括 LTE Cat.4,LTE Cat.1 和 NB-IoT。以下的表格對比了它們的特點。
特點 | LTE Cat.4 | LTE Cat.1bis | NB-IoT |
---|---|---|---|
下行速率 | 150 Mbps | 10.3 Mbps | 250 kbps |
上行速率 | 50 Mbps | 5.2 Mbps | 250 kbps |
網絡覆蓋 | 全球 LTE 網絡 | 全球 LTE 網絡 | 需要部署新的基站或升級現有基站 |
移動性 | 支持高速移動 | 支持 100 km/h 移動 | 不支持移動 |
延遲 | 毫秒級 | 毫秒級 | 秒級 |
成本 | 較高 | 較低 | 較低 |
功耗 | 較高 | 較低 | 較低 |
應用場景 | 路由器、銷售終端等需要高速數據傳輸的場景 | 共享支付、工業控制、車載支付、公網對講、POS 等需要中速數據傳輸的場景 | 水表、電表、氣表等需要低速數據傳輸且固定不動的場景 |
語音支持 | 支持 VoLTE(語音通話) | 支持 VoLTE(語音通話) | 不支持語音通話 |
天線配置 | 2x2 MIMO(多輸入多輸出) | 1x1 SISO(單輸入單輸出) | 1x1 SISO(單輸入單輸出) |
帶寬 | 20 MHz | 1.4 MHz | 180 kHz |
初識模塊
無線通信模塊,簡稱模塊(Module,亦稱模組或單元),是實現數據上云和遠程通信的必不可少的組件,在各類物聯網場景中已經得到了極為廣泛的應用。從功能上看,它是在本地設備和網絡之間構建連接的橋梁。像電腦插上 USB 網卡就可以開始上網一樣,在嵌入式系統中加入了模塊,系統就具有了連接無線網絡的可能性。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
搭載移遠 EC20 模塊的某物聯網產品主板
很多初次接觸模塊的用戶會對模塊這樣一個被金屬殼籠罩著的奇怪器件感到陌生,它與傳統的芯片和分立器件存在很大的不同。實際上,模塊的本質就是一種小型的 PCBA(Printed Circuit Board Assembly,組裝電路板)。當我們去掉模塊表面的金屬屏蔽罩,其內部依舊是熟悉(但更為密集)的 PCB 電路結構。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
某 4G 模塊的內部圖像
有過嵌入式系統開發經驗的用戶對于“核心板”或者 SoM(System on Module)應該不會陌生。模塊同樣可理解為一種將無線通信所需的各類器件集成在一起,用于完成本地電路與云端服務的通信功能的高密度、小體積、帶屏蔽罩的“核心板”。在本文開頭的關于通信的介紹中,我們講到了編碼(解碼)和調制(解調)的概念。在無線通信,尤其是蜂窩通信中,這些步驟往往會演變和拓展得極為復雜。模塊的作用即是幫助我們完成這些復雜的步驟,實現簡單高效的通信。
模塊的內部結構較為復雜。如下圖所示,可以看到包含主芯片(高通 MDM9607)、存儲器、電源管理芯片、功率放大器、射頻前端等多種集成器件,以及大量密集分布的小尺寸封裝的電阻、電容等元件。顯然,模塊的復雜度和精密度是遠超傳統電路板的。
EC20 Mini PCIe 模塊的元件組成
主芯片(Main Chip),部分廠家稱之為基帶(Baseband)芯片或調制解調器(Modem)芯片,是整個模塊的核心。它的角色、功能和特性與手機中的 SoC(System on Chip,片上系統)十分相似。隨著技術的發展和芯片制造工藝的提升,在現代模塊中,主芯片通常已經集成了應用處理器(Application Processor,AP)、基帶和射頻的相關功能,運行著完備的操作系統(RTOS 或 Linux),對外提供包括 GPIO、USB 等在內的各種接口,并能夠根據需求完成各類通信操作。從這個意義上看,模塊既像一臺沒有屏幕和電池的手機,又像一種功能較為復雜的單片機。
高通最新的 QCX216 4G Modem 芯片功能框圖
模塊的應用模式
對于同一臺 Android 手機,不同人有不同的用法。一些用戶會安分地使用出廠自帶的系統和功能,另一些則熱衷于解鎖、刷機、root 等操作,更進一步地去開發和挖掘設備的潛力。和手機類似,模塊也有這樣的兩類應用模式:標準模式和二次開發模式。
標準模式
和普通手機一樣,模塊在出廠時通常都會內置操作系統和應用程序。對于許多用戶來說,直接使用模塊出廠預置功能就可以滿足大部分的網絡通信需求。這種無需對模塊進行開發和調整,直接作為成品功能單元進行使用的方式稱為標準模式或傳統模式,是當前應用最普遍的模塊使用方式。
標準模式示意圖
如上圖所示,在標準模式中,模塊與主控(MCU,如 STM32)之間通過 UART 或 USB 接口相連接,基于 AT 指令進行雙向交互。不難看出,MCU 是整套系統的核心,通信模塊是作為 MCU 的一個獨立的功能外設的角色而存在的。系統的主要業務邏輯(用戶應用,App)在 MCU 中運行,其他外設(圖中的 External Devices)通過 UART、I2C 等接口與 MCU 相連,受 MCU 控制。
關于 AT 指令
對于開發者而言,在基于標準模式使用模塊時,主要的開發工作量在于主控中運行的用戶 App。其業務代碼中需要包含較為復雜的 AT 指令發送和返回值解析功能,例如對 URC(Unsolicited Result Code,非請求結果碼)的處理等,因而對于初學者難度較大。
除了 AT 指令功能,模塊在標準模式下還可以作為無線網卡,為主控或其他上位機提供包括 PPP 撥號上網在內的一系列網絡服務,此處不做贅述。
二次開發模式
在前文中我們曾提到,模塊就像是功能較為復雜的單片機。事實上,模塊所搭載的主芯片為了滿足無線通信的需要,通常具有較高的性能和較多的資源,同時也配備了包括 GPIO、ADC、I2C 等在內的豐富的外設接口,只不過在標準模式下,這些資源對于用戶通常不是直接可用的。如果能夠“解鎖”這一限制,模塊的應用潛力將極大提升,這就需要對模塊進行二次開發。
二次開發的本意是在軟件本身提供的一些基本功能和接口的基礎上,進行組合和擴展,開發出新的功能來滿足用戶的特殊需求。具體到模塊開發上,二次開發模式允許開發者在底層操作系統的基礎上調用 API 編寫并運行自己的應用,充分調用模塊的各種資源,實現更多的可能性。
二次開發模式示意圖
二次開發最重要的意義在于使模塊在一定程度上具備了取代標準模式中的主控的能力,因而這種模式又被稱為 OpenCPU 或 OpenMCU(不同廠家可能有不同的專門稱呼,如移遠稱之為 QuecOpen)。如上圖所示,與標準模式相比,OpenCPU 模式由于將模塊本身作為主控使用,用戶應用(App)直接置于模塊內部運行,外設(圖中的 External Devices)與模塊直接相連,整個系統中無需外部處理器(MCU)或只需簡單的外部芯片(圖中的 Simple Microchip),因而可以有效地達到精簡硬件設計、降低器件成本、縮小產品尺寸的目的。在單片機價格居高不下的當下,OpenCPU 方案受到了眾多公司的青睞。
但是,OpenCPU 方案也具有較為明顯的局限性。由于這一模式通常需要用戶直接在模塊底層運行的操作系統的基礎上進行開發,技術門檻較高,傳統的、不具備系統級開發經驗的單片機開發者很難適應。其次,由于 OpenCPU 技術支持難度大,模塊廠家通常只向大客戶提供相關的工具和資料,入門較為不便。最后,不同廠家、不同型號的模塊,其 OpenCPU 開發環境和開發工具存在較大差別,用戶編寫的程序在不同模塊間的移植存在一定的難度。
使用腳本語言開發模塊
傳統的 OpenCPU 開發通常使用 C 語言,因此也被稱作 CSDK 開發。用戶需要直接修改和控制底層的操作系統,具有較高的難度和一定的風險性。在?前文?中,我們介紹了低代碼開發方式和它在物聯網領域的應用。目前,已經有部分模塊廠商通過在 CSDK 的基礎上移植解釋器 / 虛擬機的方式,使得用戶可以使用 Lua、Python 等腳本語言對模塊進行二次開發。
與 C 語言相比,腳本語言在語法和使用方式上普遍較為簡單,開發者無需花費太多時間和精力即可掌握,并可相對輕松地實現業務邏輯,便于項目的快速開發和功能迭代。同時,對于低代碼開發方式而言,開發者通常無需考慮內存回收、基礎任務調度等底層細節,顯著降低了模塊二次開發的技術門檻。最后,對于不同型號的模塊,只要它們運行的是同一種腳本語言解釋器,用戶編寫的程序通常只需少量修改(甚至無需修改)即可完成移植。
如下的示例分別是在 EC100Y-CN 模塊上使用 C 語言和 Python 語言實現 LED 閃燈的代碼。可以看出,腳本語言更加簡單直觀,易于編寫、便于理解。
LED 閃燈代碼
使用 QuecOpen(CSDK)使用 QuecPython
#include "ql_application.h"
#include "ql_gpio.h"
#include <stdio.h>static quec_gpio_cfg_t led_gpio_cfg[] =
{{GPIO_PIN_NO_75, PIN_DIRECTION_OUT, PIN_NO_EDGE, PIN_PULL_DISABLE, PIN_LEVEL_LOW}
};static void led_test(void *argv)
{ql_gpio_init(led_gpio_cfg[0].gpio_pin_num, led_gpio_cfg[0].pin_dir, led_gpio_cfg[0].pin_pull, led_gpio_cfg[0].pin_level);while (1){ql_gpio_set_level(led_gpio_cfg[0].gpio_pin_num, PIN_LEVEL_LOW);ql_rtos_task_sleep_s(1);ql_gpio_set_level(led_gpio_cfg[0].gpio_pin_num, PIN_LEVEL_HIGH);ql_rtos_task_sleep_s(1);}
}application_init(led_test, "led_test", 2, 2);
當然,由于使用腳本語言開發時屏蔽了很多底層細節,因而在靈活性和可控性上不如傳統的 C 語言開發。此外,腳本語言與 C 語言相比,本身性能相對較差、執行速度較慢,因而在部分對于性能和實時性要求較高的場景下不適合使用。
選擇合適的開發方式
下表比較了標準模式,CSDK 二次開發和腳本二次開發在多個維度的差異。用戶可根據實際需求選擇最適合自己的開發方式。
特性 | 標準模式 | 二次開發(CSDK) | 二次開發(腳本語言) | 備注 |
---|---|---|---|---|
物料成本 | ?? | ? | ? |
|
上手門檻 | ? | ??? | ? |
|
開發難度 | ? | ??? | ? |
|
開發周期 | ? | ??? | ? |
|
維護成本 | ?? | ??? | ? |
|
靈活性 | ? | ??? | ?? |
|
性能 | - | ??? | ?? |
|
功耗 | ? | ?? | ?? |
|
生態系統 | ??? | ? | ??? |
|