- 博客(263)
- 资源 (6)
- 收藏
- 关注
原创 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
415
原创 JNI开发流程
最近在做一个自己的项目,就是基于FastDDS封装一套JAVA库,让android和java应用可以使用dds的功能。由于FastDDS是使用C++编写的开源库,因此java的类库想要调用FastDDS的接口,需要额外编写一个JNI层的动态库对FastDDS的接口进行封装,并且通过注册函数的方式将JNI中的接口函数注册给上层的JAVA类库或者java应用,这样,JAVA就可以通过jni动态库中的函数间接调用到FastDDS中的接口了。
2025-05-30 20:01:07
1050
原创 Android Gnss模块初步整理
App -> LocationManager -> LocationManagerService -> LocationProviderManager -> GnssLocationProvider ->GnssNative -> GnssHal ->com_android_server_location_GnssLocationProvider -> hal service(对接外部Gnss数据来源)
2025-05-29 16:42:00
448
原创 使用vsomeip tcp_client_endpoint_impl代码实现的客户端通信
【代码】使用vsomeip tcp_client_endpoint_impl代码实现的客户端通信。
2025-05-07 11:07:30
141
原创 RTPSParticipant构建流程
RTPSParticipant的构建主要在RTPSParticipantImpl的构造函数中,主要包含下面几个流程:注册默认UDPTransport注册用于自定义Transport确认元数据通信组播和单播地址确认初始化对等端点(initialPeerList)确认用户数据通信组播和单播地址创建元数据通信和用户数据通信的ReceiverResource创建BufferPool创建FlowControl创建和初始化BuiltinProtocol 下面的章节主要针对代码展开梳理这些流程。
2025-05-06 12:17:25
866
原创 participant中participantid的来源和用途
GuidPrefix总共12字节,其中前8个字节是整个进程的guid_prefix,后4个字节就是participant_id。participant_id会影响到RTPSParticipant的GUID中GuidPrefix的值。
2025-04-23 14:49:03
134
原创 FastDDS在QNX平台需要打开ReusePort选项
在UDPv4Transport中,需要在设置完socket的REUSE_ADDRESS属性后,额外设置REUSE_PORT属性,否则,在QNX平台下,创建的组播socket会无法绑定30490端口。
2025-04-21 10:27:14
84
原创 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
448
原创 FASTDDS TypeSupport类用途
DomainParticipant中注册类型的主要用途在于这个数据类型会被注册到下层的RTPS中,RTPSParticipantImpl中的check_type函数来源于DomainParticipant。DDS应用中Topic上传输的数据类型一般都是继承自TopicDataType,在传输该数据类型之前,首先需要向Participant注册该数据类型(register_type)在创建该数据类型的Publisher/Subscriber之前,首先需要向DomainParticipant注册该数据类型。
2025-04-14 12:59:09
235
原创 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
399
原创 3.5.1. Topics, keys and instances
按照Topic的定义,一个Topic只和一个数据类型绑定,因此在该Topic上产生的每一个数据样本(sample)都可以被视为对该数据类型的实例的信息更新,在同一个Topic中,是可以存在同一个数据类型的不同数据实例的,在该Topic上收到的数据样本会被用于更新该Topic绑定的数据类型的某一个数据实例。
2025-04-09 18:27:22
745
原创 Android init.rc使用logwrapper进行日志重定向
由于脚本中都是使用echo来打印日志的,默认init.rc执行脚本是将输出重定向到/dev/null下面的。而理想的做法是将日志输出到logcat,这种情况下,可以使用logwrapper来对脚本命令包一层,这样执行脚本的时候,数据的日志就被重定向到android的logcat了。今天在项目中因为offer报文丢失的票在init.rc中增加了脚本用来抓取someip的日志。
2025-04-08 16:13:13
260
原创 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
304
原创 vsomeip tcp_client_endpoint代码分析
在各种中间件中,似乎都存在endpoint这样的类,例如someip,dds等通信中间件,都有各种endpoint类负责基于不同的协议来完成数据通信的功能。
2025-03-28 19:16:49
73
原创 C++通过宏将任何内容转成字符串的方式
今天在写代码的时候,有碰到需要将枚举值打印出来的需求,程序中某个类保存多个状态,每个状态值都是一个枚举类型,想在状态变更的时候打印出来进行调试。传统的手法就是通过map或者switch case来转换枚举值到字符串,例如。
2025-03-20 16:09:56
179
原创 记录一次SOMEIP Notification发送异常的排查
问题的现象是这样的,我们车机侧(Android端)有个app应用作为SOMEIP的服务端,在收到别的应用的某个Method请求后,会在一段时间内执行某个函数,并且持续发送该函数的执行进度,因此在SOMEIP通信矩阵中,该数据配置为服务的一个字段(field)。排查后才发现,field字段的notification机制默认是需要数据变化才进行发送的,而有时候app这边执行函数的进度特别的慢,进度数据一直没有变化,也就没有进度field的notification发出去了。
2025-03-16 13:40:38
198
原创 CommonAPI如何完成参数的序列化
从CommonAPI自带的HelloworldClient来示范: 可以看到,在上面的代码中, “Bob”是SomeIP的sayHello这个Method方法的参数,因此在发送sayHello的REQUEST报文的时候,“Bob”需要被序列化到报文的payload中,这部分工作应该是在HelloWorldSomeIPProxy的sayHello函数中完成的:二. 具体实现 从实例代码中看到,发送REQUEST报文依赖了SOMEIP绑定层ProxyHelper类的callMethodWithRe
2025-03-14 16:00:51
994
原创 多个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
228
原创 LINUX进程中文件相关结构
/ 指向被打开的文件file集合的指针(files_struct中的fd_array),如果被打开的文件数量超过了max_fds,则需要重新分配空间保存file集合并且更新fd保存的地址。// 进程初始状态时已经使用的文件描述符数组,数组索引代表文件描述符,值为1表示对应的文件被使用(例如select中,当一个文件等待的事件被触发)// 指向当前进程已经使用的文件描述符数组,数组索引代表文件描述符,值为1表示对应的文件被使用(例如select中,当一个文件等待的事件被触发)mode_t f_mode;
2025-02-10 13:42:17
778
转载 GPS基础知识整理
观察者站在地面上观察卫星时,以仰角,方位角描述卫星相对于观察者的位置,当观察者站在地面上掏出罗盘观察卫星时,观察者与卫星之间的垂直夹角为仰角,卫星和罗盘正北方向的夹角为方向角。卫星和被测距物体是在同一个坐标系中,并且卫星知道自己在这个坐标系中的位置,那么通过三颗卫星的测距值,可以算出被测物体在这个坐标系中的位置。实际上,由于GPS接受器上时钟的精度问题,需要增加一个卫星的测距值来进行修正,因此,需要四颗卫星的测距值来确定被测物体的位置。
2025-02-06 15:10:31
219
转载 UML class之间关联和依赖关系
原文链接:https://blog.csdn.net/hejingfang123/article/details/111871668。(2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。(1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。1、从类的属性是否增加的角度看。依赖关系VS关联关系。
2025-02-06 10:16:20
58
原创 CommonAPI学习笔记-2
这篇文章主要是想整理并且分析CommonAPI代码生成工具根据fidl和fdepl配置文件生成出来的代码的结构和作用。
2025-02-05 18:31:28
1149
原创 CommonAPI学习笔记-1
CommonAPI分为两层:核心层和绑定层,使用了Franca来描述服务接口的定义和部署,而Franca是一个用于定义和转换接口的框架(https://franca.github.io/franca/)。 核心层和通信中间件无关,使用fidl配置文件来描述接口的逻辑,绑定层和中间件相关(DBUS/SOMEIP)。因此在fdepl配置文件中设置了中间件所依赖的参数。
2025-01-26 13:28:46
1029
原创 asio中strand用于串行执行task
如果我们有多个线程上运行同一个io_context上下文,那么向这个io_context上下文提交的task会随即出现在这些线程中的某一个,在随机的时间点运行。但是,在某些情况下,我们提交的一系列task可能是有依赖关系,需要先后执行的,那么这种情况下,直接向io_context上下文提交就无法满足需求了。
2025-01-07 20:24:32
282
原创 SOMEIP ServiceDiscovery流程整理
因此从**pending_remote_subscriptions_**的结构可以看到,每个remote_subscription对应一个remote_subscription_ack(每一个eventgroup的订阅都有一个订阅回复ACK),而remote_subscription_ack中subscriptions_成员包含了多条remote_subscription(因为每次订阅回复的ACK报文中,包含多个订阅evengroupentry对应的remote_subscription)。
2024-12-31 09:37:48
1198
4
原创 Memory-mapped I/O and port-mapped I/O
ref: https://en.wikipedia.org/wiki/Memory-mapped_I/O_and_port-mapped_I/OFrom Wikipedia, the free encyclopediaFor more generic meanings of input/output ports, see Computer port (hardware). For memory-mapped file I/O, see Memory-mapped file.“Port-mapped I/O”
2024-12-31 09:36:52
783
原创 QNX通过pfctl工具查看socket通信状态
通过pfctl -si && pfctl -ss可以查看当前主机IP和外域IP之间的所有socket通信状态,显示的格式是。传输层协议 | 主机IP | 外域IP | 主机端状态:外域状态。
2024-12-19 19:48:11
328
原创 VSOMEIP主要流程的时序
routing_manager_impl::handle_local_offer_service // 判断是否可以Offer Service (是否存在冲突),可以offer的情况下插入local_services_中。// 修改订阅状态 (ACKED) endpoint_manager_impl::find_or_create_remote_client // 从remote_service_info_中查找远端服务的配置,创建client_endpoint。
2024-11-29 18:09:36
1043
原创 boost::asio打印错误信息
boost::system::error_code const &_error;std::cout << "connect fail [" << boost::system::system_error(_error).what() << "]";
2024-11-26 10:50:40
110
原创 RTPS通信使用的socket和端口
在FastRTPS中,无论SenderResource还是,ReceiverResource,其内部会依赖NetworkFactory创建socket,每个socket都需要绑定socket才能正常使用。 一般来说,一个RTPSParticipant中创建的RTPSReader/RTPSWriter都是共用一组socket资源的,而这些socket的端口的值一般是RTPSParticipant的domainid和participantid相关的。
2024-11-22 20:14:06
606
原创 RTPS网卡白名单的一个BUG
问题就在上面这段TCPv4Transport的构造函数中,轮询了白名单中的IP,根据IP找对应的网卡,如果没有找到网卡,则将IP从白名单中移除。当我们创建RTPSParticipantImpl的时候,有时候会指定通信使用的网卡,将可以用于RTPS通信的网卡的IP添加到白名单中,这样,RTPS就只会在IP所在的网卡上进行PDP,EDP以及业务数据交互。
2024-11-13 14:05:49
568
原创 RTPS层创建的RTPSWriter获取匹配reader的回调堆栈
WriterListener::onWriterMatched // RTP上层的引用需要创建一个listener实现该接口。
2024-10-28 15:50:24
270
原创 Gnss测试数据需要更新timestamp
按理说这个是常识,一般导航模块收到gnss数据后,会比较里面的timestamp是否合法(至少要大于当前系统时间),Gnss中的timestamp是个Unix时间戳,长整形,每一包数据都会校验这个timestamp。今天在使用someip工具模拟发送GNSS数据的时候,忘了更新这个timestamp,结果导航应用从使用的SDK就报错了,只打印了一条GNSS数据。timestamp这个Unix时间戳,使用当前时间在在线网站上可以转换出来。
2024-10-11 16:44:38
252
makefile中文手册
2017-09-21
teraterm.zip
2020-06-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人