1. 案例簡介
無線射頻識别即射頻識别技術(Radio Frequency Identification,RFID)是自動識别技術的一種,通過無線射頻方式進行非接觸雙向資料通信,利用無線射頻方式對電子标簽或射頻卡進行讀寫,進而達到識别目标和資料交換的目的。
RFID技術具有抗幹擾性強以及無需人工識别的特點,是以常常被應用在一些需要采集資訊的領域上,例如物流,倉儲,防僞,身份識别等領域。
接下來我們學習下怎麼基于HaaS100 搭建RFID讀卡器,讀取卡片資訊,并且上傳到阿裡雲IOT平台上。

實驗效果展示:
2. 基礎知識
RFID射頻識别系統的工作原理:
電子标簽進入天線磁場後,若接收到讀寫器發出的特殊射頻信号,就能憑借感應電流所獲得的能量發送出存儲在晶片中的産品資訊(無源标簽),或者主動發送某一頻率的信号(有源标簽),讀寫器讀取資訊并解碼後,送至中央資訊系統進行有關資料處理。
典型的RFID系統主要由應用系統軟體,RFID讀寫器,電子标簽3部分構成。
3. 物料清單
3.1 HaaS100 硬體
HaaS100 硬體簡介3.2 RFID讀寫器
TX522 是一款基于13.56MHz頻率的Mifare卡讀寫子產品,可以支援多種類型卡,TX522 Mifare卡讀寫子產品具有天線一體化,識别距離達到80mm。可以通過UART接口跟HaaS100進行通信。
刷卡:
當檢測到 RFID卡片靠近的時候;紅色訓示燈閃爍,并通過序列槽發送出卡片序列号相關的指令.
指令協定說明
資料通信以一幀為機關進行,格式如下:
資料通信幀結構:
第1位元組:起始符;
第2位元組:包号,預設:0x00;
第3位元組:指令—上位機發送給IC卡讀寫器;
第4位元組:此幀有效資料的長度。從緊接着的第1個位元組開始,到倒數第3個位元組結束,為有效位元組。
第5位元組 到 倒數第3位元組: 有效資料。
倒數第2位元組:校驗和;
倒數第1位元組:結束符;
刷卡。子產品上的訓示燈會亮,并且通過序列槽主動發送卡片序列号給上位機,此時上位機就會接收到卡片序列号的相關指令。指令:20 00 01 08 04 00 00 00 A6 40 FE E4 0E 03。
20:起始符
00:包号
01:指令位元組,子產品主動輸出卡片序列号時,該位元組為0x00;其他指令為指令字
08:表示後面8個位元組為有效資料位
04 00:表示卡片屬性為S50卡
00 00:此2個位元組無實際意義。
A6 40 FE E4 :表示卡片序列号。刷不同卡片,此4個位元組會變。
0E:校驗和。從包号(SEQNR)開始到資料(DATA)的最後一位元組異或,然後再取反 得到。
03:幀結束符。
卡片序列号是我們關注的重要資訊,我們通過序列槽讀取卡片序列号資訊後将其發送給阿裡雲IOT平台。
4. 案例實作
4.1 硬體連接配接
RFID子產品通過UART接口跟HaaS100進行通信。
這個是HaaS100 硬體接口定義:
紅框部分是序列槽2的引腳。
将RFID子產品電源線,地線,序列槽RX,序列槽TX 4根線接到HaaS闆子序列槽2上。
HaaS闆引腳編号 | HaaS闆引腳說明 | RFID子產品 |
---|---|---|
5 | 5V | VCC |
3 | GND | |
10 | UART2_RXD | TX |
12 | UART2_TXD | RX |
4.2 接入阿裡雲IOT平台
首先登陸
阿裡雲IOT平台。
選擇産品标簽頁,點選建立産品按鈕,建立産品,填寫産品資訊。
選擇添加功能
點選編輯草稿按鈕,編輯自定義功能,記錄下辨別符資訊後面代碼中會用到。
編輯完成後點選左下角釋出上線。
開始添加裝置,選擇裝置标簽頁,點選添加裝置按鈕。
檢視裝置三元組資訊:
記錄下裝置的三元組資訊: product key/device name/device secret ,這些資訊後面要填寫到代碼中。
4.3 軟體實作
接下來我們開始編寫HaaS 上的軟體代碼,讀取序列槽資料,從中提取出卡片序列号,通過linkkit SDK接口将序列号發送給阿裡雲IOT平台。
4.3.1 軟體流程圖
RFID相關代碼在solutions/rfid_demo目錄下。
4.3.2 HaaS100 序列槽通信部分
UART序列槽操作代碼可以參考這個檔案:solutions/rfid_demo/rfid_app.c
UART序列槽操作相關代碼:
int rfid_uart_init(void)
{
int port_id = 2;
int ret = 0;
char dev_name[16] = {0};
snprintf(dev_name, sizeof(dev_name), "/dev/ttyUART%d", port_id);
fd = open(dev_name, 0);
if(ret != 0) {
printf("open uart error\r\n");
return ret;
}
ret = ioctl(fd, IOC_UART_SET_CFLAG, B9600 | CS8);
close(fd);
printf("ioctl uart error\r\n");
}
static void task_recvdata_entry(void *arg)
int i = 0;
int ret = 0;
char rfid_data_buf[50] = {0};
int rev_length = 0;
char params[30];
char rfid_deviceid[12];
while (1) {
ret = read(fd, rfid_data_buf, sizeof(rfid_data_buf));
if (ret > 0) {
printf("read length:%d\r\n", ret);
for (i = 0; i < ret; i++) {
printf("%02x ", rfid_data_buf[i]);
}
}
- 1
- 2
- 4
- 6
- 7
- 8
- 9
- 11
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
4.3.3 往阿裡雲IOT平台發送資料
我們使用send_property_post接口将讀取的卡片序列号DeviceID發送給阿裡雲IOT平台。
//card_id 這個字元串是之前在阿裡雲IOT平台添加自定義功能時的标志符。
//rfid_deviceid 裡存儲的是通過序列槽讀到的RFID序列号。
snprintf(params, sizeof(params), "{\"card_id\": \"%s\"}", rfid_deviceid);
send_property_post(params);
4.4 端雲聯調
4.4.1 下載下傳軟體版本
開發環境的搭建請參考
《aos-studio使用說明之搭建開發環境》,其中詳細的介紹了AliOS Things 3.3的IDE內建開發環境的搭建流程。
RFID的代碼下載下傳請參考
《aos-studio使用說明之建立工程》,
> 選擇解決方案: “rfid使用示例”或者“rfid demo”
> 選擇開發闆: Haas100 board configure
源碼下載下傳完成後将在阿裡雲IOT平台擷取的裝置資訊填寫到檔案solutions//rfid_demo/rfid_demo.c中。
char *product_key = "";
char *device_name = "";
char *device_secret = "";
– 編譯固件可參考
《aos-studio使用說明之編譯固件》– 燒錄固件可參考
《aos-studio使用說明之燒錄固件》4.4.2 裝置配網
HaaS啟動後通過序列槽指令行配網,輸入如下指令可完成配網:
netmgr -t wifi -c {ssid} {password}
ssid, password 替換成你自己的網絡熱點資訊。
4.4.3 示範效果圖檔
當有RFID卡片靠近讀卡器時,我們會在序列槽log裡看到RFID卡片資料資訊:
在IOT平台上可以看到卡片的序列号。
5. 總結
本文檔介紹了如何基于HaaS100 搭建RFID讀卡器,讀取卡片資訊,并且上傳到阿裡雲IOT平台上,其中涉及到了HaaS 序列槽操作和給阿裡雲IOT發送資料。
RFID子產品除了可以讀卡上的資料外還可以給卡寫入資料,還有更多的功能大家可以一起挖掘和探索。
HaaS除了序列槽外還可以通過i2c,spi 等接口連結外面的傳感器或者其他裝置。
通過本文檔介紹的這個流程,大家可以打造更多的應用場景,一起行動起來,打造一套屬于自己的智能裝置吧。
開發者支援
HaaS官方:
https://haas.iot.aliyun.com/HaaS技術社群:
https://blog.csdn.net/HaaSTech開發者釘釘群和公衆号見下圖,開發者釘釘群每天都有技術支援同學值班。
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-d7a94ec6ab.css" rel="stylesheet">
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-49037e4d27.css" rel="stylesheet">
</div>
</article>