AUTOSAR vsomeip, json配置

原创 | vsomeip — SOME/IP 开源实现 (qq.com)

加入组播路由命令:route add -nv 224.224.224.245 dev eth0

sudo route add -nv 239.0.204.1 dev vlan_204

# sudo ip route add xxx.100.204.0/24 dev xxx.204 proto static

# sudo ip route del xxx.0.204.0/24 dev xxx.204

查看路由表:route

sudo ip route del 239.0.xxx.0/24  dev xxxx

sudo ip route add 239.0.xxx.0/24  dev xxxx proto static

autosar E2E 源码解析 - 知乎 (zhihu.com)

(684条消息) crc 校验错误_关于E2E protection和CRC_weixin_39529443的博客-CSDN博客

vsomeip例子

//
// Created by Gaddi
//
#include "Server.h"

void Server::ready() {
    if(app_){
        if(!app_->init()){
            LOGE("cannot init the application");
            return;
        }
        //注册服务实例可用状态回调
        app_->register_availability_handler(SERVICE_ID, INSTANCE_ID, std::bind(&Server::availableHandler,
                                                                               this,
                                                                               std::placeholders::_1,
                                                                               std::placeholders::_2,
                                                                               std::placeholders::_3));

        //注册状态变化回调
        app_->register_state_handler(std::bind(&Server::stateHandler, this, std::placeholders::_1));

        //注册消息接收回调, 这里我们主要模拟三个属性的(SET,GET), 以及单纯的FUNC执行
        app_->register_message_handler(SERVICE_ID, INSTANCE_ID,  METHOD_ID_FIELD_GET,std::bind(&Server::messageHandler,
                                                                          this,
                                                                          std::placeholders::_1));
        app_->register_message_handler(SERVICE_ID, INSTANCE_ID,  METHOD_ID_FIELD_SET,std::bind(&Server::messageHandler,
                                                                                               this,
                                                                                               std::placeholders::_1));
        app_->register_message_handler(SERVICE_ID, INSTANCE_ID,  METHOD_ID_FUNC_CALL,std::bind(&Server::messageHandler,
                                                                                               this,
                                                                                               std::placeholders::_1));
        //注册客户端订阅事件组
        app_->register_subscription_handler(SERVICE_ID, INSTANCE_ID, EVENT_GROUP_ID_1, std::bind(&Server::subscriptionHandler,
                                                                                                 this,
                                                                                                 std::placeholders::_1,
                                                                                                 std::placeholders::_4));
        //注册事件
        std::set<vsomeip::eventgroup_t> group_set_1;
        group_set_1.insert(EVENT_GROUP_ID_1);

        app_->offer_event(SERVICE_ID, INSTANCE_ID, EVENT_ID_FIELD_NOTIFY, group_set_1,
                          vsomeip::event_type_e::ET_EVENT,
                          std::chrono::milliseconds::zero(),
                          false,
                          true,
                          nullptr,
                          vsomeip::reliability_type_e::RT_UNRELIABLE);
        app_->offer_event(SERVICE_ID, INSTANCE_ID, EVENT_ID_ONLY_NOTIFY_0, group_set_1,
                          vsomeip::event_type_e::ET_EVENT,
                          std::chrono::milliseconds::zero(),
                          false,
                          true,
                          nullptr,
                          vsomeip::reliability_type_e::RT_UNRELIABLE);
        LOGE("ready done for server");
    }
}

void Server::start() {
    if(app_){
        LOGE("start for server");
        app_->start();
        LOGE("start done for server");
    }
}

/**
 * 当客户端订阅成功后,服务端每隔5s触发通知
 * @param srv
 */
static void offerEventCycle(Server* srv){
    const int size = 5;
    uint16_t v = 0;
    while(true){
        vsomeip_v3::byte_t* data_ = new vsomeip_v3::byte_t(size);
        for(int i=0; i<size; i++){
            data_[i] = v + i;
        }
        v++;
        std::shared_ptr<vsomeip::payload> payload_ = srv->rtm_->create_payload();
        payload_->set_data(data_, size);
        srv->app_->notify(SERVICE_ID, INSTANCE_ID, EVENT_ID_ONLY_NOTIFY_0, payload_, true);
        delete data_;
        sleep(5);
        if(v == 10){
            break;
        }
    }
}

void Server::availableHandler(vsomeip::service_t service_, vsomeip::instance_t instance_,
                              bool isAvailable) {
    LOGE("%s received service = %02X , instance = %02X, isAvailable = %d",
         __func__ ,
         service_ ,
         instance_,
         isAvailable);
}

void Server::messageHandler(const std::shared_ptr<vsomeip::message> &message_) {
    if(message_){
        LOGE("Server %s received service = %02X , instance = %02X, type = %hhu",
             __func__ ,
             message_->get_service(),
             message_->get_instance(),
             message_->get_message_type());

        if(message_->get_service() == SERVICE_ID && message_->get_instance() == INSTANCE_ID){
            switch(message_->get_method()){
                case METHOD_ID_FUNC_CALL:{
                    std::shared_ptr<vsomeip::payload> payload_ = message_->get_payload();
                    if(payload_){
                        int val = payload_->get_data()[0];
                        callMethod(val);
                    }
                }break;

                case METHOD_ID_FIELD_SET:{
                    //获取客户端传递过来的数据
                    std::shared_ptr<vsomeip::payload> payload_ = message_->get_payload();
                    bool changed = false;
                    if(payload_){
                        uint32_t val = payload_->get_data()[0];
                        if(field_ != val){
                            field_ = val;
                            changed = true;
                        }
                        //设置属性后,回复OK
                        if(message_->get_message_type() == vsomeip::message_type_e::MT_REQUEST){
                            std::shared_ptr<vsomeip::message> response_ = rtm_->create_response(message_);
                            app_->send(response_);
                        }

                        if(changed){
                            std::shared_ptr<vsomeip::payload> p_ = rtm_->create_payload();
                            vsomeip::byte_t* data_ = new vsomeip::byte_t[1];
                            data_[0] = field_;
                            p_->set_data(data_, 1);
                            app_->notify(SERVICE_ID, INSTANCE_ID, EVENT_ID_FIELD_NOTIFY, p_);
                            delete[] data_;
                        }
                    }
                } break;

                case METHOD_ID_FIELD_GET:{
                    //回复属性值field给到请求的客户端
                    LOGE("The client call field get val");
                    std::shared_ptr<vsomeip::message> response_ = rtm_->create_response(message_);
                    uint8_t size = 1;
                    vsomeip::byte_t* data_ = new vsomeip::byte_t[size];
                    data_[0] = field_;
                    std::shared_ptr<vsomeip::payload> payload_ = rtm_->create_payload(data_, size);
                    response_->set_payload(payload_);
                    app_->send(response_);
                    delete[] data_;
                } break;
            }
        }
    }
}

bool Server::subscriptionHandler(vsomeip::client_t client_, bool subscribed) {
    LOGE("%s received client_t = %02X , subscribed = %d",__func__ ,client_,subscribed);
    //客户端订阅成功,启动一个线程来间隔5s广播事件
    if(subscribed){
        std::thread execute(&offerEventCycle, this);
        execute.detach();
    }
    return true;
}

void Server::stateHandler(vsomeip::state_type_e state) {
    LOGE("%s received state_type_e = %hhu",__func__ ,state);
    if(state == vsomeip::state_type_e::ST_REGISTERED){
        app_->offer_service(SERVICE_ID, INSTANCE_ID);
    }
}

void Server::callMethod(int value) {
    LOGE("%s received param = %d", __func__ , value);
}

(665条消息) 车联网通信中间件 -- 使用vsomeip实现双机通讯_述剑的博客-CSDN博客

(657条消息) vsomeip-双机通信例子_vsomeip json配置_Sherry Baron的博客-CSDN博客

(665条消息) SOME/IP开源库Vsomeip分析4-服务注册过程_vsome_routing_info-CSDN博客

(665条消息) vsomeip源码梳理 -- Event订阅流程_述剑的博客-CSDN博客

看完这个,你还觉得SOME/IP测试难吗? - 知乎 (zhihu.com)

AP AUTOSAR SOMEIP - 知乎

Autosar AP – AP和CP差异_小火球2.0的博客-CSDN博客_autosar ap和cp的区别

Vsomeip与8155 - 简书 (jianshu.com)

(487条消息) vsomeip源码梳理 -- application初始化_述剑的博客-CSDN博客_vsomeip代码分析

vsomip网络通信配置 - water_bear - 博客园 (cnblogs.com)

什么是AUTOSAR?读这篇文章就够了 (baidu.com)

(486条消息) 译:vsomeip 10 分钟阅读_iBlackAngel的博客-CSDN博客_vsomeip 过滤客户端

vsomeip的json配置文件介绍

(486条消息) vsomeip3 双机通信文件配置_蓝牙先生的博客-CSDN博客_vsomeip配置文件

[someip专题]vsomeip使用以及代码解析1_linux_AgingMoon-DevPress官方社区 (csdn.net)

(486条消息) 译:vsomeip 10 分钟阅读_iBlackAngel的博客-CSDN博客_vsomeip 过滤客户端

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值