static ACIGA_VOID aciga_device_info_report_version( ACIGA_VOID ) { ACIGA_U8 _au8device_type[32] = {0x04, 0x00, 0x00, 0x00, 0x00, 0x00, SIID_DEVICE_INFORMATION, 0x01, E_DEV_INFO_PIID_MCU_FIRMWARE_VERSION, 0x03}; ACIGA_U8 _au8device_version[128] = {0x04, 0x01, 0x00, 0x00, 0x00, 0x01, SIID_MODULE_INFORMATION, 0x01, E_MODULE_INFO_PIID_VERSION, 0x00 }; const ACIGA_CHAR *ver = aciga_device_frimware_version_get(); _au8device_version[9] = strlen(ver); memcpy( &_au8device_version[10], ver, strlen(ver) ); aciga_device_msg_send_to_mesh( 0, _au8device_version, 10+strlen(ver) ); const ACIGA_CHAR *mcu_ver = aciga_device_strorage_get_device_info(); _au8device_type[9] = strlen(mcu_ver); memcpy( &_au8device_version[10], mcu_ver, strlen(mcu_ver) ); aciga_device_msg_send_to_mesh( 0, _au8device_type, sizeof(_au8device_type) ); }
时间: 2023-10-10 22:07:52 浏览: 99
这段代码看起来像是嵌入式设备的代码。它通过发送消息到网格中传递设备信息,包括设备类型、固件版本和 MCU 版本等。其中 `aciga_device_frimware_version_get()` 和 `aciga_device_strorage_get_device_info()` 分别获取设备的固件版本和 MCU 版本信息,并将其打包成消息发送到网格中。
相关问题
const ACIGA_CHAR *aciga_device_frimware_version_get( ACIGA_VOID ) { return ACIGA_APP_VERSION_FIRMWARE; }为什么这里使用的是指针定义
这里使用指针的原因是函数返回的是一个字符串常量(ACIGA_APP_VERSION_FIRMWARE),该字符串常量是存储在程序的常量区中的,而不是存储在栈或堆中的。因此,如果直接将该字符串常量作为函数的返回值,会导致该字符串常量被释放或修改,从而导致程序错误。
使用指针可以解决这个问题,指针变量存储的是该字符串常量的地址,而不是该字符串常量本身。因此,即使函数执行完毕,该字符串常量仍然存在于常量区中,可以安全地使用该指针变量来访问该字符串常量。同时,由于该指针变量指向的是常量区,因此也可以使用 const 修饰符来确保该指针变量不会被用于修改该字符串常量。
int main(void) { aciga_system_cbs_t cbs = { .ble_stack_inited = ble_stack_inited, .prov_result = prov_result, .platform_io_event = platform_io_event, }; aciga_system_init(&cbs); aciga_app_init(); const device_info_t *_pstdevice_info = aciga_device_strorage_get_device_info(); uint8_t _au8device_mac[6]; aciga_common_str_to_hex( _pstdevice_info->stdid_info.szmac, _au8device_mac, sizeof(_au8device_mac) ); aciga_common_reversal_byte((char *) _au8device_mac, sizeof(_au8device_mac) ); BT_INFO("adv pid=%d", _pstdevice_info->stpid_info.device_pid); uint32_t pid = _pstdevice_info->stpid_info.device_pid; if(pid == 0){ BT_ERR("pid error,use default pid=%d",DEFAULT_PID); pid = DEFAULT_PID; } aciga_connect_adv_config_data(_au8device_mac, pid, _pstdevice_info->stdid_info.szdid); char adv_name[31]; aciga_get_broadcast_name(&adv_name,pid); aciga_connect_adv_config_name(adv_name); aciga_connect_adv_set_lowpoer_interval(ADV_LOWPOWER_INTERVAL); aciga_connect_adv_set_enable(true); uint8_t secret[16]; aciga_common_str_to_hex(_pstdevice_info->stdid_info.szkey, secret, sizeof(secret)); aciga_system_set_conf(ACIGA_SYS_CONF_DEV_SECRET, (void *)secret); bool lowpower_support = true; aciga_system_set_conf(ACIGA_SYS_CONF_LOW_POWER_SUPPORT, (void *)&lowpower_support); pwr_mgr_init(); aciga_host_ota_init(); //test_write_default_key(); // aciga_system_run(0, NULL, NULL); return 0; }
这是一个C语言程序的主函数,程序的功能是初始化系统并启动连接广告。程序首先定义了一个aciga_system_cbs_t类型的结构体变量cbs,并给其中的三个成员变量赋值,这些成员变量分别是ble_stack_inited、prov_result和platform_io_event。然后程序调用aciga_system_init函数和aciga_app_init函数来初始化系统和应用程序。接下来程序调用aciga_device_strorage_get_device_info函数来获取设备信息,并将其存储在一个名为_pstdevice_info的指针所指向的常量中。程序接着将设备MAC地址转换成16进制表示,并将其反转。然后程序根据设备信息设置连接广告的参数,并将其启用。程序接着将设备秘钥转换成16进制表示,并将其存储在系统配置中。程序最后启动系统并返回0。
阅读全文