Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

发送设备目录查询信息 不支持的命令 #9

Closed
pans0930 opened this issue Apr 5, 2023 · 8 comments · Fixed by #10
Closed

发送设备目录查询信息 不支持的命令 #9

pans0930 opened this issue Apr 5, 2023 · 8 comments · Fixed by #10

Comments

@pans0930
Copy link

pans0930 commented Apr 5, 2023

gb下的command.go发送Query的Catalog命令时,显示不支持的Message方法实现,本人golang功底比较浅,望指教

@chenjianhao66
Copy link
Owner

你好,目前关于文件目录的Catlog命令以及返回响应已经实现了,并且将其返回的命令响应已经通过map的形式存储 gb包下message.go源文件中的 messageHandler 中:

messageHandler = map[string]gosip.RequestHandler{
  // 通知
  "Notify:Keepalive": keepaliveHandler,
  
  // 响应
  // 查询设备信息响应
  "Response:DeviceInfo": deviceInfoHandler,
  "Response:Catalog":    catalogHandler,
}

这个map的key在parser包中的GetCmdTypeFromXML函数中返回;显示不支持的Message方法实现,就意味着返回的key在messageHandler中不存在。

根据你的描述,我判断是目前程序不支持其他的query 目录请求;当前版本对于设备信息查询的支持,只支持以下实现:

下面的举例会以:支持项(在messageHandler的key) 方式显示

  • 设备目录信息查询请求(Response:Catalog)
  • 设备信息查询请求(Response:DeviceInfo)
  • 设备心跳(Notify:Keepalive)

我判断 不支持的message 方法实现是因为经过 parser包的GetCmdTypeFromXML函数解析后,返回的 keymessageHandler不存在,你这边在debug一下看看解析出来的key是什么

@pans0930
Copy link
Author

pans0930 commented Apr 6, 2023

你好,目前关于文件目录的Catlog命令以及返回响应已经实现了,并且将其返回的命令响应已经通过map的形式存储 gb包下message.go源文件中的 messageHandler 中:

messageHandler = map[string]gosip.RequestHandler{
  // 通知
  "Notify:Keepalive": keepaliveHandler,
  
  // 响应
  // 查询设备信息响应
  "Response:DeviceInfo": deviceInfoHandler,
  "Response:Catalog":    catalogHandler,
}

这个map的key在parser包中的GetCmdTypeFromXML函数中返回;显示不支持的Message方法实现,就意味着返回的key在messageHandler中不存在。

根据你的描述,我判断是目前程序不支持其他的query 目录请求;当前版本对于设备信息查询的支持,只支持以下实现:

下面的举例会以:支持项(在messageHandler的key) 方式显示

  • 设备目录信息查询请求(Response:Catalog)
  • 设备信息查询请求(Response:DeviceInfo)
  • 设备心跳(Notify:Keepalive)

我判断 不支持的message 方法实现是因为经过 parser包的GetCmdTypeFromXML函数解析后,返回的 keymessageHandler不存在,你这边在debug一下看看解析出来的key是什么

2023-04-06 16:38:37.664 DEBUG gb/message.go:30 MESSAGE消息体:
[MESSAGE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.168.5.121:5060;branch=z9hG4bK1680770317624
CSeq: 55 MESSAGE
From: sip:44010200492000000001@4401020049;tag=FTxEswQJhmuYO5DEpPFZXvbbkt5QAsOH
To: sip:[email protected]
Call-ID: WFrNzKmqVbHLXywFP69CGR3ptMVz5KPq
Max-Forwards: 70
Content-Type: Application/MANSCDP+xml
User-Agent: go-gb
Content-Length: 151

DeviceInfo 701385 34020000001320000003 ] 2023-04-06 16:38:37.665 INFO gb/message.go:37 [解析出的命令: :] 2023-04-06 16:38:37.665 WARN gb/message.go:43 [不支持的Message方法实现]

个人看到的是因为在下发查询设备信息的时候,就走到了message.go了,我debug了下,发现好像是服务端到客户端的sdp未发出去

@pans0930
Copy link
Author

pans0930 commented Apr 6, 2023

`2023-04-06 16:38:37.676 DEBUG gb/command.go:44 发送设备目录查询信息:
[MESSAGE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.168.5.121:5060;branch=z9hG4bK1680770317664
CSeq: 56 MESSAGE
From: sip:44010200492000000001@4401020049;tag=vQFidq7x7y2fGBt0IFBAxgqYLNqyjuOF
To: sip:[email protected]
Call-ID: L4cQn1QxRMlLGMoWfsbdf92qaaRUpmHY
Max-Forwards: 70
Content-Type: Application/MANSCDP+xml
User-Agent: go-gb
Content-Length: 147

Catalog 88884 34020000001320000003 ] 2023-04-06 16:38:37.677 INFO gb/request.go:36 [发送SIP Request消息,Method为: MESSAGE] 2023-04-06 16:38:37.678 INFO gb/message.go:29 [处理MESSAGE消息...] 2023-04-06 16:38:37.678 DEBUG gb/message.go:30 MESSAGE消息体: [MESSAGE sip:[email protected] SIP/2.0 Via: SIP/2.0/UDP 192.168.5.121:5060;branch=z9hG4bK1680770317664 CSeq: 56 MESSAGE From: ;tag=vQFidq7x7y2fGBt0IFBAxgqYLNqyjuOF To: Call-ID: L4cQn1QxRMlLGMoWfsbdf92qaaRUpmHY Max-Forwards: 70 Content-Type: Application/MANSCDP+xml User-Agent: go-gb Content-Length: 147 Catalog 88884 34020000001320000003 ] 2023-04-06 16:38:37.678 INFO gb/message.go:37 [解析出的命令: :] 2023-04-06 16:38:37.678 WARN gb/message.go:43 [不支持的Message方法实现]`

@chenjianhao66
Copy link
Owner

在你发出的log中,在parser包中的GetCmdTypeFromXML函数返回的key是 ,用这个key去messageHandler去找对应的函数是找不到的,我在使用海康的摄像头调试时,对应的SIP响应包会是以下结构:

MESSAGE sip:44010200492000000001@4401020049 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.222:5060;rport=5060;branch=z9hG4bK290042240
From: <sip:44010200491118000001@4401020049>;tag=671018362
To: <sip:44010200492000000001@4401020049>
Call-ID: 1984090469
CSeq: 20 MESSAGE
Content-Type: Application/MANSCDP+xml
Max-Forwards: 70
User-Agent: IP Camera
Content-Length: 300

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <CmdType>DeviceInfo</CmdType>
  <SN>701385</SN>
  <DeviceID>44010200491118000001</DeviceID>
  <Result>OK</Result>
  <DeviceName>IP DOME</DeviceName>
  <Manufacturer>Hikvision</Manufacturer>
  <Model>DS-2DE3104W-DE</Model>
  <Firmware>V5.4.0</Firmware>
</Response>

在消息体body中,会以标准的XML配置文件结构格式去放置所返回的消息。但是从你发出的log中可以看出:

MESSAGE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.168.5.121:5060;branch=z9hG4bK1680770317664
CSeq: 56 MESSAGE
From: sip:44010200492000000001@4401020049;tag=vQFidq7x7y2fGBt0IFBAxgqYLNqyjuOF
To: sip:[email protected]
Call-ID: L4cQn1QxRMlLGMoWfsbdf92qaaRUpmHY
Max-Forwards: 70
Content-Type: Application/MANSCDP+xml
User-Agent: go-gb
Content-Length: 147

Catalog 88884 34020000001320000003 

并没有以XML配置文件结构去存放返回信息,所以会解析key失败,进而导致找不到对应的Handler函数去解析,最终显示不支持的Message方法实现log。

@pans0930
Copy link
Author

pans0930 commented Apr 6, 2023

func newTo(user, host string) *sip.Address {
	return &sip.Address{
		Uri: &sip.SipUri{
			FUser: sip.String{Str: user},
			FHost: host,
		},
	}
}

这段代码的一个端口参数未加上,您这边默认用的5060,但是可能设备的端口不是5060,pr我就不提了,可以从device去获取port端口了

func newTo(user, host string) *sip.Address {
	port := sip.Port(5063)
	return &sip.Address{
		Uri: &sip.SipUri{
			FUser: sip.String{Str: user},
			FHost: host,
			FPort: &port,
		},
	}
}

@chenjianhao66
Copy link
Owner

func newTo(user, host string) *sip.Address {
	return &sip.Address{
		Uri: &sip.SipUri{
			FUser: sip.String{Str: user},
			FHost: host,
		},
	}
}

这段代码的一个端口参数未加上,您这边默认用的5060,但是可能设备的端口不是5060,pr我就不提了,可以从device去获取port端口了

func newTo(user, host string) *sip.Address {
	port := sip.Port(5063)
	return &sip.Address{
		Uri: &sip.SipUri{
			FUser: sip.String{Str: user},
			FHost: host,
			FPort: &port,
		},
	}
}

嗯,后续我会修复这个函数。
前面的问题Message不支持的问题是否已经解决?

@pans0930
Copy link
Author

pans0930 commented Apr 6, 2023

这个问题应该是Query的消息也走到了

messageHandler = map[string]gosip.RequestHandler{
  // 通知
  "Notify:Keepalive": keepaliveHandler,
  
  // 响应
  // 查询设备信息响应
  "Response:DeviceInfo": deviceInfoHandler,
  "Response:Catalog":    catalogHandler,
}

只是如果是“Query:DeviceInfo”或者是“Query:Catalog”,也会走到messageHandler里面,有点奇怪,我还找到哪里,不过目前测试是没问题了,可能是因为服务端和客户端的端口在程序里面都是5060,ip都是本机IP,所以死循环了,发送也是接受,所以未找到消息类型

谢谢,没啥问题,我先关了

@tocurd
Copy link
Contributor

tocurd commented Apr 24, 2023

@pans0911 看下回复的xml是不是gb2312格式,我也遇到了这个问题,可以尝试下 #13

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants