色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用RUI3制作一款用于電腦的多功能LoRa?適配器

瑞科慧聯(RAK) ? 2022-11-29 14:33 ? 次閱讀

LoRa?和 LoRaWAN?已經成為了物聯網世界的重要技術,也向人們提供了諸多易于使用的遠程通信解決方案。在這過程中電腦設備卻被忽略了,我們會發現帶有 LoRa?模塊的筆記本電腦很少見。

現在這種局面陸續得到了改善,在一些解決方案中,已經開始出現用于筆記本電腦的 LoRa?模塊了。最近筆者利用瑞科慧聯的低代碼開發平臺 RUI3 制作了一個 LoRa?USB 適配器,它可以直接連接到筆記本電腦或樹莓派上。大多數時候,這個適配器可以作為收發器用于家居場景種;但它也作為一個方便測試的平臺,比如:遠程用筆記本電腦發送命令、記錄結果等等。

poYBAGOFeB-AKC3yAABUGPoWbhU732.png

使用瑞科慧聯的模塊化硬件開發平臺 WisBlock,讓這樣的應用開發變得更加簡單。筆者通過 WisBlock 制作了兩種適配器,一種是使用計算機上的自定義軟件來管理 LoRa?模塊的 AT 固件,另一種是直接在LoRa?模塊上完成大部分工作。在這兩種適配器中,電腦都是作為終端來使用。今天要介紹的是后一種適配器,主要就是使用 RUI3 為 LoRa?通信模塊 RAK4631-R 制作一個簡單的自定義固件。

一、前期準備

  • 硬件

1、選擇 RAK4631-R(不同國家或地區對應頻率的頻段不同)。

poYBAGOFeB-Aa7o2AALW9vCoSKQ801.png(注意,這里我們也可以使用另一款通信模塊 RAK3172,因為他們均支持 RUI3 編譯,只要有自己所需要的功能就行。因為 RAK3172 不支持藍牙和硬件加密,但該項目需要加密 LoRa??數據包,而且將 AES128 添加到代碼中也超出了本文的范圍,所以這里我們選擇了 RAK4631-R。)

2、底板:本例中,我們選擇了 RAK19003,它具有最小的封裝尺寸 30 mm x 35 mm。

3、USB 電纜(適用于 RAK19003 的 USBType-C)。

  • 軟件

1、Arduino IDE。

2、終端應用程序,例如筆者最喜歡的 CoolTerm。當然 Arduino IDE 的串行終端,也能完成開發。

  • 工作模式

LoRa?適配器基本上需要兩種工作模式:傳輸模式和設置模式。而 AT固件本質上是單模模式的,即它們總是處于設置模式。在設置模式中,甚至發送和接收都是命令。與此相反,默認的傳輸模式充當 LoRa?模塊和 USB端口之間的橋梁:“無論一端輸入任何內容,都將從另一端輸出”。只有當用戶發出特殊字符串時,適配器才會在傳輸和設置模式之間切換。 筆者見過一些 LoRa?模塊為此提供一兩個引腳來實現這一點,可以設置引腳高低電平從硬件上切換這兩種模式,但這樣的操作對電腦來說是不可能的。因此,用戶可以使用不太可能出現的特殊字符串去切換這兩種模式。然而在調制解調器時代,“$$$”經常作為特殊的字符串去使用,所以我們也可以使用該字符串實現。

二、工作流程

在常規的 LoRa?應用程序中,工作流程通常如下:

  • 初始化串口
  • 設置 Wire,然后設置 LoRa?模塊(引腳分配等)
  • 設置 LoRa?配置(SF、BW、頻率等)

本文使用到 RUI3,因此可直接去掉第二點,因為 API 已經配置完成、電池也配置好了。在RUI的 API中,LoRaWAN?是提供了LoRa選項區域幫助用戶配置 LoRa?。并且LoRa?模塊在 RAK4631-R 中是預先連通的,所以只需調用 LoRaWAN?的幾行 API 設置所需的配置,就可以檢查結果:

bool rslt = api.lorawan.nwm.set(0); if (!rslt) { // Do something } rslt = api.lorawan.pfreq.set(myFreq); if (!rslt) { // Do something } rslt = api.lorawan.psf.set(sf); if (!rslt) { // Do something } rslt = api.lorawan.pbw.set(bw); if (!rslt) { // Do something } // etc etc etc...

通過檢查,已經設置完成了,結果與 API設定的配置是一致的。

然后設置 LoRa?回調:接收和傳輸。這里讓用戶能夠以異步方式將“管理這些事件的代碼”單獨管理運行,而不是在主 loop() 代碼中循環運行。

最后一行是為了將 LoRa?模塊設置為了永久監聽模式。

api.lorawan.registerPRecvCallback(recv_cb); api.lorawan.registerPSendCallback(send_cb); rslt = api.lorawan.precv(65534);

最后,就可以在 setup()中完成自己的需求了。例如:讓 OLED 檢查狀態,或設置 LED的狀態(電路板上有 2 個可用,1 個綠色和 1 個藍色)等。到這一步一切都準備好了,一起來看看接下來會發生什么?

三、loop()

在 loop() 中,循環檢查串行端口是否有字符傳入,并對其進行相應的操作。稍后我會詳細介紹這一點。接著還需要檢查 LoRa?模塊,如果有接收到數據包,則將接收數據包中的內容打印到串口上。這是兩個部分之間的橋梁。在其他框架中,這通常與串口相同。接著 LoRa?模塊循環監聽,如果有內容,直接讀取。這個功能 RUI3中并不包含,需要在上面聲明的 void recv_cb(rui_lora_p2p_recv_t data) 函數中自己實現并進行,在將LoRa?模塊接收的原始數據發送到 Serial 之前,可以在這個函數中決定如何處理原始數據。例如:如果需要 JSON 數據,可以將其解析之后在打印到串口。同樣,如果數據是加密的,或者希望它是加密的,就可以在進一步處理之前在那進行解密。回調函數代碼如下所示:

void recv_cb(rui_lora_p2p_recv_t data) { uint16_t ln = data.BufferSize; char plainText[ln + 1] = {0}; char buff[92]; sprintf(buff, "Incoming message, length: %d, RSSI: %d, SNR: %d", data.BufferSize, data.Rssi, data.Snr); Serial.println(buff); if (needAES) { // Do we need to decrypt the data? int rslt = aes.Process((char*)data.Buffer, ln, myIV, myPWD, 16, plainText, aes.decryptFlag, aes.ecbMode); if (rslt < 0) { Serial.printf("Error %d in Process ECB Decrypt\n", rslt); return; } } else { // No? Just copy the data memcpy(plainText, data.Buffer, ln); } // The easiest way to know whether the data is a JSON packet is to try and decode it :-) StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, plainText); if (!error) { JsonObject root = doc.as(); // using C++11 syntax (preferred): for (JsonPair kv : root) { sprintf(buff, " * %s: %s", kv.key().c_str(), kv.value().as()); Serial.println(buff); } return; // End for JSON messages } // There was an error, so this is not a JSON packet – not well-formed anyway. // Print it as a plain message Serial.println("Message:"); Serial.println(plainText); }

四、Tx(發送)

發送同樣也有一個回調函數,當數據發送完成時可調用。用戶也可以在那里添加東西,但它在正常使用中基本上是為了確保LoRa?模塊返回到監聽模式中:

void send_cb(void) { // TX callback Serial.println("Tx done!"); isSending = false; // Flag used to determine whether we're still sending something or we're free to send. api.lorawan.precv(65534); }

該回調函數需要快速的執行并使 Lora?模塊返回到監聽模式,不需要在其中加入長延時等待。

五、設置模式

當用戶發送 $$$(后綴為 \n)時,代碼會切換到設置模式。這部分稍微復雜一些,發送命令這一段會重復被使用,所以為了使用方便,大部分都是復制粘貼后,對該段進行更改其函數名,并為每個命令添加合適的代碼。因此我們需要一個統一的命令結構,如下所示:

int cmdCount = 0; struct myCommand { void (*ptr)(char *); // Function pointer char name[12]; char help[48]; };

(cmdCount 馬上就會派上用場)。命令的結構由指針函數、函數名和命令描述三部分組成。

下圖是聲明了一個命令數組:

myCommand cmds[] = { {handleHelp, "help", "Shows this help."}, {handleP2P, "p2p", "Shows the P2P settings."}, {handleFreq, "fq", "Gets/sets the working frequency."}, {handleBW, "bw", "Gets/sets the working bandwidth."}, {handleSF, "sf", "Gets/sets the working spreading factor."}, {handleCR, "cr", "Gets/sets the working coding rate."}, {handleTX, "tx", "Gets/sets the working TX power."}, {handleAES, "aes", "Gets/sets AES encryption status."}, {handlePassword, "pwd", "Gets/sets AES password."}, {handleIV, "iv", "Gets/sets AES IV."}, {handleJSON, "json", "Gets/sets JSON sending status."}, };

到目前為止一切都順利。所以在 setup() 函數啟動時,會計算可用命令的數量,以便知道我們有多少個命令。cmdCount = sizeof (cmds)/ sizeof (myCommand):這在 evalCmd函數中用于遍歷命令,cmdCount即為最終統計到的命令個數。

void evalCmd(char *str, string fullString) { uint8_t ix, iy = strlen(str); for (ix = 0; ix < iy; ix++) { char c = str[ix]; // lowercase the keyword if (c >= 'A' && c <= 'Z') str[ix] = c + 32; } Serial.print("Evaluating: `"); Serial.print(fullString.c_str()); Serial.println("`"); for (int i = 0; i < cmdCount; i++) { if (strcmp(str, cmds[i].name) == 0) { // call the function cmds[i].ptr((char*)fullString.c_str()); return; } } }

在此之后,添加命令和處理它們的調用就非常容易了。讓我們來看看 handleHelp (char*)命令:

void handleHelp(char *param) { Serial.printf("Available commands: %d\n", cmdCount); for (int i = 0; i < cmdCount; i++) { sprintf(msg, " . %s: %s", cmds[i].name, cmds[i].help); Serial.println(msg); } }

char *param 參數可能需要也可能不需要,因此默認發送,每個命令都可以自由使用或者直接忽略它。例如:handleFreq() 命令便要使用該參數:

void handleFreq(char *param) { if (strcmp("fq", param) == 0) { // no parameters sprintf(msg, "P2P frequency: %.3f MHz\n", (myFreq / 1e6)); Serial.print(msg); sprintf(msg, "Fq: %.3f MHz\n", (myFreq / 1e6)); displayScroll(msg); return; } else { // fq xxx.xxx set frequency float value = atof(param + 2); if (value < 150.0 || value > 960.0) { // sx1262 freq range 150MHz to 960MHz // Your chip might not support all... sprintf(msg, "Invalid frequency value: %.3f\n", value); Serial.print(msg); return; } myFreq = value * 1e6; api.lorawan.precv(0); // turn off reception while we're doing setup sprintf(msg, "Set P2P frequency to %3.3f: %s MHz\n", (myFreq / 1e6), api.lorawan.pfreq.set(myFreq) ? "Success" : "Fail"); Serial.print(msg); api.lorawan.precv(65534); sprintf(msg, "New freq: %.3f", value); displayScroll(msg); return; } }

poYBAGOFeB-AEMkXAAFueGbNSLk032.png

一切操作之后有了現在的結果,編碼歷時幾個小時,就得到了一個功能齊全的 LoRa?USB適配器。但實際上沒有用這么多時間,因為筆者重用了以前項目中的 Commands.h 代碼,并且暫時跳過 AES 加密部分,把它留在示例項目中是因為它相對比較復雜,且通常不是簡單項目的一部分。通常可以在項目正常運行后再添加 AES,這樣就不必擔心其他東西會受影響。但是,就像 Commands.h 一樣,筆者已經從其他項目準備好 AES 文件,所以對它的實現也只是復制粘貼工作。

pYYBAGOFeB-ARMFAAACe1v8dqBU954.png

六、擴展

功能蔓延(feature creep)一直都是困擾開發人員的問題,但現在我們暫時可以先忽略這一點。一起來看看這個項目可以有哪些擴展:

1、OLED顯示屏

由于引腳配置,顯示屏要在底板背面添加,但添加起來也是很方便。學習一些如何關閉屏幕的編程代碼,可以幫助節省能源和保護屏幕;

2、RTC實時時鐘

可以在 JSON 數據包或類似 Cayenne LPP 的格式中為數據包添加時間戳;

3、GNSS模塊

用戶可以將 GPS 坐標添加到數據包中,而且如果已經在家中設置了收發器的坐標,還可以使用它們的自動計算距離(Haversine 公式)的功能。

4、固件的BLE UART路由

添加這個功能很簡單。一旦設置了 BLE,代碼就與串行代碼幾乎相同了。這樣操作之后,它就不僅僅是一個用于電腦的 USB LoRa?適配器了,加上電池它可以成為手機無線 LoRa?適配器。

以上這些,這個使用 RUI3 制作的項目都能實現、也都可以擁有這些功能。如果你們感興趣,也可以自己動手試試!

pYYBAGOFeB-Ae_OBAACtuD2MIT0208.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 物聯網
    +關注

    關注

    2912

    文章

    44899

    瀏覽量

    375829
  • LoRa
    +關注

    關注

    349

    文章

    1700

    瀏覽量

    232198
收藏 人收藏

    評論

    相關推薦

    電源適配器怎么使用?

    價格優勢,超低空載和待機能量損耗。符合CEC標準,超安全設計,電源適配器符合各國安規認證。高效率的電路設計,性能穩定,低溫升。   如果沒有電源適配器的話,旦電壓不穩,我們的電腦,筆
    發表于 01-18 11:04

    電源適配器和開關電源之間的區別

    隨著電力電子技術的發展和創新,使得電源產品市場發展十分的迅速,技術也在不斷地創新,這成本反轉點日益向低輸出電力端移動,這為電源適配器和開關電源產品提供了廣闊的發展空間。開關電源和電源適配器
    發表于 01-16 10:57

    電腦紅外適配器有哪些

    電腦紅外適配器種利用紅外線技術實現電腦與其他電子設備之間進行數據交換和傳輸的設備。隨著科技的不斷發展,電腦紅外
    的頭像 發表于 10-14 10:56 ?394次閱讀

    外接電源適配器的工作原理是什么

    外接電源適配器種將交流電(AC)轉換為直流電(DC)的設備,廣泛應用于各種電子設備中,如筆記本電腦、手機、平板電腦等。它通常由
    的頭像 發表于 10-12 09:23 ?639次閱讀

    電源適配器空載電壓高怎么回事

    )的設備,廣泛應用于各種電子設備中,如筆記本電腦、手機、平板電腦等。電源適配器的主要組成部分包括: 輸入濾波器:用于濾除輸入交流電中的高頻噪
    的頭像 發表于 09-27 15:32 ?1054次閱讀

    電源適配器電流大小對電器影響

    電源適配器電流大小對電器的影響是個復雜而重要的問題。 、電源適配器的工作原理 電源適配器
    的頭像 發表于 08-02 09:40 ?3673次閱讀

    適配器的電流大于原適配器可以嗎

    適配器的電流大于原適配器是否可行,這是個涉及到電子設備電源適配器使用和安全性的問題。 適配器
    的頭像 發表于 08-02 09:38 ?1833次閱讀

    usb-c多口適配器

    面臨的大問題。在這樣的背景下,Type-C多口適配器應運而生,以其高效、便捷的特點,成為了現代充電與連接的新選擇 概述 Type-C多口適配器,顧名思義,是指具有多個Type-C充電接口的
    的頭像 發表于 07-01 09:13 ?423次閱讀
    usb-c多口<b class='flag-5'>適配器</b>

    電源適配器有哪些作用

    電源適配器的作用有哪些 電源適配器,又稱電源轉換器或電源供應器,是種將電源輸入轉換為特定電壓和電流輸出的電子設備。它廣泛應用于各種電子設備中,如手機、筆記本
    的頭像 發表于 06-10 17:07 ?8118次閱讀

    Type-C多功能適配器機多用的智能連接新選擇

    Type-C多功能適配器種集多種功能身的電子設備,它采用了Type-C接口,可以連接多種不同的設備,并實現多種
    的頭像 發表于 04-28 22:26 ?837次閱讀
    Type-C<b class='flag-5'>多功能</b><b class='flag-5'>適配器</b>:<b class='flag-5'>一</b>機多用的智能連接新選擇

    開關電源適配器和充電器的區別 開關電源適配器怎么用

    開關電源適配器和充電器是電子設備中常見的電源轉換裝置,它們在功能和用途上有些區別。下面將詳細說明這兩種設備的區別,并介紹開關電源適配器的使用。
    的頭像 發表于 02-14 17:51 ?8122次閱讀

    適配器的作用是什么?有哪些重要功能?

    適配器種軟硬件組件,用于在不兼容的系統或設備之間建立連接,以實現數據或信號的傳輸和交換。適配器的作用是充當中間件,通過轉換信號、協議、接口等,使得不同系統、設備之間能夠互相通信和相
    的頭像 發表于 02-03 09:54 ?5715次閱讀

    什么是藍牙適配器?它有哪些性能特點?

    什么是藍牙適配器?它有哪些性能特點? 藍牙適配器用于連接電腦、手機、平板電腦等設備的藍牙設備。它的主要
    的頭像 發表于 02-02 14:56 ?3207次閱讀

    什么是電源適配器的轉換效率?轉換效率對電源適配器有何影響?

    什么是電源適配器的轉換效率?轉換效率對電源適配器有何影響?如何提高電源適配器的轉換效率? 電源適配器的轉換效率是指它所能輸出的電能與輸入的電能之間的轉換效率。換句話說,轉換效率越高,
    的頭像 發表于 01-30 16:46 ?1583次閱讀

    什么是電源適配器的浪涌電流?浪涌電流對電源適配器有何影響?

    什么是電源適配器的浪涌電流?浪涌電流對電源適配器有何影響? 電源適配器的浪涌電流是指在電源啟動或斷開時,由于電源電壓的突變引起的瞬態電流。這種瞬態電流瞬間達到峰值,然后逐漸衰減到穩定狀態。 浪涌電流
    的頭像 發表于 01-30 16:38 ?1744次閱讀
    主站蜘蛛池模板: 绞尽奶汁by菊花开| 国产午夜福利伦理300| 国产精品香蕉视频在线| 琪琪电影午夜理论片77网| 5G在线观看免费年龄确认18| 精品无码国产污污污免费网站2| 亚洲爱视频| 国产成人免费观看| 日韩内射美女人妻一区二区三区| gv肉片视频免费观看| 女人麻豆国产香蕉久久精品| av天堂影音先锋在线| 女子初尝黑人巨嗷嗷叫| a亚洲在线观看不卡高清| 内射白浆一区二区在线观看| china年轻小帅脸直播飞机| 全身无赤裸裸美女网站| 高清国产一区| 亚洲AV无码专区国产精品麻豆| 国内精品乱码卡一卡2卡三卡新区| 亚洲精品AV无码重口另类| 极品少妇小泬50PTHEPON| 正在播放一区二区| 理论片87福利理论电影| 99久久久无码国产精品免费人妻 | 日本边添边摸边做边爱边| 超碰v| 婷婷亚洲五月色综合久久| 国产亚洲精品久久久久久禁果TV| 亚洲综合AV色婷婷五月蜜臀| 乱辈通奷XXXXXHD猛交| 超碰在线线公开免费视频| 性生大片免费看| 久久婷婷国产五月综合色啪最新 | 亚洲2017天堂色无码| 精品三级久久久久电影网1| 91桃色污无限免费看| 日操夜操天天操| 寂寞夜晚在线视频观看| 91国内精品久久久久免费影院| 日日操日日射|