// 随便 记录下 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_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
|