just missing rtp streams
This commit is contained in:
parent
8ad96dce26
commit
ad701f7a97
4 changed files with 258 additions and 23 deletions
34
common/disconnectcauses.go
Normal file
34
common/disconnectcauses.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
type TetraFlexCallDisconnectCauses byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
DisconnectReason_NotDisconnected TetraFlexCallDisconnectCauses = 255
|
||||||
|
DisconnectReason_Unknown TetraFlexCallDisconnectCauses = 0
|
||||||
|
DisconnectReason_UserRequested TetraFlexCallDisconnectCauses = 1
|
||||||
|
DisconnectReason_CalledPartyBusy TetraFlexCallDisconnectCauses = 2
|
||||||
|
DisconnectReason_CalledPartyNotReachable TetraFlexCallDisconnectCauses = 3
|
||||||
|
DisconnectReason_CalledPartyNotSupportEncryption TetraFlexCallDisconnectCauses = 4
|
||||||
|
DisconnectReason_Congestion TetraFlexCallDisconnectCauses = 5
|
||||||
|
DisconnectReason_NotAllowedTrafficCase TetraFlexCallDisconnectCauses = 6
|
||||||
|
DisconnectReason_IncompatibleTrafficCase TetraFlexCallDisconnectCauses = 7
|
||||||
|
DisconnectReason_RequestedServiceNotAvailable TetraFlexCallDisconnectCauses = 8
|
||||||
|
DisconnectReason_PreEmptiveUseResource TetraFlexCallDisconnectCauses = 9
|
||||||
|
DisconnectReason_InvalidCallIdentifier TetraFlexCallDisconnectCauses = 10
|
||||||
|
DisconnectReason_CallRejectedByCalled TetraFlexCallDisconnectCauses = 11
|
||||||
|
DisconnectReason_NoIdleCCEntity TetraFlexCallDisconnectCauses = 12
|
||||||
|
DisconnectReason_ExpiryTimer TetraFlexCallDisconnectCauses = 13
|
||||||
|
DisconnectReason_SwMIRequestedDisconnection TetraFlexCallDisconnectCauses = 14
|
||||||
|
DisconnectReason_AcknowledgedServiceNotCompleted TetraFlexCallDisconnectCauses = 15
|
||||||
|
DisconnectReason_UnknownTetraIdentity TetraFlexCallDisconnectCauses = 16
|
||||||
|
DisconnectReason_SSSpecificDisconnection TetraFlexCallDisconnectCauses = 17
|
||||||
|
DisconnectReason_UnknownExternalSubscriberIdentity TetraFlexCallDisconnectCauses = 18
|
||||||
|
DisconnectReason_CallRestorationOthersFailed TetraFlexCallDisconnectCauses = 19
|
||||||
|
DisconnectReason_CalledPartyRequiresEncryption TetraFlexCallDisconnectCauses = 20
|
||||||
|
DisconnectReason_ConcurrentSetupNotSupported TetraFlexCallDisconnectCauses = 21
|
||||||
|
DisconnectReason_CalledPartySameDM TetraFlexCallDisconnectCauses = 22
|
||||||
|
DisconnectReason_NonCallOwnerRequestedDisconnection TetraFlexCallDisconnectCauses = 23
|
||||||
|
DisconnectReason_CallCompletedElsewhere TetraFlexCallDisconnectCauses = 32
|
||||||
|
DisconnectReason_NetworkFailure TetraFlexCallDisconnectCauses = 100
|
||||||
|
DisconnectReason_IgnoreCallSilently TetraFlexCallDisconnectCauses = 255
|
||||||
|
)
|
|
@ -103,7 +103,7 @@ func (tc *TerminalClient) SubscribeEvents(messageTypes []tmkind.TetraFlexTermina
|
||||||
func (tc *TerminalClient) AttachGroups(groups []GroupConfig) (err error) {
|
func (tc *TerminalClient) AttachGroups(groups []GroupConfig) (err error) {
|
||||||
tfGroupAttachReq, err := NewTMIpApiGroupAttachRequest(groups)
|
tfGroupAttachReq, err := NewTMIpApiGroupAttachRequest(groups)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil
|
||||||
}
|
}
|
||||||
fmt.Println(hex.EncodeToString(tfGroupAttachReq.Encode()))
|
fmt.Println(hex.EncodeToString(tfGroupAttachReq.Encode()))
|
||||||
tc.HandlerMap[tfGroupAttachReq.handler] = make(chan HandlerResponse)
|
tc.HandlerMap[tfGroupAttachReq.handler] = make(chan HandlerResponse)
|
||||||
|
@ -120,13 +120,110 @@ func (tc *TerminalClient) AttachGroups(groups []GroupConfig) (err error) {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (tc *TerminalClient) CallSetup(address TetraFlexAddress, callType TetraFlexCallTypes, callPriority TetraFlexCallPriorities, hookCall bool, identityInfo TetraFlexIdentityInfo) (err error) {
|
func (tc *TerminalClient) CallSetup(address TetraFlexAddress, callType TetraFlexCallTypes, callPriority TetraFlexCallPriorities, hookCall bool, identityInfo TetraFlexIdentityInfo) (callRef byte, err error) {
|
||||||
//
|
tfCallSetupReq, err := NewTMIpApiCallSetupRequest(address, callType, callPriority, hookCall, identityInfo)
|
||||||
|
if err != nil {
|
||||||
|
return callRef, err
|
||||||
|
}
|
||||||
|
fmt.Println(hex.EncodeToString(tfCallSetupReq.Encode()))
|
||||||
|
tc.HandlerMap[tfCallSetupReq.handler] = make(chan HandlerResponse)
|
||||||
|
|
||||||
|
//fmt.Println(hex.EncodeToString(tfAuthReq.Encode()))
|
||||||
|
err = tc.Send(tfCallSetupReq)
|
||||||
|
if err != nil {
|
||||||
|
return callRef, err
|
||||||
|
}
|
||||||
|
response := <-tc.HandlerMap[tfCallSetupReq.handler]
|
||||||
|
if !response.Success {
|
||||||
|
return callRef, response.Error
|
||||||
|
}
|
||||||
|
//fmt.Println(hex.EncodeToString(response.TMR.payload))
|
||||||
|
callRef, err = response.TMR.readByte()
|
||||||
|
if err != nil {
|
||||||
|
return callRef, err
|
||||||
|
}
|
||||||
|
return callRef, nil
|
||||||
|
}
|
||||||
|
func (tc *TerminalClient) CallDisconnect(callRef byte, disconnectCause TetraFlexCallDisconnectCauses) (err error) {
|
||||||
|
tfCallDisconnectReq, err := NewTMIpApiCallDisconnectRequest(callRef, disconnectCause)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fmt.Println(hex.EncodeToString(tfCallDisconnectReq.Encode()))
|
||||||
|
tc.HandlerMap[tfCallDisconnectReq.handler] = make(chan HandlerResponse)
|
||||||
|
|
||||||
|
//fmt.Println(hex.EncodeToString(tfAuthReq.Encode()))
|
||||||
|
err = tc.Send(tfCallDisconnectReq)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response := <-tc.HandlerMap[tfCallDisconnectReq.handler]
|
||||||
|
if !response.Success {
|
||||||
|
return response.Error
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func (tc *TerminalClient) CallConnect(callRef byte) (err error) {
|
||||||
|
tfCallConnectReq, err := NewTMIpApiCallConnectRequest(callRef)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fmt.Println(hex.EncodeToString(tfCallConnectReq.Encode()))
|
||||||
|
tc.HandlerMap[tfCallConnectReq.handler] = make(chan HandlerResponse)
|
||||||
|
|
||||||
func (tc *TerminalClient) PTTRequest() {
|
//fmt.Println(hex.EncodeToString(tfAuthReq.Encode()))
|
||||||
|
err = tc.Send(tfCallConnectReq)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response := <-tc.HandlerMap[tfCallConnectReq.handler]
|
||||||
|
if !response.Success {
|
||||||
|
return response.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (tc *TerminalClient) PTTRequest(callRef byte, identityInfo TetraFlexIdentityInfo, octaStateByte byte) (err error) {
|
||||||
// IpApiCallPttRequest
|
// IpApiCallPttRequest
|
||||||
|
tfPTTRequest, err := NewTMIpApiCallPTTRequest(callRef, identityInfo, octaStateByte)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(hex.EncodeToString(tfPTTRequest.Encode()))
|
||||||
|
tc.HandlerMap[tfPTTRequest.handler] = make(chan HandlerResponse)
|
||||||
|
|
||||||
|
//fmt.Println(hex.EncodeToString(tfAuthReq.Encode()))
|
||||||
|
err = tc.Send(tfPTTRequest)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response := <-tc.HandlerMap[tfPTTRequest.handler]
|
||||||
|
if !response.Success {
|
||||||
|
return response.Error
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (tc *TerminalClient) PTTRelease(callRef byte) (err error) {
|
||||||
|
// IpApiCallPttRequest
|
||||||
|
tfPTTRelease, err := NewTMIpApiCallPTTRelease(callRef)
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(hex.EncodeToString(tfPTTRelease.Encode()))
|
||||||
|
tc.HandlerMap[tfPTTRelease.handler] = make(chan HandlerResponse)
|
||||||
|
|
||||||
|
//fmt.Println(hex.EncodeToString(tfAuthReq.Encode()))
|
||||||
|
err = tc.Send(tfPTTRelease)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response := <-tc.HandlerMap[tfPTTRelease.handler]
|
||||||
|
if !response.Success {
|
||||||
|
return response.Error
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -134,6 +231,8 @@ groupAddr := common.NewAddressFromSSINumber(103)
|
||||||
identityNum := common.NewAddressFromSSINumber(1007)
|
identityNum := common.NewAddressFromSSINumber(1007)
|
||||||
|
|
||||||
response, err = common.NewTMIpApiCallSetupRequest(*groupAddr, common.CallTypeGroup, common.CallPriorityDefault, false, common.TetraFlexIdentityInfo{
|
response, err = common.NewTMIpApiCallSetupRequest(*groupAddr, common.CallTypeGroup, common.CallPriorityDefault, false, common.TetraFlexIdentityInfo{
|
||||||
|
|
||||||
|
|
||||||
Description: "blurb",
|
Description: "blurb",
|
||||||
Kind: common.IdentityKindTerminal,
|
Kind: common.IdentityKindTerminal,
|
||||||
Address: *identityNum,
|
Address: *identityNum,
|
||||||
|
|
|
@ -321,20 +321,6 @@ func NewTMIpApiGroupAttachRequest(groupConfig []GroupConfig) (tm *TerminalMessag
|
||||||
return terminalMessage, nil
|
return terminalMessage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTMIpApiCallConnectRequest(callRef byte) (tm *TerminalMessage, err error) {
|
|
||||||
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiCallConnectRequest, NextHandlerID())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if err = terminalMessage.WriteByte(callRef); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
//Fill 55
|
|
||||||
if err = terminalMessage.FillZero(55); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return terminalMessage, nil
|
|
||||||
}
|
|
||||||
func NewTMIpApiSoftwareInfoRequest(ref byte) (tm *TerminalMessage, err error) {
|
func NewTMIpApiSoftwareInfoRequest(ref byte) (tm *TerminalMessage, err error) {
|
||||||
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiSoftwareInfoRequest, NextHandlerID())
|
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiSoftwareInfoRequest, NextHandlerID())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -414,6 +400,35 @@ func NewTMIpApiCallSetupRequest(address TetraFlexAddress, callType TetraFlexCall
|
||||||
}
|
}
|
||||||
return terminalMessage, nil
|
return terminalMessage, nil
|
||||||
}
|
}
|
||||||
|
func NewTMIpApiCallConnectRequest(callRef byte) (tm *TerminalMessage, err error) {
|
||||||
|
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiCallConnectRequest, NextHandlerID())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.WriteByte(callRef); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.FillZero(55); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return terminalMessage, nil
|
||||||
|
}
|
||||||
|
func NewTMIpApiCallDisconnectRequest(callRef byte, disconnectCause TetraFlexCallDisconnectCauses) (tm *TerminalMessage, err error) {
|
||||||
|
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiCallDisconnectRequest, NextHandlerID())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.WriteByte(callRef); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.WriteByte(byte(disconnectCause)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.FillZero(54); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return terminalMessage, nil
|
||||||
|
}
|
||||||
func NewTMIpApiCallStreamRequest(uint1 uint, callRef byte, streamRef byte, audioChannelType TetraFlexAudioChannelTypes) (tm *TerminalMessage, err error) {
|
func NewTMIpApiCallStreamRequest(uint1 uint, callRef byte, streamRef byte, audioChannelType TetraFlexAudioChannelTypes) (tm *TerminalMessage, err error) {
|
||||||
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiCallStreamRequest, NextHandlerID())
|
terminalMessage, err := NewTerminalMessage(64, tmkind.IpApiCallStreamRequest, NextHandlerID())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -510,3 +525,38 @@ func NewTMIpApiCallPTTRequest(callRef byte, identityInfo TetraFlexIdentityInfo,
|
||||||
}
|
}
|
||||||
return terminalMessage, nil
|
return terminalMessage, nil
|
||||||
}
|
}
|
||||||
|
func NewTMIpApiCallPTTRelease(callRef byte) (tm *TerminalMessage, err error) {
|
||||||
|
terminalMessage, err := NewTerminalMessage(128, tmkind.IpApiCallPttRequest, NextHandlerID())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.WriteByte(callRef); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.WriteByte(255); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.FillZero(2); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//WriteIdentityInfoAddress
|
||||||
|
if err = terminalMessage.WriteTFAddress(TetraFlexAddressEmpty); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//WriteIdentityInfoDescr (protoHelper1:334)
|
||||||
|
if err = terminalMessage.WriteString("", 64); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//WriteIdentityInfoKind
|
||||||
|
if err = terminalMessage.WriteByte(0); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//WriteIdentityInfoUnfied ()
|
||||||
|
if err = terminalMessage.WriteByte(0); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = terminalMessage.FillZero(10); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return terminalMessage, nil
|
||||||
|
}
|
||||||
|
|
62
main.go
62
main.go
|
@ -16,14 +16,14 @@ func main() {
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
terminalClient := common.NewTerminalClient("192.168.133.106:42381")
|
|
||||||
|
|
||||||
//data := make([]byte, 256)
|
terminalClient := common.NewTerminalClient("192.168.133.106:42381")
|
||||||
|
//
|
||||||
err = terminalClient.Connect()
|
err = terminalClient.Connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
//
|
||||||
myAddr := common.TetraFlexAddress{
|
myAddr := common.TetraFlexAddress{
|
||||||
Kind: common.UserNo,
|
Kind: common.UserNo,
|
||||||
UserNo: "1005",
|
UserNo: "1005",
|
||||||
|
@ -32,7 +32,7 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
//
|
||||||
err = terminalClient.SubscribeEvents([]tmkind.TetraFlexTerminalMessageKinds{
|
err = terminalClient.SubscribeEvents([]tmkind.TetraFlexTerminalMessageKinds{
|
||||||
tmkind.IpApiCallUpdateNotification,
|
tmkind.IpApiCallUpdateNotification,
|
||||||
tmkind.IpApiSdsTlReportNotification,
|
tmkind.IpApiSdsTlReportNotification,
|
||||||
|
@ -44,6 +44,8 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
|
||||||
//fmt.Println(hex.EncodeToString(parsedMsg.Bytes()))
|
//fmt.Println(hex.EncodeToString(parsedMsg.Bytes()))
|
||||||
regInfoBytes, _ := json.Marshal(terminalClient.RegistrationInfo)
|
regInfoBytes, _ := json.Marshal(terminalClient.RegistrationInfo)
|
||||||
fmt.Println(string(regInfoBytes))
|
fmt.Println(string(regInfoBytes))
|
||||||
|
@ -65,7 +67,58 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
fmt.Println("Groups attached")
|
||||||
|
go func() {
|
||||||
|
fmt.Println("Test started, waiting 3s")
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
groupAddr := common.NewAddressFromSSINumber(101)
|
||||||
|
fmt.Println("Test callSetup")
|
||||||
|
callRef, err := terminalClient.CallSetup(*groupAddr, common.CallTypeGroup, common.CallPriorityDefault, false, common.TetraFlexIdentityInfo{
|
||||||
|
Description: "Blaa",
|
||||||
|
|
||||||
|
/* Kind: common.IdentityKindApplication,
|
||||||
|
Address: *common.NewAddressFromSSINumber(1002),
|
||||||
|
UnifiedSSIKinds: common.UnifiedKindExternalNumber,
|
||||||
|
*/
|
||||||
|
Kind: common.IdentityKindTerminal,
|
||||||
|
Address: *common.NewAddressFromSSINumber(1002),
|
||||||
|
UnifiedSSIKinds: common.UnifiedKindPersonalNumber,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("callRef=%d\n", callRef)
|
||||||
|
|
||||||
|
// IpApiCallStreamRequest
|
||||||
|
err = terminalClient.PTTRequest(callRef, common.TetraFlexIdentityInfo{
|
||||||
|
Description: "Blaa",
|
||||||
|
|
||||||
|
/* Kind: common.IdentityKindApplication,
|
||||||
|
Address: *common.NewAddressFromSSINumber(1002),
|
||||||
|
UnifiedSSIKinds: common.UnifiedKindExternalNumber,
|
||||||
|
*/
|
||||||
|
Kind: common.IdentityKindTerminal,
|
||||||
|
Address: *common.NewAddressFromSSINumber(1002),
|
||||||
|
UnifiedSSIKinds: common.UnifiedKindPersonalNumber,
|
||||||
|
}, 0)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
// PTT Release
|
||||||
|
err = terminalClient.PTTRelease(callRef)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
time.Sleep(3 * time.Second)
|
||||||
|
|
||||||
|
err = terminalClient.CallDisconnect(callRef, common.DisconnectReason_CallRejectedByCalled)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// IpApiCallPttRequest
|
||||||
|
}()
|
||||||
|
// idk send help xD
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case parsedMsg := <-terminalClient.RX:
|
case parsedMsg := <-terminalClient.RX:
|
||||||
|
@ -80,7 +133,6 @@ func main() {
|
||||||
//terminalClient.SendTM()
|
//terminalClient.SendTM()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//if parsedMsg.Kind == tmkind.IpApiNo
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue