Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
ccim_sdk_android
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sheteng
ccim_sdk_android
Commits
05829b3f
Commit
05829b3f
authored
Nov 13, 2021
by
sheteng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
加入心跳
parent
30b8eb2b
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
195 additions
and
101 deletions
+195
-101
.idea/deploymentTargetDropDown.xml
.idea/deploymentTargetDropDown.xml
+17
-0
app/build.gradle
app/build.gradle
+8
-6
app/src/main/java/com/ccwangluo/im/FirstFragment.java
app/src/main/java/com/ccwangluo/im/FirstFragment.java
+1
-1
app/src/main/res/layout/fragment_first.xml
app/src/main/res/layout/fragment_first.xml
+1
-1
ccim/src/main/java/com/ccwangluo/ccim/manage/SocketManageer.java
...c/main/java/com/ccwangluo/ccim/manage/SocketManageer.java
+41
-5
ccim/src/main/java/com/ccwangluo/ccim/modle/PulseData.java
ccim/src/main/java/com/ccwangluo/ccim/modle/PulseData.java
+23
-0
ccim/src/main/proto/chat.proto
ccim/src/main/proto/chat.proto
+104
-88
No files found.
.idea/deploymentTargetDropDown.xml
0 → 100644
View file @
05829b3f
<?xml version="1.0" encoding="UTF-8"?>
<project
version=
"4"
>
<component
name=
"deploymentTargetDropDown"
>
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type
value=
"RUNNING_DEVICE_TARGET"
/>
<deviceKey>
<Key>
<type
value=
"SERIAL_NUMBER"
/>
<value
value=
"10.4.6.88:5555"
/>
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown
value=
"2021-11-13T05:39:00.572615Z"
/>
</component>
</project>
\ No newline at end of file
app/build.gradle
View file @
05829b3f
...
...
@@ -34,17 +34,19 @@ android {
dependencies
{
def
multidex_version
=
"2.0.1"
implementation
"androidx.multidex:multidex:$multidex_version"
def
lifecycle_version
=
"2.3.1"
implementation
"androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation
"androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation
'androidx.appcompat:appcompat:1.3.1'
implementation
'com.google.android.material:material:1.4.0'
implementation
'androidx.constraintlayout:constraintlayout:2.1.1'
implementation
'androidx.navigation:navigation-fragment:2.3.0'
implementation
'androidx.navigation:navigation-ui:2.3.0'
implementation
project
(
path:
':ccim'
)
testImplementation
'junit:junit:4.+'
androidTestImplementation
'androidx.test.ext:junit:1.1.2'
androidTestImplementation
'androidx.test.espresso:espresso-core:3.3.0'
compile
'com.google.protobuf:protobuf-java:3.5.1'
implementation
'com.google.protobuf:protobuf-java:3.8.0'
implementation
'com.google.protobuf:protobuf-java-util:3.8.0'
implementation
'com.google.protobuf:protobuf-java:3.13.0'
implementation
'com.google.protobuf:protobuf-java:3.13.0'
implementation
'com.google.protobuf:protobuf-java-util:3.12.0'
implementation
'com.guolindev.permissionx:permissionx:1.6.1'
}
\ No newline at end of file
app/src/main/java/com/ccwangluo/im/FirstFragment.java
View file @
05829b3f
...
...
@@ -107,7 +107,7 @@ public class FirstFragment extends Fragment {
binding
.
searchUser
.
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
CCIMClient
.
getInstance
().
searchUser
(
"feng"
,
new
ResultEventCallback
<
List
<
Chat
.
SearchResponse
.
User
>>()
{
CCIMClient
.
getInstance
().
searchUser
(
binding
.
userName
.
getText
().
toString
()
,
new
ResultEventCallback
<
List
<
Chat
.
SearchResponse
.
User
>>()
{
@Override
public
void
onSuccess
(
List
<
Chat
.
SearchResponse
.
User
>
users
)
{
Log
.
d
(
TAG
,
"onSuccess: "
+
users
);
...
...
app/src/main/res/layout/fragment_first.xml
View file @
05829b3f
...
...
@@ -24,7 +24,7 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:hint=
"userId"
android:text=
"10
3
"
/>
android:text=
"10
1
"
/>
<EditText
android:id=
"@+id/userName"
...
...
ccim/src/main/java/com/ccwangluo/ccim/manage/SocketManageer.java
View file @
05829b3f
...
...
@@ -7,6 +7,7 @@ import com.ccwangluo.ccim.modle.IrequestData;
import
com.ccwangluo.ccim.modle.MyIReaderProtocol
;
import
com.ccwangluo.ccim.listener.MessageListener
;
import
com.ccwangluo.ccim.listener.ResultEventCallback
;
import
com.ccwangluo.ccim.modle.PulseData
;
import
com.ccwangluo.ccim.util.HmacUtil
;
import
com.xuhao.didi.core.pojo.OriginalData
;
import
com.xuhao.didi.socket.client.sdk.OkSocket
;
...
...
@@ -24,9 +25,9 @@ import ccim.protocol.Push;
public
class
SocketManageer
{
private
final
Logger
logger
=
Logger
.
getLogger
(
CCIMClient
.
class
.
getName
());
private
static
final
String
SERVER_IP
=
"117.144.156.2"
;
// private static final String SERVER_IP = "192.168.31.216
";
private
static
final
int
SERVER_PORT
=
800
0
;
//
private static final String SERVER_IP = "117.144.156.2";
private
static
final
String
SERVER_IP
=
"10.4.5.134
"
;
private
static
final
int
SERVER_PORT
=
800
1
;
private
static
final
int
version
=
1
;
...
...
@@ -64,6 +65,9 @@ public class SocketManageer {
@Override
public
void
onSuccess
(
Chat
.
ChatResponseMessage
chatResponseMessage
)
{
onConnectListener
.
onSocketConnection
();
Chat
.
ConnectResponse
connectRes
=
chatResponseMessage
.
getConnectRes
();
long
l
=
connectRes
.
getHeartBeatInterval
()
*
1000L
;
pulseData
(
l
);
}
});
}
...
...
@@ -77,9 +81,8 @@ public class SocketManageer {
this
.
chatInfo
=
initServer
(
SERVER_IP
,
SERVER_PORT
,
new
MessageListener
()
{
@Override
public
void
onServerConnect
()
{
// if(id == 1) {
if
(
id
==
1
)
connectChatServer
(
appKey
,
userName
,
extData
,
userId
,
ts
,
sign
);
// }
}
@Override
...
...
@@ -87,6 +90,14 @@ public class SocketManageer {
try
{
Chat
.
ChatResponseMessage
chatResponseMessage
=
Chat
.
ChatResponseMessage
.
parseFrom
(
data
.
getBodyBytes
());
logger
.
info
(
chatResponseMessage
.
toString
());
if
(
chatResponseMessage
.
hasHeartbeatRes
()){
OkSocket
.
open
(
chatInfo
).
getPulseManager
().
feed
();
return
;
}
if
(
chatResponseMessage
.
hasConnectionStateRes
()){
connectState
();
return
;
}
int
seq
=
chatResponseMessage
.
getHeader
().
getSeq
();
ResultEventCallback
<
Chat
.
ChatResponseMessage
>
callBack
=
callBackManager
.
getCallBack
(
seq
);
if
(
callBack
!=
null
)
{
...
...
@@ -110,6 +121,29 @@ public class SocketManageer {
});
}
/**
* 反馈连接状态给服务器
*/
private
void
connectState
(){
Chat
.
ConnectionStateAckRequest
defaultInstance
=
Chat
.
ConnectionStateAckRequest
.
getDefaultInstance
();
sendRequest
(
defaultInstance
);
}
/**
* 心跳
*/
private
void
pulseData
(
Long
frequency
){
OkSocketOptions
.
Builder
okOptionsBuilder
=
new
OkSocketOptions
.
Builder
();
okOptionsBuilder
.
setPulseFrequency
(
frequency
);
okOptionsBuilder
.
setReaderProtocol
(
new
MyIReaderProtocol
());
OkSocket
.
open
(
getChatInfo
()).
option
(
okOptionsBuilder
.
build
());
Chat
.
ChatRequestMessage
.
Builder
builder
=
Chat
.
ChatRequestMessage
.
newBuilder
();
builder
.
setHeartbeatReq
(
Chat
.
HeartbeatRequest
.
getDefaultInstance
());
OkSocket
.
open
(
getChatInfo
()).
getPulseManager
()
.
setPulseSendable
(
new
PulseData
(
builder
.
build
().
toByteArray
()))
//只需要设置一次,下一次可以直接调用pulse()
.
pulse
();
}
private
ConnectionInfo
initServer
(
String
ip
,
int
port
,
MessageListener
messageListener
)
{
ConnectionInfo
authInfo
=
new
ConnectionInfo
(
ip
,
port
);
//调用OkSocket,开启这次连接的通道,拿到通道Manager
...
...
@@ -189,6 +223,8 @@ public class SocketManageer {
builder
.
setRemoveMemberReq
((
Channel
.
RemoveMemberRequest
)
request
);
}
else
if
(
request
instanceof
Channel
.
ExitChannelRequest
){
builder
.
setExitChannelReq
((
Channel
.
ExitChannelRequest
)
request
);
}
else
if
(
request
instanceof
Chat
.
ConnectionStateAckRequest
){
builder
.
setConnectionStateAckReq
((
Chat
.
ConnectionStateAckRequest
)
request
);
}
OkSocket
.
open
(
getChatInfo
())
...
...
ccim/src/main/java/com/ccwangluo/ccim/modle/PulseData.java
0 → 100644
View file @
05829b3f
package
com.ccwangluo.ccim.modle
;
import
com.xuhao.didi.core.iocore.interfaces.IPulseSendable
;
import
java.nio.ByteBuffer
;
import
java.nio.ByteOrder
;
public
class
PulseData
implements
IPulseSendable
{
private
final
byte
[]
body
;
public
PulseData
(
byte
[]
body
){
this
.
body
=
body
;
}
@Override
public
byte
[]
parse
()
{
ByteBuffer
bb
=
ByteBuffer
.
allocate
(
4
+
body
.
length
);
bb
.
order
(
ByteOrder
.
BIG_ENDIAN
);
bb
.
putInt
(
body
.
length
);
bb
.
put
(
body
);
return
bb
.
array
();
}
}
ccim/src/main/proto/chat.proto
View file @
05829b3f
...
...
@@ -8,63 +8,69 @@ import "message.proto";
import
"push.proto"
;
message
ChatRequestMessage
{
RequestMessageHeader
header
=
1
;
oneof
payload
{
ConnectRequest
connect_req
=
2
;
// 连接
PullContactsRequest
pull_contacts_req
=
3
;
// 拉联系人
SearchRequest
search_req
=
4
;
// 查找用户
AddContactRequest
add_contact_req
=
5
;
// 添加联系人
ContactRequestsRequest
contact_requests_req
=
6
;
// 联系人申请列表
CheckContactReqRequest
check_contact_req_req
=
7
;
// 验证联系人申请
CreateContactGroupRequest
create_contact_group_req
=
8
;
// 创建联系人群组
MoveContactGroupRequest
move_contact_group_req
=
9
;
// 移动联系人所在群组
DeleteContactRequest
delete_contact_req
=
10
;
// 删除联系人
BlockContactRequest
block_contact_req
=
11
;
// 联系人拉入黑名单
ReportIllegalUserRequest
report_illegal_user_req
=
12
;
// 举报违规用户
PullOfflineMessageRequest
pull_offline_msg_req
=
13
;
// 拉取离线消息
CreateChannelRequest
create_channel_req
=
21
;
// 创建频道
JoinChannelRequest
join_channel_req
=
22
;
// 加入频道
RemoveMemberRequest
remove_member_req
=
23
;
// 移除成员
ExitChannelRequest
exit_channel_req
=
24
;
// 退出频道
SendMessageRequest
send_msg_req
=
42
;
// 发送消息
SendChannelMessageRequest
send_channel_msg_req
=
43
;
// 发送频道消息
PushPrivateMessageAckRequest
push_private_msg_ack_req
=
61
;
// 推送私人消息成功ack
PushChannelMessageAckRequest
push_channel_msg_ack_req
=
62
;
// 推送频道消息ack
}
RequestMessageHeader
header
=
1
;
oneof
payload
{
ConnectRequest
connect_req
=
2
;
// 连接
PullContactsRequest
pull_contacts_req
=
3
;
// 拉联系人
SearchRequest
search_req
=
4
;
// 查找用户
AddContactRequest
add_contact_req
=
5
;
// 添加联系人
ContactRequestsRequest
contact_requests_req
=
6
;
// 联系人申请列表
CheckContactReqRequest
check_contact_req_req
=
7
;
// 验证联系人申请
CreateContactGroupRequest
create_contact_group_req
=
8
;
// 创建联系人群组
MoveContactGroupRequest
move_contact_group_req
=
9
;
// 移动联系人所在群组
DeleteContactRequest
delete_contact_req
=
10
;
// 删除联系人
BlockContactRequest
block_contact_req
=
11
;
// 联系人拉入黑名单
ReportIllegalUserRequest
report_illegal_user_req
=
12
;
// 举报违规用户
PullOfflineMessageRequest
pull_offline_msg_req
=
13
;
// 拉取离线消息
CreateChannelRequest
create_channel_req
=
21
;
// 创建频道
JoinChannelRequest
join_channel_req
=
22
;
// 加入频道
RemoveMemberRequest
remove_member_req
=
23
;
// 移除成员
ExitChannelRequest
exit_channel_req
=
24
;
// 退出频道
SendMessageRequest
send_msg_req
=
42
;
// 发送消息
SendChannelMessageRequest
send_channel_msg_req
=
43
;
// 发送频道消息
PushPrivateMessageAckRequest
push_private_msg_ack_req
=
61
;
// 推送私人消息成功ack
PushChannelMessageAckRequest
push_channel_msg_ack_req
=
62
;
// 推送频道消息ack
HeartbeatRequest
heartbeat_req
=
100
;
ConnectionStateAckRequest
connection_state_ack_req
=
101
;
}
};
message
ChatResponseMessage
{
ResponseMessageHeader
header
=
1
;
oneof
payload
{
ConnectResponse
connect_res
=
2
;
PullContactsResponse
pull_contacts_res
=
3
;
SearchResponse
search_res
=
4
;
AddContactResponse
add_contact_res
=
5
;
ContactRequestsResponse
contact_requests_res
=
6
;
CheckContactReqResponse
check_contact_req_res
=
7
;
CreateContactGroupResponse
create_contact_group_res
=
8
;
MoveContactGroupResponse
move_contact_group_res
=
9
;
DeleteContactResponse
delete_contact_res
=
10
;
BlockContactResponse
block_contact_res
=
11
;
PullOfflineMessageResponse
pull_offline_msg_res
=
12
;
CreateChannelResponse
create_channel_res
=
21
;
JoinChannelResponse
join_channel_res
=
22
;
RemoveMemberResponse
remove_member_res
=
23
;
ExitChannelResponse
exit_channel_res
=
24
;
ReportIllegalUserResponse
report_illegal_user_res
=
41
;
SendMessageResponse
send_msg_res
=
42
;
SendChannelMessageResponse
send_channel_msg_res
=
43
;
PushPrivateMessageResponse
push_private_msg_res
=
61
;
PushChannelMessageResponse
push_channel_msg_res
=
62
;
}
ResponseMessageHeader
header
=
1
;
oneof
payload
{
ConnectResponse
connect_res
=
2
;
PullContactsResponse
pull_contacts_res
=
3
;
SearchResponse
search_res
=
4
;
AddContactResponse
add_contact_res
=
5
;
ContactRequestsResponse
contact_requests_res
=
6
;
CheckContactReqResponse
check_contact_req_res
=
7
;
CreateContactGroupResponse
create_contact_group_res
=
8
;
MoveContactGroupResponse
move_contact_group_res
=
9
;
DeleteContactResponse
delete_contact_res
=
10
;
BlockContactResponse
block_contact_res
=
11
;
PullOfflineMessageResponse
pull_offline_msg_res
=
12
;
CreateChannelResponse
create_channel_res
=
21
;
JoinChannelResponse
join_channel_res
=
22
;
RemoveMemberResponse
remove_member_res
=
23
;
ExitChannelResponse
exit_channel_res
=
24
;
ReportIllegalUserResponse
report_illegal_user_res
=
41
;
SendMessageResponse
send_msg_res
=
42
;
SendChannelMessageResponse
send_channel_msg_res
=
43
;
PushPrivateMessageResponse
push_private_msg_res
=
61
;
PushChannelMessageResponse
push_channel_msg_res
=
62
;
HeartbeatResponse
heartbeat_res
=
100
;
ConnectionStateResponse
connection_state_res
=
101
;
}
};
message
ConnectRequest
{
...
...
@@ -79,9 +85,9 @@ message ConnectRequest {
// ts=CurrentTimeMillis (毫秒)
}
message
ConnectResponse
{
bool
connected
=
1
;
//是否连接成功
bool
connected
=
1
;
//是否连接成功
int32
heart_beat_interval
=
2
;
}
message
PullContactsRequest
{}
...
...
@@ -126,85 +132,95 @@ message PullContactsResponse {
}
message
SearchRequest
{
string
username
=
1
;
string
username
=
1
;
}
message
SearchResponse
{
message
User
{
int64
user_id
=
1
;
string
username
=
2
;
}
repeated
User
users
=
1
;
message
User
{
int64
user_id
=
1
;
string
username
=
2
;
}
repeated
User
users
=
1
;
}
message
AddContactRequest
{
int64
user_id
=
1
;
int64
user_id
=
1
;
}
message
AddContactResponse
{
enum
AddResult
{
SUCCESS
=
0
;
ALREADY_SENT
=
1
;
NO_AUTHORITY
=
2
;
ALREADY_CONTACT
=
3
;
ACCEPT_REQ
=
4
;
// 接受对方的好友申请(对方已经发送申请,自己不必申请直接同意)
}
AddResult
result
=
1
;
enum
AddResult
{
SUCCESS
=
0
;
ALREADY_SENT
=
1
;
NO_AUTHORITY
=
2
;
ALREADY_CONTACT
=
3
;
ACCEPT_REQ
=
4
;
// 接受对方的好友申请(对方已经发送申请,自己不必申请直接同意)
}
AddResult
result
=
1
;
}
message
ContactRequestsRequest
{}
message
ContactRequestsResponse
{
message
ContactRequest
{
int64
user_id
=
1
;
string
username
=
2
;
}
repeated
ContactRequest
requests
=
1
;
message
ContactRequest
{
int64
user_id
=
1
;
string
username
=
2
;
}
repeated
ContactRequest
requests
=
1
;
}
message
CheckContactReqRequest
{
bool
accept
=
1
;
int64
req_user_id
=
2
;
bool
accept
=
1
;
int64
req_user_id
=
2
;
}
message
CheckContactReqResponse
{}
message
CreateContactGroupRequest
{
string
name
=
1
;
string
name
=
1
;
}
message
CreateContactGroupResponse
{
int64
group_id
=
1
;
int64
group_id
=
1
;
}
message
MoveContactGroupRequest
{
int64
contact_user_id
=
1
;
int64
contact_group_id
=
2
;
int64
contact_user_id
=
1
;
int64
contact_group_id
=
2
;
}
message
MoveContactGroupResponse
{
}
message
DeleteContactRequest
{
int64
contact_user_id
=
1
;
int64
contact_user_id
=
1
;
}
message
DeleteContactResponse
{
}
message
BlockContactRequest
{
int64
contact_user_id
=
1
;
bool
mute
=
2
;
int64
contact_user_id
=
1
;
bool
mute
=
2
;
}
message
BlockContactResponse
{
}
message
ReportIllegalUserRequest
{
int64
illegal_user_id
=
1
;
string
title
=
2
;
string
content
=
3
;
int64
illegal_user_id
=
1
;
string
title
=
2
;
string
content
=
3
;
}
message
ReportIllegalUserResponse
{}
message
HeartbeatRequest
{
}
message
HeartbeatResponse
{
}
message
ConnectionStateAckRequest
{}
message
ConnectionStateResponse
{
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment