如何做一個自己的開源聊天專案?(仿微信)
篇幅較長,感謝閱讀。
萬事開頭難
在我決定做開源是因為自身工作接觸到大多數的專案都是基於開源大佬寫的框架,自覺慚愧,工作以來一直忙於業務與功能實現,多多少少做過的幾個專案也沒能抽出部分好一點的功能業務Maven包什麼的提供也同行使用或借鑑,這實在是有悖於自己的初心。
決定做開源是今年(2018)7月末的時候,自己曾做的一個Iot專案剛剛被幾個網上的朋友問到,並尋求原始碼,那麼久做了一個Demo,並放到了GitHub上。
之後感覺應該做一個有自己情感注入的專案才行,而不是工作上的現實交易的專案,我想做一個屬於自己的專案,有意義的專案。
當時還在創業階段,給自己的時間也不多,所以能想到做什麼也確實是想法有限,更重要的是時間也有限。
謝謝一個人,讓我有了一個Idea去做一個專案,她經常說工作後什麼話都不能輕易說,偶爾沒有自己的空間去抒發自己的情緒,當時想到的是做一個個人樹洞的東西,但是那有點產品性,且有點不好給同行們借鑑。而我在創業時也剛剛好接觸到netty,之後用netty做了一個Iot物聯網專案,現在想到就是順便提升自己的能力,將netty運用並熟悉掌握起來,做一個聊天室吧,一開始想法侷限,就是一個線上聊天室。
初始專案演進
沒錯,一開始就是一個專案式的形式,我很快的完成了一個聊天的功能,並打了一個tag包。現在的地址是: ofollow,noindex">demo 。
下載地址: demo
- 1.0.0版本 詳情介紹
我實現了使用者登入、聊天曆史、隨機使用者名稱、非同步資料寫入等基本功能。
登入是隨機分配的使用者名稱,聊天資料會快取本地,channel斷開(使用者離線的時候就執行非同步任務去儲存資料,在登入介面時就讀取資料庫資料)
[圖片上傳失敗...(image-22c496-1543989196979)]
[圖片上傳失敗...(image-ba983e-1543989196979)]
- 1.2.0版本
修復聊天記錄功能,實現重複資訊錄入,完善前端頁面,回車監聽等,對於前版本的本地快取Map型別選用錯誤,對重複資料無法儲存
[圖片上傳失敗...(image-433d50-1543989196979)]
[圖片上傳失敗...(image-dd3aac-1543989196979)]
- 1.3.0版本
使用者註冊登入功能,系統聊天繫結使用者,禁止二次登入等,前端頁面大改,使用者登入後,id和channel一一對應,當出現二次id登入且channel不同時,視為二次登入。
[圖片上傳失敗...(image-5f60fa-1543989196979)]
[圖片上傳失敗...(image-a87f3e-1543989196979)]
[圖片上傳失敗...(image-820706-1543989196979)]
- 1.4.1版本
本人主導SUI Mobile構建仿微信樣式頁面版,使用時開F12手機介面,修改前端樣式。
[圖片上傳失敗...(image-6e56b7-1543989196979)]
- 1.5.2版本
TCP/IP軟硬體通訊-微控制器等應用的TCP通訊,Netty處理二進位制圖片傳送聊天功能,前言說到的Iot物聯網專案的功能新增。
[圖片上傳失敗...(image-5f34f9-1543989196979)]
- 1.5.8 版本
MQTT協議軟硬體通訊等,Iot物聯網,這個暫時被提取為分支模組。
- 1.6.0 版本
API呼叫Netty長連結執行傳送訊息(線上數、使用者列表) 詳情地址
即可以以系統身份想線上channel傳送資料。
[圖片上傳失敗...(image-43d44c-1543989196979)]
[圖片上傳失敗...(image-4acb7a-1543989196979)]
到此,產品專案分支到一段落,到了這個時候專案已經積累了十多個參與者(QQ群:628793702),在QQ群貢獻一些他們的建議與在工作中遇到的問題。
A lightweight, efficient communication framework that supports chat and the Internet of Things(一個輕量級、高效率的支援聊天與物聯網的通訊框架)
分支開啟之路
paho-mqtt分支
感謝一個在成都的朋友提供的業務場景,需要小程式參與控制Iot物聯網,並使用MQTT的場景。
本Demo是小程式端的Iot案例簡單實現。
服務端配置
首先是配置修改,你可以在本分支的yml配置檔案進行mqtt的配置,核心的引數是:
ssl: false # 使用ssl加密 protocol: MQTT_WS_PAHO # MQTT MQTT_WS_MQTT(mqtts.js) MQTT_WS_PAHO(paho.js)
本專案使用的paho.js的mqtt連線形式,所以protocol要選擇MQTT_WS_PAHO。專案目前是未加密的,啟動ssl本案例暫時不能通訊。
預設直接啟動專案就好。
專案啟動後的地址 : ws://192.168.1.121:8094/mqtt
ws、與字尾mqtt是com.myself.nettychat.bootstrap.AbstractBootstrapServer.java中的配置
小程式配置
你需要小程式開發者工具,並預設認定你是具備基本的小程式開發經驗的開發者,這裡省略部分的基本配置,你只需要將本分支中 wechat-client 資料夾中的檔案完全複製到你新建的小程式專案即可,除錯情況下無需AppID
你需要注意的是pages/connect/connect.js中的第78行
var client = new MQTT.Client("ws://" + this.data.server_addr+"/mqtt", "clientId_" + Math.random().toString(36).substr(2));
這裡就是小程式的連線地址配置,預設和專案啟動的一致,你需要在小程式的連線頁面填寫你的
IP:埠
然後就連線成功了,接著你可以在subscribe頁面訂閱一個主題,本Demo是訂閱TEST。

Image text
Java模擬MQtt客戶端
執行test中的com.myself.nettychat.MqttPublishSample,你需要修改成本機的配置,類似連線地址等
String broker = " ws://192.168.1.121:8094/mqtt ";//地址
需要注意的是,你的topic也要與小程式訂閱的主題一致哦!
執行測試用例,模擬硬體傳送資訊

Image text

Image text
測試
回到小程式的message頁面,你可以看到接收到了訊息

Image text
tcp-wechat
專案介紹
針對小程式與微控制器硬體執行Iot物聯網通訊(TCP/IP)的一套完整Demo。
啟動流程
1、啟動專案,tcp監聽成功
2、執行com.myself.nettychat.tcptest.TCPTestClient (記得先改ip或埠,如果你有修改的話)
3、執行PostMan,請求下方的API 進行通訊測試
Demo場景
小程式端選購售貨機中的商品,點選購買(小程式API向Iot中心傳送對應商品的開鎖資訊),Iot中心中轉開鎖資訊給微控制器,微控制器接收資訊開啟對應的鎖。
通訊機制:幀頭+ID+資料型別+24把鎖狀態+crc校驗+幀尾(可以按照需求進行定製)
com.myself.nettychat.config.TCPServerHandler (通訊接收的處理類)
API(小程式呼叫介面)
http://localhost:8080/susu/back/get_channel_size GET
請求Iot中心,獲取當前連線存活狀態下的連結例項
{ "code": 200, "msg": "成功", "data": 1 }
http://localhost:8080/susu/back/get_channel_id_list GET
請求Iot中心,當前存活狀態下的連結Id列表
{ "code": 200, "msg": "成功", "data": [ "F5690137563CC8" ] }
http://localhost:8080/susu/back/send_to_channel POST
引數
- channelId //第二個API獲取到的連結Id
- lock //將要開啟的第幾把鎖 1-24(看微控制器接入的鎖的數量)
{ "code": 200, "msg": "成功", "data": "【傳送成功】" }
im-api
簡介
本專案為InChat核心專案,服務端專案,以API形式作為對外功能,類似騰訊IM的服務端作用,本文也將著重講解本專案的各個API,目前還沒有嵌入Iot通訊模組,僅以Socket/">WebSocket的聊天室作為初期發展,需要使用到Iot的朋友可以先去 Master 專案瞭解。
swagger-ui
前端對接公告,目前推出API,請均已此文件說明的為主,其餘API非正式版或測試版,誤用
檢視API列表
http://localhost:8080/susu/swagger-ui.html
API列表詳情
- 1、賬號註冊
POST http://loclhost:8080/susu/user/to_register
- 引數:username(使用者名稱)
- 引數:password(密碼)
- 前端Tip:傳值判斷,引數均不能為空,密碼限制在前端做判斷
返回碼與資訊值
返回碼 | 資訊內容 | 備註 |
---|---|---|
200 | 成功 | |
555 | 引數錯誤 | |
556 | 使用者名稱存在 |
提示
僅API列表詳情中的API處於可用狀態,其餘API請勿使用,暫未基本完成,使用請詳看文件
webrtc
一個基於WebRTC與netty相結合的語音與視訊流通訊專案。還在構建中,,,

Image text
關於分支的想法
由於構建為分支,是因為暫時不能全部融合在一起,很多場景暫時是獨立的,所以我針對朋友們的建議,構建了不同的分支專案,並且竟可能的實現其要求的功能。
這些分支不會被拋棄,我會在後期將他們整理到真正的正版專案中去。
InChat雛形
感謝以上所有的沉澱!!!
專案現在已經開始了重構與業務程式碼的抽離,我將把以上的功能全部抽成一個InChat-Maven包,並配合SpringBoot快速開發整合。
A lightweight, efficient communication framework that supports chat and the Internet of Things(一個輕量級、高效率的支援聊天與物聯網的通訊框架)

微信圖片_20181123151842.png
從8月初到現在已經大約已經三個月了,由於一直沒有時間與精力很好的維護這個專案,心裡一直有所歉意。再次向每一個關注過InChat專案的朋友表示抱歉。
從12月初,準確的說,應該是前幾天開始,InChat已經開始進行合理的重構與演進設計,同時相關文件都會分享到GitHub上,與本人部落格中。

微信圖片_20181123153533.png
例如想在已經開始設計的登入模組。
開源IM專案-InChat登入介面設計與實現(基於Netty)
一個不情之請
正如上文中說到的,我很感謝女朋友一直以來的陪伴,作為程式猿來說,是很珍貴的,不過這個專案的初衷是為了她而做的,而後能等到朋友與線上友人的支援真的是意料之外,再次很感謝各位熱愛開源的朋友。
明天就是她的生日,我希望把 InChat 繼續維持下去,作為一個生日禮物必備的專案報告一直延續下去。
如果以上有一些對你有所幫助的話,還請到GitHub對專案點個Star。感謝對每一個開源者的支援!謝謝。
希望本專案對你有所幫助,我的目標暫定,一個小眾IM加物聯網的開源通訊專案。

1787897575-5b6fb1bf2b46f_articlex.png