作者:Victor Sue
物聯網在近幾年有爆發之勢,大量普及的集合了許多因素,包括:晶片模組成本、終端設備、網路普及、應用服務、軟體技術等日趨完善有關,物聯網有「最後一哩」的難題。雖然用來收集與分析資料的雲端基礎架構早已就緒,但仍需要可用來連結大量裝置接上網路、且兼具傳輸距離、低功耗與低成本特性的LPWAN(Low-Power Wide-Area Network,低功率廣域網路)。
因此LPWAN有數種規格互相競逐,例如Lora、Sigfox、窄頻物聯網(Narrow Band-IoT, NB-IoT)等,NB-IoT亦稱為LTE Cat. NB1,為架構在行動通訊網路上的低功率廣域網路技術。可以使終端設備簡單有效地連接行動通訊網路,資料傳輸時具備行動通訊等級加密的可靠度,適合處理少量、不頻繁的雙向數據。
在感測器軟硬體方面,可以透過Arduino建構快速原型的製作,其為一個基於易於使用的硬體和軟體的開源電子架構,並可從簡單感測應用轉變為物聯網應用,可穿戴設備等嵌入式產品,而且所有Arduino都是完全開源的,開發者能夠獨立構建它們並最終使產品適應其特定需求。
鑒於Arduino和NB-IoT在物聯網產品開發上的優勢,資策會推出了結合兩者優勢的開源物聯網開發板 – DSI2598 NB-IOT開發板,使用國產晶片聯發科的NB-IoT MT2625模組,搭配Arduino原廠MCUATMEGA328P,為國內首款的Arduino NB-IoT開發板,輔以Arduino IDE為主要的程式開發環境,讓雛形打造簡單容易。
這次有幸受邀針對 DSI2598 NB-IoT 開發板做測試,並撰寫其測評文章,官方的作法很開放,完全不干涉我如何撰寫文章的內容,若您對於這片DSI2598 NB-IoT 開發板開發板有興趣,可透過這個網址進行申請(申請核准後將另行通知領取)。

DSI2598申請網址 (圖片來源:資策會)
規格介紹
DSI2598 NB-IoT 開發板是資策會為 Maker與新創推出的IoT開發板,也是國內第一款同時結合Arduino與NB-IOT的開發板,可善用Arduino豐富的生態系支援來快速建立概念驗證原型POC(Proof of Concept);其核心採用國產聯發科通訊晶片MT2625,完整支援NB-IoT R14的聯網易用性,以高整合度為大量物聯網設備提供兼具低功耗及成本效益的解決方案。
簡單地來說,DSI2598就是Arduino Nano加上NB-IoT的開箱即用開發板。話不多說,接下來讓我們來看看DSI2598的整體系統規格:

DSI 2598系統規格 (圖片來源:資策會)
首先,先從外觀看起,DSI2598分為一代和二代,主要差別為二代導入與Arduino Nano類似的設計,將燒錄程式用的USB to Serial內建到開發板內,大幅增加開發者的易用性,更容易將IoT的相關想法,透過DSI2598建立POC(Proof of Concept)來實際進行驗證。
DSI2598搭配Arduino原廠MCU ATMEGA328P,具備PWM、I2C、SPI、ADC、UART 等功能腳位位功能,可讓使用者套用各式Arduino程式庫,搭配各種外部感測器模組進行連接,來接收所需的環境感測數據。
透過Arduino讀取感測器資料,再透過NB-IoT的方式傳送至雲端主機,可以快速地完成一個簡易的資料收集點,搭配合適的物聯網雲端平台,導入AI(人工智慧)成為AIoT(人工智慧物聯網),以建立相關服務應用。
NB-IoT部分,DSI2598採用Quectel BC26 NB-IoT模組,BC26基於聯發科MT2625芯片平台研發,支持全球頻段(B1/B2/B3/B4/B5/B8/B12/B13/B17 /B18/B19/B20/B25/B26/B28/B66),客戶只需一顆模組,產品即可覆蓋全球需求。BC26具有超小體積,尺寸僅為17.7×15.8×2.0mm,能最大限度地滿足可穿戴設備、智能家居、安防、資產追踪、智能表計、便攜式健康監控儀器等緊湊型終端設備的需求。BC26還支持低供電電壓範圍(2.1V-3.63V),更適合NB-IoT技術的應用場景。
在設計方面,BC26採用LCC封裝,兼容移遠通信GSM/GPRS系列的M26模組,方便現有的2G客戶快速、靈活地切換至NB-IoT網絡。BC26易於針對各種不同的應用進行客製化,比如家庭自動化、雲信標(cloud beacon)、智慧型電錶及多項物聯網靜態或行動應用。以下為BC26模組外觀與硬體規格:
啟動吧~GO~
讓我們來實際測試DSI2598 NB-IoT開發板,首先安裝Arduino與相關驅動程式,以準備DSI2598的基本開發環境:
1. 安裝Arduino IDE,請到以下網址進行下載(選擇對應的作業系統)
https://www.arduino.cc/en/main/software
2. 安裝CH341SER驅動程式,請到以下網址進行下載
http://www.wch.cn/download/CH341SER_EXE.html
3. 開啟Arduino IDE

Arduino啟動圖示 (圖片來源:Victor Sue)
4. 開啟新專案 檔案->新增

Arduino開啟新專案 (圖片來源:Victor Sue)
5. 輸入以下的Blink程式碼,此段程式碼主要是對序列埠(Serial Port)輸出字串,來對板子進行基本的功能驗證,藉此確認Arduino開發環境與板子是否正確運行。
DSI2598-BLINK.ino // the setup function runs once when you press reset or power the board void setup() { Serial.begin(9600); } // the loop function runs over and over again forever void loop() { Serial.println("Hello World~"); delay(1000); }
6. 將DSI2598的USB接上PC
7. 設定開發板為Arduino Nano 工具->開發板
8. 設定序列埠

Arduino設定序列埠 (圖片來源:Victor Sue)
9. 編譯並上傳

Arduino編譯並上傳 (圖片來源:Victor Sue)
10. 完成後,開啟 工具->序列埠監看視窗(Ctrl-Shift-M),設定9600 baud,會不斷印出”Hello World~”,代表Arduino正常運行,恭喜跨出成功的第一步。

DSI2598 Blink測試 (圖片來源:Victor Sue)
NB-IoT連線測試
確定開發環境與開發板正常運作後,下一步就是打通BC26的NB-IoT連線,Aarduino控制BC26模組的介面為UART,控制方法為AT指令,UART部分Arduino採用Softserial函式庫,可以將Arduino的其他腳位通過軟體模擬成額外的串口序列埠,SoftwareSerial類並非Arduino UNO核心類庫,因此使用前你需要先聲明包含SoftwareSerial.h,其中定義的成員函數與硬件串口類似,available()、begin()、read()、write()、print()、println()、peek() 等用法相同,SofrwareSerial 函式庫有以下已知的限制:
• 使用多個軟體序列埠,同時間只有一個可以接收資料
• 只有支援中斷的腳位可以可以作為 RX 信號腳位
• 鮑率(Baud Rate)最高支援到 19200 bps•
AT指令在當代手機通訊中起著重要的作用,能夠通過AT指令控制通訊裝置進行各種行為,包括撥叫號碼、簡訊、聯網等,一般拿到通訊模組的第一件事情,就是用輸入AT,模組若回應OK的話,則代表通訊模組已正常啟動並等待控制,AT指令分為以下三種基本格式:
1. 測試命令(Test Command):在AT指令後面加上“=?”即構成測試命令。例如“AT+CSCS=?”會列舉出所有支援的字符集
2. 讀取命令(Read Command):在AT指令後面加上“?”即構成讀取命令。例如“AT+CSCS?”會列舉出當前設定
3. 執行命令(Execute Command):一般而言在AT指令後加上“=”及命令引數即可。有些命令例如AT+CMGR命令沒有引數,直接就可以執行。
讓我們來透過NB-IoT實際連上網路吧~
1. DSI2598開發板裝上隨附的FPC天線

DSI2598安裝FPC天線 (圖片來源:Victor Sue)
2. DSI2598插入電信商的NB-IOT SIM卡,SIM卡卡槽在開發板背面

DSI2598開發板SIM卡卡槽 (圖片來源:Victor Sue)
3. DSI2598透過USB插上電腦
4. 下載程式碼https://t.ly/DKkB2
5. 開啟Arduino IDE
6. 選擇設定DSI2598的開發板(Arduino Nano)和序列埠號
7. 編譯並上傳
8. 開啟 工具->序列埠監看視窗(Ctrl-Shift-M),設定115200 baud

DSI2598 Arduino序列埠監看視窗設定 (圖片來源:Victor Sue)
9. 在下圖的輸入框內輸入以下的AT指令(藍字為輸入AT指令,綠字為模組輸出)
10. 確認NB-IoT成功上線且拿到IP,成功~ 具體AT命令請參考BC26官方網站(https://www.quectel.com/cn/product/BC26.htm 需註冊登入才能下載手冊)

DSI2598 NB-IoT成功上線拿到IP Address (圖片來源:Victor Sue)
上傳IDEAS Chain雲端測試
感測器、Arduino到 NB-IoT連網都OK了,接下來就是重頭戲,將資料打到雲端啦,資策會非常佛心,不僅僅提供高整合度的開發板,更提供了雲端平台 IDEAS Chain。IDEAS Chain 是什麼呢?它是資策會服創所開發之雲端數據平台,以多元服務的整合設計,讓新創團隊與開發者簡單、快速導入物聯網數據應用,降低 IoT 結合雲端服務建置門檻。話不多說,就讓我們到平台上註冊吧~
1. IDEAS Chain註冊:請先到登入 -> 沒有帳號?
https://www.ideaschain.com.tw/www/iot.html

IDEAS Chain建立帳號 (圖片來源:Victor Sue)
2. 建立帳號後會收到認證Mail,點擊確認後登入IDEAS Chain

IDEAS Chain登入 (圖片來源:Victor Sue)
3. 點擊新增專案,建立專案,填入專案名稱與專案描述

IDEAS Chain新增專案 (圖片來源:Victor Sue)

IDEAS Chain填入專案名稱與描述 (圖片來源:Victor Sue)
4. 專案建立成功,點擊專案新增裝置

IDEAS Chain專案建立成功 (圖片來源:Victor Sue)
5. 新增裝置與相關資訊

IDEAS Chain新增裝置 (圖片來源:Victor Sue)

IDEAS Chain新增裝置資訊 (圖片來源:Victor Sue)
6. 在裝置管理內新增感測器

IDEAS Chain裝置管理 (圖片來源:Victor Sue)

IDEAS Chain新增感測器 (圖片來源:Victor Sue)
7. 接下來就是重點了,Arduino程式碼BC26.h內有三個數值須根據剛才在IDEAS Chain新增的專案/裝置/感測器所產生的ID進行修改
那這三個數值分別要去哪找呢? 首先, AK金鑰在專案管理頁面上點擊編輯,跳轉後第一行的資訊即為AK金鑰:

IDEAS Chain專案管理-編輯 (圖片來源:Victor Sue)

IDEAS Chain AK金鑰 (圖片來源:Victor Sue)
DID為裝置管理的裝置編號(DID)

IDEAS Chain裝置編號(DID) (圖片來源:Victor Sue)
SID為點擊感測器上面的編輯按鈕,跳轉後第一行即為SID

IDEAS Chain感測器-編輯 (圖片來源:Victor Sue)
8. IDEAS Chain設定完成
9. DSI2598透過USB插上電腦
10. 開啟Arduino IDE
11. 輸入以下兩隻程式碼
DSI2598-ideaschain.ino
#include "BC26.h" #define RED 11 #define GREEN 12 #define BLUE 13 void setup() { // put your setup code here, to run once: Serial.begin(115200); mySerial.begin(9600); pinInitial(); LED("red"); delay(500); Serial.println("Boot BC26 "); BC26_initail(); // 啟動與設定連線的伺服器 LED("green"); delay(2000); LED("blue"); data_update(AK, DID, SID, String(reset_count)); delay(2000); LED("green"); } void loop() { // put your main code here, to run repeatedly: if(reset_count >= 3600){ // 30min後系統重開 resetFunc(); } if(time_count >= 60){ LED("blue"); data_update(AK, DID, SID, String(reset_count)); time_count = 0; } LED("green"); delay(500); time_count++; reset_count++; // 系統重新啟動計時器累加 } void pinInitial(){ pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); digitalWrite(RED, LOW); digitalWrite(GREEN, LOW); digitalWrite(BLUE, LOW); } void LED(String string){ if(string == "red"){ digitalWrite(RED, HIGH); digitalWrite(GREEN, LOW); digitalWrite(BLUE, LOW); // delay(1000); }else if(string == "green"){ digitalWrite(RED, LOW); digitalWrite(GREEN, HIGH); digitalWrite(BLUE, LOW); // delay(1000); }else if(string == "blue"){ digitalWrite(RED, LOW); digitalWrite(GREEN, LOW); digitalWrite(BLUE, HIGH); // delay(1000); }else if(string == "none"){ digitalWrite(RED, LOW); digitalWrite(GREEN, LOW); digitalWrite(BLUE, LOW); // delay(1000); }else if(string == "yellow"){ digitalWrite(RED, HIGH); digitalWrite(GREEN, HIGH); digitalWrite(BLUE, LOW); // delay(1000); }else if(string == "purple"){ digitalWrite(RED, HIGH); digitalWrite(GREEN, LOW); digitalWrite(BLUE, HIGH); // delay(1000); }else if(string == "sky"){ digitalWrite(RED, LOW); digitalWrite(GREEN, HIGH); digitalWrite(BLUE, HIGH); // delay(1000); }else if(string == "white"){ digitalWrite(RED, HIGH); digitalWrite(GREEN, HIGH); digitalWrite(BLUE, HIGH); // delay(1000); }else if(string == "nocolor"){ digitalWrite(RED, LOW); digitalWrite(GREEN, LOW); digitalWrite(BLUE, LOW); // delay(1000); } }
BC26.h
#include SoftwareSerial mySerial(8, 9); String AK = "xxxxxxxxxxxxxxxxxxxx"; // 平台的AK金鑰參數 String DID = "0150455698870876"; // 平台的裝置ID參數 String SID = "S000001"; // 平台的感測器ID參數 String data = ""; // 儲存來自BC26回覆的字串參數 String data_on = ""; // 擷取部分字串參數的儲存參數 int sta = 1; // 迴圈的status參數判斷 int time_count = 0; int count = 0; // 副程式中來自BC26的回覆次數計數器 //int count1 = 0; // 副程式中的時間計數器 int band = 8; // 設定頻段(B8) int IP_count1 = 0; void(* resetFunc) (void) = 0; // 宣告系統重置參數 int reset_count = 0; // 系統重新啟動計時器宣告 String data_tcp_build = "AT+QSOC=1,1,1"; // 建立TCP通訊的AT指令 String tcpserver_connect = "AT+QSOCON=0,7789,\"150.117.122.166\""; String noreply = "no reply, reset all"; void serial_read(){ while (mySerial.available()){ //Check if there is an available byte to read, delay(10); //Delay added to make thing stable char c = mySerial.read(); //Conduct a serial read if (c == '\n') {break;} //Exit the loop when the "" is detected after the word data += c; //Shorthand for data = data + c } if (data.length() > 0) { // 判斷data內有值在更換 data.trim(); delay(100); Serial.println(data); if(sta == 1){ count++; } if(sta == 1){ if(count >= 1){ // Turn on BC26 status // Serial.println("Turn on BC26"); sta++; count = 0; } }else if(sta == 2){ if(data == "OK"){ // 設置頻段 sta++; } }else if(sta == 3){ // wait for IP status for(int i = 0; i < 3; i++){ data_on += data[i]; } if(data_on == "+IP"){ sta++; }else if(data_on =="+CG"){ sta++; } }else if(sta == 4){ for(int i = 0; i < 7; i++){ data_on += data[i]; } if(data_on == "+QSOC=0"){ // 開啟TCP通訊通道 sta++; } }else if(sta == 5){ if(data == "OK"){ // 連線至伺服器 sta++; } }else if(sta > 5){ // 傳輸資料與伺服器端訊息回傳 // +QSONMI for(int i = 0; i < 8; i++){ data_on += data[i]; } if(data_on == "+QSONMI=" || data_on == "AT+QSOSE"){ sta++; }else if(data[0] == 'O' && data[1] == 'K'){ sta++; } } } data = ""; data_on = ""; } void BC26_reset(){ // reset BC26 mySerial.println("AT+QRST=1"); while (sta == 1) { // 等待模組訊息回覆 serial_read(); delay(1*1000); count++; if (count > 10) { // 超過10秒未有回覆,重新啟動系統 count = 0; Serial.println(noreply); resetFunc(); } } count = 0; } void ask_for_IP(){ // 查詢IP狀況 mySerial.println("AT+CGPADDR=1"); while (sta == 3) { // 等待模組訊息回覆 serial_read(); delay(1*1000); count++; if (count > 10) { // 每10秒問一次IP狀況 IP_count1++; mySerial.println("AT+CGPADDR=1"); count = 0; if(IP_count1 > 6){ // 一分鐘後仍沒找到IP,重新開機 Serial.println(noreply); resetFunc(); } } } count = 0; IP_count1 = 0; } void set_band(int band){ // 設置頻段 String AT_band = "AT+QBAND=1,"; AT_band.concat(band); mySerial.println(AT_band); while (sta == 2) { // 等待模組訊息回覆 serial_read(); delay(1*1000); count++; if (count > 10) { // 超過10秒未有回覆,重新啟動系統 count = 0; Serial.println(noreply); resetFunc(); } } count = 0; } void build_TCP_connect(){ // 建立TCP連線通道 mySerial.println(data_tcp_build); } void connect_toserver(){ // 與伺服器連接 mySerial.println(tcpserver_connect); } String str2hex(String str){ // API字串轉hex格式function String hex_string = ""; for(int i = 0; i < str.length(); i++){ hex_string += String(str[i], HEX); } return hex_string; } String api_string(String AK, String DID, String SID, String data){ String api_pass = "{\"a\":\""; api_pass.concat(AK); api_pass.concat("\",\"d\":\""); api_pass.concat(DID); api_pass.concat("\",\"s\":\""); api_pass.concat(SID); api_pass.concat("\",\"v\":\""); api_pass.concat(data); api_pass.concat("\"}"); Serial.print("api_pass: "); Serial.println(api_pass); return api_pass; } void reading(int sta_pre, int sta){ while(sta_pre == sta){ // 等待模組訊息回覆 serial_read(); delay(1*1000); break; count++; } if(count > 10){ // 超過10秒未有回覆, count = 0; Serial.println("no replay, send next data after 2 seconds"); delay(1*1000); sta_pre++; } count = 0; sta_pre = sta; } void data_update(String AK, String DID, String SID, String data){ // 資料上傳function Serial.println("Sending data......"); int sta_pre = sta; build_TCP_connect(); reading(sta_pre, sta); connect_toserver(); reading(sta_pre, sta); mySerial.print("AT+QSOSEND=0,"+String(api_string(AK, DID, SID, data).length()+2)+","); mySerial.println(str2hex(api_string(AK, DID, SID, data))+"0d0a"); reading(sta_pre, sta); mySerial.println("AT+QSODIS=0"); reading(sta_pre, sta); mySerial.println("AT+QSOCL=0"); reading(sta_pre, sta); } void BC26_initail(){ BC26_reset(); delay(1*1000); set_band(band); delay(20*1000); // 等待20秒連線 ask_for_IP(); // 查詢IP狀況 delay(5*1000); } void long_delay(int hr, int minut, int sec){ // 設定delay時間長度 for(int i = 0; i < (hr*60*60 + minut*60 + sec); i++){ delay(1000); } }
12. 編譯並上傳
13. 到IDEAS Chain上的裝置管理即可觀看資料上傳的狀態,點擊黃色鈕可以查看資料上傳的紀錄

IDEAS Chain資料上傳的狀態 (圖片來源:Victor Sue)

IDEAS Chain資料上傳的紀錄 (圖片來源:Victor Sue)
結語
整體來說,DSI2598開發板硬體上具備高度的整合性,同時融入Arduino的易用性,與NB-IoT的低功號遠距連線,加以資策會服創所開發之IDEAS Chain雲端數據平台,提供從地到雲一條龍的全套服務,對於開發IoT專案的Maker與新創團隊,能夠以最快的速度,將創意發想轉化成POC進行驗證。
對於之後的量產設計,更提供完整的BOM與電路設計(請參考網址https://t.ly/XGYEV),並提供小型量產的媒合(請參考官網 https://www.ideas-hatch.com ),希望未來DSI2598的開發資源能夠整合到單一Github上,提供各方團隊開發各式IoT的應用與服務,也能讓世界看到台灣有如此優秀的開源硬體開發套件。
延伸閱讀
Quectel BC26 NB-IOT模組:https://www.quectel.com/cn/product/BC26.htm
(責任編輯:王姵文)
- 【NB-IoT】國產DSI2598開發板開箱評測 - 2019/12/11
- 【開箱評測】athena A1 Kit自造邊緣運算上手評測 - 2019/11/13
- 【RAK WisCore】自己動手才是王道!開發語音助理專案 - 2017/11/29
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!
2020/12/11
您好,不好意思,
想請問您BC26的板子目前只能做上傳資料的功能嗎?
因為想做手機和電腦的無線控制,
因此想知道BC26可不可以接收訊息?
2020/12/11
有的, 推薦使用MQTT, 可參考B626原廠網站(需註冊),
應用指導-> Quectel_BC26&BC20_MQTT_應用指導_V1.1.pdf
https://www.quectel.com/cn/product/BC26.htm
2020/12/11
謝謝,
請問有相關範例嗎?
目前剛接觸BC26連網
所以不是很清楚應該如何修改……
2020/12/11
無相關範例, 建議參考以下這篇, B626的相關操作都是AT command來進行的. https://blog.csdn.net/qq_23327993/article/details/103566898
2020/04/27
我有申請到正在用,看來連線都正常了,不過我一直沒辦法順利下載那些PDF檔案(可能因為我都在學校的關係,不能隨便連結中國的網路),因此想是那些AT command、TCP(IP) command的說明書我都下載不成功
有辦法email給我嗎: laisan86@gmail.com
2020/04/27
已Mail給您, 請收信.
2020/03/11
您好詢問一下,目前我使用您的Source Code練習卻無法上傳資料至IDEAS Chain平台,AK、DID、SID已確認無誤,而Monitor並無明顯錯誤,但會有亂碼的情況發生(115200 baud)
之後便採用AT Command手動方式進行連接,能與150.117.122.166(PORT:7789)進行連接,但在AT+QSOSEND傳送後,會有亂碼或是完全無reply的情況發生(連接並無斷線),而資料也沒有上傳成功。
想詢問是否有遇過類似的解決方法,感謝您 !
開發版 : DSI2598(第二代)
網路狀態 : 已使用AT Command確認網路與取得IP
錯誤異常 : 無法順利上傳資料至IDEAS Chain平台
2020/03/11
您好, 看來問題在於Idea Hatch的服務150.117.122.166(PORT:7789)關閉導致, 建議向資策會反應此問題 https://www.ideas-hatch.com/contact.jsp 來取得相關API服務的IP與Port並更新到code裡
2020/01/07
您好,貴公司的DSI2598開發板我正與我指導教授討論是否購買與購買幾片中,這幾天就會寄予購物清單^^
可否再請教您們一個問題,我使用紅外線物體偵測、兩片Arduino UNO R3、兩片LoRaRYLR890、1片NBIOT:SIM7020E。
我將其分為傳送端與接收端:
傳送端(Tx):
1. 紅外線物體偵測器
2. Arduino UNO R3
3. LoRa:RYLR890
4. LED
接收端:(Rx):
1. Arduino UNO R3
2. LoRa:RYLR890
3. NBIOT:SIM7020E
4. LED
我的目的是要做一套模擬智能路燈的概念,當Tx端之紅外線偵測到物體時除本身LED燈亮燈之外還能透過LoRa傳達亮燈資料訊息給Rx端,並再把訊息透過NBIOT傳給IFTTT,最後IFTTT把訊息傳至手機。
但現在問題出在接收端之LED燈能夠確實亮燈,手機卻沒收到IFTTT之訊息。我推測是NBIOT的程式宣告部份發生了問題,而我檢查好幾日都查不到錯誤點,無計可施下只好請教NBIOT專業人士給予我寶貴建議!!!
這是我的接收端程式碼:
const int ledPin = 13;
#include //引用SoftwareSerial函式庫
SoftwareSerial LoRa(10, 11); //RX ,TX
SoftwareSerial NBIOT(3, 4); //RX ,TX
void setup() { //輸出入宣告區
pinMode(ledPin, OUTPUT);
Serial.begin(9600); //設鮑率為9600
NBIOT.begin(9600);
LoRa.begin(57600); //設LoRa傳輸率為57600
pinMode(9, OUTPUT); //設Pin 9() 為輸出
digitalWrite(9, HIGH); //設Pin 9為高電位
delay(300); //延遲0.3毫秒
LoRa.println(“AT+NETWORKID=12”); //把網路號碼設為12
delay(300);
LoRa.println(“AT+NETWORKID?”); //詢問網路號碼
delay(300);
LoRa.println(“AT+ADDRESS=34”); //把裝置號碼設為34
delay(300);
LoRa.println(“AT+ADDRESS?”); //詢問裝置號碼
delay(300);
//while(LoRa.available()){ //把累積的回應全部印出來
// Serial.println(“ok”);
// Serial.write(LoRa.read());
//}
}
void loop() {
String rxData, lengthChar; //宣告rxData,lengthChar為字串
char rxByte, state = 0;
int k, header = 0, tail=0, strLength, payloadLength;
if (LoRa.available()){
while(LoRa.available()){ //讀取字串 (如果BaudRate太低,while迴圈內應加入適當的delay)
rxByte = LoRa.read();
rxData += rxByte;
}
Serial.println(“\n \nRx AT command:”); //印出原始command字串
Serial.println(rxData);
if (rxData.startsWith(“+RCV=”)) { //判斷字串頭是否為”+RCV”?
strLength = rxData.length();
for(k = 5; k < strLength; k++){ //尋找資料段落所在
if (state == 0) {//尋找第1個','
if (rxData.charAt(k) == ',')
state = 1;
}else if (state == 1) { //讀取並換算Payload長度,根據長度尋找資料段落所在
if (isDigit(rxData.charAt(k))){ //讀取Payload長度字串
lengthChar +=rxData.charAt(k);
}else if (rxData.charAt(k)==',') { //Payload長度字串結束
header = k+1; //Payload開始位置
payloadLength = lengthChar.toInt(); //換算Payload長度
tail = header+payloadLength; //Payload結束位置
Serial.print("Payload length = "); //印出Payload長度
Serial.println(payloadLength);
rxData = rxData.substring(header,tail); //切出資料段落
Serial.println("Rx payload:"); //印出Payload
Serial.println(rxData);
//目前推測是這裡有宣告錯誤之處
}if (rxData == "1"){
//Serial.print(rxData);
digitalWrite (ledPin, HIGH);
break;
const char *AT = "AT";
const char *CSQ = "AT+CSQ";
NBIOT.println(AT);
delay(100);
NBIOT.println(CSQ);
delay(100);
NBIOT.println(String("AT+CHTTPCREATE=") + "http://" + "maker.ifttt.com\r\n");
delay(100);
NBIOT.println("AT+CHTTPCON=0");
delay(100);
NBIOT.println(String("AT+CHTTPSEND=0,0,") + "/trigger/msgToLINE/with/key/cos134FjL3AhHpVsul0feQ/");
delay(100);
NBIOT.println("AT+CHTTPDISCON=0");
delay(100);
NBIOT.println("AT+CHTTPDESTROY=0");
} else if (rxData == "0"){
//Serial.print(rxData);
digitalWrite (ledPin, LOW);
break;
}
}else{
Serial.println("Error!");
digitalWrite (ledPin,LOW);
break;
}
}
}
}
}
//delay(100);
在此萬分感謝您們的幫助!!!不論您耐心看完我的長篇留言後是否會留言,或是留給我的建議是否真的可以成為我的解題之方法,小弟都萬分感謝您們的耐心閱讀與協助!! 2020 Happy New Years!
2020/01/09
DoDo你好, 很高興看到你用NB-IOT建立屬於自己的專案,
以下是幾點建議, 希望對你除錯上有所幫忙 :
1.LoRa模組RYLR890的Serial預設Baud Rate是9600.
2.是否有進行NB-IOT init ?
3.是否有確認NB-IOT行動網路上線(訊號品質AT+CSQ or 上線狀態AT+CREG?) ?
4.是否有設定行動網路的APN ?
2020/01/13
感謝您給予的寶貴建議,我這幾天不斷地在除錯,在不斷改進後發現到問題似乎是出現在NBIOT:SIM7020E的PWR腳位中?
當我將LoRa:RYLR890暫時拔除後,NBIOT能正常傳輸Arduino資訊至IFTTT,並傳至LINE中,但若加入LoRa我將無法正常傳輸;可LoRa方面不管我有沒有加上NBIOT,LoRa的都能夠正常傳達Tx資料到Rx中
2019/12/31
請問一下,我是自架一個UDP SERVER收集NB-IOT傳過來的訊息,目前是單向收資料,因在UDP上可以看到NB-IOT上SIM卡傳過來的IP,若我要對NB-IOT反向下指令的話,要怎麼操作。謝謝!
2019/12/31
你好, 由於UDP封包的特性是射後不理, 所以建議改用MQTT主動詢問, 或是使用TCP的方式進行.
2019/12/24
好的我再參考。
Arduino UNO 部份 目前我卡在 DSI2598-ideaschain.ino的第一列程式的階段:
BC26.h no such a file or directory
請問不是點選加入檔案嗎?
2019/12/31
你好, 請將BC26.h和DSI2598-ideaschain.ino放在同一層目錄, 謝謝.
2019/12/21
已詢問過,這幾天在修改系統,過兩天會再啟用。
2019/12/22
好的,感謝您!!
2019/12/23
已重開通,請再試試~
2019/12/24
好的我再參考。
Arduino UNO 部份 目前我卡在 DSI2598-ideaschain.ino的第一列程式的階段:
BC26.h no such a file or directory
請問不是點選加入檔案嗎?
2019/12/24
您好,DSI2598-ideaschain.ino的第一列程式我找到了解決方法,但目前有疑慮的是BC26.h的第59行程式有疑慮:
59.
for(int i = 0; i 10) { // 超過10秒未有回覆,重新啟動系統
這段程式Arduino偵測的錯誤回報訊息是:
a function-definition is not allowed here before ‘{‘ token
煩請指點疑慮!!
2019/12/31
你好, 可能是複製貼上的問題, 建議可以到我的github下載, 謝謝.
2019/12/19
你好,請問有Arduino UNO搭配NB-IOT的範例供參考嗎? 我使用的NB-IOT型號是SIM7020E
2019/12/19
您好, 建議可以修改NB-IoT連線測試的範例(下載), 跑在Arduino Uno上,
SIM7020E的連線AT指令, 可以參考Waveshare SIM7020E NB-IoT HAT裡的說明, 來進行相關的連線操作.
2019/12/20
好的,這幾日我再嘗試,今日研究了一下也對DSI2598開發模組有興趣,但您的網址我點選進入後,網址顯示已不接受回應?
2019/12/20
我們來幫忙問問開發單位資策會。