* J1939 Questions on Intended usage
@ 2021-05-14 12:04 Patrick Menschel
2021-05-15 12:26 ` Kurt Van Dijck
0 siblings, 1 reply; 9+ messages in thread
From: Patrick Menschel @ 2021-05-14 12:04 UTC (permalink / raw)
To: dev.kurt, linux-can
Hi Kurt,
J1939 just hit the raspberrypi-kernel-headers and will soon be part of
regular raspberrypi-kernel [1] while it was already
available in Python 3.9 for a couple of month. [2]
I was about to give it a spin but was confused of the call parameters.
Could you shed some light on the intended usage.
Do I need to open one socket per PGN I'm sending?
e.g.
s1 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
s1.bind(interface_name, MY_NAME, PGN_OF_TSC1, MY_SA)
s1.write(bytes(8))
s2 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
s2.bind(interface_name, MY_NAME, PGN_OF_EBC1, MY_SA)
s2.write(bytes(8))
What about the cyclic transmitted PGNs? Do I drop those into
BroadcastManager somehow?
If I want to open an ISOTP Channel while a j1939 socket exists for my
SA, does anything weird happen on that socket?
e.g. I open a KWP2000 session from tester to engine ecu:
Tester 0xF1 <--> ECU 0x00
0x18DA00F1 >>
<< 0x18DAF100
Thanks and Best Regards,
Patrick Menschel
[1] https://github.com/raspberrypi/linux/pull/4346
[2] https://docs.python.org/3.9/library/socket.html#socket.socket.bind
> CAN_J1939 protocol require a tuple (interface, name, pgn, addr) where additional
> parameters are 64-bit unsigned integer representing the ECU name, a32-bit unsigned
> integer representing the Parameter Group Number (PGN), and an 8-bit integer
> representing the address.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-14 12:04 J1939 Questions on Intended usage Patrick Menschel @ 2021-05-15 12:26 ` Kurt Van Dijck 2021-05-15 14:01 ` Patrick Menschel 0 siblings, 1 reply; 9+ messages in thread From: Kurt Van Dijck @ 2021-05-15 12:26 UTC (permalink / raw) To: Patrick Menschel; +Cc: linux-can On Fri, 14 May 2021 12:04:47 +0000, Patrick Menschel wrote: > Hi Kurt, > > J1939 just hit the raspberrypi-kernel-headers and will soon be part of > regular raspberrypi-kernel [1] while it was already > available in Python 3.9 for a couple of month. [2] > > I was about to give it a spin but was confused of the call parameters. > > Could you shed some light on the intended usage. > > Do I need to open one socket per PGN I'm sending? > e.g. > > s1 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) > s1.bind(interface_name, MY_NAME, PGN_OF_TSC1, MY_SA) > s1.write(bytes(8)) > > s2 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) > s2.bind(interface_name, MY_NAME, PGN_OF_EBC1, MY_SA) > s2.write(bytes(8)) No, you don't _need_ to. You can. If you need quite some different PGN's, it may be more interesting to: s = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) s.bind(interface_name, MY_NAME, ANY_PGN, MY_SA) s.sendto(bytes(8), DST_1, PGN_1) s.sendto(bytes(8), DST_2, PGN_2) ... I'm not a python expert, I just assume something like that is possible. > > > What about the cyclic transmitted PGNs? Do I drop those into > BroadcastManager somehow? The broadcast manager is seperate from j1939, so it's apart. > > > If I want to open an ISOTP Channel while a j1939 socket exists for my > SA, does anything weird happen on that socket? No, nothing weird will happen. The only possible disadvantage I can think of is that the messages sent using ISOTP do not honor the NAME-SA mapping, so on a bus with dynamic addressing, you should be carefull to use local/remote addresses. Kind regards, Kurt ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 12:26 ` Kurt Van Dijck @ 2021-05-15 14:01 ` Patrick Menschel 2021-05-15 18:10 ` Patrick Menschel 0 siblings, 1 reply; 9+ messages in thread From: Patrick Menschel @ 2021-05-15 14:01 UTC (permalink / raw) To: Kurt Van Dijck; +Cc: linux-can Am 15.05.21 um 14:26 schrieb Kurt Van Dijck: > On Fri, 14 May 2021 12:04:47 +0000, Patrick Menschel wrote: >> Do I need to open one socket per PGN I'm sending? >> e.g. >> >> s1 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >> s1.bind(interface_name, MY_NAME, PGN_OF_TSC1, MY_SA) >> s1.write(bytes(8)) >> >> s2 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >> s2.bind(interface_name, MY_NAME, PGN_OF_EBC1, MY_SA) >> s2.write(bytes(8)) > > No, you don't _need_ to. You can. > > If you need quite some different PGN's, it may be more interesting to: > s = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) > s.bind(interface_name, MY_NAME, ANY_PGN, MY_SA) > s.sendto(bytes(8), DST_1, PGN_1) > s.sendto(bytes(8), DST_2, PGN_2) > ... > > I'm not a python expert, I just assume something like that is possible. Yes, the method exists sendto() https://docs.python.org/3/library/socket.html#socket.socket.sendto https://github.com/python/cpython/blob/main/Modules/socketmodule.c#L4279 but apparently sockaddr_can is not yet expanded to individual parameters as it was done with the bind() https://github.com/python/cpython/blob/main/Modules/socketmodule.c#L2207 Then I'll start by passing in the sockaddr_can struct as a first test and make a PR to that repo in the long run. >> What about the cyclic transmitted PGNs? Do I drop those into >> BroadcastManager somehow? > > The broadcast manager is seperate from j1939, so it's apart. Now that would have been the cherry on the cake ;-) 99% of J1939 are information sharing, cyclic messages of PDU2 format. Handing the timing over to the BCM would have been super convenient. Thanks again and Best Regards, Patrick ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 14:01 ` Patrick Menschel @ 2021-05-15 18:10 ` Patrick Menschel 2021-05-15 18:41 ` Marc Kleine-Budde 2021-05-15 18:42 ` Kurt Van Dijck 0 siblings, 2 replies; 9+ messages in thread From: Patrick Menschel @ 2021-05-15 18:10 UTC (permalink / raw) To: Kurt Van Dijck; +Cc: linux-can Am 15.05.21 um 16:01 schrieb Patrick Menschel: > Am 15.05.21 um 14:26 schrieb Kurt Van Dijck: >> On Fri, 14 May 2021 12:04:47 +0000, Patrick Menschel wrote: >>> Do I need to open one socket per PGN I'm sending? >>> e.g. >>> >>> s1 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >>> s1.bind(interface_name, MY_NAME, PGN_OF_TSC1, MY_SA) >>> s1.write(bytes(8)) >>> >>> s2 = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >>> s2.bind(interface_name, MY_NAME, PGN_OF_EBC1, MY_SA) >>> s2.write(bytes(8)) >> >> No, you don't _need_ to. You can. >> >> If you need quite some different PGN's, it may be more interesting to: >> s = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >> s.bind(interface_name, MY_NAME, ANY_PGN, MY_SA) >> s.sendto(bytes(8), DST_1, PGN_1) >> s.sendto(bytes(8), DST_2, PGN_2) >> ... >> >> I'm not a python expert, I just assume something like that is possible. > > Yes, the method exists > > sendto() > https://docs.python.org/3/library/socket.html#socket.socket.sendto > https://github.com/python/cpython/blob/main/Modules/socketmodule.c#L4279 > > but apparently sockaddr_can is not yet expanded to individual parameters > as it was done with the > > bind() > https://github.com/python/cpython/blob/main/Modules/socketmodule.c#L2207 > > Then I'll start by passing in the sockaddr_can struct as a first test > and make a PR to that repo in the long run. Guess I have to amend that impression, everything works fine, except for broadcast which gives me a PermissionError ?! python -i Python 3.9.5 (default, May 13 2021, 13:29:45) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import socket >>> s = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >>> s.bind(("mcp0", 0, 0x40000, 0x20)) >>> s.sendto(bytes(range(8)), ("", 0, 0x12300, 0x30)) 8 >>> s.sendto(bytes(range(0,0x88,0x11)), ("", 0, 0x12300, 0x30)) 8 >>> Took me some try and error to get rid of OSError: [Errno 77] File descriptor in bad state but at least something comes out. candump mcp0 mcp0 19233020 [8] 00 01 02 03 04 05 06 07 mcp0 19233020 [8] 00 11 22 33 44 55 66 77 Maybe I didn't get the concept at all. The transport protocol also does something. s.sendto(bytes(range(64)), ("mcp0", 0, 0xFECA, 0x20)) TP.CM.RTS mcp0 18EC2020 [8] 10 40 00 0A 0A CA FE 00 TP.CM.CTS mcp0 18EC2020 [8] 11 0A 01 FF FF CA FE 00 TP.DT mcp0 18EB2020 [8] 01 00 01 02 03 04 05 06 mcp0 18EB2020 [8] 02 07 08 09 0A 0B 0C 0D mcp0 18EB2020 [8] 03 0E 0F 10 11 12 13 14 mcp0 18EB2020 [8] 04 15 16 17 18 19 1A 1B mcp0 18EB2020 [8] 05 1C 1D 1E 1F 20 21 22 mcp0 18EB2020 [8] 06 23 24 25 26 27 28 29 mcp0 18EB2020 [8] 07 2A 2B 2C 2D 2E 2F 30 mcp0 18EB2020 [8] 08 31 32 33 34 35 36 37 mcp0 18EB2020 [8] 09 38 39 3A 3B 3C 3D 3E mcp0 18EB2020 [8] 0A 3F FF FF FF FF FF FF TP.CM.EndMsgAck mcp0 18EC2020 [8] 13 40 00 0A FF CA FE 00 Those with a little knowledge of J1939 will now roll on the floor ;-) The only thing that I didn't get to work is send to broadcast. That PermissionError is somewhat strange. >>> s.sendto(bytes(range(8)), ("", 0, 0xFECA, 0xFF)) Traceback (most recent call last): File "<stdin>", line 1, in <module> PermissionError: [Errno 13] Permission denied >>> s.sendto(bytes(range(64)), ("mcp0", 0, 0xFECA, 0xFF)) Traceback (most recent call last): File "<stdin>", line 1, in <module> PermissionError: [Errno 13] Permission denied Best Regards, Patrick ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 18:10 ` Patrick Menschel @ 2021-05-15 18:41 ` Marc Kleine-Budde 2021-05-15 18:42 ` Kurt Van Dijck 1 sibling, 0 replies; 9+ messages in thread From: Marc Kleine-Budde @ 2021-05-15 18:41 UTC (permalink / raw) To: Patrick Menschel; +Cc: Kurt Van Dijck, linux-can [-- Attachment #1: Type: text/plain, Size: 652 bytes --] On 15.05.2021 18:10:20, Patrick Menschel wrote: > The only thing that I didn't get to work is send to broadcast. > That PermissionError is somewhat strange. Does this from Documentation/networking/j1939.rst help? | By default no broadcast packets can be send or received. To enable sending or | receiving broadcast packets use the socket option ``SO_BROADCAST``: Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 18:10 ` Patrick Menschel 2021-05-15 18:41 ` Marc Kleine-Budde @ 2021-05-15 18:42 ` Kurt Van Dijck 2021-05-15 19:00 ` Patrick Menschel 1 sibling, 1 reply; 9+ messages in thread From: Kurt Van Dijck @ 2021-05-15 18:42 UTC (permalink / raw) To: Patrick Menschel; +Cc: linux-can On Sat, 15 May 2021 18:10:20 +0000, Patrick Menschel wrote: > Am 15.05.21 um 16:01 schrieb Patrick Menschel: > > Am 15.05.21 um 14:26 schrieb Kurt Van Dijck: > >> On Fri, 14 May 2021 12:04:47 +0000, Patrick Menschel wrote: > >>> Do I need to open one socket per PGN I'm sending? > >>> e.g. > >>> > Guess I have to amend that impression, everything works fine, > except for broadcast which gives me a PermissionError ?! Will you not forget to set the SO_BROADCAST socket option ( see: man 7 socket ) Kurt ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 18:42 ` Kurt Van Dijck @ 2021-05-15 19:00 ` Patrick Menschel 2021-05-15 19:07 ` Kurt Van Dijck 2021-05-15 19:17 ` Marc Kleine-Budde 0 siblings, 2 replies; 9+ messages in thread From: Patrick Menschel @ 2021-05-15 19:00 UTC (permalink / raw) To: Marc Kleine-Budde, Kurt Van Dijck; +Cc: linux-can Am 15.05.21 um 20:42 schrieb Kurt Van Dijck: > On Sat, 15 May 2021 18:10:20 +0000, Patrick Menschel wrote: >> Am 15.05.21 um 16:01 schrieb Patrick Menschel: >>> Am 15.05.21 um 14:26 schrieb Kurt Van Dijck: >>>> On Fri, 14 May 2021 12:04:47 +0000, Patrick Menschel wrote: >>>>> Do I need to open one socket per PGN I'm sending? >>>>> e.g. >>>>> >> Guess I have to amend that impression, everything works fine, >> except for broadcast which gives me a PermissionError ?! > > Will you not forget to set the SO_BROADCAST socket option ( see: man 7 socket ) > Thank you both, that was the trick. But why does it throw a PermissionError ? I would expect a ValueError, e.g. -EINVAL because I as a User did the wrong input or rather did not set a socket option. Alternatively -EPROTO. python -i Python 3.9.5 (default, May 13 2021, 13:29:45) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import socket >>> s = socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) >>> s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) >>> s.bind(("mcp0", 0, 0x40000, 0x20)) >>> s.sendto(bytes(range(8)), ("mcp0", 0, 0xFECA, 0xFF)) 8 >>> s.sendto(bytes(range(64)), ("mcp0", 0, 0xFECA, 0xFF)) 64 >>> candump mcp0 mcp0 18FECA20 [8] 00 01 02 03 04 05 06 07 mcp0 18ECFF20 [8] 20 40 00 0A FF CA FE 00 mcp0 18EBFF20 [8] 01 00 01 02 03 04 05 06 mcp0 18EBFF20 [8] 02 07 08 09 0A 0B 0C 0D mcp0 18EBFF20 [8] 03 0E 0F 10 11 12 13 14 mcp0 18EBFF20 [8] 04 15 16 17 18 19 1A 1B mcp0 18EBFF20 [8] 05 1C 1D 1E 1F 20 21 22 mcp0 18EBFF20 [8] 06 23 24 25 26 27 28 29 mcp0 18EBFF20 [8] 07 2A 2B 2C 2D 2E 2F 30 mcp0 18EBFF20 [8] 08 31 32 33 34 35 36 37 mcp0 18EBFF20 [8] 09 38 39 3A 3B 3C 3D 3E mcp0 18EBFF20 [8] 0A 3F FF FF FF FF FF FF Best Regards, Patrick ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 19:00 ` Patrick Menschel @ 2021-05-15 19:07 ` Kurt Van Dijck 2021-05-15 19:17 ` Marc Kleine-Budde 1 sibling, 0 replies; 9+ messages in thread From: Kurt Van Dijck @ 2021-05-15 19:07 UTC (permalink / raw) To: Patrick Menschel; +Cc: Marc Kleine-Budde, linux-can On Sat, 15 May 2021 19:00:43 +0000, Patrick Menschel wrote: > Am 15.05.21 um 20:42 schrieb Kurt Van Dijck: > > On Sat, 15 May 2021 18:10:20 +0000, Patrick Menschel wrote: > >> Am 15.05.21 um 16:01 schrieb Patrick Menschel: > >>> Am 15.05.21 um 14:26 schrieb Kurt Van Dijck: > >>>> On Fri, 14 May 2021 12:04:47 +0000, Patrick Menschel wrote: > >>>>> Do I need to open one socket per PGN I'm sending? > >>>>> e.g. > >>>>> > >> Guess I have to amend that impression, everything works fine, > >> except for broadcast which gives me a PermissionError ?! > > > > Will you not forget to set the SO_BROADCAST socket option ( see: man 7 socket ) > > > Thank you both, > > that was the trick. But why does it throw a PermissionError ? > > I would expect a ValueError, e.g. -EINVAL because I as a User did the > wrong input or rather did not set a socket option. > Alternatively -EPROTO. > Looking at it now, I have no good answer. Kurt ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: J1939 Questions on Intended usage 2021-05-15 19:00 ` Patrick Menschel 2021-05-15 19:07 ` Kurt Van Dijck @ 2021-05-15 19:17 ` Marc Kleine-Budde 1 sibling, 0 replies; 9+ messages in thread From: Marc Kleine-Budde @ 2021-05-15 19:17 UTC (permalink / raw) To: Patrick Menschel; +Cc: Kurt Van Dijck, linux-can [-- Attachment #1: Type: text/plain, Size: 485 bytes --] On 15.05.2021 19:00:43, Patrick Menschel wrote: > that was the trick. But why does it throw a PermissionError ? So does ipv4: https://elixir.bootlin.com/linux/v5.12.4/source/net/ipv4/datagram.c#L61 Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2021-05-15 19:17 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-05-14 12:04 J1939 Questions on Intended usage Patrick Menschel 2021-05-15 12:26 ` Kurt Van Dijck 2021-05-15 14:01 ` Patrick Menschel 2021-05-15 18:10 ` Patrick Menschel 2021-05-15 18:41 ` Marc Kleine-Budde 2021-05-15 18:42 ` Kurt Van Dijck 2021-05-15 19:00 ` Patrick Menschel 2021-05-15 19:07 ` Kurt Van Dijck 2021-05-15 19:17 ` Marc Kleine-Budde
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.