Basic test component (disco Info)
This commit is contained in:
parent
ceeb51ce0e
commit
ff2da776d3
|
@ -7,11 +7,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
component := xmpp.Component{Host: "mqtt.localhost", Secret: "mypass"}
|
component := MyComponent{Name: "MQTT Component", Category: "gateway", Type: "mqtt"}
|
||||||
component.Connect("localhost:8888")
|
component.xmpp = &xmpp.Component{Host: "mqtt.localhost", Secret: "mypass"}
|
||||||
|
component.xmpp.Connect("localhost:8888")
|
||||||
|
|
||||||
for {
|
for {
|
||||||
packet, err := component.ReadPacket()
|
packet, err := component.xmpp.ReadPacket()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("read error", err)
|
fmt.Println("read error", err)
|
||||||
return
|
return
|
||||||
|
@ -21,7 +22,7 @@ func main() {
|
||||||
case xmpp.IQ:
|
case xmpp.IQ:
|
||||||
switch inner := p.Payload.(type) {
|
switch inner := p.Payload.(type) {
|
||||||
case *xmpp.Node:
|
case *xmpp.Node:
|
||||||
fmt.Println("Node:", inner.XMLName.Space, inner.XMLName.Local)
|
component.processIQ(p.Type, p.Id, p.From, inner)
|
||||||
default:
|
default:
|
||||||
fmt.Println("default")
|
fmt.Println("default")
|
||||||
}
|
}
|
||||||
|
@ -30,3 +31,48 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
NSDiscoInfo = "http://jabber.org/protocol/disco#info"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MyComponent struct {
|
||||||
|
Name string
|
||||||
|
// Typical categories and types: https://xmpp.org/registrar/disco-categories.html
|
||||||
|
Category string
|
||||||
|
Type string
|
||||||
|
|
||||||
|
xmpp *xmpp.Component
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c MyComponent) processIQ(iqType, id, from string, inner *xmpp.Node) {
|
||||||
|
fmt.Println("Node:", inner.XMLName.Space, inner.XMLName.Local)
|
||||||
|
switch inner.XMLName.Space + " " + iqType {
|
||||||
|
case NSDiscoInfo + " get":
|
||||||
|
fmt.Println("Send Disco Info")
|
||||||
|
result := fmt.Sprintf(`<iq type='result'
|
||||||
|
from='%s'
|
||||||
|
to='%s'
|
||||||
|
id='%s'>
|
||||||
|
<query xmlns='http://jabber.org/protocol/disco#info'>
|
||||||
|
<identity
|
||||||
|
category='%s'
|
||||||
|
type='%s'
|
||||||
|
name='%s'/>
|
||||||
|
<feature var='http://jabber.org/protocol/disco#info'/>
|
||||||
|
<feature var='http://jabber.org/protocol/disco#items'/>
|
||||||
|
</query>
|
||||||
|
</iq>`, c.xmpp.Host, from, id, c.Category, c.Type, c.Name)
|
||||||
|
c.xmpp.Send(result)
|
||||||
|
default:
|
||||||
|
iqErr := fmt.Sprintf(`<iq type='error'
|
||||||
|
from='%s'
|
||||||
|
to='%s'
|
||||||
|
id='%s'>
|
||||||
|
<error type="cancel" code="501">
|
||||||
|
<feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
|
||||||
|
</error>
|
||||||
|
</iq>`, c.xmpp.Host, from, id)
|
||||||
|
c.xmpp.Send(iqErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -94,6 +94,13 @@ func (c *Component) ReadPacket() (Packet, error) {
|
||||||
return next(c.decoder)
|
return next(c.decoder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Component) Send(packet string) error {
|
||||||
|
if _, err := fmt.Fprintf(c.conn, packet); err != nil {
|
||||||
|
return errors.New("cannot send packet " + err.Error())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Handshake Packet
|
// Handshake Packet
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue