- 博客(278)
- 资源 (6)
- 收藏
- 关注
原创 8155平台SPI学习笔记
那么SPI Frame是由多个SPI Message组成的,每个SPI Message需要带上一个2字节的长度字段,根据msg中每个元素的长度+2字节算一个SPI Message的长度,可以计算出msgs数组中有多少消息可以进入最终要发送的SPI Frame。因为SPI Frame长度是有限制的,而且由于SPI通信的特性,MOSI和MISO双攻交换数据的时间是一样的,因此,两边交换的SPI Frame的长度是固定的,例如是256字节。
2025-07-11 18:44:38
577
原创 车机证书更新流程
非对称加密的数据,加解密的流程是这样的:公钥 + 原文 = 密文 -> 密文 + 私钥 = 原文私钥 + 原文 = 密文 -> 密文 + 公钥 = 原文常见的对称加密方式有AES(FY使用的),RC4,RC5,RC6和DES等常见的非对称加密方式有RSA,ECC(FY使用的)和DSA权威机构会将自己的公钥提供给社会大众,目的就是可以验证某个证书是否是经过该机构认证过的(加密过的),如果证书可以使用该机构的公钥解密出来数据,说明这个证书是可信任的。
2025-06-30 18:29:43
604
原创 使用OpenSSL接口读取pem编码格式文件中的证书
pem格式的全称是Private Enhance Mail(加强邮件文本格式),是一种常见的文本文件格式,用于存储和传输加密的数据,最初为了安全电子邮件而设计,后来被广泛应用在数字证书,SSL/TLS和秘钥管理。pem文件中,每一段文本前后都有清晰的边界标记,如下k0.......解析pem文件的代码流程如下:a. 读取pem文件中的标签获取不同的对象(证书,秘钥..)的BASE64编码的字符串b. 使用BIO_new_mem_buf包装读取到的字符串作为一个BIO。
2025-06-30 14:59:01
398
原创 SOME/IP Service Discovery (SOME/IP-SD) 第五章节
如果一个客户端使用不同的SOME/IP-SD消息订阅同一个SOME/IP Service Instance的不同的Eventgroup,并且所订阅的这些Eventgroup包含相同的Event,那么服务端在每次收到该客户端发送的SOME/IP-SD Subscribe Eventgroup Entry中包含这个Event时,都需要发送该Event所属的属性的初始值给客户度。
2025-06-30 11:00:36
664
原创 someip工作涉及网络命令整理
sudo route add -net 224.0.0.0/4 enp0s31f6.20 // 添加静态路由,所有目标地址为组播地址范围224.0.0.0/4的流量都走enp0s31f6.20网卡。-d 239.192.252.251 // 流量的目标地址,可以是单个地址239.192.252.251,也可以是地址范围244.0.0.0/24。--dports 25000:26000 // 流量的目标端口是25000~26000。-p udp/tcp // 流量走的传输层协议。
2025-06-25 14:28:58
240
原创 使用CMake编译Fidl和Fdepl
# 概述 一般集成了CommonAPI的应用,都需要先处理fidl和fdepl,生成源码后将源码组入工程,然后再编写CMakeLists.txt编译整个应用。 能否将fidl和fdepl作为工程的源码文件一起参与CMake编译,应该也是可以的,就是需要在CMakeLists.txt中,首先用自定义函数来处理fidl和fdepl文件,将fidl和fdepl的源码先生成出来,那肯定是可以的,分为下面几个步骤。
2025-06-25 10:47:26
331
原创 RTPS Struct Module
在RTPS中,扮演通信角色的是实体(Entity),Struct Module描述了各种Entity以及Entity之间的关联关系。 RTPS的Entity对DDS的Entity可见,两者可以互相通信。每种RTPS的Enity都和DDS中的某种Entity一一对应,RTPS的Entity通过HistoryCache接口和DDS的Entity进行通信。 例如,DDS的DataWriter的write操作添加了一个CacheChange到与该DataWriter对应的RTPS Writer实体的Hist
2025-06-22 12:04:42
1019
原创 vsomeip发送数据的细节
client_endpoint_impl::cancel_dispatch_timer -> 该timer和flush_cbk函数关联,因为涉及到重新计算dispatcher_timer的超时时间,所以这里先取消,函数完成前再重启启动。client_endpoint_impl::get_configured_times_from_endpoint 获取数据防抖和滞留配置(由派生类实现)设置dispatcher_timer超时后执行client_endpoint_impl::flush_cbk。
2025-06-22 12:02:50
193
原创 使用CommonAPI开发Some/IP的流程
那是因为对于最终用户来说,他面对的是核心层的Proxy和Stub类,而不是绑定层的,因此,他不需要关系和知道绑定层的参数。此外,核心层生成的HelloWorldStub.hpp文件中,还有一个接口类HelloWorldStubAdapter,这个类是用来衔接Stub和实际中间件的,后面生成绑定层代码的时候会生成绑定层的HelloWorldSomeIPStubAdapter和HelloWorldSomeIPStubAdapterInternal类(实现HelloWorldStubAdapter接口类)
2025-06-21 13:11:32
621
原创 SOMEIP服务定义文档格式
col [服务名称:(例如LocationService, ModemStatus)服务介绍:该服务的主要用途 (例如提供卫星状态,提供经纬度信息,提供4G网络状态)col [自定义数据类型名称:复杂数据类型:嵌套数据类型(Enum/Struct/Union/Array/NA),用于表示当前数据成员是复杂类型还是基本类型数据成员名称:自定义数据类型中成员的名称数据成员类型:自定义数据类型中成员的数据类型(可能是基本类型,也可能是用户自定义类型)
2025-06-17 19:58:26
917
原创 记录一次排查SOME/IP订阅问题
但是从pcap看,好像无论Android发的StopSubscribe还是Subscribe Entry,SA侧都没有任何回应,哪怕是SubscribeNACK也好啊,于是怀疑是因为没有收到SA的SubscribeACK/SubscribeNACK才导致的Android一直重复在发送StopSubscribe+Subscribe Entry组合的情况发生。然后SA的该4G网络状态服务并不是只有Android订阅了,S32G侧也订阅并且成功了,定期获取到了4G网络状态事件。
2025-06-17 10:27:04
344
原创 SOME/IP学习随笔
SOME/IP-SD消息的SD Header中的Reboot Flag在整个SOME/IP协议栈重启后设置为1,当且仅当已发送的SOME/IP-SD消息的Session ID已经完成一次循环从1重新开始的时候,才会将Reboot Flag设置为0。对于服务的订阅方,收到服务提供方的SD消息(OFFER)中有Reboot的情况, 则服务的订阅方应当按照收到提供方StopOffer消息的方式进行处理。因为Session ID都是SOME/IP消息的发送方设置在SOME/IP的Header中的,
2025-06-16 18:28:54
905
原创 SOMEIP官方文档 【4 Protocol specification】
SOME/IP提供基于车载网络的面向服务的通信功能,SOME/IP的服务定义列出了该服务可以对外提供的功能。一个SOME/IP服务由一个或者多个事件(event),方法(method)和属性(field)组成。其中事件(event)可以按照周期,也可以在数据发生变化的时候向服务的订阅者发送数据。方法(method)让服务的订阅者发起远程方法调用,并且方法的执行在服务的提供这这边。
2025-06-16 15:47:09
383
原创 Android App引用vendor编写的jni动态库
简单描述一下,就是我自己基于FastDDS写了一个Jni的so,然后编写了jar包引用该so,最后写了一个Android的测试apk使用jar包,调用jni中的接口去创建Participant,Subscriber等。将so的文件名添加到文件末尾,然后打包编译,烧写镜像后,可以在设备的/system/etc目录下确认public.libraries.txt文件中是否修改成功。经过DS查询,找到错误原因,是需要将jni动态库加到公共库列表文件中,列表文件的位置在。
2025-06-03 13:52:18
433
原创 JNI开发流程
最近在做一个自己的项目,就是基于FastDDS封装一套JAVA库,让android和java应用可以使用dds的功能。由于FastDDS是使用C++编写的开源库,因此java的类库想要调用FastDDS的接口,需要额外编写一个JNI层的动态库对FastDDS的接口进行封装,并且通过注册函数的方式将JNI中的接口函数注册给上层的JAVA类库或者java应用,这样,JAVA就可以通过jni动态库中的函数间接调用到FastDDS中的接口了。
2025-05-30 20:01:07
1107
原创 Android Gnss模块初步整理
App -> LocationManager -> LocationManagerService -> LocationProviderManager -> GnssLocationProvider ->GnssNative -> GnssHal ->com_android_server_location_GnssLocationProvider -> hal service(对接外部Gnss数据来源)
2025-05-29 16:42:00
531
原创 使用vsomeip tcp_client_endpoint_impl代码实现的客户端通信
【代码】使用vsomeip tcp_client_endpoint_impl代码实现的客户端通信。
2025-05-07 11:07:30
178
原创 RTPSParticipant构建流程
RTPSParticipant的构建主要在RTPSParticipantImpl的构造函数中,主要包含下面几个流程:注册默认UDPTransport注册用于自定义Transport确认元数据通信组播和单播地址确认初始化对等端点(initialPeerList)确认用户数据通信组播和单播地址创建元数据通信和用户数据通信的ReceiverResource创建BufferPool创建FlowControl创建和初始化BuiltinProtocol 下面的章节主要针对代码展开梳理这些流程。
2025-05-06 12:17:25
892
原创 participant中participantid的来源和用途
GuidPrefix总共12字节,其中前8个字节是整个进程的guid_prefix,后4个字节就是participant_id。participant_id会影响到RTPSParticipant的GUID中GuidPrefix的值。
2025-04-23 14:49:03
152
原创 FastDDS在QNX平台需要打开ReusePort选项
在UDPv4Transport中,需要在设置完socket的REUSE_ADDRESS属性后,额外设置REUSE_PORT属性,否则,在QNX平台下,创建的组播socket会无法绑定30490端口。
2025-04-21 10:27:14
90
原创 DDS Discovery数据
FastDDS允许用户自己配置initial peers(初始化对等节点列表),其中包括一个或者多个IP+端口,这些IP+端口分别是不同远端Participant监听用于交换PDP数据的,因此本地的Participant只需要想这些initial peers发送PDP流量数据即可。Participant的initial peers中包含IP和端口的键值对集合,这些IP+端口是要和本地Participant进行PDP流量交互的其他Participant所监听的,这些地址可以是单播地址或者组播地址。
2025-04-18 19:46:51
462
原创 FASTDDS TypeSupport类用途
DomainParticipant中注册类型的主要用途在于这个数据类型会被注册到下层的RTPS中,RTPSParticipantImpl中的check_type函数来源于DomainParticipant。DDS应用中Topic上传输的数据类型一般都是继承自TopicDataType,在传输该数据类型之前,首先需要向Participant注册该数据类型(register_type)在创建该数据类型的Publisher/Subscriber之前,首先需要向DomainParticipant注册该数据类型。
2025-04-14 12:59:09
246
原创 QNX中监听GPIO引脚信号的代码流程(1)
要监听硬件中断,需要获取IO权限,在QNX系统中,ThreadCtl函数和_NTO_TCTL_IO参数管理线程的IO权限,例如在线程函数中执行下面两行代码分别关闭和打开线程访问硬件资源的权限。gpio_set_interrupt_cfg(GPIO的fd, GPIO引脚号, GPIO_INTERRUPT_TRIGGER_RISING, NULL);// 信号事件处理函数。// 传给信号事件处理函数的数据。sigevent 信号事件,POSIX标准定义的结构体,用于描述异步事件的通知方式。
2025-04-14 10:26:08
423
原创 3.5.1. Topics, keys and instances
按照Topic的定义,一个Topic只和一个数据类型绑定,因此在该Topic上产生的每一个数据样本(sample)都可以被视为对该数据类型的实例的信息更新,在同一个Topic中,是可以存在同一个数据类型的不同数据实例的,在该Topic上收到的数据样本会被用于更新该Topic绑定的数据类型的某一个数据实例。
2025-04-09 18:27:22
759
原创 Android init.rc使用logwrapper进行日志重定向
由于脚本中都是使用echo来打印日志的,默认init.rc执行脚本是将输出重定向到/dev/null下面的。而理想的做法是将日志输出到logcat,这种情况下,可以使用logwrapper来对脚本命令包一层,这样执行脚本的时候,数据的日志就被重定向到android的logcat了。今天在项目中因为offer报文丢失的票在init.rc中增加了脚本用来抓取someip的日志。
2025-04-08 16:13:13
303
原创 FastDDS StatelessReader匹配Writer的调用栈
2025-04-02 17:12:51.045 [RTPS_READER Error] tid:930547,user reader match remote writer -> Function matched_writer_add.2.10(_ZN8eprosima8fastrtps4rtps15StatelessReader18matched_writer_addERKNS1_15WriterProxyDataE+0x43c) [0x798a27d2d9dc].2.10(_ZN8eprosima8
2025-04-03 09:58:02
313
原创 vsomeip tcp_client_endpoint代码分析
在各种中间件中,似乎都存在endpoint这样的类,例如someip,dds等通信中间件,都有各种endpoint类负责基于不同的协议来完成数据通信的功能。
2025-03-28 19:16:49
127
原创 C++通过宏将任何内容转成字符串的方式
今天在写代码的时候,有碰到需要将枚举值打印出来的需求,程序中某个类保存多个状态,每个状态值都是一个枚举类型,想在状态变更的时候打印出来进行调试。传统的手法就是通过map或者switch case来转换枚举值到字符串,例如。
2025-03-20 16:09:56
208
原创 记录一次SOMEIP Notification发送异常的排查
问题的现象是这样的,我们车机侧(Android端)有个app应用作为SOMEIP的服务端,在收到别的应用的某个Method请求后,会在一段时间内执行某个函数,并且持续发送该函数的执行进度,因此在SOMEIP通信矩阵中,该数据配置为服务的一个字段(field)。排查后才发现,field字段的notification机制默认是需要数据变化才进行发送的,而有时候app这边执行函数的进度特别的慢,进度数据一直没有变化,也就没有进度field的notification发出去了。
2025-03-16 13:40:38
207
原创 CommonAPI如何完成参数的序列化
从CommonAPI自带的HelloworldClient来示范: 可以看到,在上面的代码中, “Bob”是SomeIP的sayHello这个Method方法的参数,因此在发送sayHello的REQUEST报文的时候,“Bob”需要被序列化到报文的payload中,这部分工作应该是在HelloWorldSomeIPProxy的sayHello函数中完成的:二. 具体实现 从实例代码中看到,发送REQUEST报文依赖了SOMEIP绑定层ProxyHelper类的callMethodWithRe
2025-03-14 16:00:51
1023
原创 多个shared_ptr管理同一块内存的问题
第一个main函数中shared_ptr的用法是正确的,具体来说,每块裸内存只能和一个共享指针的PCB控制块绑定在一起,当使用一个shared_ptr使用另一个shared_ptr初始化的时候,这两个shared_ptr是共用同一个PCB的。而第二个main函数中的shared_ptr的用法是错误的,两个shared_ptr的使用了同一个裸内存指针来初始化,会造成创建了两个PCB控制块同时管理同一块内存的情况,最后重复删除。
2025-03-08 12:49:31
241
原创 LINUX进程中文件相关结构
/ 指向被打开的文件file集合的指针(files_struct中的fd_array),如果被打开的文件数量超过了max_fds,则需要重新分配空间保存file集合并且更新fd保存的地址。// 进程初始状态时已经使用的文件描述符数组,数组索引代表文件描述符,值为1表示对应的文件被使用(例如select中,当一个文件等待的事件被触发)// 指向当前进程已经使用的文件描述符数组,数组索引代表文件描述符,值为1表示对应的文件被使用(例如select中,当一个文件等待的事件被触发)mode_t f_mode;
2025-02-10 13:42:17
783
makefile中文手册
2017-09-21
teraterm.zip
2020-06-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人