Hi all,
I have a dsdl named TestServiceInput.0.1.dsdl that looks like this:
uint8[10] message
@sealed
for a personal service called TestService with ID of 17 that I register to my cyphal implementation with node ID of 22.
when I invoke the following:
yakut call 22 17:TestServiceInput.0.1 ‘message:“helloworld”’
I get the following:
Error: TestServiceInput.0.1 is not a service type.
What does this error message mean (and how do I fix this), and what is the correct way of sending a message that contains a string ?
             
            
              
              
              
            
           
          
            
            
              The DSDL you have defined is a Message, not a Service.
A Service has the following structure, with --- delineating the Request and Response part respectively:
# This service accepts a list of 2D point coordinates and returns the best-fit linear function coefficients.
# If no solution exists, the returned coefficients are NaN.
PointXY.1.0[<64] points
@extent 1024 * 8
---
float64 slope
float64 y_intercept
@extent 64 * 8
(Example taken from pycyphal demo page)
To send a Message using Yakut, take a look at the following example (given in the same demo):
export UAVCAN__UDP__IFACE=127.0.0.1
export UAVCAN__NODE__ID=111         # We need a node-ID to publish messages properly
y pub --count=10 2345:uavcan.si.unit.temperature.scalar   250 \
                 2346:uavcan.si.sample.temperature.scalar 'kelvin: 240'
(Obviously you will replace some parts, specifying the correct Node ID, DSDL type,…)
PS: You seem to want to send a string, there’s a uavcan.primitive.String.1.0 type that is better suited for this purpose (instead of uint8). (Unless you’re absolutely sure it will always be exactly 10 bytes → correct me if I’m wrong here @pavel.kirienko )
PS2: I would highly recommend working through the demo provided above, I have made some (rough) personal notes that could provide a bit more background understanding here. And lastly, I have been implementing some new pycyphal functionality here, which I think could be helpful for looking up code examples/unit test structure and so on.
             
            
              
              
              1 Like
            
           
          
            
            
              Thanks! I’ll give that a shot.
Do you also happen to have documentation on how to format a message as part of a yakut call ? Is it just YAML format ?
             
            
              
              
              
            
           
          
            
            
              yakut call is only to be used with Service types.
For Messages, you need to use publish/subscribe.
From yakut --help:
call,q                  Invoke an RPC-service using the specified request
publish,p,pub           Publish messages on the specified subjects
subscribe,s,sub         Subscribe to specified subjects and print messages to
An example on how to use these commands.
             
            
              
              
              1 Like
            
           
          
            
            
              My mistake, I meant for Service types.
I fixed the dsdl to be a service type, so now it’s called TestService.0.1
I called the following:
yakut call 22 17:TestService.0.1 ‘{message:“hello world”}’
and I get:
ValueError: invalid literal for int() with base 10: ‘hello world’
Do you have an example of sending strings to a service ?
             
            
              
              
              
            
           
          
            
            
              For this to work, your message needs to be a variable-length array of uint8, like so:
uint8[<=10] message
Otherwise you need to use the YAML list syntax to assign the field.
             
            
              
              
              
            
           
          
            
            
              Thanks, I 'll experiment with this