- Published on
Line Bot 接收 Garmin inReach mini 訊息
- Authors
- Name
- Ryan Chung

前陣子看到馬克褚大大的社群有人發文,教大家如何將 Garmin inReach mini 的訊息透過 server 轉發到 Line 群組上 1。 雖然出發點很好,但要克服兩個問題:一是你要有專業版帳號,二是你要有自己的伺服器。 作為登山社群與開源社群的一員,總免不了思考怎麼改良成大家都可以輕鬆使用的方式。
突然想到利用 Line Bot 將 mail 轉發到 Line 群組,是否就可以土炮出一個登山留守群組? 雖然無法回傳衛星訊息(個人帳號無法直接與 Garmin API 溝通),但純粹就留守而言似乎也還堪用; 如果要傳訊息也可以直接點擊網頁連結,透過 Garmin 的官方頁面發送訊息。
什麼是 Garmin inReach mini?

這個東西登山圈的人鐵定不陌生,但是以防其他圈子逛進來的朋友不知道,還是稍微說明一下。 當我們在從事登山、航海等戶外活動,經常沒有網路訊號。 比較接近市區的郊山(如陽明山、阿里山)可能還有 3G、4G 訊號,但更多荒郊野外是完全沒有被訊號所覆蓋。
早期如果在山上發生意外,大家要跟平地通訊只能透過無線電,在一些關鍵地方建立中繼站,想辦法將訊息帶下山 (猶記得山協指導老師家後院架了一根超高的鐵塔,就是為了在山難事件發生時,可以作為指揮中心收發全台灣山區所有的無線電訊號)。
隨著時代進步,衛星電話開始逐漸取代高功率無線電。只要一台手持裝置,就可以直接透過衛星打電話到山下,不再需要依靠無線電或稀少的基地台。 雖然造價昂貴,但使用方式簡單有效,遂逐漸成為主流,目前比較常見的是 Inmarsat 海事衛星跟 Thuraya 舒拉雅衛星 2。
雖然能打電話、傳訊息已經很方便了,但真正會攜帶衛星電話上山的登山團體,通常只有大專院校登山社、專業商業團及個人而已。 對於一般消費者來說,衛星電話高昂的機體費用、年費、通話費,以及低使用率是主要原因,沒有多少團體養得起衛星電話。 究其根本,台灣的登山教育不夠普及,山難防治與留守制度沒有被普羅大眾接受,大家風險自負下根本沒有人想花錢花心力準備衛星電話。
然而時代持續改變,隨著山林開放與後疫情時代來臨,許多山難接踵而至。 登山教育開始逐漸被重視,戶外安全推廣協會也大力宣傳其 留守平台,讓登山客能有個安全報備行程的地方。 而這一切因素,都為 Garmin inReach mini 的崛起做了鋪路。
Garmin inReach mini 是一台非常精巧的裝置,售價僅需一萬出頭,捨去衛星電話諸多花俏功能,整合登山最重要的 通訊 、 航跡 與 氣象,配合手機 APP 的使用,讓山上可以即時傳遞與接收衛星訊息,山下留守則可以即時看到山上隊伍的 GPS 點位。 除了攜帶方便,其月租方案相對傳統衛星電話低廉,使用低軌道銥衛星 Iridium 增加衛星訊號的接收範圍(溪谷內尤其明顯),這些優勢讓 inReach mini 成為目前戶外 CP 值最高的通訊手段。
Garmin inReach mini 可以透過 mail 或手機簡訊發送訊息(其實還有 Facebook 發文功能,但我沒試過),除了純文字外還可以夾帶當前的 GPS 座標,非常方便。 然而有個小缺點,登山隊伍每次更換留守都需要重新設定聯絡人,對於出隊頻繁的團體來說稍微有些惱人,但這點合情合理,過去我也沒多著墨。 這次偶然發現可以轉發到 Line 群,不但可以統一留守介面(以後不用再做設定),還可以讓各位專業留守人隨時關注不同隊伍的動態,以免資訊過度集中封閉,對於後勤充足的登山社團來說非常有幫助。
設定 Line Notify 與 Google Apps Script
要傳送訊息到 Line,我們首先要建立目標群組,然後登入 Line Notify 服務。

接下來,我們要實作自己的 Line Bot。 登入預計用來接收 Garmin 訊息的 gmail 帳戶,以我這篇為例,就是直接使用成大山協的官方 gmail。 接著進入 Google Apps Script 點選「新專案」,可以順便將「未命名的專案」更新成自己想要的名字,這部分不影響後續任何操作。 接著在程式碼的部分,刪除預設的範本,複製以下的全部程式碼,並將第一行 XXXXX
的部分改成剛剛記錄下來的 Notify token。
const lineToken = "XXXXX"; //LINE notify token
function send_line(Me){
var payload = {'message' : Me};
var options ={
"method" : "post",
"payload" : payload,
"headers" : {"Authorization" : "Bearer "+ lineToken}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
function fetchContactMail() {
//取得間隔
var now_time= Math.floor(new Date().getTime() / 1000) ;
var time_term = now_time - 60;
//搜尋條件設定
var strTerms = '(is:unread after:'+ time_term + ')';
//取得訊息
var myThreads = GmailApp.search(strTerms);
var myMsgs = GmailApp.getMessagesForThreads(myThreads);
var valMsgs = [];
for(var i = 0; i < myMsgs.length;i++){
var subject = myMsgs[i][0].getSubject();
if(subject.includes('inReach')){
valMsgs[i] = '\n【 ' + myMsgs[i][0].getDate() + ' 】'
//+ "\n【From】: " + myMsgs[i][0].getFrom()
+ '\n\n' + subject
+ '\n\n' + myMsgs[i][0].getPlainBody();
}
}
return valMsgs;
}
function main() {
new_Me = fetchContactMail()
if(new_Me.length > 0){
for(var i = new_Me.length-1; i >= 0; i--){
send_line(new_Me[i])
}
}
}
接著按下上面工具列的儲存鍵,將下拉選單中 send_line
改為 main
,然後按下旁邊的執行按鈕。 Google 應該會要求使用者進行帳戶權限審查,一路允許到底即可。

接著點選左側選單的「觸發條件」並新增一個觸發條件,這裡我們一樣要將執行功能改為 main
,然後選取時間型觸發條件類型改為「分鐘計時器」,選取分鐘間隔改為「每分鐘」。 儲存後一樣通過帳戶權限認證即可順利完成。

補充說明一下,在這邊我們的策略是每分鐘觸發一次這個 Apps Script,程式碼會透過 GmailApp.search()
去 gmail 抓過去一分鐘的所有新郵件, 並從標題判斷是否含有 inReach
字串;如果有,就將這篇郵件的標題與內文轉寄到 Line 群組裡。 我將寄件人的部分碼掉了,但大家也可以依照需求自行修改 Line message 的格式。
之所以每分鐘都確認一次,是因為當山難事件發生時,訊息交流可能很頻繁,如果每一小時或每天才收一次通知會太久。 目前 Google 並沒有針對 Apps Script 的觸發費用額外收費,大家可以依據自己的使用習慣做調整 (eg. 5min),但是要同步修改 time_term
變數的內容。
結果
最後,我們還要將 LINE Notify 官方帳號加進去我們的 Line 群,這樣當 inReach 訊息進來時,他就會主動跳出來通知我們郵件內容。 結果如下所示:

圖中可見,雖然我們可以順利用 Line 接收訊息,但不能直接從這裡回傳資訊,要透過 Garmin 連結至官方網頁發送訊息。 如果想要有直接回傳的功能,可以回頭參考馬克褚社團裡的貼文 1,升級成專業帳號並將 Line Bot 的內容修改一下即可。 因為我沒有專業帳號,這部分就留待有緣再嘗試了...
十月更新:非常遺憾的是,Line Notify 將於 2025 年 3 月 31 日終止服務,需要改用 Messaging API 或轉去其他平台(例如 Discord)
Footnotes
徐晴明, "inreach 與 LINE 橋接實作演示", FB 馬克褚工作室-Garmin inReach-經驗交流聯誼會, https://www.facebook.com/groups/1836965556473016/?hoisted_section_header_type=recently_seen&multi_permalinks=2549460761890155 ↩ ↩2
2024/04/19 Thuraya-3 衛星發生故障,造成台灣全境包含離島皆無法使用其服務,目前中華電信也停止代理 ↩