IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 高通 sensor see _2 -> 正文阅读

[网络协议]高通 sensor see _2

// 随便  记录下  
sns_service_manager.c

sns_service_manager_init 函数

定义在 .data.sns 段里面…

static sns_fw_service_manager service_manager SNS_SECTION(".data.sns");

// init 流程.
service_manager 管理 各种  service 。
1: stream service
2: attr_svc
3:event_service
4: …

 service_manager.service.struct_len = sizeof(service_manager.service);
  service_manager.service.get_service = &get_service;

  service_manager.services[SNS_STREAM_SERVICE] = (sns_service*)sns_stream_service_init();
  service_manager.services[SNS_ATTRIBUTE_SERVICE] = (sns_service*)sns_attr_svc_init();
  //service_manager.services[SNS_DYNAMIC_BUFFER_SERVICE] = ;
  service_manager.services[SNS_EVENT_SERVICE] = (sns_service*)sns_event_service_init();
  service_manager.services[SNS_DIAG_SERVICE] = (sns_service *)sns_diag_service_init();
  service_manager.services[SNS_POWER_RAIL_SERVICE] = (sns_service*)sns_pwr_rail_service_init();
  service_manager.services[SNS_SYNC_COM_PORT_SERVICE] = (sns_service *)sns_sync_com_port_service_init();
  service_manager.services[SNS_GPIO_SERVICE] = (sns_service *)sns_gpio_service_init();
  service_manager.services[SNS_ISLAND_SERVICE] = (sns_service *)sns_island_service_init();
  return SNS_RC_SUCCESS;

再来看下  get_service 函数.

SNS_SECTION(".text.sns") static sns_service*
get_service(struct sns_service_manager *svc_mngr, sns_service_type service)
{
1:framework service 获得..
  sns_fw_service_manager *this = (sns_fw_service_manager*)svc_mngr;
  if(service >= SNS_SERVICE_TYPE_LENGTH)
    return NULL;

2:Checks if a pointer can be safely dereferenced when in island mode. 如果 为 1,说明 在 island 模式下是安全的.这个不影响 流程.跳过.
  Consider NULL to be a valid island pointer  if(!sns_island_is_island_ptr((intptr_t)this->services[service]))
  {
    SNS_ISLAND_EXIT();
  }
3:返回  具体的 service 
  return this->services[service];
}

这个 直接获得  service_manager 的地址.

SNS_SECTION(".text.sns") sns_fw_service_manager*
sns_service_manager_ref(void)
{
  return &service_manager;
}

举个例子:
参考 :
https://blog.csdn.net/mjfh095215/article/details/113932106?spm=1001.2014.3001.5502

init_dependencies

static void init_dependencies(sns_sensor *const this)
{
  DBG_PRINTF_EX(LOW, this, "init_dependencies sensor");

  for(int i=0;i<ARR_SIZE(def_dependency);i++)
  {
    send_suid_req(this, def_dependency[i], strlen(def_dependency[i]));
  }
}

def_dependency :没看懂是 啥意思?

我们看下  send_suid_req 这个函数

if(shared_state->suid_stream == NULL)
  {
    sns_service_manager *manager = this->cb->get_service_manager(this);
    sns_stream_service *stream_service =
      (sns_stream_service*)manager->get_service(manager, SNS_STREAM_SERVICE);
     stream_service->api->create_sensor_stream(stream_service, this, sns_get_suid_lookup(),
                                               &shared_state->suid_stream);
  }

this->cb->get_service_manager 
这个 函数 sns_sensor_init_fw 
执行的是 get_service_manager 函数

sensor_cb = (sns_sensor_cb)
  {
    .struct_len = sizeof(sensor_cb),
    .get_service_manager = &get_service_manager,

这个 函数 上面写了, 就是返回 service_manager 的地址.
这个  this  参数没有用上.

SNS_SECTION(".text.sns") static struct sns_service_manager*
get_service_manager(sns_sensor const *this)
{
  UNUSED_VAR(this);
  return (sns_service_manager*)sns_service_manager_ref();
}

当然 我们在  sns_service_manager_init 中绑定了 get_service 函数

  service_manager.service.get_service = &get_service;

看下调用:
其实 就是获得了 这个 
service_manager.services[SNS_STREAM_SERVICE] = (sns_service*)sns_stream_service_init();

      (sns_stream_service*)manager->get_service(manager, SNS_STREAM_SERVICE);

在来看下  这个 stream_service 的函数
stream_service_api 这个结构体的初始化 还是要看下,不然到后面真的是找不到了.

sns_fw_stream_service*
sns_stream_service_init(void)
{
  stream_service_api = (sns_stream_service_api)
  {
    .struct_len = sizeof(stream_service_api),
    .create_sensor_stream = &create_sensor_stream,
    .create_sensor_instance_stream = &create_sensor_instance_stream,
    .remove_stream = &remove_stream
  };

  stream_service.service.service.version = version;
  stream_service.service.service.type = SNS_STREAM_SERVICE;
  stream_service.service.api = &stream_service_api;

  return &stream_service;
}

继续回到  send_suid_req 
这个就不在进去看了.看下注释 
Initialize a new stream to be used by a Sensor 
第一个参数: stream 的服务
2: 没有用上
3:uid
4:fw 分配的流

 stream_service->api->create_sensor_stream(stream_service, this, sns_get_suid_lookup(),
                                               &shared_state->suid_stream);

好,继续回到 send_suid_req 函数

继续的话,会进入到 这个里面. 在上面 这个 流创建了,不为空
在这里插入图片描述填充  suid_req

在这里插入图片描述
对数据 进行编码.

    encoded_len = pb_encode_request(buffer, sizeof(buffer), &suid_req, sns_suid_req_fields, NULL);

编码 成功,开始 发送…
buffer 存放了  pb 编码后的内容…
发生 分为2步:
1:讲数据封包成 sns_request 类型
2:send_request 发送 .

if(0 < encoded_len)
    {
      sns_request request = (sns_request){
        .request_len = encoded_len, .request = buffer, .message_id = SNS_SUID_MSGID_SNS_SUID_REQ };
      rc = shared_state->suid_stream->api->
             send_request(shared_state->suid_stream, &request);
    }

我们在来看下 这个 send_request 怎么发送的
在这里插入图片描述关键的 就这个

if(sns_data_stream_validate(stream))
  {
  //  加入 队列 等等执行.
    sns_stream_service_add_request(stream, request);
    rv = SNS_RC_SUCCESS;
  }

也许 这个关键字 对调试 有用,先记录下.
send_request: Invalid stream
发送完毕

后面接收的话

通过SNS_SUID_MSGID_SNS_SUID_EVENT接收的event,获取suid

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:32:48  更:2022-06-06 17:33:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:29:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码