上一篇我簡要的介紹如何使用米芯智能模塊(阿里雲IoT直連模塊)快速開發智能電風扇(原文點這裡)。在社區發表後收到了不少熱心的開發者前來切磋交流。討論比較多的是電控板MCU與模塊對接相關話題。為此我新開篇詳細展開一下內容,老規矩仍舊以電風扇作為例子。
**注意:
因本文內容涉及技術細節,需讀者要有一定的技術功底閱讀內容。
讀完本文內容可能需要您花費1-2個小時以上時間。**
1. 快速開始
請提前整備如下物料,後面需要用到。
1.1 物料清單
名稱 | 數量 | 備註 |
---|---|---|
帶TTL串口的電風扇電控板 | 1 | 開發者自備 |
米芯智能模塊樣品小板 | 1 | 點擊購買 |
串口協議文檔 | 1 | 向作者索取 |
USB轉TTL串口工具 | 1 | 開發者可以用自己熟悉的串口工具 |
配網二維碼 | 1 | 向作者索取 |
APP控制面板二維碼 | 1 | 向作者索取 |
安卓智能手機 | 1 | 開發者自備 |
天貓精靈APP | 1 | 開發者自備 |
1.2 電腦串口與樣品小板電纜連接
請注意,電纜連接前確認USB轉TTL串口工具電平設置與樣品小板上的標識的電壓一致。目前小板有3.3V和5V兩種電壓。
USB轉TTL串口工具實物參考:
請使用電纜將電風扇電控板的TX、RX、GND 與 USB轉TTL串口工具上的 TX、RX、GND 接上。
USB轉TTL串口工具沒有特殊要求,使用前先確保串口工具是正常可用的且串口電平插針所插位置的電壓值與樣品小板電壓一致。
請使用外部穩壓電源輸出連接到小板電源插針上(電壓值以小板上的電壓標識為準),請勿使用串口工具上的電源輸出。使用串口工具上的電源可能會導致模塊無法啟動。
1.3 安裝串口調試軟件
請在您開發使用的電腦上安裝串口調試軟件。
串口軟件無特殊要求,能接收、發送十六進制內容即可。
1.4 使用串口調試軟件調試樣品小板
請參考如下步驟:
- 完成前3個步驟後,請在串口調試軟件上“打開”串口端口號(譬如:COM9) 。
- 正常情況下串口調試軟件上的“接收區域” 可以看到 十六進制的內容打印出來,每隔3秒打印一次。這是模塊發送的心跳數據包。
- “接收區域”能看到心跳包說明模塊已經正常運行。
- 請試著在 “發送區域” 輸入“串口協議文檔”裡面的基礎指令,點擊發送。一般情況下模塊會迴應指令, 在 “接收區域”看到模塊回覆的十六進制值。
- 重複4這個過程,可以觀察發送和接收的數據。
1.5 在電風扇控制板MCU上實現接口程序
請您在控制板MCU上根據 “串口協議文檔” 裡面的指令要求實現相應的程序接口。
實踐建議:
- 指令的格式是固定的。因此建議使用包裝函數來解析、格式化指令輸出和接收;
- 控制板MCU發送指令的間隔建議大於100ms;過密集的指令發送會導致模塊和網絡不穩定;
- 指令碼存在粘包的情況(即兩條以上指令頭尾連接),請循環解析指令碼;
- 在控制板MCU接口程序開發過程中可以使用串口調試軟件調試輸入輸出;
- 配網鍵建議使用已有的一個物理按鍵,譬如:長按設置鍵,進入配網
1.6 樣品小板與電風扇控制板電纜連接
完成前5個步驟後,說明軟件對接已經可以了。請使用電纜將樣品小板和控制板兩者的VCC、GND、TX、RX連接起來,加電開機觀察。
實物參考:
請注意,電纜連接前確認TTL串口電平與模塊上的標識的電壓一致。目前小板有3.3V和5V兩種電壓。
1.7 天貓精靈APP配網、測試
加電開機情況下,請按“配網鍵”(一般有燈光和聲音提示)模塊進入配網狀態。
請使用一個已經安裝天貓精靈APP的手機。(請到各大手機應用市場下載:天貓精靈app)
打開天貓精靈APP,掃描“配網二維碼”
點擊 “我的" ->"連接設備":
右上角,點擊 “掃描ICON" :
掃描 “配網二維碼”,填入 WIFI的連接密碼,點擊“下一步”。
選中 “確認以上操作”, 點擊 “開始連接”
連接成功後,我的 -> 智能設備 這裡看到設備
在開發模式下,點擊 智能設備 圖標,進去後不會顯示 控制面板,請掃描 “控制面板二維碼” 進行操作測試。
2 米芯通訊協議
米芯通訊協議 是一種簡化的串口通訊協議。旨在設備控制板(MCU)可以方便的接入阿里雲AIoT。
設備開發者請參考米芯通訊協議完成設備端MCU程序的對接開發。
- 請確保模塊已正確的燒錄了 米芯固件 ;
- 模塊 加電能正常運行。 用戶串口收到心跳包
55 AA 00 00 00 00 FF
- 初次對接協議,建議安裝米芯工具方便調試。
2.1 串口參數約定
波特率: 9600
數據位: 8
奇偶校驗: 無
停止位: 1
數據流控: 無
2.2 數據類型
hex | 類型 | 長度(byte) | 說明 |
---|---|---|---|
0x00 | bool | 1 | 0或1 |
0x01 | int8 | 1 | -128~127 |
0x02 | enum | 1 | 最多定義100個 |
0x02 | uint8 | 1 | 0-255 |
0x05 | int | 4 | 32位整型 |
0x09 | float | 4 | |
0x0a | double | 8 | |
0x0b | text | N | 字符串 |
0x0c | date | 8 | String類型的UTC時間戳,單位:毫秒 |
2.3 幀格式說明
Head | Ver | Cmd | Payload_len | Payload | Checksum |
---|---|---|---|---|---|
2 byte | 1 byte | 1 byte | 2 byte | N byte | 1 byte |
字段 | 名稱 | 長度(byte) | 說明 |
---|---|---|---|
Head | 幀頭 | 2 | 固定為0x55 0xAA |
Ver | 版本 | 1 | |
Cmd | 命令字 | 1 | 具體幀類型 |
Payload_len | 數據長度 | 2 | 大端 |
Payload | 數據 | xxxx | 詳見指令收發表 |
Checksum | 校驗和 | 1 | 從幀頭開始按字節求和得出的結果,取低字節 |
數據傳輸統一使用大端(即高字節在前,低字節在後)字節序。
計算校驗和參考代碼:
uint8_t check_sum(uint8_t *pack, uint16_t pack_len)
{
uint16_t i;
uint8_t csum = 0;
for (i = 0; i < pack_len; i++)
{
csum += *pack++;
}
return csum;
}
2.4 基礎指令一覽
功能名稱 | 幀頭 | 版本 | 命令字 | 數據長度 | 數據 | 校驗和 | |
---|---|---|---|---|---|---|---|
*心跳檢測 | 模塊發送 | 0x55aa | 0x00 | 0x00 | 0x0000 | - | 0xff |
MCU上報 | 0x55aa | 0x01 | 0x00 | 0x0001 | 0x00(mcu加電第一次) 0x01(其它) |
xx | |
關閉心跳 | MCU上報 | 0x55aa | 0x01 | 0x25 | 0x0000 | - | xx |
模塊發送 | 0x55aa | 0x00 | 0x25 | 0x0000 | - | xx | |
獲取模塊mac地址 | MCU上報 | 0x55aa | 0x01 | 0x2d | 0x0000 | - | xx |
模塊發送 | 0x55aa | 0x00 | 0x2d | 0x0006 | 如: 0xA4CF12BFA186 | xx | |
剩餘內存(heep) | MCU上報 | 0x55aa | 0x01 | 0x0f | 0x0000 | - | xx |
模塊發送 | 0x55aa | 0x00 | 0x0f | 0x0004 | 如: 0x00003E00 | xx | |
當前WiFi信號強度(RSSI) | MCU上報 | 0x55aa | 0x01 | 0x24 | 0x0000 | - | xx |
模塊發送 | 0x55aa | 0x00 | 0x24 | 0x0004 | 如: 0xFFFFFFB7 | xx | |
獲取時間戳(秒) | MCU上報 | 0x55aa | 0x01 | 0x0c | 0x0000 | - | xx |
模塊發送 | 0x55aa | 0x00 | 0x0c | 0x0004 | 如: 0x5E4A6366 | xx | |
*WiFi工作狀態 | 模塊發送 | 0x55aa | 0x00 | 0x03 | 0x0001 | 參考 4.2 | xx |
MCU上報 | 0x55aa | 0x01 | 0x03 | 0x0000 | - | xx | |
*重置配網 | MCU發送 | 0x55aa | 0x01 | 0x04 | 0x0000 | - | xx |
模塊上報 | 0x55aa | 0x00 | 0x04 | 0x0000 | - | xx | |
WiFi 配網方式 |
MCU上報 | 0x55aa | 0x01 | 0x05 | 0x0001 | 0x00 (smartconfig模式) 0x01 (Ap模式) |
xx |
模塊發送 | 0x55aa | 0x00 | 0x05 | 0x0000 | - | xx | |
*MCU狀態查詢 | 模塊發送 | 0x55aa | 0x00 | 0x08 | 0x0000 | - | xx |
MCU上報 | 0x55aa | 0x01 | 0x07 | N | 上報所有的功能狀態 | xx | |
WiFi功能產測 | MCU上報 | 0x55aa | 0x01 | 0x0e | 0x0000 | - | xx |
模塊發送 | 0x55aa | 0x00 | 0x0e | 0x0002 | 參考4.7 | xx | |
*產品功能 | 模塊發送 | 0x55aa | 0x00 | 0x06 | N | 參考 "產品功能定義" | xx |
MCU上報 | 0x55aa | 0x01 | 0x07 | N | 參考 "產品功能定義" | xx | |
*產品事件 | MCU上報 | 0x55aa | 0x01 | 0xA7 | N | 參考 "產品事件定義" | xx |
2.5 心跳檢測
- 模塊 上電後,串口不間斷髮送心跳。若未收到回覆,則保持3S心跳發送,若收到回覆,心跳間隔變為15s;
- 外部MCU也可依據心跳定期檢測 模塊 是否正常工作。
2.6 關閉心跳
調試時可以臨時關閉心跳檢測 。
- 退出本指令,請上電重啟模塊。
2.7獲取模塊mac地址
獲取模塊mac地址值。如: A4-CF-12-BF-A1-86
- mac地址相關知識 點擊這裡
2.8 剩餘內存(heep)
heep值的大小關係到 模塊 的正常運行。heep不足是會導致 模塊 reboot 。
- heep 值單位為字節。
- 值為int類型,如:0x00003E30 即 15920 字節
2.9 聯網狀態
-
模塊 聯網WiFi指示狀態參考:
- 0x00:smartconfig配網方式 (燈快閃);
- 0x01:AP配網方式 (燈慢閃);
- 0x02:WiFi配置成功但未連上路由 (燈熄滅);
- 0x04:已連上路由 器且連接到雲端 (燈長亮);
- 當 模塊 檢測到 MCU 重啟或 MCU 斷線再上線的過程,則主動下發 WiFi 狀態至 MCU。
- 當 模塊 的 WiFi 狀態發生變化,則主動下發 WiFi 狀態至 MCU。
聯網狀態 | 描述 | 狀態值 |
---|---|---|
狀態1 | smartconfig 配置狀態 | 0x00 |
狀態2 | AP 配置狀態 | 0x01 |
狀態3 | WiFi 已配置但未連上路由器 | 0x02 |
狀態4 | WiFi 已配置且連上路由器 | 0x03 |
狀態5 | 已連上路由器且連接到雲端 | 0x04 |
狀態6 | WiFi 設備處於低功耗模式 | 0x05 |
2.10 重置配網
模塊 進入配網使能狀態。一般在設備上設置一個配網按鈕,譬如:長按設置鍵進入配網。
- 本指令執行後 模塊 中的WiFi配置會被清除;
- 執行本指令會軟重啟模塊;
2.11 切換 WiFi 配網方式
smartconfig配網方式和AP配置方式可以相互切換。通過對應協議指令,切換進入該配置狀態。
- 模塊 已成功聯網的情況下,本指令無效;
- 模塊 啟動默認是smartconfig配網方式;
- 阿里雲飛燕平臺部分品類zeroconfig(零配)有效(即支持天貓精靈找隊友配網)。
2.12 WiFi 聯網狀態
模塊已成功聯網的情況下,返回 0x01 ,反之返回 0x00 。
- 聯網狀態只反應與無線Ap連接狀態,不是雲端的連接狀態;
- 設備聯網狀態變化會自動發送到設備端。
2.13 當前WiFi信號強度(RSSI)
返回 模塊接收WiFi信號強度。
- 模塊 已成功聯網的情況下,本指令有效;
- 信號強度單位 dBm ,一個負數值。
- 值為int類型,如:0xFFFFFFB3 即 -77 dBm
2.14 獲取Unix時間戳
可實現設備端上時間功能有自動校時等需求。設備端開發者可通過本指令獲取Unix時間戳轉換為本地時間即可。
2.15 命令下發和狀態上報
針對該產品功能的命令下發和狀態上報協議詳見下方"產品功能部分"指令收發表。
2.16 MCU工作狀態上報條件
- 08命令字查詢:MCU接收到查詢MCU工作狀態指令後,需要上報所有功能的狀態(開 關,模式等功能);
- 主動上報:MCU狀態發生變化(非app控制,比如本地控制板按鍵)時,mcu需要主動上報;
- 定時上報:如有定時功能,MCU需要每分鐘上報倒計時剩餘時間,以分鐘為單位。
2.17 WiFi功能產測
切記,在樣機開發階段務必調試模塊在設備中物理擺放位的信號接收強度。
不合理的擺放位置,會影響WiFi聯網穩定性。
請啟用一個AP作為產測使用,設置AP的SSID: michip_dev_test
密碼:123456789
,連接成功後,每隔5秒返回信號強度百分比。主要用於產品量產時的WiFi模塊測試。本指令,請等待上電初始化完成,5S以後調用。退出本指令,請上電重啟;
- 數據長度為2字節:
Data[0] | Data[1] | Data[1]說明 |
---|---|---|
0x01 | 0x00-0x64 | 信號強度: 0x00信號最差,0x64信號最強 |
0x00 | 0x00 | 未掃描到指定的ssid |
0x00 | 0x01 | 模塊未燒錄祕鑰key |
3.0 產品功能指令
功能名稱 | 功能ID | 指令類型 | 指令長度 | 指令值 | 備註 |
---|---|---|---|---|---|
搖頭開關 | 0x00 | 0x00 | - | 0:關閉 1:開啟 | |
風速 | 0x01 | 0x02 | - | 1:低檔 2:中檔 3:高檔 | |
工作模式 | 0x02 | 0x02 | - | 1:正常風 2:自然風 3:睡眠風 4:靜音風 | |
電源開關 | 0x03 | 0x00 | - | 0:關閉 1:開啟 |
3.1 產品事件指令
3.1.1 故障上報
- 事件ID:0x00
- 事件類型:info
參數名稱 | 參數類型 | 參數長度 | 參數值 | 備註 |
---|---|---|---|---|
故障代碼 | enum | - | 0:恢復正常 |
4.0 結尾總結
直連阿里雲IoT固件模塊及串口協議在不斷的迭代更新中。希望通過本文的介紹能給您帶來更多的啟發,也歡迎各位同仁相互拋磚引玉共同學習進步。
因篇幅及文筆水平有限,本文的文字和圖片可能存在錯誤之處還請讀者多包涵。
歡迎一起探討學習;