[Golang][Line][教學] 如何快速建置一個 Line Notify 的服務

前言

Line 在 2017 年其實推出了一個「通知」的服務,名稱為 「Line Notify」.這個服務跟 Line Bot 裡面的推送(Push Message) 其實是分開來的,而且服務也是需要另外申請的.

本篇文章將簡單的介紹這個機制運作的方式,並且暨「[Golang][教學] 在 Heroku 建立你自己的 Line 機器人 (Line Bot API)」 之後,在寫一個 Line Notify Template 的服務. 讓各位可以快速部署出自己的 Line Notify 的服務.

Line Notify

Line Notify 的申請頁面 跟 Line Bot 的不同,建議各位可以先去申請 Github 或是 IFTTT 的服務.

你會發現有一個新的帳號加你為好友,千萬不能封鎖 不然所有的 Line Notify 都會收不到.

如果你可以正常的串接 Github 或是 IFTTT 的 Line Notify ,我們就可以繼續以下的相關工作.

開發 Line Notify 服務

講到要如何開發一個 Line Notify 的服務,主要需要進行以下幾件事情:

  • Line Notify 的申請頁面 註冊你將要啟動的服務,來取得 Client IDClient Secret
  • 一個靜態網頁來負責開啟 POST 資訊到 Line Notify 並且讓使用者在 Line Notify 上面登入帳號與傳送相關資訊
  • 開發一個 API 端口(auth)負責跑 Line Notify oauth 來讓使用者的 Line 帳號與 Line Notify 的服務器登陸服務
  • 開發另一個端口(callback)來接收,傳送回來的 token 並且儲存作為之後通知之用
  • 最後有一個發送通知的端口(或是服務器透過資訊變更而啟動) 的端口 (notify) ,負責將要更新的資訊傳送給 Line Notify 服務器來轉發到 Line Noty 的帳號上

在服務的說明上,可以參考 Line Notify 的官方網頁 或是 Poy Chang 所寫的「實作 Line Notify 通知服務 (1)」 都相當清楚. 但是本篇文章是希望能快速帶領各位完成一個 Line Notify 的服務,所以接下來會使用我所開發的 linenotify repo 來介紹.

透過 Line Notify Template 快速建立服務

Line Notify Template Repo: https://github.com/kkdai/linenotify

接下來的文章,將會一個個來解釋該如何透過 Line Notify Template 來快速進行開發:

申請一個 Line Notify 服務:

記得到這個網址來申請你需要的 Line Notify 服務,關於網址的部分可以先隨便輸入.稍後服務建立起來後再申請.

建立好服務後,記得將兩個重要資訊抄錄下來 Client IDClient Secret:

透過 Heroku Deploy 快速搭建出已經建立好的 Line Notify Template

這裡會先假設各位都已經有 Heroku 帳號 ,接下來各位到這個 repo

Line Notify Template Repo: https://github.com/kkdai/linenotify

點下 「 Deploy to Heroku 」來將這個服務部署到你自己的 Heroku 伺服器(不需要花費)

這時候會需要輸入 App Name 代表你服務的名稱與網址請隨意輸入.但是稍後要記錄起來.

範例裡面我們將輸入 test-linenotify ,區域就沒有差別. (這個名稱是 unique ,請勿跟我一樣 XD )

然後到 Setting Tab 去打開 Reveal Config Vars 加入以下的參數:

  • CallbackURL:
    • 這裡需要輸入你 App 網址,假設你 app 叫做 test-linenotify 那麼網址就會是 https://test-linenotify.herokuapp.com/callback
  • ClientID:
    • 輸入 Client ID 從 Line Notify 註冊頁面所取得的資料
  • ClientSecret:
    • 一樣,輸入 Client Secret 從 Line Notify 註冊頁面取得的資料

回到 Line Notify 服務頁面來修改相關資料:

你需要回到當初設定的服務網址去修改相關網址.依照以下方式來修改:

  • 服務網址:
    • 依照這個範例, https://test-linenotify.herokuapp.com/auth
  • Callback URL:
    • 依照這個範例, https://test-linenotify.herokuapp.com/callback

就這樣.. 全部設定完成.

如何使用 Line Notify Template 來測試:

根據這個範例,你需要到這個網址 https://test-linenotify.herokuapp.com/auth

你會看到一個按鈕,這個時候你可以按下連接到 Line Notify按鈕 , 他會要求你登入 Line 的服務然後連接到以下的網頁.

這時候建議選擇 「透過 1 對 1 聊天接收通知」,然後就會導到一個成功的網頁.

並且在 Line Notify 會出現以下綁定成功的訊息.

發送測試 Line Notify 訊息吧

由於這個範例程式不具備資料儲存的功能(他也只會記住前一次登陸的 token ),所以建議連動成功之後馬上就開始測試.

根據這個範例,你可以馬上輸入 https://test-linenotify.herokuapp.com/notify?msg=test1 這個指令是會傳送文字 test1 到你的 Line Notify 去.然後你就會看到以下資料.

未來的工作:

這個範例只是讓各位能夠快速了解 Line Notify 運作的原理與一個服務需要哪些 API .但是離正式上線還有許多功能要做,如果你要開發一個正式的服務,可能需要以下相關服務.

  • 更詳細的服務登入網頁:
    • 需要一個更清楚的網頁讓使用者知道明瞭,該 Line Notify 是提供哪些服務.
  • 資料庫來儲存所有的使用者 Token:
    • 要傳送給相關使用者,你需要一個清單來記住所有註冊的使用者 token .
    • 由於 Heroku 並不提供資料庫功能,而這個範例程式也只有存在記憶體中. 也就是隨時會被改調或是因為 Heroku 進行每天六個小時的停機而清除掉.
  • 更好的內容提供:
    • 飯粒提供的內容相當簡單,只是一個 Query String 來傳送資料.正常狀況可能是監控一系列的機器,或是做網路爬蟲等等相關工作.
    • 身為服務提供商,需要定期抓取資料並且決定要不要送給使用者(或是送給哪位使用者)

參考

  • https://notify-bot.line.me/doc/en/
  • https://poychang.github.io/line-notify-1-basic/
  • https://mr117119.wordpress.com/2017/08/15/line-notify-line-%E6%8F%90%E4%BE%9B%E7%9A%84%E5%85%8D%E8%B2%BB%E9%80%9A%E7%9F%A5%E6%9C%8D%E5%8B%99/

[Coursera] Blockchain Basics

課程鏈結: 這裡

前言:

最近開始決定來清理一下 Coursera 上面積欠的課程,但是也想到竟然有這幾天的假期,不如來好好的學習一些有趣的知識. Ethereum 就是一個我之前一直想好好學習,但是沒有時間可以了解的. 剛好看到 Coursera 也有相關的課程,所以決定把這個系列課程剛好這幾天學習了解.

「Blockchain Basics」 算是比較粗淺的入門課程,並沒有任何的 Programming 的部分,主要是做概念的講解與名次的解釋.

課程內容:

Week1:

基本的 Blockchain 結構:

UTXO

UTXO(Unspent Transaction Output): 結構包含如下

  • Unique identifier of the transaction that created the UTXO
  • Index
  • Value
  • (option): Condition under output can be spent

一個 Transaction 會有 Input UTXO 也會有 Output UTXO,

Genesis Block

Genesis Block 指的是第一筆的交易,不論是 Bitcoin 或是 Ethereum 都有他們的 Block #0 ,我們可以透過以下的工具來查看:

  • Block Explorer: https://blockexplorer.com/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
    • 具有 1 個 transaction
    • Reward: 50
    • Difficulty: 1
    • 時間: 2009 (如果你那時候開始玩.. )
  • EtherScan: https://etherscan.io/block/0
    • 具有 8893 個 transactions
    • 0 個 contract
    • Gas: 5
    • Reward: 5

Week2:

Smart Contracts:

Smart contracts 是透過類似 Solidity 的高階程式語言,寫成一段程式碼可以透過 EVM (Ethereum Virtual Machine) 跑在任何的 ethereum client 上面.

Ethereum 貨幣單位

交易產生 Smart Contracts 流程:

每一筆交易可以帶有可執行的程式碼 (smart contracts) ,但是執行該 Smart Contracts 的算力(Gas) 會被反映到手續費裡面.並且有嚴格的 Gas Limit 來掌控一個 Block 所能使用的上限.

節點功用:

  • Full node:
    • 交易的啟動,認證
    • 挖礦
    • 區塊的建立
    • 智能合約的執行
  • Minor node:
    • 接收,驗證並且執行交易

Gas Point:

Gas Point 是給所有節點為了執行 Smart Contract 的手續費,計算範例如下:

  • Step: 1
  • Load from memory: 20
  • Store into memory: 100
  • Transaction base fee: 21000
  • Contract creation: 53000

如果 Gas Point 不夠或是消耗完了,該筆交易就會被取消.

Mining incentive model

Prove of work puzzle winner 拿到所有的 Block reward ,但是緊接在後面的 miner 叫做 Ommer miner .而它們挖出來的 Block 也會放著作為 Security check 之死,並且拿到一小筆的 reward.

Ethereum Accounts:

  • EOA(Externally owned account): 透過一組 PK (private key) 來代表你是帳號擁有者,並且可以執行相關操作.
  • Contract: 透過相關 smart contract 的 code 來控制的帳號.

Block creation sequence

  • 交易開始
  • 交易認證 (Validation)
  • 交易綁定與廣播
  • PoW 解決 Puzzle
  • 增加新的 Block 到鍊上

Refer: Life cycle of ethereum transaction

Week 3:

ECC (Elliptic curve cryptographyphy)

Strong than RSA,

256 bits ECC key pair ~= 3072 bits RSA key pair 

Hash function

  • Simple Hashing:
    • Fixed number of items (block header)
  • Tree hashing:
    • Number of items differ from block to block

All hashing output:

  • Account address
  • Digital signiatures
  • State hash
  • Receipt hash

如何保證 block 的一致性 (Integrity)

  • 不可串改的 block header
  • Transaction 不可被串改
  • State 的移轉是透過計算Hash 編碼並且認證過的

Bitcoin 與 Ethereum 都是透過 SHA-3 演算法 Keccak 來作加密

Bitcoin 如何計算這個 block 的 hash value? 需要以下資訊:

  • Previous block hash
  • Version
  • Merkle Root Hash
  • Timestamp
  • Bits
  • Nonce

參考網址: https://cse.buffalo.edu/blockchain/blockhash.html

Ethereum Merkle Tree

用來作用比對交易的一致性 (integrity), leaf node 存放交易(transaction)的資料. Parent node 則存放該子結點的 Hash Value. 而 Root node 存放所有交易的 Hash Value. 這樣做的好處有:

  • 一致性檢查: 所有的 Hash value 環環相扣,不容易被人輕易修改.
  • 修改少: 如果一筆交易有修改,要修改得資料只有由這個子結點一路到 root node

參考:

  • https://www.youtube.com/watch?v=h1wzzhkHfTk
  • https://bitcoin.stackexchange.com/questions/10479/what-is-the-merkle-root

Week4:

Trust Trail flow:

  • 驗證Transaction
  • 驗證 gas 跟 資源(resources)
  • 選擇一群交易 (transactions) 來建立新的 block
  • 執行該 Transaction 來取得新的狀態 (state)
  • 建置一個新 block
  • 通過 consensus 驗證
  • 將 block 加入到 chain 的最尾端

Consensus of blockchain

  • https://www.coindesk.com/short-guide-blockchain-consensus-protocols/
  • https://blog.wavesplatform.com/review-of-blockchain-consensus-mechanisms-f575afae38f2

Double Spending

  • 指的是有兩個 block 在非常接近的時間產生出來.這樣的話兩個 block 會同時連接到 main chain 產生兩條 chain . 但是之後比較長的 子鍊 會取代成為主鍊

  • Ethereum 透過 Global nonce 跟 account number 來解決這樣的問題.

PoW v.s. PoS

這段影片很簡單扼要

簡單記錄一下:

  • Proof -of-Work: (Bitcoin, Ethereum ( 主鍊))
    • Miner 透過消耗算力來解開 puzzle ,驗證是否為適合的 block.
    • Miner 得到相對應的 reward
    • 風險:
      • 51% 攻擊,當有人能夠集結 51% 以上的算力的時候就可以偽造資料,修改 main chain
  • Proof-of-Stake: (目前用在 Ethereum testnet)
    • 所有總資產一開始就存在,而每筆交易需要手續費(賭注)
    • 沒有人負責 mine block 而是作為 validate block
    • 每個人都可以附上一筆手續費來提升自己被選為下一個 block 的費用(賭注)
    • 風險:
      • 只要有人能夠拿出 51% 的錢當手續費,就有機會攻擊.這部分有更多論文正在討論.

Forks:

  • Soft fork: Software patch
  • Hard fork: Protocol change which introduce two chain could not merged.

Soft-fork in Bitcoin

Bitcoin 有過一次 Soft-fork for P2SH Script ( pay-to-script-hash script) refer here https://bitcoin.org/en/developer-guide#p2sh-scripts

Hard-fork in Ethereum (Ethereum Homestead –> Ethereum Metropolis)

包括了以下的 EIP (Ethereum Improvement Proposal):

  • Parallel processing of transactions
  • Proof-Of-Works consesnsus still stay except that every hundren blocks, Proof-of-stake consensus protocol is applied for evaluating latter.
  • Miner incentive was reduce from 5 Ethers to 3 Ethers.

Final Course Project

最後的作業,會讓你跑一個本地端的 VM 內建已經安裝好的 Ethereum client (geth) .並且跑一系列動作新建節點,連線,挖礦,交易.簡單但是可以馬上感受到 Ethereum 的完整感受.

Reference:

  • http://www.takethiscourse.net/blockchain-online-courses-moocs/
  • https://medium.com/blockchannel/life-cycle-of-an-ethereum-transaction-e5c66bae0f6e
  • https://github.com/ethereum/wiki/wiki/Ethereum-Development-Tutorial
  • https://cse.buffalo.edu/blockchain/blockhash.html
  • https://medium.com/@fukuball

[好書分享] 征服世界是可能的嗎?

前言:

最近把一些之前沒看完的書開始拿出來讀完,這一本就是在閒暇時間拿來消遣用的書.但是雖然最近 Kobo 大幅度特價來台灣打廣告,我還是喜歡紙本的書啊(書櫃表示滿了..)

這一本不諱言當初是因為封面的比克大魔王 而買下來的,但是其實內容相當有趣所以當初也是一次幾乎都看完了.一直到了最近才有時間去寫讀書心得.這系列其實跟「空想科學讀本」系列很像,屬於幻想的科學系列.但是作者們都用很嚴謹的角度來看待當初埋藏在各位心裡的奇怪想法.

tldr: 如果你沒有看過以下的漫畫讀物,強烈建議你「不」要買這本書來看.因為作者 岡田斗司夫 是動畫公司的創辦人,並且是美少女夢工廠當初創辦的公司. 裡面的範例也超級「宅」 ,如果是愛看漫畫的人或許可以完全融入作者的幻想科學裡.

內容簡介:

「征服世界」 已經忘記有多少動漫畫的反派夢想似乎都是這個,透過征服世界來達到自己的夢想.這本書也很有趣的由這裡展開.本來只是作者 岡田斗司夫 在暑假一個有趣的研究的分享,「一起征服世界吧」的演講. 卻被出版社聯絡,決定要出了這本有趣的書. 不過作者也不是泛泛之輩,他就認真的開始分析各個動漫反派的動機與方法論.整本書的架構如下:

征服世界的目的是?

一開始作者先透過一些動漫角色 「假面騎士」還有「北斗神拳」裡面的來分析這些反派為何要征服世界.每個人都有不同的目的:

  • 消滅人類: 宇宙戰艦大和號- 科美拉星人
  • 我要錢
  • 老是被人管,想要統治別人
  • 推廣邪惡: 這個酷了吧? 竟然是七龍珠裡面的比克大魔王

哪類的統治者?

這邊就統治者(也就是我們說的大反派)來分析他們的人個特性,你看是不是相當認真.

想要征服世界的大反派,其實分成四型:

  • 魔王型
  • 獨裁者型
  • 昏君型
  • 幕後黑手型

那麼如何征服世界呢?

這邊就認真的討論,如果真的想要征服世界的人該如準備?

  • 設定目的
  • 確保人才
  • 調度資金
  • 作戰計畫管理及肅清屬下
  • 征服世界之後(繼承人問題)

真正有可能征服世界嗎?

這個章節也認真的討論(但是還是舉了很多動漫的例子)征服世界的好處,還有統治世界的重點.

心得:

這本是相當適合當作休閒刊物,當然前提你還是要有相當程度的「宅」才能看懂裡面所舉的範例.作為一個放鬆毒物其實相當的棒.但是除了動漫的角色之外,也是可以看到作者對於歷史與人類管理相關的演進過程有一定程度的研究.有許多相關內容也潛移默化的導入到有趣的範例內.

[好書分享] 知識內容寫作課:寫一篇真材實料的網路爆紅好文章 - 從資訊業來思考

前言:

這本書其實已經看完幾個禮拜了,不過一直到這幾天放長假(?) 之後才有時間來寫. 這一本書是 Redhat 的大大提供建議的好書.雖然書名跟摘要會讓人覺得好像跟資訊技術人員沒有關係,但是裡面的內容其實都是通用的.讀完之後覺得有滿多地方可以推薦給大家.同時我會一併轉換到資訊技術人員來說,該怎麼去改善自身的撰寫方式.

其實我經常在演討會的摘要或是投影片上面都有運用到相關技巧,也歡迎大家相互討論指教.

內容簡介:

這本書是泛科學總編輯與泛科知識公司的知識長-鄭國威所撰寫的書.主要就是敘述他如何讓泛科學 這樣介紹科學的知識網站如何獲得大眾的青睞. 如何透過「有趣」並且吸引人的內容來讓更多人了解艱澀的科普知識.

整本書的內容圍繞在三個大流程:

  • 如何寫出受人歡迎的知識內容? (知識寫作的九宮格)
  • 如何宣傳你的知識文章
  • 建立個人知識品牌

接下來就簡單介紹一下這本書裡面的內容,希望會讓大家更欣賞這本書.我會一併轉換到資訊技術人員來說,該怎麼去改善自身的撰寫方式.

如何寫出受人歡迎的知識內容? (知識寫作的九宮格)

知識寫作的九宮格是一個工具,幫助你將你的知識鋪成文字並且吸引人來吸收.一個良好的知識需要足夠吸引人的文字來架構,並且需要有足夠好的內容與標題吸引人來閱讀.

1. 熱點:

透過流行文化與名人的話題來吸引人進來,對於資訊相關的知識而言.比如說最近的支付話題相當的盛行,不論是 Line 一卡通的新聞或是麥當勞大麥克之亂的都是很適合拿來寫作並且你腦袋裡面的知識帶入到文字之中.

2. 場景:

透過令人熟悉的故事,場景或是時空來讓讀者更容易吸收一些知識. 比如說透過 棋靈王 吸引人來聽 AlphaGo 甚至是 Tensorflow. 透過 Pokemon Go 的圖片與熱潮來解釋 Kubernetes 如何自動化擴展節點的優點都是.

3. 誰:

你的文章想要寫給誰看? 你的演講想要對誰說? 這個場地大多是哪一些人? 都是我每次一到了演講會場都會花時間去了解的. 如果是 ModernWeb 的場子,大多會是前端的人才, COSCUP 大多會是學生而各種不同的 Conference 都會充滿著各行各業的人. 「你如何透過他們的語言」將你的知識解釋給他們聽? 才是講者真正的功夫.

4. 為什麼? 怎麼做?

先建立好整篇文章(演講)的情境後,接下來就是你要文字(演講)的架構. 為什麼就會是一個很重要的問題,因為你的整篇文章都是圍繞著這個為什麼?

為什麼: 就是讓使用者省思,並且吸引他跟你一樣的思考

以下提供一些我過往的例子:

  • 因為聊天機器人只會回答一般的文字,所以我們希望能幫他加上人工智慧
  • 經常在外面看到一些物品不知道叫什麼名字? 幫你的聊天機器人加上 ImageNet 的人工智慧吧

這些都是「為什麼」你要怎麼做,他是一個 hook 可以鉤住讀者的目光.依照你的脈絡來開始閱讀你的文字.

而怎麼做就是比較有趣的部分,很多時候大家很急著把結果快速地寫出來.對於資訊相關人員而言,直接破題告訴你怎麼解決問題是沒有任何意義的. 因為必須要寫出來如何找到問題點,甚至如果能寫出 debug 的整個流程都是相當的好的.

5. 結果:

對於一般科學而言,這裡提到的是數據,歷史與結論.但是對於資訊從業人員而言,這裡可能就是某些解決方式或是某種現象. 比如說, 使用 Tensorflow 的訓練流程,透過 Kubernetes 來部屬你的服務方式.

6. 展望:

這個部分主要是討論在文章的後端,需要呼應到你一開始的「為什麼?」這個部份.對於資訊人員,舉例而言:了解了如何透過 K8S 來部屬你的服務之後,你必須馬上在文章的末端再給他加強印象.你可以透過 K8S 逐步將你手邊的應用程式方便的部屬,並且有 OOXX 的優點.

這個方式可以再三給讀者強烈的印象,前後呼應並且讓他深刻了解.

7. 感受:

連接者「展望」,讀者再三地強調「為什麼?」而做之後.就需要知道你希望他們產生的相關行動.一篇教導打造聊天機器人的文章,當然就希望讀者自己動作來寫一個.一個 K8S 部署的文章,會告訴讀者可以從哪個方向入手.

8. 參考資料:

這是我很習慣的部分,但是不少寫作的朋友可能都會忘記.附上相關鏈結可以補足你可能遺漏的部分.更可以讓讀者可以去閱讀更多的相關資料.也同時是鼓勵讀者回來回饋,如果有錯誤的話? :p

9. 圖文影音:

這部分屬於觀感部分,人類對於文字的吸收與記憶能力不如圖文與影音.所以可以的話,儘量加上一些圖片可以幫助讀者放鬆.

如何宣傳你的知識文章

文章寫好了,該如何宣傳你的文章? 這邊有幾個很值得分享的內容,你需要「三種關鍵角色來幫你推廣」:

連接者:

如果一篇 DevOps 的文章能夠放在 DevOps 社群的話,當然可以得到更多的讀者共鳴. 所以一個好的文章也需要好的地方「投放」.

專家:

如果你寫了一篇好的文章,你恰巧認識相關領域的專家.可以請他們幫你推薦.一本好的書,一定要能找到專家來寫序或是推薦文.可以為你的知識站台加分.

推銷員:

這邊講的不是像 Sales 那種推銷員,而是很喜歡分享內容的人.透過這樣的人可以讓你的文章獲得更多人的目光.更有可能他們還可能透過一些註解讓你的文章更吸引人進來. (ex: retweet, 臉書分享…)

建立個人知識品牌

這裡有建議的三個階段,快速的整理一下:

熱門平台做可行性測試:

透過 臉書, Twitter 上面直接寫文章的前言.來測試人們對妳話題的感興趣程度.如果很熱門,就可以放更多的心思將它完成.

建立自己渠道:

建立自己獨有的管道,不論是部落格,臉書粉絲頁面,或是社團討論區都可以.你需要建立自己在相關群組人裡面的專業形象.

與其他人合作:

不論是透過其他的社群,其他的討論版面.適當的擴大你的讀者群,是個重要的方向.你需要不僅僅讓你圈圈的人喜歡閱讀你的內容,更要讓不了解你領域的人試著閱讀你的文章.

心得:

這本書真的很棒,雖然大部分的內容都是筆者在通用科學與歷史偏重的泛科學的例子.但是我在閱讀的時候一直都轉換成資訊相關的內容,吸收起來格外的好.希望各位在讀的時候也能有一樣的感受.

[TIL][Golang] 修復 Golang BLE 在 MacOSX High Sierra 上面的問題

前言

Beacon 是具有藍芽連線的小裝置,通常裡面的格式為 Apple 的 iBeacon 或是 Google 的 Eddystone . 一般而言,要開發 Beacon 的話比較好的方式就是架設一個 Raspberry Pi 然後在裡面灌起來相關的藍芽模擬.但是如果你想要在 MacOSX 上面寫 Beacon 模擬程式的話,大部分的人都會使用 Bleno 一套由 nodejs 開發出來的藍芽套件. 支援夠好又熱門.

Golang 是很方便的語言,不論是寫在後端或是系統上來說.當然我也會想說來寫寫一些測試 beacon 範例的. 三年前,我曾經寫了這篇文章 Golang BLE Eddystone 初體驗(包含Beacon模擬器) 的文章.但是事隔三年之後,由於 Mac OSX 的系統更新,整個部分已經無法正常運行,需要做修改.

在 Golang 上面要使用藍牙的相關工具,大部分人都是使用 paypal 所開源的 PayPal/gatt ,但是那個套件兩年沒有維護了.以下會簡單記錄一下出了哪些問題.

tldr: PayPal/gatt 已經沒有在維護這個軟體.. Golang 要寫藍牙請用 https://github.com/go-ble/ble

Mac OSX 改了什麼

首先 Mac 在 High Sierra 上面將藍牙設備名稱改名字(為何要這樣做?) 原本的名字是 com.apple.blued 但是到了 High Sierra 就改成 com.apple.bluetoothd

這樣導致了 PayPal/gatt 的 golang 套件無法順利運行.其實在 nodejs 的套件上面馬上就跟上了這個部分( nodejs bleno fixed )

Paypal/GATT 已經沒有在維護

回過頭來的老問題,這些問題其實不能解決也不難維護.但是 PayPal/gatt 由於沒有在維護了.其實相當的困難繼續開發,而且許多 fork 出來的專案似乎也沒有比較解決大部分的問題.

換 go-ble/ble

換過去整個流程還算簡單, go-ble 提供 Advertisement 跟 iBeaconAdvertisement.方便提供相關的轉換.

參考

  1. paypal/gatt issue: Examples issue “Go pointer to Go pointer”
    1. GODEBUG=cgocheck=0 ./server
  2. currantlabs/ble issue: Not working on macOS High Sierra
    1. Unhandled event: xpc.Dict{"kCBMsgId":4, "kCBMsgArgs":xpc.Dict{"kCBMsgArgState":5}}
  3. Tracking macOS High Sierra Support

[NodeJS][Golang] 玩玩看 Line Beacon

前言

上週五去參加了 Line 的技術者聚會活動,也同時聽到如何透過 Line Beacon 來跟 Line Bot 結合.於是決定把整個官方範例串接起來,並且將整個流程寫的更容易了解.

LineBot Beacon 流程

在這個流程圖裡面,你可以看到整個流程有一點小複雜:

  • 首先使用者的手機接受到 Beacon 的訊號後,手機會將藍牙訊號傳送到 Line App
  • Line App 收到後,發送 Beacon hardware ID 給 Line Server
  • Line Server 根據 hardware ID 轉發給相關的 Line Bot (也附上該使用者的 token)
  • 這時候 Line Bot Webhook 就會收到使用者發送一個 beacon 的 event
  • 跟據不同 Beacon ID 跟 Event (Enter/Leave) 來定義不同的反應方式

根據這樣的流程,可以知道以下幾件事情:

  • Beacon 的控制的事情其實有限 (Enter/Leave)
  • Beacon event 本身提供訊息也只有以下的部分
string Msg         //beacon string
string type        //beacon type
string hardware ID //beacon hardware ID to determine b

根據這些訊息,其實還是能做出很多有趣的運用就要看各位如何發揮想像力.

沒有 LineBeacon 可以測試? 先試試看官方 nodejs 範例

官方範例: https://github.com/line/line-simple-beacon

node 10 的 MacOSX 藍芽上似乎有問題

先來透過官方範例來看看,結果似乎有點問題 (20180825):

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module 'xpc-connection'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/Users/Evan/src/go/src/github.com/kkdai/line-simple-beacon/tools/line-simplebeacon-nodejs-sample/node_modules/bleno/lib/mac/highsierra.js:10:21)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

跟工程師討論的結果,似乎 node10 再 xpc-connection (也就是要跑 mac 藍牙的這個部分) 所以可能還是要使用 node8 是比較穩定的.

那來幫 nodejs 降版吧

如果你跟我一樣使用 Homebrew 作為套件的管理系統,那麼從 node10 降板到 node8 的方式如下.

brew uninstall        //uninstall node10
brew install [email protected]   //install node8

這裡要注意,如果以之前有透過 npm 安裝的部分.最好砍掉重新安裝比較穩定.

Line Beacon 綁定在 Line Bot 上

首先先到 [email protected] Manager 來建立開發者帳號 (developer trial) 的 Beacon Hardware ID

記得要將你的號碼掛在你需要附屬的 Line Bot 上面.

LineBot 上面的相關修改

你必須要在你的相對應的 LineBot 上面做了以下的修改,才能讓你的 LineBot 在收到 Line Beacon 訊息的時候給予適當的提醒.

這只是一個最簡單的 code ,但是主要可以顯示出來 Beacon 會傳來兩種訊息.分別是 Enter 跟 Leave

參考鏈結

  1. https://developers.line.me/en/docs/messaging-api/using-beacons/
  2. https://developers.line.me/en/reference/messaging-api/#beacon-event