伊莉討論區

標題: 如何使用推播系統推播訊息到手機? [打印本頁]

作者: a7813195    時間: 2017-5-4 12:20 PM     標題: 如何使用推播系統推播訊息到手機?

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-4 05:41 PM

本帖最後由 chevylin0802 於 2017-5-5 11:11 AM 編輯

其實推播系統只是即時通信的一種變型方式
不一定只能選擇GCM, FCM或其它的系統架構來做
比如LINE也有開放如何製作LINE客戶端的方式來作為商業用戶的蓷播平台
比較麻煩的反而是你如何將電腦軟體上的資料自動的往推播系統丟出
至於接收端的部份
其實還比較好處理
網路上有很多的範例
並不是那麼難找
而且也有中文的網站有提供你一步一步怎麼做的指導
只是如果你採用的是GCM或FCM的話
那還需要到google去申請加密密鑰

我是不太去重視這種推播技術的
畢竟它也只不過是把XMPP加到系統裏面
只不過就是多了可以雙向傳遞文字訊息的功能
要比起真正完整的即時通訊技術裏包括圖型語音以及影像雙向溝通的特性
要來得粗淺很多
而即時通信系統卻是可以自主自行架設在自己的公司或家裏面
完全不需要依靠甚至於被谷歌綁死
也不會有資料被竊取的風險以及顧慮



作者: a7813195    時間: 2017-5-5 08:07 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-6 01:24 PM

本帖最後由 chevylin0802 於 2017-5-6 01:28 PM 編輯

這是一個有點麻煩的問題
首先是你要如何自動截取到電腦軟體上的資料
這個部份是需要寫程式的
因為你可以在電腦架一個網頁伺服器
這並不難做
只是花一點時間就可以完成架設
HTML語法本身並不難
一般來講你可以使用WebSocket技術來主動傳送資料給客戶端
也就是瀏覽器
WebSocket可以靠Javascript來寫(通常會使用Node.js現成的websocket程式庫)
這也沒有問題
難的是你在伺服器端要如何寫WebSocket的程式
比較簡單的作法來講通常是寫一段Socket.IO的WebSocket程式
只是看你自己了解多少

作者: a7813195    時間: 2017-5-7 02:01 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-7 11:11 AM

本帖最後由 chevylin0802 於 2017-5-7 02:07 PM 編輯
a7813195 發表於 2017-5-7 02:01 AM
抱歉大大 我知識尚淺
不知大大是否有更明確的指示
寫程式算式死的 但邏輯觀念可能會影響到整個做法與演進 ...

這就是我在講的比較麻煩的部份的原因
因為微軟的Windows系統太封閉了
你還真的只能用C++或C#去搞
那種東西我還真的沒去碰過
畢竟做伺服器的人大多採用的都是Linux的平台
尤其還是做嵌入式系統的廠商
從來不會把需要授權金的微軟系統考慮進去
Linux系統可以寫的程式也很多樣化
從C++, PHP, Python, Java, Javascripts(Node.js), 到Ruby on Rail ......等
各式各樣的程式語言都可以用
但就是不會去用到C#
所以我也沒辦法幫你

至於類似推播技術的系統
主要還是IRC或者IM
所謂的IRC/IM系統指的就是像即時通信軟體這類的
當然如果還加上影音功能的話也可以稱它為VoIP
比如已經有10幾年歷史的SIP通信標準
以及也有10年歷史的Jabber(一種開源軟體系統)
Jabber所使用的通信標準也就是XMPP

FCM或GCM都需要在Google註冊取得金鑰
而它很麻煩的地方就是你只能拿它當實驗用途
它實在很難作為商業或公益用途的應用
畢竟它同時可以發佈的客戶端不超過1000個
然而商業用途或公益用途就可想而知
必需要靠自己架站來完成而不是透過Google的雲端平台或Firefox的雲端平台

當然如果只是學校專案並沒有考慮到靠它來作為商業運轉的用途或公益團體平台的話
確實可以直接採取FCM/GCM這個方式去做
但它就完全沒有後續研究的意義可言
如果是專科學校的話就無所謂
如果是大學甚至研究所的專題的話
恐怕要考慮深遠一點

WebSocket技術說穿了就是使用一種Javascripts的語法綁在HTML上
而這種Javascripts的程式卻是透過打通一個兩端都事先約定好的通信埠來作為通道互傳信息
像HTTP通信協議用的是80, HTTPS則是443一樣
WebSocket可以讓你採用一個固定的通道, 比如8000
接下來就可以讓兩個客戶端或者客戶端與伺服器端相互傳遞資料內容
所謂的GCM/FCM推播系統也是一樣的做法
只是在WebSocket所使用的通道裏傳遞的是XMPP規範的文件
而不同的地方是
WebSocket的部份是你需要靠自己架設的網頁伺服器寫程式去完成的
而它完全不需要再去透過Google或FireFox的伺服器進行
這相對在後續研發的延展性來說
就會比FCM/GCM要來得大一些
而且WebRTC技術也是延伸自WebSocket
WebRTC也就是網頁版的即時通訊技術
包括文字以及影音都可以傳遞


作者: a7813195    時間: 2017-5-8 12:11 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-8 01:20 PM

本帖最後由 chevylin0802 於 2017-5-8 01:23 PM 編輯
a7813195 發表於 2017-5-8 12:11 PM
之前在上java課程的時候
有接觸到使用socket去做檔案護傳的部分
我在想 之後會不會面臨到

連線中斷是會發生的
不過JAVA的Socket IO本身就會產生出Exception
只是看你如何去完善Exception裏的程式而已
通常一般的範例都是死的
只會給你print out 錯誤訊息
並不會告訴你如何處理
但事實上如果有Exception發生的話
就直接把socket給close
再重新靠listen來等待新的連線就可以
只是你需要把server端的程式寫成multi thread的方式就可以不必擔心跳出來的問題
至於client端的部份
在Exception發生之後
只需要檢查網路是否通暢
等待網路通暢的時候再重新發出connect連線請求
重新連線
就可以繼續等待新的訊息發出
只是如果你想要做得更好
就必需要考慮你傳輸資料的時候
還需要將日期時間格式一起傳遞過去
讓它變成具有日期時間的訊息
比如採用json格式發送
每一個欄位各自有它固定的意義
當一筆資料讀取出來的時候
透過你自己寫的Java Socket Server的程式
把它編輯成一串json的文句再傳送出去
如果有多個裝置同時連線的話
你也可以讓所有裝置都讀取到同一串文句



作者: a7813195    時間: 2017-5-12 11:53 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-12 12:52 PM

本帖最後由 chevylin0802 於 2017-5-13 12:01 PM 編輯
a7813195 發表於 2017-5-12 11:53 AM
我又想到一個問題了
說是推播 不如簡單說只是發送訊息到手機(這裡只講述推播到手機部分 網頁部分不討論)
網 ...

的確如此
只是server並不難做
難的是你如何讓兩端有協議的格式
光光協議就夠你傷腦筋了
你要自己思考這個部份
不一定非得靠HTTP
任何一個TCP的port只要指定清楚都可以用
不過一般都建議你別跟現成已定義的通信協議衝突
所以一般都建議你採用1000以上的port

通信協議是一個必要的基礎
比如Client端總是要先發送一段資料給伺服器端
像是WEB最常用的應該就是使用帳號密碼
當然你可以不必那樣子使用
你可以給它一段通行密碼作為存取的驗證以及保持住連線
為了防止你的客戶端的網路連線突然間的中斷
最好有一個登入機制
比如每五分鐘由客戶端向伺服器端登入一次
註冊成功的時候伺服器端都會發送出登入成功的訊息給客戶端
註冊失敗的話也一樣會發送登入失敗的訊息給客戶端
大部份都會類似於HTTP協議的方式, 回傳的訊息標頭如果是200就代表OK的意思
登入成功之後伺服器就可以隨時將訊息傳給客戶端

像一堆會寫JAVA的人總以為掛個程式庫就好
HTTP/HTTPS都可以從Apache取得相關的web api
但是如果是自己寫呢?
恐怕1000個會寫Java的人會有999個不知所措
因為即使會使用tcp socket的人也不知道通信協議要怎麼做

所以我建議你要先從ISO/OSI Model 網路通信協議的7層layer的標準開始了解起
不過也不需要過於深入
基本上有兩個部份是需要仔細去了解的(只針對程式設計師而言)
一個是關於會議層的部份
它主要的部份在於Server與Client之間的溝通對話的時序
另一個則是關於應用層的部份
這個部份就是關於剃除掉會議層的部份之外的封包資料格式

比如Instant Messager(IM)即時通信來講
它的基本動作就分成了登入以及資料傳遞這兩個部份
(除此之外其他還包括群組建立或群組加入, 建立好友名單或申請加入好友等.....)

登入的協議如下
1. Client向Server發出登入請求
2. Server回應Client端需要進行帳號及密碼驗證
3. Client傳送帳號及密碼給Server端進行驗證
4. Server端傳送給Client端登入成功或失敗的訊息以及有效期限(一般有效期限設定為300秒, 即5分鐘)
5. 如果登入成功, Client端則需要在登入期限後重新登入
6. 如果登入失敗, 視Client端的程式再次發送登入請求(一般設定成三次不成功便停止發送登入請求)
當Client端登入成功之後, Server端就可以即時發送訊息給Client端
如果Client端想要登出的話, 只需要發送登出請求, Server端即可回覆允許登出的訊息則完成登出程序

Client端訊息發送
1. Client向Server傳送訊息
2. Server端回傳OK訊息或失敗訊息

Server端傳送訊息給客戶端
1. Server向Client端傳送訊息
2. Client端回傳OK訊息或格式錯誤或無法解析等錯誤訊息

基本上你要做的大概就是類似這種即時訊息的通信方式
剩下就是你自己如何定義清楚每一個封包的傳送格式以及如何在程式當中進行封包解析

至於物聯網的概念
你也可以把所有的終端裝置都當成是客戶端的方式來進行
不過如果是使用Arduino的話恐怕要小心記憶體不足的問題

另外關於帳密傳送的部份
通常都會直接在程式裏面針對密碼的部份進行加密再來傳送
以確保密碼不被監聽外洩
不過不見得需要考慮這個環節
反而是如果是物聯網裝置端的部份
要如何自動擁有專屬不會重覆的識別碼則是需要去考慮的問題
反而你的Server程式需要寫成多執行緒的方式

其實物聯網的裝置端最首要的問題就是在於如何與外界通訊
常用的方式不外乎就是直接用一條USB線接到電腦上
但事實上這與實務上的情況完全不同
因為物聯網沒有辦法讓你透過數十米甚至數百米長的距離的USB線來傳送
如果你想要採用Ethernet介面的話
那麼物聯網裝置的成本就會變得很高
所以在商業應用上
物聯網裝置通常會採用的是藍芽或者是Zigbee或者是Wifi來傳送
但是無線傳輸也常常會遇到干擾的問題
不管如何
你可能都會發現到物聯網裝置仍然需要有轉接的路由裝置
而這些轉接的路由裝置則透過Ethernet或Wifi再跟電腦連線
也因為是如此
我的建議
會把物聯網終端裝置或者物聯網路由裝置也視為Client端來跟電腦的Server連線
只是這些Client端會標註成特定的Client
就類似於Facebook的粉絲頁的作用一樣
也類似於LINE裏的企業組織用戶一樣
物聯網裝置的Client端的程式就可以針對個別裝置的狀況來寫一段自動發送數據的程式
而不需要每一次動不動就去修改Server
當然你的Server也要為了這些用戶端建立一套資料庫來儲存帳密以及裝置識別碼等資料
起碼這樣子才算是完成最初步的東西


作者: a7813195    時間: 2017-5-15 09:59 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-16 10:15 AM

本帖最後由 chevylin0802 於 2017-5-16 10:17 AM 編輯
a7813195 發表於 2017-5-15 09:59 PM
由於目前時間緊迫
但推播機制必須得做出來
我有想過自己製作server的方式 但是知識尙淺

它講的是從google的範例再去進行修改的
但是文章寫得很凌亂
要看懂的人真的要有比較多的經驗的人才看得懂
所以你拿這個文章的內容想要去做出來
還真的是很難為你了
遠遠不及你直接去google把範例下載下來之後
再去比對應該修改的部份


作者: a7813195    時間: 2017-5-16 04:57 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: a7813195    時間: 2017-5-16 05:43 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-16 06:43 PM

本帖最後由 chevylin0802 於 2017-5-16 06:45 PM 編輯
a7813195 發表於 2017-5-16 04:57 PM
http://oldgrayduck.blogspot.tw/2015/10/android-studiogcm-client.html
大大您好 不好意思又麻煩您
我 ...


你的Android開發環境的問題
你只能夠先移除安裝之後
再重新下載最新版友本重新安裝
新版本的開發環境
最好先爬文看一下別人的安裝心得
這個部份我幫不到你
作者: chevylin0802    時間: 2017-5-16 06:50 PM

本帖最後由 chevylin0802 於 2017-5-17 10:12 AM 編輯
a7813195 發表於 2017-5-16 05:43 PM
剛剛是用好範例 但是我用時候內部設定都好說
想請問大大給個方向
他說我們要更改public static final Stri ...

FCM或GCM都一定要透過他們的網站
而且你還得注意到它有1000個Clients的限制

這還不是最麻煩的事情
假定你做了五家醫院
門診科室一共有80間
都透過FCM/GCM來傳遞資料好了
那麼你就會看到手機不斷的在彈出不必要的訊息
因為病人所預約的醫師只會有一個
但彈出來的訊息卻是所有80間門診科室的號碼
所以會使得手機的APP完全沒有達到病人所要使用的目的跟意義
除非你在App裏面還做過濾器
過濾掉所有不必彈出來的訊息
除此之外
比如台大醫院的門診
有的病人排到500多號
可是科室醫師才看到200多號
這時候有必要每看完一個病人就要通知到病人手上告訴他說現在是200多號嗎?
我想這一定會讓人覺得很煩
至於多家醫院是不是共用同一個FCM/GCM所註冊的網址
反而不是什麼重點
因為API_KEY只跟著你所申請的FCM/GCM的網址跑的
註冊不同的FCM/GCM網址就會個別產生出不同的金鑰給你
只是我必需要告訴你的是
你這個專案題目真的很複雜
真的要做到可以用
起碼也要四五個人一起做
要有設計資料庫的人
要有設計App的人
要有設計伺服器跟通信協議的人
還要有硬體裝置端系統整合的人

另外
說實在的如果是真的要安裝到醫院去的話
那才真的是一件可怕的事情
FCM/GCM目前都是免費提供給人使用的
但難保哪一天Google或Mozilla協會做出政策上的改變
不管是從免費變成要收費或者是有其他的要求
那麼整套系統的運作可能就跟著廢了
所以基本上
企業在接這種專案的時候都會盡可能避免使用GCM/FCM這種平台
因為一個不小心就被Google他們掐住脖子

正確的做法是把門診科室看成是社群裏的某一個群組
所有病人在門診預約掛號之後就自動加入這個群組
群組有任何訊息就直接發佈到社群群組上
所有加入群組的人員都可以從社群群組上看到發佈出來的訊息
然後App再去進行號碼過濾
初步可以設定成進入100號以內才顯示訊息
或者也可以由用戶自己設定20號以內或50號以內才顯示訊息
這麼一來就變得比較容易做
每一個醫院每一個科室都有自己專屬的群組
然後只需要一台社群伺服器給所有醫院共用就可以



作者: a7813195    時間: 2017-5-17 03:20 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-17 05:12 PM

本帖最後由 chevylin0802 於 2017-5-17 08:24 PM 編輯
a7813195 發表於 2017-5-17 03:20 PM
那個問題已解決 好像是版本關係

我知道FCM以及GCM有著1000個client限制

Raspberry Pi的問題是你要找到MIPS版的java VM才行
如果不是MIPS版的Java VM
是沒有辦法工作的
至於ARM架構
市面上是有很多種
比如Banana Pi (它是使用全志的A20 SOC去做的板子)
我記得大概800塊台幣就可以買得到
如果你採用它Linano的映像檔的話
也可以直接在裏面用apt-get的方式去下載到GNU版本的JAVA VM

至於我講的社群群組的概念方式的話並不難做
即使你使用我建議的香蕉派的板子
也一樣可以安裝MySQL Server在裏面
概念並不難
你可以想像當App跳出操作介面的時候
申請註冊的方式採用身份證字號以及自己預設一組密碼
以後再次開起App以後就改成自動登入
登入完成之後
可以由User自己選醫院, 門診科室, 還有輸入掛號的號碼
接下來就根據輸入的醫院跟門診科室去加入社群群組
你可以自己用一組文數字去自動編輯出科室群組的編號
比如亞東醫院內科第二診室, 編號為YDH01002
於是App就傳送出這幾個資料給伺服器
比如說
A123456780 JOIN TO YDH01002 FOR NUMBER 283 ON Nov 27, 2017
或者你也可以把它改成JSON格式
{ "A123456780",  "YDH01002", "283", "2017/10/27" }
連進伺服器之後
伺服器就會把它儲存到資料庫裏面
伺服器就可以根據所有同一個科室已加入的成員名單傳送
伺服器要寫這段程式應該是很簡單才對

反而是你用Arduino想去讀伺服器的資料庫的這段
就有點怪怪的
Arduino並沒有網路給你用
你只能透過TTL COM Port去連接
如果你還去外加Wifi或Ethernet介面
反而成本變高了
另外還有一點是有的門診科室有時候是會跳號的
很可能突然間會從381號跳到192號
然後再跳回去382
像這種狀況你要怎麼去處理?
所以也很可能要用到的並不是一個按鍵開關就可以
而是可能需要一個數字鍵盤
那麼就有可能會是USB介面了
但USB數字鍵盤是無法連接到Arduino上的
而你要怎麼去處理?

而且科室內是不可能架成伺服器的
因為它不是外網
以系統架構來說
每一間門診科室
都需要一台能接上醫院內網的裝置
所以最好是用樹莓派相近的實驗板
最好是用LAN port
而以它作為社群群組發布訊息的終端裝置
然後只要架一台伺服器
不管有多少個科室多少間醫院
都共同連接到這台伺服器即可
作為發布訊息的群組裝置
仍然是這台伺服器的客戶端
只是它負責主動上傳號碼更新訊息
當伺服器收到某醫院某門診科室的更新訊息時
就搜尋出所有已加入這個群組的成員名單
然後就主動發送給成員手機上
手機App就可以根據這個更新資料
決定是否彈出訊息

作者: a7813195    時間: 2017-5-17 09:02 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: chevylin0802    時間: 2017-5-17 10:54 PM

本帖最後由 chevylin0802 於 2017-5-18 05:51 PM 編輯
a7813195 發表於 2017-5-17 09:02 PM
至於板子的選擇
我會慎重考慮大大的推薦


基本上是這個樣子
你可以先照你的意思做

QRCode的問題比較大一些
因為很多人是用電話掛號的
人並不在醫院現場
更何況掛號處總不可能每一個診室都貼一張QRCode讓你掃
像台大醫院多達數十個門診科室根本不可能有空位弄出那麼多診室的QRCode
即使弄一整個牆面讓你去掃
你也會發現光找門診科室所對應的QRCode就必需要找個老半天
所以QRCode通常都只能針對一個統一入口
因此我認為QRCode的設計在這個地方是有很大的問題存在的
至於網路掛號的情況
雖然可以使用QRCode的方式
問題是網站通常都由醫院發包給特定廠商去處理
對方是否同意加設QRCode也是問題
不是你自己認為OK他們就會同意
所以真的要實施QRCode來加入群組的可能性我認為機率很低

以下是通訊協議的時序圖

[attach]118817018[/attach]

我做了簡易的測試程式已經可以工作了
放在Github上
https://github.com/zhengyi0802/hibp_test
不過我自己的電腦只安裝Ubuntu Linux 16.04 LTS版本
所以如果你要改成Windows版
恐怕要自己去改
畢竟我只是把概念做出來給你看而已
你Server的部份仍然最好是用Java寫
而且一定只能寫成multithreaded server
網路上有現成的參考範例
我記得也有人git上傳到github裏


作者: love88131496    時間: 2018-3-4 03:58 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: evo0508    時間: 2018-3-16 03:34 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: a7813195    時間: 2018-3-31 03:58 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: s947477    時間: 2018-4-7 07:10 PM

提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 伊莉討論區 (https://attach1201.eyny.com/) Powered by Discuz!