如何做一個自己的開源聊天項目?(仿微信)

篇幅較長,感謝閱讀。

萬事開頭難

在我決定做開源是因爲自身工作接觸到大多數的項目都是基於開源大佬寫的框架,自覺慚愧,工作以來一直忙於業務與功能實現,多多少少做過的幾個項目也沒能抽出部分好一點的功能業務Maven包什麼的提供也同行使用或借鑑,這實在是有悖於自己的初心。

決定做開源是今年(2018)7月末的時候,自己曾做的一個Iot項目剛剛被幾個網上的朋友問到,並尋求源碼,那麼久做了一個Demo,並放到了GitHub上。

之後感覺應該做一個有自己情感注入的項目才行,而不是工作上的現實交易的項目,我想做一個屬於自己的項目,有意義的項目。

當時還在創業階段,給自己的時間也不多,所以能想到做什麼也確實是想法有限,更重要的是時間也有限。

謝謝一個人,讓我有了一個Idea去做一個項目,她經常說工作後什麼話都不能輕易說,偶爾沒有自己的空間去抒發自己的情緒,當時想到的是做一個個人樹洞的東西,但是那有點產品性,且有點不好給同行們借鑑。而我在創業時也剛剛好接觸到netty,之後用netty做了一個Iot物聯網項目,現在想到就是順便提升自己的能力,將netty運用並熟悉掌握起來,做一個聊天室吧,一開始想法侷限,就是一個在線聊天室。

初始項目演進

沒錯,一開始就是一個項目式的形式,我很快的完成了一個聊天的功能,並打了一個tag包。現在的地址是:demo
下載地址:demo

我實現了用戶登錄、聊天曆史、隨機用戶名、異步數據寫入等基本功能。
登錄是隨機分配的用戶名,聊天數據會緩存本地,channel斷開(用戶離線的時候就執行異步任務去存儲數據,在登錄界面時就讀取數據庫數據)

圖片描述
圖片描述

  • 1.2.0版本

修復聊天記錄功能,實現重複信息錄入,完善前端頁面,回車監聽等,對於前版本的本地緩存Map類型選用錯誤,對重複數據無法存儲

圖片描述
圖片描述

  • 1.3.0版本

用戶註冊登錄功能,系統聊天綁定用戶,禁止二次登錄等,前端頁面大改,用戶登錄後,id和channel一一對應,當出現二次id登錄且channel不同時,視爲二次登錄。

圖片描述
圖片描述
圖片描述

  • 1.4.1版本

本人主導SUI Mobile構建仿微信樣式頁面版,使用時開F12手機界面,修改前端樣式。
圖片描述

  • 1.5.2版本

TCP/IP軟硬件通信-單片機等應用的TCP通信,Netty處理二進制圖片發送聊天功能,前言說到的Iot物聯網項目的功能添加。

圖片描述

  • 1.5.8 版本

MQTT協議軟硬件通信等,Iot物聯網,這個暫時被提取爲分支模塊。

  • 1.6.0 版本

API調用Netty長鏈接執行發送消息(在線數、用戶列表)詳情地址

即可以以系統身份想在線channel發送數據。

圖片描述
圖片描述

到此,產品項目分支到一段落,到了這個時候項目已經積累了十多個參與者(QQ羣:628793702),在QQ羣貢獻一些他們的建議與在工作中遇到的問題。

GitHub地址:InChat
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通信模塊,僅以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快速開發集成。

InChat
A lightweight, efficient communication framework that supports chat and the Internet of Things(一個輕量級、高效率的支持聊天與物聯網的通訊框架)

圖片描述

從8月初到現在已經大約已經三個月了,由於一直沒有時間與精力很好的維護這個項目,心裏一直有所歉意。再次向每一個關注過InChat項目的朋友表示抱歉。

從12月初,準確的說,應該是前幾天開始,InChat已經開始進行合理的重構與演進設計,同時相關文檔都會分享到GitHub上,與本人博客中。
圖片描述

例如想在已經開始設計的登錄模塊。

開源IM項目-InChat登錄接口設計與實現(基於Netty)

一個不情之請

正如上文中說到的,我很感謝女朋友一直以來的陪伴,作爲程序猿來說,是很珍貴的,不過這個項目的初衷是爲了她而做的,而後能等到朋友與線上友人的支持真的是意料之外,再次很感謝各位熱愛開源的朋友。

圖片描述

明天就是她的生日,我希望把InChat繼續維持下去,作爲一個生日禮物必備的項目報告一直延續下去。

圖片描述

如果對本項目有興趣的,可以加入QQ羣:628793702,一起研究討論學習。

如果以上有一些對你有所幫助的話,還請到GitHub對項目點個Star。感謝對每一個開源者的支持!謝謝。

希望本項目對你有所幫助,我的目標暫定,一個小衆IM加物聯網的開源通訊項目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章