func requestTopic(publisher_uri, caller_id, topic string, response_data interface{}) error { fmt.Printf(" talking to publisher '%s'\n", publisher_uri) pub_rpc := xmlrpc.NewClient(publisher_uri) tcpros_string := "TCPROS" tcpros := make([]xmlrpc.Value, 1) tcpros[0] = xmlrpc.Value{String: &tcpros_string} protocols := make([]xmlrpc.Value, 1) protocols[0] = xmlrpc.Value{Array: &tcpros} params := make([]xmlrpc.Param, 3) params[0] = xmlrpc.Param{xmlrpc.Value{String: &caller_id}} params[1] = xmlrpc.Param{xmlrpc.Value{String: &topic}} params[2] = xmlrpc.Param{xmlrpc.Value{Array: &protocols}} return pub_rpc.Call("requestTopic", params, response_data) }
func Subscribe(node_name, topic_name, type_name string, channel interface{}) (*TcpRosSubscriber, error) { rpc_client := xmlrpc.NewClient("http://localhost:11311") hostname, err := os.Hostname() if err != nil { return nil, err } msg_port := 11317 msg_uri := fmt.Sprintf("http://%s:%d", hostname, msg_port) var response2 xmlrpc.MethodResponse err = rpc_client.CallStrings("registerSubscriber", []string{node_name, topic_name, type_name, msg_uri}, &response2) if err != nil { return nil, err } var sub TcpRosSubscriber array := *response2.Params[0].Val.Array code := *array[0].Int status := *array[1].String fmt.Printf("got response code: %d, status '%s'\n", code, status) pub_ptr := array[2].Array if pub_ptr == nil { // No publishers yet. TODO: implement updatePublishers() xmlrpc call. return &sub, nil } publishers := *pub_ptr caller_id := node_name for i := range publishers { publisher_uri := *publishers[i].String var response xmlrpc.MethodResponse err := requestTopic(publisher_uri, caller_id, "/chatter", &response) if err != nil { fmt.Printf(" error from requestTopic: %v\n", err) continue } fmt.Printf("response to requestTopic():\n") response.Params[0].Val.Print() fmt.Printf("woot\n") array := response.Params[0].Val.GetArray() code, _ := array[0].GetInt() status, _ := array[1].GetString() fmt.Printf(" requestTopic got response code: %d, status '%s'\n", code, status) protocol := array[2].GetArray() protocol_name, _ := protocol[0].GetString() host, _ := protocol[1].GetString() port, _ := protocol[2].GetInt() fmt.Printf(" protocol %s %s %d\n", protocol_name, host, port) publisher := new(publisherConnection) publisher.host = host publisher.port = port publisher.recvr_node_name = node_name publisher.topic_name = topic_name publisher.type_name = type_name sub.publishers = append(sub.publishers, publisher) go publisher.read(channel) } return &sub, nil }