Skip to content

Commit 89e06bf

Browse files
committed
Add first test application using vsomeip
1 parent aabd0d2 commit 89e06bf

File tree

10 files changed

+256
-62
lines changed

10 files changed

+256
-62
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
.vscode/
22
dist/
33
someipy.egg-info/
4-
__pycache__
4+
__pycache__
5+
6+
test_apps/build
7+
test_apps/install

example_apps/send_events_udp.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22
import ipaddress
33
import logging
44

5-
from someipy import TransportLayerProtocol
6-
from someipy.service import ServiceBuilder, EventGroup
5+
from someipy import TransportLayerProtocol, ServiceBuilder, EventGroup, construct_server_service_instance
76
from someipy.service_discovery import construct_service_discovery
8-
from someipy.server_service_instance import construct_server_service_instance
97
from someipy.logging import set_someipy_log_level
108
from someipy.serialization import Uint8, Uint64, Float32
119
from temperature_msg import TemparatureMsg
@@ -83,7 +81,7 @@ async def main():
8381
try:
8482
# Either cyclically send events in an endless loop..
8583
while True:
86-
await asyncio.sleep(5)
84+
await asyncio.sleep(1)
8785
tmp_msg.timestamp = Uint64(tmp_msg.timestamp.value + 1)
8886
payload = tmp_msg.serialize()
8987
service_instance_temperature.send_event(

src/someipy/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from ._internal.someip_sd_header import TransportLayerProtocol
22
from .server_service_instance import ServerServiceInstance, construct_server_service_instance
3+
from .service import Service, ServiceBuilder, EventGroup

src/someipy/logging.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22

3-
_log_level = logging.INFO
3+
_log_level = logging.DEBUG
44

55

66
def set_someipy_log_level(log_level: int):

src/someipy/server_service_instance.py

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import asyncio
22
from typing import Tuple
33

4-
from someipy._internal.tcp_client_manager import TcpClientManager, TcpClientProtocol
54
from someipy.service import Service
65

6+
from someipy._internal.tcp_client_manager import TcpClientManager, TcpClientProtocol
77
from someipy._internal.message_types import MessageType, ReturnCode
88
from someipy._internal.someip_sd_builder import (
99
build_subscribe_eventgroup_ack_entry,
@@ -24,7 +24,6 @@
2424
ServiceDiscoveryObserver,
2525
ServiceDiscoverySender,
2626
)
27-
2827
from someipy._internal.simple_timer import SimplePeriodicTimer
2928
from someipy._internal.utils import (
3029
create_udp_socket,
@@ -43,17 +42,26 @@
4342

4443

4544
class ServerServiceInstance(ServiceDiscoveryObserver):
46-
service: Service
47-
instance_id: int
48-
endpoint: EndpointType
49-
protocol: TransportLayerProtocol
50-
someip_endpoint: SomeipEndpoint
51-
ttl: int
52-
sd_sender: ServiceDiscoverySender
53-
cyclic_offer_delay_ms: int
54-
55-
subscribers: Subscribers
56-
offer_timer: SimplePeriodicTimer
45+
"""AI is creating summary for ServerServiceInstance
46+
47+
Args:
48+
ServiceDiscoveryObserver ([type]): [description]
49+
50+
Returns:
51+
[type]: [description]
52+
"""
53+
54+
_service: Service
55+
_instance_id: int
56+
_endpoint: EndpointType
57+
_protocol: TransportLayerProtocol
58+
_someip_endpoint: SomeipEndpoint
59+
_ttl: int
60+
_sd_sender: ServiceDiscoverySender
61+
_cyclic_offer_delay_ms: int
62+
63+
_subscribers: Subscribers
64+
_offer_timer: SimplePeriodicTimer
5765

5866
def __init__(
5967
self,
@@ -66,24 +74,24 @@ def __init__(
6674
sd_sender=None,
6775
cyclic_offer_delay_ms=2000,
6876
):
69-
self.service = service
70-
self.instance_id = instance_id
71-
self.endpoint = endpoint
72-
self.protocol = protocol
73-
self.someip_endpoint = someip_endpoint
74-
self.ttl = ttl
75-
self.sd_sender = sd_sender
76-
self.cyclic_offer_delay_ms = cyclic_offer_delay_ms
77-
78-
self.subscribers = Subscribers()
79-
self.offer_timer = None
77+
self._service = service
78+
self._instance_id = instance_id
79+
self._endpoint = endpoint
80+
self._protocol = protocol
81+
self._someip_endpoint = someip_endpoint
82+
self._ttl = ttl
83+
self._sd_sender = sd_sender
84+
self._cyclic_offer_delay_ms = cyclic_offer_delay_ms
85+
86+
self._subscribers = Subscribers()
87+
self._offer_timer = None
8088

8189
def send_event(self, event_group_id: int, event_id: int, payload: bytes) -> None:
82-
self.subscribers.update()
90+
self._subscribers.update()
8391

8492
length = 8 + len(payload)
8593
someip_header = SomeIpHeader(
86-
service_id=self.service.id,
94+
service_id=self._service.id,
8795
method_id=event_id,
8896
length=length,
8997
client_id=0x00, # TODO
@@ -93,16 +101,13 @@ def send_event(self, event_group_id: int, event_id: int, payload: bytes) -> None
93101
message_type=MessageType.NOTIFICATION.value,
94102
return_code=0x00,
95103
)
96-
_logger.debug(
97-
f"Send event for instance 0x{self.instance_id:04X}, service: 0x{self.service.id:04X}"
98-
)
99104

100-
for sub in self.subscribers.subscribers:
105+
for sub in self._subscribers.subscribers:
101106
if sub.eventgroup_id == event_group_id:
102107
_logger.debug(
103-
f"Send event for instance 0x{self.instance_id:04X}, service: 0x{self.service.id:04X} to {sub.endpoint[0]}:{sub.endpoint[1]}"
108+
f"Send event for instance 0x{self._instance_id:04X}, service: 0x{self._service.id:04X} to {sub.endpoint[0]}:{sub.endpoint[1]}"
104109
)
105-
self.someip_endpoint.sendto(
110+
self._someip_endpoint.sendto(
106111
someip_header.to_buffer() + payload,
107112
endpoint_to_str_int_tuple(sub.endpoint),
108113
)
@@ -148,12 +153,12 @@ def send_response():
148153

149154
if not success:
150155
_logger.debug(
151-
f"Return ERROR message type to {addr} for service and instance ID: 0x{self.service_id:04X} / 0x{self.instance_id:04X}"
156+
f"Return ERROR message type to {addr} for service and instance ID: 0x{self.service_id:04X} / 0x{self._instance_id:04X}"
152157
)
153158
header_to_return.message_type = MessageType.ERROR.value
154159
else:
155160
_logger.debug(
156-
f"Return RESPONSE message type to {addr} for service and instance ID: 0x{self.service_id:04X} / 0x{self.instance_id:04X}"
161+
f"Return RESPONSE message type to {addr} for service and instance ID: 0x{self.service_id:04X} / 0x{self._instance_id:04X}"
157162
)
158163
header_to_return.message_type = MessageType.RESPONSE.value
159164

@@ -182,17 +187,17 @@ def subscribe_eventgroup_update(
182187
# an Eventgroup of a Service Instance.
183188
# TODO: enable major version check
184189
if (
185-
sd_event_group.sd_entry.service_id == self.service.id
186-
and sd_event_group.sd_entry.instance_id == self.instance_id
187-
and sd_event_group.eventgroup_id in self.service.eventgroupids
190+
sd_event_group.sd_entry.service_id == self._service.id
191+
and sd_event_group.sd_entry.instance_id == self._instance_id
192+
and sd_event_group.eventgroup_id in self._service.eventgroupids
188193
):
189194
(
190195
session_id,
191196
reboot_flag,
192-
) = self.sd_sender.get_unicast_session_handler().update_session()
197+
) = self._sd_sender.get_unicast_session_handler().update_session()
193198

194199
_logger.debug(
195-
f"Send Subscribe ACK for instance 0x{self.instance_id:04X}, service: 0x{self.service.id:04X}, TTL: {sd_event_group.sd_entry.ttl}"
200+
f"Send Subscribe ACK for instance 0x{self._instance_id:04X}, service: 0x{self._service.id:04X}, TTL: {sd_event_group.sd_entry.ttl}"
196201
)
197202
ack_entry = build_subscribe_eventgroup_ack_entry(
198203
service_id=sd_event_group.sd_entry.service_id,
@@ -205,12 +210,12 @@ def subscribe_eventgroup_update(
205210
entry=ack_entry, session_id=session_id, reboot_flag=reboot_flag
206211
)
207212

208-
self.sd_sender.send_unicast(
213+
self._sd_sender.send_unicast(
209214
buffer=header_output.to_buffer(),
210215
dest_ip=ipv4_endpoint_option.ipv4_address,
211216
)
212217

213-
self.subscribers.add_subscriber(
218+
self._subscribers.add_subscriber(
214219
EventGroupSubscriber(
215220
eventgroup_id=sd_event_group.eventgroup_id,
216221
endpoint=(
@@ -230,40 +235,40 @@ def offer_timer_callback(self):
230235
(
231236
session_id,
232237
reboot_flag,
233-
) = self.sd_sender.get_multicast_session_handler().update_session()
238+
) = self._sd_sender.get_multicast_session_handler().update_session()
234239

235240
_logger.debug(
236-
f"Offer service for instance 0x{self.instance_id:04X}, service: 0x{self.service.id:04X}, TTL: {self.ttl}, version: {self.service.major_version}.{self.service.minor_version}, session ID: {session_id}"
241+
f"Offer service for instance 0x{self._instance_id:04X}, service: 0x{self._service.id:04X}, TTL: {self._ttl}, version: {self._service.major_version}.{self._service.minor_version}, session ID: {session_id}"
237242
)
238243

239244
service_to_offer = SdService(
240-
service_id=self.service.id,
241-
instance_id=self.instance_id,
245+
service_id=self._service.id,
246+
instance_id=self._instance_id,
242247
major_version=1,
243248
minor_version=0,
244-
ttl=self.ttl,
245-
endpoint=self.endpoint,
246-
protocol=self.protocol,
249+
ttl=self._ttl,
250+
endpoint=self._endpoint,
251+
protocol=self._protocol,
247252
)
248253
sd_header = build_offer_service_sd_header(
249254
service_to_offer, session_id, reboot_flag
250255
)
251-
self.sd_sender.send_multicast(sd_header.to_buffer())
256+
self._sd_sender.send_multicast(sd_header.to_buffer())
252257

253258
def start_offer(self):
254-
self.offer_timer = SimplePeriodicTimer(
255-
self.cyclic_offer_delay_ms / 1000.0, self.offer_timer_callback
259+
self._offer_timer = SimplePeriodicTimer(
260+
self._cyclic_offer_delay_ms / 1000.0, self.offer_timer_callback
256261
)
257-
self.offer_timer.start()
262+
self._offer_timer.start()
258263

259264
async def stop_offer(self):
260265
_logger.debug(
261-
f"Stop offer for instance 0x{self.instance_id:04X}, service: 0x{self.service.id:04X}"
266+
f"Stop offer for instance 0x{self._instance_id:04X}, service: 0x{self._service.id:04X}"
262267
)
263268

264-
if self.offer_timer is not None:
265-
self.offer_timer.stop()
266-
await self.offer_timer.task
269+
if self._offer_timer is not None:
270+
self._offer_timer.stop()
271+
await self._offer_timer.task
267272
# TODO: send out a stop offer sd message before stopping the timer
268273

269274

test_apps/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
cmake_minimum_required (VERSION 3.13)
2+
3+
project(someipy_test_apps)
4+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
5+
6+
find_package(vsomeip3 CONFIG REQUIRED)
7+
8+
# TODO: Common function for building a single test target
9+
function(add_test_app_target)
10+
11+
12+
13+
endfunction(add_test_app_target)
14+
15+
16+
add_executable(send_events_udp send_events_udp/send_events_udp.cpp)
17+
target_link_libraries(send_events_udp ${VSOMEIP_LIBRARIES} pthread)
18+
19+
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install")
20+
21+
install(TARGETS send_events_udp
22+
RUNTIME DESTINATION send_events_udp)
23+
24+
file(GLOB JSON_FILES "${CMAKE_SOURCE_DIR}/send_events_udp/*.json" "${CMAKE_SOURCE_DIR}/send_events_udp/*.sh")
25+
install(FILES ${JSON_FILES} DESTINATION send_events_udp)

test_apps/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
## Build Test Applications using CMake
2+
3+
```bash
4+
rm -rf build install && mkdir -p build && cd build && cmake .. && make && make install && cd ..
5+
```
6+
7+
## Setup Python Pip Package from Source
8+
9+
```bash
10+
python3.12 -m pip install -e .
11+
```
12+
13+
## Test Procedure
14+
15+
### Network Setup Linux
16+
17+
```bash
18+
sudo ip addr add 127.0.0.2/8 dev lo
19+
sudo ip addr add 224.224.224.245 dev lo autojoin
20+
```
21+
22+
### 1. send_events_udp
23+
24+
Open two terminals (one for Python someipy example app, one for test app)
25+
26+
Start apps:
27+
28+
```bash
29+
python3.12 send_events_udp.py
30+
bash ./install/send_events_udp/start_app.sh
31+
```
32+
33+
Expected in test app:
34+
- Receive event with frequency 1Hz
35+
- Service ID: 0x1234
36+
- Instance ID: 0x5678
37+
- Eventgroup ID: 0x0321
38+
- Event ID: 0x0123
39+
- SD Offer is sent with 0.5Hz

0 commit comments

Comments
 (0)