Published on

Line Bot 接收 Garmin inReach mini 訊息

Authors
  • avatar
    Name
    Ryan Chung
    Twitter

前陣子看到馬克褚大大的社群有人發文,教大家如何將 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 服務

點選右上角「登入」按鈕,登入後在選單裡選擇「個人頁面」,產生一組專門匹配該群組的「發行權杖」(token),填寫的名稱會成為後續發送訊息的名稱。 例如我在 Line 建立一個叫「成大山協-山防」的群組,並在 Line Notify 產生一組專門與之對應的 token 叫「NCKU Garmin inReach」。 實際產生的 token 會是一組很長的亂碼,先複製起來等下會用到。

接下來,我們要實作自己的 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 的內容修改一下即可。 因為我沒有專業帳號,這部分就留待有緣再嘗試了...

Footnotes

  1. 徐晴明, "inreach 與 LINE 橋接實作演示", FB 馬克褚工作室-Garmin inReach-經驗交流聯誼會, https://www.facebook.com/groups/1836965556473016/?hoisted_section_header_type=recently_seen&multi_permalinks=2549460761890155 2

  2. 2024/04/19 Thuraya-3 衛星發生故障,造成台灣全境包含離島皆無法使用其服務,目前中華電信也停止代理