tag 标签: 协议

相关帖子
相关博文
  • 热度 1
    2024-9-30 10:50
    164 次阅读|
    0 个评论
    01 概述 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。时间戳是使用数字签名技术产生的数据,签名的对象包括了原始文件信息、签名参数、签名时间等信息。时间戳系统用来产生和管理时间戳,对签名对象进行数字签名产生时间戳,以证明原始文件在签名时间之前已经存在。 可信时间戳是由联合信任时间戳服务中心签发的一个电子凭证,用于证明电子数据文件自申请可信时间戳后内容保持完整、未被更改。可信时间戳接入核准书的颁发,标志着可信时间戳在档案领域规范化应用已经开始,并将起到电子档案和档案数字化副本内容防篡改、保障档案的法律凭证的作用。根据《电子签名法有关数据电文原件形式的要求,申请了可信时间戳认证的电子文件、电子档案或纸质档案的数字化副本等可视为法规规定的原件形式。 在线时间戳网站: https://tool.ip138.com/timestamp/ http://shijianchuo.wiicha.com/ 国际移动设备识别码 ( International Mobile Equipment Identity , IMEI ),即通常所说的手机序列号、手机“串号”,用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。序列号共有15~17位数字,前8位(TAC)是型号核准号码(早期为6位),是区分手机品牌和型号的编码。接着2位(FAC)是最后装配号(仅在早期机型中存在),代表最终装配的代码。后6位(SNR)是串号,代表生产顺序号。国际移动设备识别码一般贴于机身背面与外包装上,同时也存在于手机存储器中,通过在手机拨号键盘中输入*#06#即可查询。 02 时间戳原理 时间戳的主要目的在于通过一定的技术手段,对数据产生的时间进行认证,从而验证这段数据在产生后是否经过篡改。 所以时间戳服务的提供者必须证明服务中使用的时间源是可信的,所提供的时间戳服务是安全的。下面介绍最常见的几种时间戳协议,并对各个协议的原理进行分析。 03 应用场景 1、时间戳在计算机编程中的应用 在计算机编程中,时间戳可以帮助程序员跟踪和调试代码。通过在代码中插入时间戳,程序员可以精确记录代码的执行时间以及不同代码之间的时间间隔,从而找出代码中的性能瓶颈或错误。 2、时间戳网络通信中的应用 在网络通信中,时间戳可以用于确定数据包的发送时间和接收时间,从而帮助其在不安全的网络中实现数据的同步传输。 3、时间戳在数字签名中的应用 在数字签名中,比如代码签名中,时间戳管理机构使用公钥基础设施、实现加密和数据签名的流程和技术来确保其时间戳的真实性和完整性,防止软件程序代码被篡改,以保证软件程序代码的真实性和完整性。 (时间戳在代码签名中的应用原理示意图) 4、时间戳在数据库管理中的应用 在数据库管理中,时间戳可以记录数据的插入、更新和删除时间,以帮助数据库管理员跟踪数据的变化历史,以及查找和恢复特定时间点的数据状态。 04 信息化组件的应用 1 Gitee链接地址 组件位于amaziot_bloom_os_sdk\libraries\am\xtu\am_format.c Gitee源码地址:https://gitee.com/ning./hongdou Github源码地址:https://github.com/ayumid/hongdou 2 服务层组件功能介绍 提供增加时间戳,imei实例。 使用该组件,必须同时使用AT组件,文件组件,TCP组件,掉线组件,掉线重连组件。 3 代码讲解 1 dtu_format_send 透传数据格式化后发送 C++ void dtu_format_send(char * raw_data, UINT16 len) { char *data_format = NULL; UINT32 format_size = 0; UINT8 buf = {0}; DTU_FILE_PARAM_T* dtu_file_ctx = NULL; dtu_file_ctx = dtu_get_file_ctx(); SDK_GetDevImei(buf ,DTU_IMEI_LEN + 1); uprintf("raw_data:%s",raw_data); format.type == 1) { format_size = len; format_size += sizeof(DTU_FORMAT_HEAD_T) + sizeof(DTU_FORMAT_TAIL_T); data_format = malloc(format_size + 1); DTU_FORMAT_HEAD_T header = {0}; DTU_FORMAT_TAIL_T tail = {0}; format.header; header.len = 0; header.timestamp = utils_utc8_2_timestamp(); memcpy(header.imei, buf, DTU_IMEI_LEN); header.num++; format.tailer; memcpy(data_format, (void*)&header, sizeof(DTU_FORMAT_HEAD_T)); memcpy(data_format + sizeof(DTU_FORMAT_HEAD_T), (void*)raw_data, len); memcpy(data_format + sizeof(DTU_FORMAT_HEAD_T) + len, (void*)&tail, sizeof(DTU_FORMAT_TAIL_T)); uprintf("%s senddata len: %d\n", __FUNCTION__, __LINE__, format_size); //发送数据到服务器 #ifdef DTU_BASED_ON_TCP dtu_socket_write(data_format, format_size); #endif /* ifdef DTU_BASED_ON_TCP.2023-11-3 15:46:57 by: zhaoning */ #ifdef DTU_BASED_ON_MQTT dtu_mqtt_send(data_format, format_size); #endif /* ifdef DTU_BASED_ON_MQTT.2023-10-30 14:24:51 by: zhaoning */ if(NULL != data_format) { free(data_format); data_format = NULL; } } format.type == 2) { cJSON *format = NULL; char* send = NULL; //创建json对象 format = cJSON_CreateObject(); //按照协议,对象内加入成员 cJSON_AddItemToObject(format, "imei", cJSON_CreateString((char*)buf)); cJSON_AddItemToObject(format, "timestamp", cJSON_CreateNumber(utils_utc8_2_timestamp())); cJSON_AddItemToObject(format, "raw_data", cJSON_CreateRaw(raw_data)); //申请内存 send = malloc(strlen(cJSON_Print(format))); if(NULL != send) { memset(send, 0, strlen(cJSON_Print(format))); send = cJSON_PrintUnformatted(format); // 生成不带空格的JSON字符串 uprintf("send:%s",send); //发送数据到服务器 #ifdef DTU_BASED_ON_TCP dtu_socket_write(send, strlen(send)); #endif /* ifdef DTU_BASED_ON_TCP.2023-11-3 15:46:57 by: zhaoning */ #ifdef DTU_BASED_ON_MQTT dtu_mqtt_send(send, strlen(send)); #endif /* ifdef DTU_BASED_ON_MQTT.2023-10-30 14:24:51 by: zhaoning */ free(send); } //删除json对象 cJSON_Delete(format); } } 4 Demo实战 4.1 创建一个Demo 复制20.2_at_xtu示例工程,到同一个文件夹下,修改文件名为20.9_di_xtu,如图: 4.2 修改makefile 增加文件组件所在目录头文件路径,和源文件路径,以及一些宏定义,如图: -D是makefile中定义宏定义必要的前缀,可以搜索相关makefile学习文章学习相关知识。 DTU_BASED_ON_TCP 表示当前是TCP模式,当前组件使用需要am.h中包含一些对应。 DTU_TYPE_5X6 表示使用SOM板贴片5x6卡,可以使用其它卡,修改为对应宏定义就可以。 DTU_UART_115200_BAUD 表示使用115200波特率 DDTU_TYPE_FORMAT_INCLUDE 表示把格式化功能包含进来 4.3 增加头文件 使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h头文件,如图: 4.4 修改代码 示例使用的是板载5x6卡,用户的硬件可能是使用外置卡,或者是三合一全网通卡,因为硬件上三种卡使用的模组SIM卡接口不一样(外置卡SIM1,5x6卡和三合一卡SIM2),所以,需要通过一个全局变量来制定SIM卡硬件接口。 extern外部变量SDK_INIT_SIM_SELECT_VALUE,这里判断了是否使用外置卡,这个宏定义在Makefile里面定义。 在Phase1Inits_enter中,宏定义判断是否要包含对SDK_INIT_SIM_SELECT_VALUE变量的修改。 在Phase2Inits_exit 调用文件组件提供的对外API,如图: 4.5 编译 在SDK根目录打开命令行,输入命令.\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\20.15_format_xtu\ C++ PS F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08 λ .\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\20.15_format_xtu\ 子目录或文件 out\bin 已经存在。 子目录或文件 build\cJSON 已经存在。 子目录或文件 build\obj 已经存在。 gnumake: Entering directory `F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu' armcc.exe -c --cpu Cortex-R4 --no_unaligned_access -g -O2 --apcs /inter --diag_suppress 2084,1,2,177,188,223,550,1296,2795,6319,9931,9933 --diag_error=warning --gnu --thumb --loose_implicit_cast -DDATA_COLLECTOR_IMPL -DISPT_OVER_SSP -DDIAG_SSP_DOUBLE_BUFFER_USE_DYNAMIC_ALLOCATION -DENV_XSCALE -DL1_DCXO_ENABLED -DLTE_HIGH_MOBILITY_OPTIMIZATION -DRUN_XIP_MODE -DCRANE_Z2 -DCA_LONG_IPC_MSG -DNEZHA3 -DNEZHA3_1826 -DUPGRADE_PLMS -DUPGRADE_PLMS_SR -DLTE_GSMMULTIBCCH -DGPLC_LTE_RSSI_SCAN -DL1V_NEW_RSSI -DUPGRADE_PLMS_3G -DUPGRADE_PLMS_L1 -DUPGRADE_FG_PLMS -DFG_PLMS_URR -DUPGRADE_L1A_FG_PLMS -DUPGRADE_PLMS_STAGE_2 -DUPGRADE_MBCCH -DMULTI_BCCH_READY_IND -DURR_MRAT_ICS_SEARCH -DUPGRADE_ICS -DMRAT_NAS -DUPGRADE_PLMS_SEARCH_API -DICS_MBCCH -DICS_MBCCH_2G_RSSI -DDIAG_NEWPP -DPHS_SW_DEMO -DPHS_SW_DEMO_TTC -DPHS_SW_DEMO_TTC_PM -DFULL_SYSTEM -D_DDR_INIT_ -D_TAVOR_HARBELL_ -DUPGRADE_ARBEL_PLATFORM -D_TAVOR_B0_SILICON_ -DTDL1C_SPY_ENABLE -DDLM_TAVOR -DTAVOR -DFLAVOR_DUALCORE -DDEBUG_D2_MOR_REG_RESEREVED_ENABLE -D_DIAG_USE_COMMSTACK_ -D_TAVOR_DIAG_ -DPM_DEBUG_MODE_ENABLED -DPM_D2FULL_MODE -DPM_EXT_DBG_INT_ARR -DFEATURE_WB_AMR_PS -DMACRO_FOR_LWG -DHL_LWG -DOPTIMIZE_FOR_2G_BCCH -DPLAT_TEST -D_FDI_USE_OSA_ -DPLAT_USE_THREADX -DLWIP_IPNETBUF_SUPPORT -DCRANE_MCU_DONGLE -DAT_OVER_UART -DPHS_SW_DEMO_TTC_PM -DUPGRADE_LTE_ONLY -DEXT_AT_MODEM_SUPPORT -DLTEONLY_THIN_SINGLE_SIM -DLFS_FILE_SYS -DLFS_FILE_SYS_V2 -DPSM_ENABLE -DNO_PAHO_MQTT -DNO_XML -DNO_LWM2M -DREMOVE_MBEDTLS -DNO_AT_NET -DCRANE_SD_NOT_SUPPORT -DNTP -DYMODEM_EEH_DUMP -DENABLE_DM_LTEONLY -DLTEONLY_THIN -DNO_EXTEND_MY_Q_AT -DNOT_SUPPORT_HTTPS -DNOT_SUPPORT_PM813 -DCRANEL_4MRAM -DREMOVE_PB -DUART_NEW_VERSION -DREMOVE_MEP -DREMOVE_SMS -DREMOVE_ENVSIM -DAPN_INCODE -DLTEONLY_THIN_SINGLE_SIM_2MFLASH -DASR160X_OPENCPU_FEATURE -DENABLE_UART3_FEATRUE -DENABLE_UART4_FEATRUE -DYUGE_MBEDTLS_3_2_1 -DENABLE_MAC_TX_DATA_LOGGING -DDISABLE_NVRAM_ACCESS -DINTEL_UPGRADE_EE_HANDLER_SUPPORT -DLTE_W_PS -DL1_DUAL_MODE -DUPGRADE_HERMON_DUAL -DINTEL_UPGRADE_DUAL_RAT -DINTEL_UPGRADE_GPRS_CIPHER_FLUSH -DUPGRADE_ENHANCED_QUAD_BAND -DINTEL_2CHIP_PLAT -DI_2CHIP_PLAT -DUPGRDE_TAVOR_COMMUNICATION -DRUN_WIRELESS_MODEM -DFLAVOR_DDR12MB_GB1MB5 -DFEATURE_SHMEM -DACIPC_ENABLE_NEW_CALLBACK_MECHANISM -DRELIABLE_DATA -DMAP_NSS -DTV_FNAME="\"SW_PLATFORM=PMD2NONE PHS_SW_DEMO PHS_SW_DEMO_PM SRCNUCLEUS FULL_SYSTEM NOACRTC PDFLT PLAT_TEST PV2 DIAGOSHMEM NVM WITHL1V\"" -DTV_FDESC="\"SW_DESCRIPTION=\"" -DENABLE_ACIPC -D_DATAOMSL_ENABLED_ -DUSB_CABLE_DETECTION_VIA_PMIC -DMIPS_TEST -DMIPS_TEST_RAM -DFLAVOR_DIET_RAM -DNVM_INCLUDE -DMSL_INCLUDE -DMSL_POOL_MEM -DNO_AUDIO -DOSA_QUEUE_NAMES -D_DIAG_DISABLE_USB_ -DOSA_NUCLEUS -DOSA_USED -DPM_D2NONE_MODE -DCRANE_SOC_TEMPERATURE_SENSOR -DL1_SW_UPDATE_FOR_DIGRF -DPHS_L1_SW_UPDATE_R7 -DUPGRADE_LTE -DFRBD_CALIB_NVM -DFRBD_AGC_CALIB -DFRBD_FDT_CALIB -DHSPA_MPR -DCAPT_PARAMS_OPTIMIZE -DL1_WB_R99_ONLY -DL1V_WB_R99_ONLY -DINTERGRATED_RF_SUPPORT -DL1_RX_DIV_SUPPORT -DENABLE_OOS_HANDLING -DTAVOR_D2_WB_L1_SUPPORT -DL1_DDR_HIGH_FREQ -DUPGRADE_DIGRF3G_SUPPORT -DW_PS_PLUS_G_PAGING -D"NO_APLP=0" -DINTEL_UPGRADE_UNIFIED_VOICE_TASK -DINTEL_UPGRADE_R99 -DAPLP_SPY_ENABLE -D__TARGET_FEATURE_DOUBLEWORD -DWHOLE_UMTS_STACK -DUSE_TTPCOM_CSR_BLUETOOTH_AUDIO_GAIN_CONTROL -DL1_UPGRADE_R5 -DUPGRADE_EDGE -DUPGRADE_R4_FS1 -DINTEL_UPGRADE_GSM_CRL_IF -DUPGRADE_EGPRS_M -DINTEL_UPGRADE_EGPRS_M -DINTEL_UPGRADE_RF_PARAMS_IN_CF_TDS -DINTEL_UPGRADE_2SAMPLES_PER_SYMBOL -D"GPRS_MULTISLOT_CLASS=12" -D"EGPRS_MULTISLOT_CLASS=12" -DMARVELL_UPGRADE_BSIC_REDESIGN -DMSL_INCLUDE -DINTEL_HERMON_SAC -DCRANE_CUST_BUILD -DL1_SW_UPDATE_FOR_DIGRF -DFLAVOR_COM -DSILICON_PV2 -DSILICON_SEAGULL -DSILICON_TTC_CORE_SEAGULL -DPCAC_INCLUDE -Otime -DBUILD_DATE="\"01 02 2024\"" -DBUILD_TIME="\"12:15:41\"" -Iatcmds\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\yuge\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\UART\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\core\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\PMU\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\GPIO\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\posix\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\diag\diag_logic\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\SysCfg\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\platform\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\env\win32\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\BSP\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\platform\dev_plat\build -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\osa\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\threadx\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\nu_xscale\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\psm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\httpclient\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\diag\diag_logic\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\timer\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\intc\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\PM\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\pm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\TickManager\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\BSP\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\atcmdsrv\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\atparser\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\sdk\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\httpclient\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\ci\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\arch -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\ipv4 -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\ipv6 -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\lwip -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\netif -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\mmi_mat\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\tavor\Arbel\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\tavor\env\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\modem\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\duster\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\fota\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\I2C\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\ACIPC\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fatsys\flash -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\INCLUDE -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\MMU\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\FDI_ADD -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\FM_INC -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fatsys\fs\hdr -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\littlefs\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\tts\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\dial\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\csw_memory\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\utilities\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\commpm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\nvm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\EEhandler\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\EEhandler\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\RTC\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\ci_client\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\BT_device\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\UART\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\mrd\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\dma\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\softutil\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\SPI\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\websocket\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\atnet_srv\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fotacomm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\Audio\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\ACM_COMM\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\audio_stub\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\aam\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\AudioHAL\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\dbgshell\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\opencpu\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\amaziot_bloom_os_sdk\utils -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\CSDK_CODE\cJSON\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu\am\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu\atcmds\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries\am\xtu -DDTU_BASED_ON_TCP -DDTU_TYPE_5X6 -DDTU_UART_115200_BAUD -DDTU_TYPE_FORMAT_INCLUDE -DDTU_TYPE_CJSON_INCLUDE -o build\obj/ext_at_cmds.o F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu/atcmds/src/ext_at_cmds.c armcc.exe -c --cpu Cortex-R4 --no_unaligned_access -g -O2 --apcs /inter --diag_suppress 2084,1,2,177,188,223,550,1296,2795,6319,9931,9933 --diag_error=warning --gnu --thumb --loose_implicit_cast -DDATA_COLLECTOR_IMPL -DISPT_OVER_SSP -DDIAG_SSP_DOUBLE_BUFFER_USE_DYNAMIC_ALLOCATION -DENV_XSCALE -DL1_DCXO_ENABLED -DLTE_HIGH_MOBILITY_OPTIMIZATION -DRUN_XIP_MODE -DCRANE_Z2 -DCA_LONG_IPC_MSG -DNEZHA3 -DNEZHA3_1826 -DUPGRADE_PLMS -DUPGRADE_PLMS_SR -DLTE_GSMMULTIBCCH -DGPLC_LTE_RSSI_SCAN -DL1V_NEW_RSSI -DUPGRADE_PLMS_3G -DUPGRADE_PLMS_L1 -DUPGRADE_FG_PLMS -DFG_PLMS_URR -DUPGRADE_L1A_FG_PLMS -DUPGRADE_PLMS_STAGE_2 -DUPGRADE_MBCCH -DMULTI_BCCH_READY_IND -DURR_MRAT_ICS_SEARCH -DUPGRADE_ICS -DMRAT_NAS -DUPGRADE_PLMS_SEARCH_API -DICS_MBCCH -DICS_MBCCH_2G_RSSI -DDIAG_NEWPP -DPHS_SW_DEMO -DPHS_SW_DEMO_TTC -DPHS_SW_DEMO_TTC_PM -DFULL_SYSTEM -D_DDR_INIT_ -D_TAVOR_HARBELL_ -DUPGRADE_ARBEL_PLATFORM -D_TAVOR_B0_SILICON_ -DTDL1C_SPY_ENABLE -DDLM_TAVOR -DTAVOR -DFLAVOR_DUALCORE -DDEBUG_D2_MOR_REG_RESEREVED_ENABLE -D_DIAG_USE_COMMSTACK_ -D_TAVOR_DIAG_ -DPM_DEBUG_MODE_ENABLED -DPM_D2FULL_MODE -DPM_EXT_DBG_INT_ARR -DFEATURE_WB_AMR_PS -DMACRO_FOR_LWG -DHL_LWG -DOPTIMIZE_FOR_2G_BCCH -DPLAT_TEST -D_FDI_USE_OSA_ -DPLAT_USE_THREADX -DLWIP_IPNETBUF_SUPPORT -DCRANE_MCU_DONGLE -DAT_OVER_UART -DPHS_SW_DEMO_TTC_PM -DUPGRADE_LTE_ONLY -DEXT_AT_MODEM_SUPPORT -DLTEONLY_THIN_SINGLE_SIM -DLFS_FILE_SYS -DLFS_FILE_SYS_V2 -DPSM_ENABLE -DNO_PAHO_MQTT -DNO_XML -DNO_LWM2M -DREMOVE_MBEDTLS -DNO_AT_NET -DCRANE_SD_NOT_SUPPORT -DNTP -DYMODEM_EEH_DUMP -DENABLE_DM_LTEONLY -DLTEONLY_THIN -DNO_EXTEND_MY_Q_AT -DNOT_SUPPORT_HTTPS -DNOT_SUPPORT_PM813 -DCRANEL_4MRAM -DREMOVE_PB -DUART_NEW_VERSION -DREMOVE_MEP -DREMOVE_SMS -DREMOVE_ENVSIM -DAPN_INCODE -DLTEONLY_THIN_SINGLE_SIM_2MFLASH -DASR160X_OPENCPU_FEATURE -DENABLE_UART3_FEATRUE -DENABLE_UART4_FEATRUE -DYUGE_MBEDTLS_3_2_1 -DENABLE_MAC_TX_DATA_LOGGING -DDISABLE_NVRAM_ACCESS -DINTEL_UPGRADE_EE_HANDLER_SUPPORT -DLTE_W_PS -DL1_DUAL_MODE -DUPGRADE_HERMON_DUAL -DINTEL_UPGRADE_DUAL_RAT -DINTEL_UPGRADE_GPRS_CIPHER_FLUSH -DUPGRADE_ENHANCED_QUAD_BAND -DINTEL_2CHIP_PLAT -DI_2CHIP_PLAT -DUPGRDE_TAVOR_COMMUNICATION -DRUN_WIRELESS_MODEM -DFLAVOR_DDR12MB_GB1MB5 -DFEATURE_SHMEM -DACIPC_ENABLE_NEW_CALLBACK_MECHANISM -DRELIABLE_DATA -DMAP_NSS -DTV_FNAME="\"SW_PLATFORM=PMD2NONE PHS_SW_DEMO PHS_SW_DEMO_PM SRCNUCLEUS FULL_SYSTEM NOACRTC PDFLT PLAT_TEST PV2 DIAGOSHMEM NVM WITHL1V\"" -DTV_FDESC="\"SW_DESCRIPTION=\"" -DENABLE_ACIPC -D_DATAOMSL_ENABLED_ -DUSB_CABLE_DETECTION_VIA_PMIC -DMIPS_TEST -DMIPS_TEST_RAM -DFLAVOR_DIET_RAM -DNVM_INCLUDE -DMSL_INCLUDE -DMSL_POOL_MEM -DNO_AUDIO -DOSA_QUEUE_NAMES -D_DIAG_DISABLE_USB_ -DOSA_NUCLEUS -DOSA_USED -DPM_D2NONE_MODE -DCRANE_SOC_TEMPERATURE_SENSOR -DL1_SW_UPDATE_FOR_DIGRF -DPHS_L1_SW_UPDATE_R7 -DUPGRADE_LTE -DFRBD_CALIB_NVM -DFRBD_AGC_CALIB -DFRBD_FDT_CALIB -DHSPA_MPR -DCAPT_PARAMS_OPTIMIZE -DL1_WB_R99_ONLY -DL1V_WB_R99_ONLY -DINTERGRATED_RF_SUPPORT -DL1_RX_DIV_SUPPORT -DENABLE_OOS_HANDLING -DTAVOR_D2_WB_L1_SUPPORT -DL1_DDR_HIGH_FREQ -DUPGRADE_DIGRF3G_SUPPORT -DW_PS_PLUS_G_PAGING -D"NO_APLP=0" -DINTEL_UPGRADE_UNIFIED_VOICE_TASK -DINTEL_UPGRADE_R99 -DAPLP_SPY_ENABLE -D__TARGET_FEATURE_DOUBLEWORD -DWHOLE_UMTS_STACK -DUSE_TTPCOM_CSR_BLUETOOTH_AUDIO_GAIN_CONTROL -DL1_UPGRADE_R5 -DUPGRADE_EDGE -DUPGRADE_R4_FS1 -DINTEL_UPGRADE_GSM_CRL_IF -DUPGRADE_EGPRS_M -DINTEL_UPGRADE_EGPRS_M -DINTEL_UPGRADE_RF_PARAMS_IN_CF_TDS -DINTEL_UPGRADE_2SAMPLES_PER_SYMBOL -D"GPRS_MULTISLOT_CLASS=12" -D"EGPRS_MULTISLOT_CLASS=12" -DMARVELL_UPGRADE_BSIC_REDESIGN -DMSL_INCLUDE -DINTEL_HERMON_SAC -DCRANE_CUST_BUILD -DL1_SW_UPDATE_FOR_DIGRF -DFLAVOR_COM -DSILICON_PV2 -DSILICON_SEAGULL -DSILICON_TTC_CORE_SEAGULL -DPCAC_INCLUDE -Otime -DBUILD_DATE="\"01 02 2024\"" -DBUILD_TIME="\"12:15:41\"" -Iatcmds\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\yuge\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\UART\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\core\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\PMU\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\GPIO\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\posix\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\diag\diag_logic\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\SysCfg\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\platform\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\env\win32\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\BSP\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\platform\dev_plat\build -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\osa\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\threadx\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\nu_xscale\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\psm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\httpclient\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\diag\diag_logic\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\timer\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\intc\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\PM\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\pm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\TickManager\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\BSP\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\atcmdsrv\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\atparser\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\sdk\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\httpclient\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\ci\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\arch -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\ipv4 -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\ipv6 -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\lwip -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\netif -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\mmi_mat\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\tavor\Arbel\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\tavor\env\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\modem\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\duster\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\fota\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\I2C\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\ACIPC\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fatsys\flash -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\INCLUDE -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\MMU\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\FDI_ADD -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\FM_INC -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fatsys\fs\hdr -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\littlefs\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\tts\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\dial\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\csw_memory\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\utilities\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\commpm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\nvm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\EEhandler\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\EEhandler\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\RTC\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\ci_client\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\BT_device\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\UART\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\mrd\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\dma\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\softutil\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\SPI\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\websocket\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\atnet_srv\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fotacomm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\Audio\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\ACM_COMM\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\audio_stub\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\aam\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\AudioHAL\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\dbgshell\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\opencpu\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\amaziot_bloom_os_sdk\utils -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\CSDK_CODE\cJSON\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu\am\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu\atcmds\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries\am\xtu -DDTU_BASED_ON_TCP -DDTU_TYPE_5X6 -DDTU_UART_115200_BAUD -DDTU_TYPE_FORMAT_INCLUDE -DDTU_TYPE_CJSON_INCLUDE -o build\obj/utils_string.o F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/utils/utils_string.c armlink.exe build\obj/main.o build\obj/ext_at_cmds.o build\obj/ext_at_controller.o build\obj/am_file.o build\obj/am_at.o build\obj/am_trans.o build\obj/am_socket.o build\obj/am_hb.o build\obj/am_net.o build\obj/am_format.o build\obj/utils_string.o build\CSDK_CODE.lib \ -o F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\out\bin\Arbel_PMD2NONE_40M.axf \ --via F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\prebuilt_1606l\Arbel_PMD2NONE_targ_objliblist.txt \ --elf \ --scatter F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\prebuilt_1606l\Crane_DS_4M_Ram_2M_Flash_XIP_CIPSRAM_Common_SingleSIM.sct \ --predefine="-DLTEONLY_THIN_SINGLE_SIM" --map --symbols --info sizes,totals \ --list F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\out\bin\Arbel_PMD2NONE_40M.map \ --keep init.o(Header) --keep init.o(Vectors) --diag_suppress 6312,6314,6319,6329 \ --feedback F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\out\feedbackLinkOptLteonlyThin_SingleSim_NoSMS.txt F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\tools\buildimage_1606l.bat SDK_PROD_TYPE : SDK_CUST_SKU : SDK_PS_MODE : SDK_CHIP_VER : SDK_OS_TYPE : Platform Convertion Tools v4.01 with PS option extension Convertion done! |INPUT |out\bin\cp_1606L.bin |MARK |NAME |EXEADDR .LOADADDR.LENGTH .CPZLADDR|COMPRESS STASTIC | |--------|--------|--------.--------.--------.--------|------------------------------| |This Is LteOnly 4M| 00003000 |This Is LteOnly 4M| 00001000 |This Is LteOnly 4M| 0000a000 |This Is LteOnly 4M| 0001e000 |This Is LteOnly 4M| 0001b000 |This Is LteOnly 4M| 0001b000 |This Is LteOnly 4M| 0001a000 |This Is LteOnly 4M| 0001a000 |This Is LteOnly 4M| 00011000 |This Is LteOnly 4M| 0001e000 |This Is LteOnly 4M| 00021000 |This Is LteOnly 4M| 00012000 |--------|--------|--------.--------.--------.--------|------------------------------| 0x0014a000| 1.289(MB)| |------------------------------------------------------------------------------------| cp_1606L.axf cp_1606L.bin cp_1606L.map gnumake: Leaving directory `F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.15_format_xtu' "copy NEZHAC_CP_CNR_MIFI_TX.bin to ./ " 已复制 1 个文件。 4.6 生成固件 参考入门中开发工具,生成工具。 4.7 查看现象 固件下载到模组,设置参数连接服务器,发送透传数据,查看服务器数据是否按照配置上报。 配置为AT+FMCFG=1,上报为十六进制数据。配置AT+FMCFG=2,上报JSON数据(注意配置为2,只支持字符串透传,十六进制尽量配置为1) Plain Text OK +TRANSIP:"TCP","",0 +TRANSHEARTFLAG:0 +TRANSHEART:0,"" +TRANSLINKFLAG:0 +TRANSLINK:"" +CMDPW:"" OK AT+TRANSIP="TCP","101.200.35.208",8866 OK CONNECT OK +TRANSIP:"TCP","101.200.35.208",8866 +TRANSHEARTFLAG:0 +TRANSHEART:0,"" +TRANSLINKFLAG:0 +TRANSLINK:"" +CMDPW:"" OK +FMHT:0x0,0x0 OK AT+FMHT="3F3F","F3F3" OK AT+FMCFG=1 OK ATO OK OK AT+FMCFG=2 OK ATO OK 5 总结 根据实验现象,用户需要实现自己的AT指令,只需要参考组件中的例子,按照自己需求修改, 注:本文部分内容来源于网络,如有侵权,请及时联系我们。 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)
  • 2024-9-29 16:13
    205 次阅读|
    0 个评论
    01 概述 Modbus 是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus 网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动 Modbus 在基于以太网上的分布式应用,目前施耐德公司已将 Modbus 协议的所有权移交给 IDA(Interface for Distributed Automation,分布式自动化接口)组织,并成立了 Modbus-IDA 组织,为 Modbus 今后的发展奠定了基础。 在中国,Modbus 已经成为国家标准,并有专业的规范文档,感兴趣的可以去查阅相关的文件,详情如下:标准编号为:GB/T19582-2008文件名称:《基于 Modbus 协议的工业自动化网络规范》,主要包含三个部分: GB-T19582.1-2008 第 1 部分:Modbus 应用协议 GB-T19582.1-2008 第 2 部分:Modbus 协议在串行链路上的实现指南 GB-T19582.1-2008 第 3 部分:Modbus 协议在 TCP/IP 上的实现指南 02 Modbus 的作用 Modbus 协议是一种通信协议,而且是一种开放协议,因此广泛地用于在工业自动化系统中实现设备之间的数据交换。它是最常用的串行通信协议之一,广泛应用于监控和控制设备之间的通信。简而言之,它是用于在电子设备之间的串行线路上传输信息的方法。请求信息的设备被称为 Modbus 客户端,提供信息的设备是 Modbus 服务器。Modbus 支持单主机,多个从机,在标准 Modbus 网络中,有一个客户端和多达 247个服务器,每个服务器都有从 1 到 247 的唯一服务器地址。客户端还可以向服务器写入信息。 Modbus 通常用于从仪器和控制设备传输信号到主控制器或数据采集系统,例如用于测量温度和湿度并将结果传输到计算机的系统。Modbus 通常用于将监控计算机与远程终端单元(RTU)连接在一起,这在监控和数据采集(SCADA)系统中使用。 Modbus 协议简单易于实现,传输效率高,因此在工业自动化领域得到广泛应用。它支持多个设备之间的并行通信,可以实现分布式控制系统的互联互通。同时,Modbus 协议还具有跨平台、跨厂商的特点,使得不同厂商 03 Modbus 的工作原理 1、四种数据类型 Modbus协议规定,进行读写操作的数据类型,按照读写属性和类型可分为以下4种: 内存区块 数据类型 主设备访问 从设备访问 内容 离散量输入 布尔 只读 读写 I/O 系统提供这种类型数据 线圈 布尔 读写 读写 通过应用程序改变这种类型数据 输入寄存器 无符号双字节整型 只读 读写 I/O 系统提供这种类型数据 保持寄存器 无符号双字节整型 读写 读写 通过应用程序改变这种类型数据 2、三种工作模式 Modbus 协议主要有三种形式:Modbus ASCII、Modbus RTU 和 Modbus TCP/IP。Modbus ASCII 和 Modbus RTU 是基于串行通信的协议,而 Modbus TCP/IP 则是基于以太网的协议。 Modbus ASCII 是一种文本协议,使用 ASCII 码表示数据。它使用起始字符(“:”)、从站地址、功能码、数据、结尾字符(换行符 CR/LF)等字段来定义通信内容,并采用的是 LRC 校验算法。数据以 ASCII 码的形式传输,通常是通过 RS-232 或 RS-485 等串行通信接口进行传输。 Modbus RTU 是一种二进制协议,使用二进制码表示数据。它采用起始字符、从站地址、功能码、数据等字段来定义通信内容,并使用 CRC 校验位来保证数据的完整性。Modbus RTU 通常通过 RS-232、RS-485 或 RS-422 等串行通信接口进行传输。 Modbus TCP/IP 是一种基于以太网的协议,使用 TCP/IP 协议栈进行通信。它使用以太网帧作为数据传输的封装,通过 IP 地址和端口号来标识设备。其占用的是 502 端口,数据帧主要包括两部分:MBAP(报文头)+PDU(帧结构),数据块与串行链路是一致的。Modbus TCP/IP 可以通过以太网、无线局域网等网络介质实现设备之间的远程通信。 3、三类功能码 Modbus 协议定义了一系列功能码,用于读取和写入设备的寄存器。常用的功能码包括读取保持寄存器、读取输入寄存器、写单个保持寄存器等。通过组合使用功能码和寄存器地址,可以实现对设备的读取和控制操作。 Modbus 主要包括 3 类功能码:公共功能码、用户定义功能码和保留功能码。 3.1 标志功能码 0 类代码 0 类代码通常被认为是有效 Modbus 设备的最低配置,因为此类代码可使主设备能够读取或写入数据模型。 代码 说明 3 读取多寄存器 16 写入多寄存器 1 类代码 1 类功能码由访问所有类型的数据模型所需的其他代码组成。在原始定义中,此列表包含功能码 7(读取异常)。但是,当前规范规定此代码为仅限于串行的代码。 代码 说明 1 读取线圈 2 读取离散量输入 4 读取输入寄存器 5 写入单个线圈 6 写入单个寄存器 7 读取异常状态(仅限串行) 2 类代码 2 类功能码表示不太常用但更为专业化的功能。例如,读取/写入多个寄存器可能有助于减少请求-响应周期的总数,但该行为仍可用 0 类代码实现。 代码 说明 15 写入多个线圈 20 读取文件记录 21 写入文件记录 22 屏蔽写入寄存器 23 读取/写入多个寄存器 24 读取 3.2 Modbus 封装接口 Modbus 封装接口(MEI)代码(即功能 43)用于封装 Modbus 数据包内的其他数据。目前,提供了两个 MEI 编号,即 13 (CANopen) 和 14(设备识别)。 功能 43/14(设备识别)非常有用,因为它允许传输多达 256 个唯一的对象。其中一些对象已预定义并预留,例如供应商名称和产品代码,但应用程序可以将其他对象定义为作为通用数据集传输。 此类代码并不常用。 3.3 异常 从设备使用异常来指示各种不良状况,比如错误请求或不正确输入。但是,异常也可以作为对无效请求的应用程序级响应。从设备不会响应发出异常的请求,而是忽略不完整或损坏的请求,并开始等待新的消息传入。 异常以定义好的数据包格式报告给用户。首先,将功能码返回给等同于原始功能码的请求主设备,设置最高有效位的情况除外。这等同于为原始功能码的值加上 0x80。异常响应包括一个异常码,用于代替与给定功能响应相关的正常数据。 异常码 含义 01 不支持接收的功能码。要确认原始功能码,请从返回值中减去0x80。 02 请求尝试访问的地址无效。根据标准,只有在起始地址和所请求值的编号超过216时才会发生这种情况。但是,有些设备可能会限制其 03 请求包含不正确的数据。在某些情况下,这意味着参数不匹配,例如所发送寄存器的数量与“字节总数”字段之间的参数不匹配。更常见的情况是,主设备请求的数据高于从设备或协议所允许的上限。例如,主设备一次只能读取 125 个保持寄存器,而资源受限的设备可能会将此值限制为更少的寄存器。 04 尝试处理请求时发生不可恢复的错误。这是一个常见异常码,表示请求有效,但从设备无法执行该请求。 每个功能码的状态图至少应包含异常码 01,通常包含异常码 02、03、04,并且任何其他定义的异常码都是可选的。 04 Modbus 协议层 在最初的做法中,Modbus 是建立在串行端口之上的单一协议,因此它不能被分成多个层。随着时间的推移,该协议引入了不同的应用数据单元,来更改串行通信所用的数据包格式,或允许使用 TCP/IP 和 UDP 网络。这样便实现了核心协议和网络层的分离,前者用于定义协议数据单元(PDU),后者用于定义应用数据单元(ADU)。 4.1 协议数据单元 PDU及其处理代码构成了 Modbus应用协议规范 的核心。该规范定义了PDU的格式、协议使用的各种数据概念、如何使用功能码访问数据,以及每个功能码的具体实现和限制。 Modbus PDU 格式可定义为功能码,后跟一组关联数据。该数据的大小和内容由功能码定义,整个 PDU(功能码和数据)的大小不能超过 253 个字节。每个功能码都有一个特定的行为,从设备可以根据所需的应用程序行为灵活地实现这些行为。PDU 规范定义了数据访问和操作的核心概念;但是,从设备可能会以规范中未明确定义的方式处理数据。 PDU 由一个单字节的功能码组成,后跟多达 252 字节的功能特定数据。 功能码是第一个需要验证的项。如果用于接收请求的设备未识别功能码,则会返回异常。如果功能码被接受,则从设备会根据功能定义开始分解数据。 由于数据包大小限制为 253 字节,因此设备可传输的数据量有限。最常见的功能码可以在从数据模型中传输 240 到 250 字节的实际数据,具体取决于代码。 由于数据包大小限制为 253 字节,因此设备可传输的数据量有限。最常见的功能码可以在从数据模型中传输 240 到 250 字节的实际数据,具体取决于代码。 4.2 访问数据 一般来说,Modbus 可访问的数据存储在前面所提到的四个数据库或地址范围中的其中一个:线圈、离散量输入、保持寄存器 和 输入寄存器。与许多规范一样,这些名称可能因行业或应用而异。例如,保持寄存器可能称为输出寄存器,线圈可能称为数字或离散量输出。这些数据库定义了所包含数据的类型和访问权限。从设备可以直接访问这些数据,因为这些数据由设备本地托管。Modbus 可访问的数据通常是设备主存的一个子集。相反,Modbus 主设备必须通过各种功能码请求访问这些数据。 通过这些区块,我们可以限制或允许访问不同的数据元素,还可以在应用层提供简化的机制来访问不同的数据类型。 这些区块是完全概念性的。它们可能作为独立的内存地址存在于给定的系统中,但也可能重叠。例如,线圈1可能存在于与保持寄存器1所代表的字的第一位相同的内存中。寻址方案完全由从设备定义,其对每个内存区块的解释是设备数据模型的重要组成部分。 4.3 数据模型寻址 该规范将每个区块定义为包含多达 65536 个元素的地址空间。在 PDU 的定义中,Modbus 定义了每个数据元素的地址,范围是从 0 到 65535。然而,每个数据元素的编号从 1 到 n,其中 n 的最大值为 65536。也就是说,线圈 1 位于地址 0 的线圈区块中,而保持寄存器 54 位于从设备定义为保持寄存器的内存部分中的地址 53。 规范允许的全部范围不需要给定设备实现。例如,设备可能会选择不执行线圈、离散量输入或输入寄存器,而只使用保持寄存器 150 至 175 和 200 至 225。这是完全可以接受的,而且可以通过例外来处理无效的访问尝试。 4.3.1 数据寻址范围 虽然规范将不同的数据类型定义为存在于不同的区块中,并为每种类型分配一个本地地址范围,但这并不一定能转化为用于记录或了解给定设备的 Modbus 可访问内存的直观寻址方案。为了简化对内存区块位置的理解,我们引入了一种编号方案,即向所讨论数据的地址中添加前缀。 例如,在设备手册中,数据项不会表示为位于地址 13 的保持寄存器 14,而是表示为位于地址 4014、40014或 400014 的数据项。在这几种情况中,第一个数字都是4,表示保持寄存器,其余数字则用于指定地址。4XXX、4XXXX 和 4XXXXX 的区别取决于设备所用的地址空间。如果 65,536 个寄存器全部都在使用,应该使用 4XXXXX 符号,因为它支持 400,001 到 465,536 的范围。如果只有几个寄存器在使用,通常的做法是使用 4,001 到 4,999 的范围。 在这种寻址方案中,每种数据类型都被分配了一个前缀,如下表所示。 数据区块 前缀 线圈 0 离散量输入 1 输入寄存器 3 保持寄存器 4 线圈的前缀为 0,这意味着 4001 的引用可能是指保持寄存器 1 或线圈 4001。出于这个原因,建议所有的新实现都使用带前导零的 6 位数寻址,并在记录时注明这一点。因此,保持寄存器 1 的地址为 400001,而线圈 4001 的地址则为 004001。 4.3.2 数据地址起始值 内存地址和引用编号之间的差异会因给定应用程序选择的索引而进一步复杂化。如前所述,保持寄存器 1 位于地址 0。通常,引用编号索引从 1 开始,这意味着给定范围的起始值为 1。因此,400001 即表示位于地址 0 的保持寄存器 00001。一些实现选择以 0 作为范围起始值,即 400000 表示位于地址 0 的保持寄存器。下表展示了这个概念。 地址 寄存器编号 编号(索引从 1 开始,标准) 编号(索引从 0 开始,备选) 0 1 400001 400000 1 2 400002 400001 2 3 400003 400002 从 1 开始的索引范围应用较为广泛,强烈建议采用这种方案。无论哪种情况,每个范围的起始值都应在记录时注明。 4.4 大数据类型 Modbus 标准提供了一个相对简单的数据模型,该模型不包含除无符号双字节整型和位值之外的其他数据类型。如果系统的位值对应于螺线管和继电器,并且双字节整型值对应于未缩放的 ADC 值,上述模型便已足够;但对于更高级的系统,则无法满足需求。 因此,许多 Modbus 实现都包含跨寄存器边界的数据类型。NI LabVIEW 数据记录和监控(DSC)模块以及 KEPServerEX 都定义了许多引用类型。例如,存储在保持寄存器中的字符串应遵循标准格式(400,001),但后跟一个十进制数、长度和字符串的字节序(400001.2H 是指保持寄存器 1 中包含两个字符的字符串,其中高位字节对应到字符串的第一个字符)。这是必需的,因为每个请求的大小都是有限的,所以 Modbus 主设备必须知道字符串的确切范围,而不是搜索长度或分隔符(如 NULL)。 4.4.1 位访问 除了允许访问跨寄存器边界的数据之外,一些 Modbus 主设备还支持对寄存器中各个位的引用。由于允许设备将相同内存范围内的每种类型的数据组合在一起,而不必将二进制数据分成线圈和离散量输入范围,因此该功能非常有益。通常使用小数点和位索引或编号进行索引,具体取决于如何实现。也就是说,第一个寄存器的第一位可能是 400,001.00 或 400,001.01。建议所有文档均说明所使用的索引方案。 4.4.2 数据字节序 通过将数据拆分到两个寄存器,多寄存器数据(如单精度浮点值)可以轻松地通过 Modbus 进行传输。由于这不是由标准定义的,因此此类拆分的字节序未作规定。尽管每个无符号双字节整型必须以网络(大端)字节序发送才能满足标准,但许多设备会颠倒多字节数据的字节序。下图所示的范例虽然不太常见,但有效地展示了这一观点。 4.4.3 字符串 字符串可以轻松地存储在 Modbus 寄存器中。为了简单起见,某些实现方法要求字符串长度为 2 的倍数,并使用空值来填充额外的空间。字节序也是字符串交互中的一个变量。字符串格式可能包含也可能不包含 NULL(作为最终值)。举个例子,一些设备的数据存储方法可能如下图所示。 4.5 从设备功能执行 正如由数据模型所定义,不同的功能会访问不同的概念数据块。一种常见的做法是让代码访问静态内存位置,但其他行为仍然可用。例如,功能码 1(读取线圈)和 3(读取保持寄存器)可以访问内存中相同的物理位置。而功能码 3(读取保持寄存器)和 16(写入保持寄存器)可以访问内存中完全不同的位置。因此,建议在定义从数据模型时考虑每个功能码的执行情况。 无论执行的是何种实际行为,所有从设备都应遵循每个请求的简单状态图。下图是功能码 1(读取线圈)的状态图范例。 每个从设备必须验证功能码、输入数量、起始地址、总范围以及实际进行读取行为的从属定义功能的执行。 尽管上面的状态图包含了静态地址范围,但真实系统的需求可能会导致静态地址范围与所定义编号有所不同。在某些情况下,从设备无法传输协议所定义的最大字节数。也就是说,如果主设备请求 0x07D0 输入,从设备只能用 0x0400 进行响应。同样,从数据模型能够将可接受线圈值的范围定义为地址 0 到 500。如果主设备从地址 0 开始请求 125,则没有问题,但如果主设备从地址 400 开始发出相同的请求,最后一个线圈将位于地址 525,这无疑超出了该设备的范围,因而会出现状态图所定义的异常 02。 4.6 应用数据单元 除了 Modbus 协议的 PDU 核心所定义的功能外,我们还可以使用多种网络协议。最常见的协议是串行和 TCP/IP,但也可以使用 UDP 等其他协议。为了在这些层之间传输 Modbus 所需的数据,Modbus 包含一组专为每种网络协议量身定制的 ADU。 4.6.1 通用特征 Modbus 需要特定的功能来提供可靠的通信。每种 ADU 格式都需要使用单元 ID 或地址,以便为应用层提供路由信息。每个 ADU 都带有一个完整的 PDU,其中包含给定请求的功能码和相关数据。为了保证可靠性,每条消息都包含错误检查信息。最后,所有的 ADU 都提供了一种机制来确定请求帧的开始和结束,但实现方式各不相同。 4.6.2 标准格式 ADU 的三种标准格式分别是 TCP、远程终端单元(RTU)和ASCII。RTU 和 ASCII ADU 通常用于串行线路,而 TCP 则用于现代 TCP/IP 或 UDP/IP 网络。 无论是三种传输模式中的哪一种,Modbus 帧格式都是一样的: Modbus 数据帧主要包括: 地址域:1 字节,即从机设备地址,通常 1-247 为有效地址,0 为广播地址 功能码:1 字节,表明主机请求数据的类型。 数据:N 字节,包含寄存器地址和寄存器数据等。 差错校验:对数据进行冗余校验的结果,CRC 或 LRC。 4.6.2.1 Modbus-ASCII Modbus-ASCII 传输模式中,每个字节均以 ASCII 编码,实际报文中 1 个字节会以两个 ASCII 字符发送,因此这种模式比 Modbus-RTU 模式效率要低。 例如报文数据 0x5B = "5" + "B" = 0X35 + 0X42。数据帧格式如下: 从 ASCII 数据帧可以看出,ASCII 模式增加了帧起始(“:”)和帧结束标志(回车&换行),由于报文数据每个字节在 ASCII 模式下需要 2个字符进行编码,为了保证 ASCII 模式和 RTU 模式在应用级兼容,ASCII 模式数据块最大长度为 252*2,所以可以计算出报文帧最大长度为 1+2+2+2x252+2+2=513 字符,报文帧内的字符间隔时间可以达 1 秒钟。 Modbus-ASCII 模式校验方法采用的是纵向冗余校验(LRC,Longitudinal Redundancy Checking)算法,校验内容不包括帧起始和帧结束字符。 计算方法也比较简单,对校验内容进行累加和计算,忽略进位,并转换为二进制补码: 例如 Modbus-ASCII 模式,主机发送请求,向地址为 1 的从设备的 0x405 地址,写入数值 0x1234,报文如下: :010604051234AA 即: :01 06 04 05 12 34 AA 可以看到01表示设备地址,06表示写单个保持寄存器。地址为0x0405,数据为0x1234,LRC校验值为0xAA。实际进行校验的数据不包含帧头和帧尾。 0xAA = LRC(01, 06, 04, 05, 12, 34) 手动 LRC 计算方法: 把原始数据两个字符组成一个字节,并进行二进制加法计算:01+06+04+05+12+34=0x56,计算二进制补码: 0x56 = 0101 0110 取反:1010 1001 加1: 1010 1010 = 0xAA 或者:0x100-0x56 = 0xAA 或者可以利用在线工具计算:LRC校验码在线计算器。 4.6.2.2 Modbus-RTU Modbus-RTU 数据帧,帧长度最大为 256 字节,由以下四部分构成: 子节点地址:1 字节,范围 0-247。 功能代码:1 字节。 数据块:0-252 字节。 CRC校验值:2 字节,低 8 位在前。 Modbus-RTU 帧间隔,Modbus-RTU 要求两个 RTU 报文帧间隔要大于 3.5 个字节时间: ModbusRTU 帧间隔且每个报文帧内字节间隔小于 1.5 个字节时间,否则会认为接收不完整。 Modbus-RTU采用循环冗余校验 (CRC - Cyclical Redundancy Checking) 算法对报文帧全部数据进行计算,得到的校验值附加在报文帧末尾,低位在前。CRC-16_Modbus计算方法可以参考:CRC-16_Modbus校验算法。 也可以用在线工具:16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器 计算 CRC 校验值。 例一:写单个寄存器。向 01 地址设备 0x0105 保持寄存器写入 1 个数据:0x0190 主机发送: 01 06 01 05 01 90 99 CB 从机回复: 01 06 01 05 01 90 99 CB 其中,01 表示从机地址,06 功能码表示写单个保持寄存器,0105 表示寄存器地址,0190 表示写入寄存器的数值,99CB 为 CRC 校验值。可以看出,当写 1 个寄存器数据时,从机响应的数据帧和主机发送的数据帧完成一致。 例二:写多个寄存器。向 01 地址设备 0x0105、0x0106、0x0107 地址保持寄存器,写入 3 个寄存器数据:0x1102、0x0304、0x0566。 主机发送:01 10 01 05 00 03 06 11 02 03 04 05 66 4a 12 从机回复:01 10 01 05 00 03 91 f5 同理,01 从机地址,10 功能码表示写多个保持寄存器,0105 表示起始地址,0003 表示写 3 个寄存器,06 表示数据量为 6 个字节,1102/0304/0566 分别表示写入 3 个寄存器的数值,4a12 表示 CRC 校验数值。 可以看出,写多个寄存器时使用 10 功能码,从机回复数据也比较精简。 例三:读单个寄存器。读 01 地址设备 0x0105 保持寄存器数据。 主机发送:01 03 01 05 00 01 95 f7 从机回复:01 03 02 56 78 87 c6 主机发送数据中,03 表示读多个寄存器,0105 表示起始地址,0001 表示读 1 个寄存器。 从机回复值中,02 表示 2 个字节,56 78 表示寄存器的数据。 例四:读多个寄存器。读 01 地址设备 0x0105、0x0106、0x0107 地址保持寄存器,共 3 个寄存器数据。 主机发送:01 03 01 05 00 03 14 36 从机回复:01 03 06 11 22 33 44 55 66 2a 18 03 表示读多个寄存器,0105 表示起始地址,0003 表示读 3 个寄存器。 06 表示 6 个字节,11 22 33 44 55 66 表示寄存器的数据。 4.6.2.3 Modbus-TCP Modbus-TCP 基于以下种报文类型: MODBUS 请求:客户机在网络上发送用来启动事务处理的报文 MODBUS 证实:在客户端接收的响应信息 MODBUS 指示:服务端接收的请求报文 MODBUS 响应:服务器发送的响应信息 报文头的数据字段代表其用途。首先,它包含一个事务处理标识符。这有助于网络允许同时发生多个未处理的请求。也就是说,主设备可以发送请求 1、2 和 3。在稍后的时间点,从设备能以 2、1、3 的顺序进行响应,并且主设备可以将请求匹配到响应并准确解析数据。这对于以太网网络来说很有用。 协议标识符通常为零,但您可以使用它来扩展协议的行为。协议使用长度字段来描述数据包其余部分的长度。此元素的位置也表明了这个报文头格式在可靠网络层上的依赖关系。由于 TCP 数据包具有内置的错误检查功能,并可确保数据一致性和传递,因此数据包长度可位于报文头的任何位置。在可靠性较差的网络上(比如串行网络),数据包可能会丢失,其影响是即使应用程序读取的数据流包含有效的事务处理和协议信息,长度信息的损坏也会使报文头无效。TCP 为这种情况提供了适当的保护。 TCP/IP 设备通常不使用单元 ID。但是,Modbus 是一种常见的协议,因此通常会开发许多网关来将 Modbus 协议转换为其他协议。在最初的预期应用中,Modbus TCP/IP 转串行网关用于连接新的TCP/IP网络与旧的串行网络。在这种环境中,单元 ID用于确定 PDU 实际对应的从设备的地址。 最后,ADU 还包含一个 PDU。对于标准协议,PDU 的长度仍限制为 253 字节。 Modbus 协议中主机可以以两种模式对从机设备发出请求:单播和广播。 4.6.2.3.1 单播模式 在单播模式下,从机地址必须唯一,地址范围 1-247。主机以特定地址访问指定的某个从机,发出一个请求数据帧,这个数据帧功能可以是读取或写入数据,从机接收到并处理完成后,会回报一个应答数据帧,以表示读取或写入成功。 4.6.2.3.2 广播模式 在广播模式下,主机向所有的从机发出请求数据帧,所有的从机都会处理这条命令,对于广播请求,所有的从机无需做出应答操作。一般地址 0 表示广播地址。 05 Modbus组件的使用 1 Gitee链接地址 组件位于amaziot_bloom_os_sdk\libraries\am\xtu\am_modbus.c 第三方组件位于amaziot_bloom_os_sdk\libraries\third_party\agile_modbus-1.1.3,可以在github上查找相关api文档。 Gitee源码地址:https://gitee.com/ning./hongdou Github源码地址:https://github.com/ayumid/hongdou 2 应用层组件功能介绍 提供Modbus实例。实现轮询。 使用该组件,必须同时使用AT组件,文件组件,TCP组件,掉线组件,掉线重连组件,心跳组件,JSON组件,Modbus组件。 3 代码讲解 1 dtu_modbus_task_init 初始化modbus任务 C++ void dtu_modbus_task_init(void) { OSA_STATUS status = 0; /*creat message*/ status = OSAMsgQCreate(&dtu_modbus_msgq, "dtu_modbus_msgq", DTU_MODBUS_TASK_MSGQ_MSG_SIZE, DTU_MODBUS_TASK_MSGQ_QUEUE_SIZE, OS_FIFO); ASSERT(status == OS_SUCCESS); status = OSATaskCreate(&dtu_modbus_msgq_task_ref, dtu_modbus_task_stack, DTU_MODBUS_TASK_STACK_SIZE, 161, "modbus_task", dtu_modbus_task, NULL); ASSERT(status == OS_SUCCESS); } 2 dtu_modbus_task modbus主任务,接收发送Modbus数据 C++ static void dtu_modbus_task(void *ptr) { OSA_STATUS status = 0; int ret = 0; int i = 0; // int id = 0; int send_len = 0; DTU_MSG_UART_DATA_PARAM_T uart_data = {0}; uint8_t ctx_send_buf ; uint8_t ctx_read_buf ; // uint8_t send = {0}; // uint8_t recv = {0}; // uint8_t* temp = NULL; DTU_FILE_PARAM_T* dtu_file_ctx = NULL; dtu_file_ctx = dtu_get_file_ctx(); agile_modbus_rtu_t ctx_dtu = {0}; agile_modbus_t *ctx = &ctx_dtu._ctx; agile_modbus_rtu_init(&ctx_dtu, ctx_send_buf, sizeof(ctx_send_buf), ctx_read_buf, sizeof(ctx_read_buf)); dtu_modbus_interval_timer_init(); st_dtu_md.state = DTU_MODBUS_POOLLING_STATE; modbus.config.type) { dtu_modbus_interval_timer_start(); } //#define AGILE_MODBUS_FC_READ_COILS 0x01 //#define AGILE_MODBUS_FC_READ_DISCRETE_INPUTS 0x02 //#define AGILE_MODBUS_FC_READ_HOLDING_REGISTERS 0x03 //#define AGILE_MODBUS_FC_READ_INPUT_REGISTERS 0x04 //#define AGILE_MODBUS_FC_WRITE_SINGLE_COIL 0x05 //#define AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER 0x06 //#define AGILE_MODBUS_FC_READ_EXCEPTION_STATUS 0x07 //#define AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F //#define AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10 //#define AGILE_MODBUS_FC_REPORT_SLAVE_ID 0x11 //#define AGILE_MODBUS_FC_MASK_WRITE_REGISTER 0x16 //#define AGILE_MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17 while(1) { //阻塞1s等待从机回复的数据 status = OSAMsgQRecv(dtu_modbus_msgq, (void *)&uart_data, DTU_MODBUS_TASK_MSGQ_MSG_SIZE, OSA_SUSPEND); if(status == OS_SUCCESS) { if(DTU_MODBUS_TIMER_INTERVAL_MSG == uart_data.id) { // uprintf("%s timer msg\r\n", __FUNCTION__, __LINE__); if(DTU_MODBUS_POOLLING_STATE == st_dtu_md.state) { //for循环查询列表中哪些指令激活,按照激活指令参数配置 指令 for(i = st_dtu_md.id; i < DTU_MODBUS_CMD_NUM; i++) { //当前列表第i指令被激活 modbus.cmd .active) { //设置从机地址 modbus.cmd .slave_addr); modbus.cmd .fn); } else { // uprintf("%s none cmd continue i:%d id: %d\n", __FUNCTION__, __LINE__, i + 1, st_dtu_md.id); st_dtu_md.id = i + 1; continue; } //根据指令01 来组包 modbus.cmd .fn == AGILE_MODBUS_FC_READ_COILS) { //组包数据 modbus.cmd .reg_n_d); } //根据指令02 来组包 modbus.cmd .fn == AGILE_MODBUS_FC_READ_DISCRETE_INPUTS) { //组包数据 modbus.cmd .reg_n_d); } //根据指令03 来组包 modbus.cmd .fn == AGILE_MODBUS_FC_READ_HOLDING_REGISTERS) { //组包数据 modbus.cmd .reg_n_d); } //根据指令04 来组包 modbus.cmd .fn == AGILE_MODBUS_FC_READ_INPUT_REGISTERS) { //组包数据 modbus.cmd .reg_n_d); } //根据指令05 来组包 modbus.cmd .fn == AGILE_MODBUS_FC_WRITE_SINGLE_COIL) { //组包数据 modbus.cmd .reg_n_d); } //根据指令06 来组包 modbus.cmd .fn == AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER) { //组包数据 modbus.cmd .reg_n_d); } // uprintf("%s find cmd\r\n", __FUNCTION__, __LINE__); //当前激活id,跳出这次循环 break; } st_dtu_md.id++; // uprintf("%s sendbuf len: %d mdid: %d\r\n", __FUNCTION__, __LINE__, send_len, st_dtu_md.id); DTU_MODBUS_CMD_NUM) { st_dtu_md.id = 0; st_dtu_md.state = DTU_MODBUS_POOLLING_WN_STATE; uprintf("%s poolling end", __FUNCTION__, __LINE__); //停止modbus驱动定时器 // dtu_modbus_interval_timer_stop(); //轮训完毕后,重新开始之前等待时间 modbus.config.delay); //开始modbus驱动定时器 // dtu_modbus_interval_timer_start(); } else { // uprintf("%s send md hex\r\n", __FUNCTION__, __LINE__); // int j = 0; // for(j = 0; j < send_len; j++) // { send_buf ); // } //发送数据到串口 send_buf, send_len); } } else if(DTU_MODBUS_POOLLING_WN_STATE == st_dtu_md.state) { //for循环查询列表中哪些指令激活,按照激活指令参数配置 指令 for(i = st_dtu_md.id; i < DTU_MODBUS_CMD_WN_NUM; i++) { //当前列表第i指令被激活 modbus.cmd_wn .active) { //设置从机地址 modbus.cmd_wn .slave_addr); modbus.cmd_wn .fn); } else { // uprintf("%s none cmd continue i:%d id: %d\n", __FUNCTION__, __LINE__, i + 1, st_dtu_md.id); st_dtu_md.id = i + 1; continue; } //根据指令0F 来组包 modbus.cmd_wn .fn == AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS) // { modbus.cmd_wn .reg_n_d); //组包数据 modbus.cmd_wn .reg_data); // int j = 0; // for(j = 0; j modbus.cmd_wn .reg_n_d; j++) // { modbus.cmd_wn .reg_data ); // } // } //根据指令10 来组包 modbus.cmd_wn .fn == AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS) { modbus.cmd_wn .reg_n_d); //组包数据 modbus.cmd_wn .reg_data); // int j = 0; // for(j = 0; j modbus.cmd_wn .reg_n_d; j++) // { modbus.cmd_wn .reg_data ); // } } // uprintf("%s find cmd\r\n", __FUNCTION__, __LINE__); //当前激活id,跳出这次循环 break; } st_dtu_md.id++; // uprintf("%s sendbuf len: %d mdid: %d\r\n", __FUNCTION__, __LINE__, send_len, st_dtu_md.id); DTU_MODBUS_CMD_WN_NUM) { st_dtu_md.id = 0; st_dtu_md.state = DTU_MODBUS_POOLLING_STATE; uprintf("%s wn poolling end", __FUNCTION__, __LINE__); //停止modbus驱动定时器 dtu_modbus_interval_timer_stop(); //轮训完毕后,重新开始之前等待时间 modbus.config.delay); //开始modbus驱动定时器 dtu_modbus_interval_timer_start(); } else { // uprintf("%s send md hex\r\n", __FUNCTION__, __LINE__); // int j = 0; // for(j = 0; j < send_len; j++) // { send_buf ); // } //发送数据到串口 send_buf, send_len); } } } else if(DTU_MODBUS_DATA_MSG == uart_data.id && NULL != uart_data.UArgs) { // uprintf("%s modbus res", __FUNCTION__, __LINE__); // // UINT8* p = uart_data.UArgs; // for (i = 0; i < uart_data.len; i++) // { // uprintf("0x%02X" , p ); // } //如果是modbus数据,判断目前是modbus rtu上报模式,modbus tcp上报模式,还是json上报格式 modbus.config.res_type) { uprintf("modbus json res"); dtu_modbus_json_modbus_res(uart_data.UArgs, uart_data.len); } modbus.config.res_type) // { // //判断是否是modbus一帧数据 // ret = dtu_modbus_protocol_check(uart_data.UArgs, uart_data.len); // if(DTU_MODBUS_PROTOCOL_SUCCESS == ret) // { // uprintf("modbus tcp res"); // } // } else { uprintf("modbus rtu res"); //modbus rtu帧,直接发 #ifdef DTU_BASED_ON_TCP dtu_socket_write(uart_data.UArgs, uart_data.len); #endif /* ifdef DTU_BASED_ON_TCP.2023-10-31 12:01:18 by: zhaoning */ #ifdef DTU_BASED_ON_MQTT dtu_mqtt_send(uart_data.UArgs, uart_data.len); #endif /* ifdef DTU_BASED_ON_MQTT.2023-10-31 12:01:28 by: zhaoning */ } //释放数据内存 free(uart_data.UArgs); //置空 uart_data.UArgs = NULL; } } } } 3 dtu_modbus_interval_timer_init 初始化指令间隔定时器,Modbus轮询过程中每个指令之间的间隔时间 C++ static void dtu_modbus_interval_timer_init(void) { OSA_STATUS status = 0; //初始化指令间隔定时器 status = OSATimerCreate(&st_dtu_md.md_timer_ref); ASSERT(status == OS_SUCCESS); } 4 dtu_modbus_interval_timer_start 开始指令间隔定时器 C++ void dtu_modbus_interval_timer_start(void) { DTU_FILE_PARAM_T* dtu_file_ctx = NULL; dtu_file_ctx = dtu_get_file_ctx(); modbus.config.interval * 200 , dtu_modbus_interval_timer_callback, 0); } 4 Demo实战 4.1 创建一个Demo 复制20.9_di_xtu示例工程,到同一个文件夹下,修改文件名为20.12_json_xtu,如图: 4.2 修改makefile 增加文件组件所在目录头文件路径,和源文件路径,以及一些宏定义,如图: -D是makefile中定义宏定义必要的前缀,可以搜索相关makefile学习文章学习相关知识。 DTU_BASED_ON_TCP 表示当前是TCP模式,当前组件使用需要am.h中包含一些对应。 DTU_TYPE_5X6 表示使用SOM板贴片5x6卡,可以使用其它卡,修改为对应宏定义就可以。 DTU_UART_115200_BAUD 表示使用115200波特率 DTU_TYPE_JSON_INCLUDE 表示把JSON功能包含进来 4.3 增加头文件 使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h头文件,如图: 4.4 修改代码 示例使用的是板载5x6卡,用户的硬件可能是使用外置卡,或者是三合一全网通卡,因为硬件上三种卡使用的模组SIM卡接口不一样(外置卡SIM1,5x6卡和三合一卡SIM2),所以,需要通过一个全局变量来制定SIM卡硬件接口。 extern外部变量SDK_INIT_SIM_SELECT_VALUE,这里判断了是否使用外置卡,这个宏定义在Makefile里面定义。 在Phase1Inits_enter中,宏定义判断是否要包含对SDK_INIT_SIM_SELECT_VALUE变量的修改。 在Phase2Inits_exit 调用文件组件提供的对外API,如图: 4.5 编译 在SDK根目录打开命令行,输入命令.\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\20.14_modbus_xtu\ C++ PS F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08 λ .\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\20.14_modbus_xtu\ 子目录或文件 out\bin 已经存在。 子目录或文件 build\cJSON 已经存在。 子目录或文件 build\obj 已经存在。 gnumake: Entering directory `F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu' armcc.exe -c --cpu Cortex-R4 --no_unaligned_access -g -O2 --apcs /inter --diag_suppress 2084,1,2,177,188,223,550,1296,2795,6319,9931,9933 --diag_error=warning --gnu --thumb --loose_implicit_cast -DDATA_COLLECTOR_IMPL -DISPT_OVER_SSP -DDIAG_SSP_DOUBLE_BUFFER_USE_DYNAMIC_ALLOCATION -DENV_XSCALE -DL1_DCXO_ENABLED -DLTE_HIGH_MOBILITY_OPTIMIZATION -DRUN_XIP_MODE -DCRANE_Z2 -DCA_LONG_IPC_MSG -DNEZHA3 -DNEZHA3_1826 -DUPGRADE_PLMS -DUPGRADE_PLMS_SR -DLTE_GSMMULTIBCCH -DGPLC_LTE_RSSI_SCAN -DL1V_NEW_RSSI -DUPGRADE_PLMS_3G -DUPGRADE_PLMS_L1 -DUPGRADE_FG_PLMS -DFG_PLMS_URR -DUPGRADE_L1A_FG_PLMS -DUPGRADE_PLMS_STAGE_2 -DUPGRADE_MBCCH -DMULTI_BCCH_READY_IND -DURR_MRAT_ICS_SEARCH -DUPGRADE_ICS -DMRAT_NAS -DUPGRADE_PLMS_SEARCH_API -DICS_MBCCH -DICS_MBCCH_2G_RSSI -DDIAG_NEWPP -DPHS_SW_DEMO -DPHS_SW_DEMO_TTC -DPHS_SW_DEMO_TTC_PM -DFULL_SYSTEM -D_DDR_INIT_ -D_TAVOR_HARBELL_ -DUPGRADE_ARBEL_PLATFORM -D_TAVOR_B0_SILICON_ -DTDL1C_SPY_ENABLE -DDLM_TAVOR -DTAVOR -DFLAVOR_DUALCORE -DDEBUG_D2_MOR_REG_RESEREVED_ENABLE -D_DIAG_USE_COMMSTACK_ -D_TAVOR_DIAG_ -DPM_DEBUG_MODE_ENABLED -DPM_D2FULL_MODE -DPM_EXT_DBG_INT_ARR -DFEATURE_WB_AMR_PS -DMACRO_FOR_LWG -DHL_LWG -DOPTIMIZE_FOR_2G_BCCH -DPLAT_TEST -D_FDI_USE_OSA_ -DPLAT_USE_THREADX -DLWIP_IPNETBUF_SUPPORT -DCRANE_MCU_DONGLE -DAT_OVER_UART -DPHS_SW_DEMO_TTC_PM -DUPGRADE_LTE_ONLY -DEXT_AT_MODEM_SUPPORT -DLTEONLY_THIN_SINGLE_SIM -DLFS_FILE_SYS -DLFS_FILE_SYS_V2 -DPSM_ENABLE -DNO_PAHO_MQTT -DNO_XML -DNO_LWM2M -DREMOVE_MBEDTLS -DNO_AT_NET -DCRANE_SD_NOT_SUPPORT -DNTP -DYMODEM_EEH_DUMP -DENABLE_DM_LTEONLY -DLTEONLY_THIN -DNO_EXTEND_MY_Q_AT -DNOT_SUPPORT_HTTPS -DNOT_SUPPORT_PM813 -DCRANEL_4MRAM -DREMOVE_PB -DUART_NEW_VERSION -DREMOVE_MEP -DREMOVE_SMS -DREMOVE_ENVSIM -DAPN_INCODE -DLTEONLY_THIN_SINGLE_SIM_2MFLASH -DASR160X_OPENCPU_FEATURE -DENABLE_UART3_FEATRUE -DENABLE_UART4_FEATRUE -DYUGE_MBEDTLS_3_2_1 -DENABLE_MAC_TX_DATA_LOGGING -DDISABLE_NVRAM_ACCESS -DINTEL_UPGRADE_EE_HANDLER_SUPPORT -DLTE_W_PS -DL1_DUAL_MODE -DUPGRADE_HERMON_DUAL -DINTEL_UPGRADE_DUAL_RAT -DINTEL_UPGRADE_GPRS_CIPHER_FLUSH -DUPGRADE_ENHANCED_QUAD_BAND -DINTEL_2CHIP_PLAT -DI_2CHIP_PLAT -DUPGRDE_TAVOR_COMMUNICATION -DRUN_WIRELESS_MODEM -DFLAVOR_DDR12MB_GB1MB5 -DFEATURE_SHMEM -DACIPC_ENABLE_NEW_CALLBACK_MECHANISM -DRELIABLE_DATA -DMAP_NSS -DTV_FNAME="\"SW_PLATFORM=PMD2NONE PHS_SW_DEMO PHS_SW_DEMO_PM SRCNUCLEUS FULL_SYSTEM NOACRTC PDFLT PLAT_TEST PV2 DIAGOSHMEM NVM WITHL1V\"" -DTV_FDESC="\"SW_DESCRIPTION=\"" -DENABLE_ACIPC -D_DATAOMSL_ENABLED_ -DUSB_CABLE_DETECTION_VIA_PMIC -DMIPS_TEST -DMIPS_TEST_RAM -DFLAVOR_DIET_RAM -DNVM_INCLUDE -DMSL_INCLUDE -DMSL_POOL_MEM -DNO_AUDIO -DOSA_QUEUE_NAMES -D_DIAG_DISABLE_USB_ -DOSA_NUCLEUS -DOSA_USED -DPM_D2NONE_MODE -DCRANE_SOC_TEMPERATURE_SENSOR -DL1_SW_UPDATE_FOR_DIGRF -DPHS_L1_SW_UPDATE_R7 -DUPGRADE_LTE -DFRBD_CALIB_NVM -DFRBD_AGC_CALIB -DFRBD_FDT_CALIB -DHSPA_MPR -DCAPT_PARAMS_OPTIMIZE -DL1_WB_R99_ONLY -DL1V_WB_R99_ONLY -DINTERGRATED_RF_SUPPORT -DL1_RX_DIV_SUPPORT -DENABLE_OOS_HANDLING -DTAVOR_D2_WB_L1_SUPPORT -DL1_DDR_HIGH_FREQ -DUPGRADE_DIGRF3G_SUPPORT -DW_PS_PLUS_G_PAGING -D"NO_APLP=0" -DINTEL_UPGRADE_UNIFIED_VOICE_TASK -DINTEL_UPGRADE_R99 -DAPLP_SPY_ENABLE -D__TARGET_FEATURE_DOUBLEWORD -DWHOLE_UMTS_STACK -DUSE_TTPCOM_CSR_BLUETOOTH_AUDIO_GAIN_CONTROL -DL1_UPGRADE_R5 -DUPGRADE_EDGE -DUPGRADE_R4_FS1 -DINTEL_UPGRADE_GSM_CRL_IF -DUPGRADE_EGPRS_M -DINTEL_UPGRADE_EGPRS_M -DINTEL_UPGRADE_RF_PARAMS_IN_CF_TDS -DINTEL_UPGRADE_2SAMPLES_PER_SYMBOL -D"GPRS_MULTISLOT_CLASS=12" -D"EGPRS_MULTISLOT_CLASS=12" -DMARVELL_UPGRADE_BSIC_REDESIGN -DMSL_INCLUDE -DINTEL_HERMON_SAC -DCRANE_CUST_BUILD -DL1_SW_UPDATE_FOR_DIGRF -DFLAVOR_COM -DSILICON_PV2 -DSILICON_SEAGULL -DSILICON_TTC_CORE_SEAGULL -DPCAC_INCLUDE -Otime -DBUILD_DATE="\"11 22 2023\"" -DBUILD_TIME="\"11:19:00\"" -Iatcmds\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\yuge\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\UART\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\core\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\PMU\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\GPIO\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\posix\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\diag\diag_logic\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\SysCfg\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\platform\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\env\win32\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\BSP\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\platform\dev_plat\build -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\osa\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\threadx\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\os\nu_xscale\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\psm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\httpclient\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\diag\diag_logic\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\timer\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\intc\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\csw\PM\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\pm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\TickManager\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\BSP\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\atcmdsrv\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\atparser\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\sdk\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\httpclient\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\ci\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\arch -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\ipv4 -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\ipv6 -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\lwip -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\lwipv4v6\src\include\netif -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\mmi_mat\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\tavor\Arbel\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\tavor\env\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\modem\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\duster\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\fota\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\I2C\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\ACIPC\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fatsys\flash -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\INCLUDE -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\MMU\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\FDI_ADD -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\FDI\src\FM_INC -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fatsys\fs\hdr -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\littlefs\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\tts\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\dial\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\csw_memory\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\utilities\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\commpm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\nvm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\EEhandler\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\EEhandler\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\RTC\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\telephony\ci_client\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\BT_device\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\UART\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\mrd\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\dma\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\softutil\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\SPI\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\websocket\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\atnet_srv\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\softutil\fotacomm\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\Audio\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\ACM_COMM\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\audio_stub\src -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hop\aam\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\aud_sw\AudioHAL\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\hal\dbgshell\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\include\asr160x\pcac\opencpu\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\amaziot_bloom_os_sdk\utils -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\CSDK_CODE\cJSON\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu\am\inc -IF:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu\atcmds\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries\am\xtu -DDTU_BASED_ON_TCP -DDTU_TYPE_5X6 -DDTU_UART_115200_BAUD -DDTU_TYPE_MODBUS_INCLUDE -DDTU_TYPE_JSON_INCLUDE -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries/third_party/agile_modbus-1.1.3\inc -IF:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/libraries/third_party/agile_modbus-1.1.3\util -o build\obj/ext_at_cmds.o F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu/atcmds/src/ext_at_cmds.c armlink.exe build\obj/main.o build\obj/ext_at_cmds.o build\obj/ext_at_controller.o build\obj/am_file.o build\obj/am_at.o build\obj/am_trans.o build\obj/am_socket.o build\obj/am_hb.o build\obj/am_net.o build\obj/am_json.o build\obj/am_modbus.o build\obj/utils_string.o build\obj/agile_modbus_slave_util.o build\obj/agile_modbus.o build\obj/agile_modbus_rtu.o build\obj/agile_modbus_tcp.o build\CSDK_CODE.lib \ -o F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\out\bin\Arbel_PMD2NONE_40M.axf \ --via F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\prebuilt_1606l\Arbel_PMD2NONE_targ_objliblist.txt \ --elf \ --scatter F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\prebuilt_1606l\Crane_DS_4M_Ram_2M_Flash_XIP_CIPSRAM_Common_SingleSIM.sct \ --predefine="-DLTEONLY_THIN_SINGLE_SIM" --map --symbols --info sizes,totals \ --list F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\out\bin\Arbel_PMD2NONE_40M.map \ --keep init.o(Header) --keep init.o(Vectors) --diag_suppress 6312,6314,6319,6329 \ --feedback F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\out\feedbackLinkOptLteonlyThin_SingleSim_NoSMS.txt F:\3.asr-b\cat.1-asr1606\1.software\BLOOM_OS_1606_OPENCPU_1191_A08\tools\buildimage_1606l.bat SDK_PROD_TYPE : SDK_CUST_SKU : SDK_PS_MODE : SDK_CHIP_VER : SDK_OS_TYPE : Platform Convertion Tools v4.01 with PS option extension Convertion done! |INPUT |out\bin\cp_1606L.bin |MARK |NAME |EXEADDR .LOADADDR.LENGTH .CPZLADDR|COMPRESS STASTIC | |--------|--------|--------.--------.--------.--------|------------------------------| |This Is LteOnly 4M| 00003000 |This Is LteOnly 4M| 00001000 |This Is LteOnly 4M| 0000a000 |This Is LteOnly 4M| 0001e000 |This Is LteOnly 4M| 0001b000 |This Is LteOnly 4M| 0001b000 |This Is LteOnly 4M| 0001a000 |This Is LteOnly 4M| 0001a000 |This Is LteOnly 4M| 00011000 |This Is LteOnly 4M| 0001e000 |This Is LteOnly 4M| 00021000 |This Is LteOnly 4M| 00012000 |--------|--------|--------.--------.--------.--------|------------------------------| 0x0014d000| 1.301(MB)| |------------------------------------------------------------------------------------| cp_1606L.axf cp_1606L.bin cp_1606L.map gnumake: Leaving directory `F:/3.asr-b/cat.1-asr1606/1.software/BLOOM_OS_1606_OPENCPU_1191_A08/amaziot_bloom_os_sdk/sample/libraries/20.14_modbus_xtu' "copy NEZHAC_CP_CNR_MIFI_TX.bin to ./ " 已复制 1 个文件。 4.6 生成固件 参考入门中开发工具,生成工具。 4.7 查看现象 固件下载到模组后,配置服务器地址,配置Modubs指令,之后用Modbus客户端来模拟查看 SQL OK AT+TRANSIP="TCP","101.200.35.208",8866 OK CONNECT OK AT+MBADD=1,1,1,1,0,10 OK AT+MBADD=2,1,1,2,0,10 OK AT+MBADD=3,1,1,3,0,10 OK AT+MBADD=20,1,1,4,0,10 OK AT+MBADD=49,1,1,5,0,10 OK AT+MBADD=50,1,1,6,0,6666 OK AT+MBADDWN=1,1,1,16,0,5,"16B352A9F615D7D3FE198" OK AT+MBCFG=1,1,3,6 OK 5 总结 根据实验现象,用户需要实现自己的AT指令,只需要参考组件中的例子,按照自己需求修改, 注:本文部分内容来源于网络,如有侵权,请及时联系我们。 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)
  • 热度 1
    2024-9-29 16:08
    181 次阅读|
    0 个评论
    01 概述 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。 它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下: 支持客户/服务器模式。 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 二 HTTP的URL HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。 HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下: http://host http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。 02 HTTP的请求 HTTP请求由三部分组成,分别是:请求行、消息报头、请求正文 1.请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。 请求方法(所有方法全为大写)有多种,各个方法的解释如下: GET 请求获取Request-URI所标识的资源 POST 在Request-URI所标识的资源后附加新的数据 HEAD 请求获取由Request-URI所标识的资源的响应消息报头 PUT 请求服务器存储一个资源,并用Request-URI作为其标识 DELETE 请求服务器删除Request-URI所标识的资源 TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT 保留将来使用 OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求 应用举例: GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF) POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。 eg:POST /reg.jsp HTTP/ (CRLF) Accept:image/gif,image/x-xbit,... (CRLF) ... HOST:www.guet.edu.cn (CRLF) Content-Length:22 (CRLF) Connection:Keep-Alive (CRLF) Cache-Control:no-cache (CRLF) (CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头 user=jeffrey&pwd=1234 //此行以下为提交的数据 HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。 2、请求报头后述 3、请求正文(略) 03 HTTP响应 在接收和解释请求消息后,服务器返回一个HTTP响应消息。 HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文 1、状态行格式如下: HTTP-Version Status-Code Reason-Phrase CRLF 其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。 状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 1xx:指示信息--表示请求已接收,继续处理 2xx:成功--表示请求已被成功接收、理解、接受 3xx:重定向--要完成请求必须进行更进一步的操作 4xx:客户端错误--请求有语法错误或请求无法实现 5xx:服务器端错误--服务器未能实现合法的请求 常见状态代码、状态描述、说明: 200 OK //客户端请求成功 400 Bad Request //客户端请求有语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found //请求资源不存在,eg:输入了错误的URL 500 Internal Server Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常 eg:HTTP/1.1 200 OK (CRLF) 2、响应报头后述 3、响应正文就是服务器返回的资源的内容 04 HTTP组件的使用 1 Gitee链接地址 组件位于amaziot_bloom_os_sdk\libraries\am\xtu\am_http.c Gitee源码地址:https://gitee.com/ning./hongdou Github源码地址:https://github.com/ayumid/hongdou 2 应用层组件功能介绍 提供HTTP连接实例,可以通过调用组件内的API,来实现HTTP本地客户端和服务器之间的通信。 3 代码讲解 1 dtu_http_response_cb http请求回调函数 C++ static int dtu_http_response_cb(char *buffer, int size, int nitems, void *private_data) { struct http_data_s *client_data = private_data; data_sz + size) data)) { data_sz, buffer, size); data_sz += size; return 0; } return -1; } 2 dtu_http_pg_data_get get请求实现 C++ static void dtu_http_pg_data_get(DTU_MSG_UART_DATA_PARAM_T* data, UINT8 type, UINT8 channel) { struct http_client *client = NULL; struct http_data_s *client_data = NULL; struct http_client_list * header = NULL; DTU_FILE_PARAM_T* dtu_file_ctx = NULL; char url = {0}; char head_tmp = {0}; UINT8* d = NULL; int response_code = 0; int i = 0; dtu_file_ctx = dtu_get_file_ctx(); response_code = 0; UArgs; client_data = malloc(sizeof(*client_data)); if (!client_data){ return ; } memset(client_data, 0, sizeof(*client_data)); client = http_client_init(); if (!client){ free(client_data); client_data = NULL; return ; } len] = '\0'; if(1 == channel) { http.http1.url))) { UArgs); } else { UArgs); } http_client_setopt(client, HTTPCLIENT_OPT_URL, url); } else if(2 == channel) { http.http1.url))) { UArgs); } else { UArgs); } http_client_setopt(client, HTTPCLIENT_OPT_URL, url); } uprintf("http get url: %s", url); http_client_setopt(client, HTTPCLIENT_OPT_RESPONSECB, dtu_http_response_cb); http_client_setopt(client, HTTPCLIENT_OPT_RESPONSECB_DATA, client_data); http_client_setopt(client, HTTPCLIENT_OPT_METHOD, HTTPCLIENT_REQUEST_GET); // Add private HTTP header if(1 == channel) { http.http1.head1)) { http.http1.head1); header = http_client_list_append(header, head_tmp); uprintf("head11: %s", head_tmp); } http.http1.head2)) { http.http1.head2); header = http_client_list_append(header, head_tmp); uprintf("head12: %s", head_tmp); } http.http1.head3)) { http.http1.head3); header = http_client_list_append(header, head_tmp); uprintf("head13: %s", head_tmp); } } else if(2 == channel) { http.http2.head1)) { http.http2.head1); header = http_client_list_append(header, head_tmp); uprintf("head21: %s", head_tmp); } http.http2.head2)) { http.http2.head2); header = http_client_list_append(header, head_tmp); uprintf("head22: %s", head_tmp); } http.http2.head3)) { http.http2.head3); header = http_client_list_append(header, head_tmp); uprintf("head23: %s", head_tmp); } } http_client_setopt(client, HTTPCLIENT_OPT_HTTPHEADER, header); http_client_perform(client); http_client_getinfo(client, HTTPCLIENT_GETINFO_RESPONSE_CODE, &response_code); uprintf(" Get tcp state %d\n", response_code); = 200 && response_code < 300) { data_sz) { data); for (i = 0; i < 100; i++) { data ); } } }else if (response_code == 404) { data); } if (client_data) { free(client_data); client_data = NULL; } if (client) { http_client_shutdown(client); client = NULL; } } 3 dtu_http_pg_data_post post请求实现 C++ static void dtu_http_pg_data_post(DTU_MSG_UART_DATA_PARAM_T* data, UINT8 type, UINT8 channel) { struct http_client *client = NULL; struct http_data_s *client_data = NULL; struct http_client_list * header = NULL; DTU_FILE_PARAM_T* dtu_file_ctx = NULL; char head_tmp = {0}; UINT8* d = NULL; int response_code = 0; int i = 0; dtu_file_ctx = dtu_get_file_ctx(); response_code = 0; UArgs; client_data = malloc(sizeof(*client_data)); if (!client_data){ return ; } memset(client_data, 0, sizeof(*client_data)); client = http_client_init(); if (!client){ free(client_data); client_data = NULL; return ; } if(1 == channel) { http.http1.url); } else if(2 == channel) { http.http2.url); } http_client_setopt(client, HTTPCLIENT_OPT_RESPONSECB, dtu_http_response_cb); http_client_setopt(client, HTTPCLIENT_OPT_RESPONSECB_DATA, client_data); http_client_setopt(client, HTTPCLIENT_OPT_METHOD, HTTPCLIENT_REQUEST_POST); // // Add private HTTP header if(1 == channel) { http.http1.head1)) { http.http1.head1); header = http_client_list_append(header, head_tmp); uprintf("head11: %s", head_tmp); } http.http1.head2)) { http.http1.head2); header = http_client_list_append(header, head_tmp); uprintf("head12: %s", head_tmp); } http.http1.head3)) { http.http1.head3); header = http_client_list_append(header, head_tmp); uprintf("head13: %s", head_tmp); } } else if(2 == channel) { http.http2.head1)) { http.http2.head1); header = http_client_list_append(header, head_tmp); uprintf("head21: %s", head_tmp); } http.http2.head2)) { http.http2.head2); header = http_client_list_append(header, head_tmp); uprintf("head22: %s", head_tmp); } http.http2.head3)) { http.http2.head3); header = http_client_list_append(header, head_tmp); uprintf("head23: %s", head_tmp); } } len] = '\0'; http_client_setopt(client, HTTPCLIENT_OPT_HTTPHEADER, header); UArgs); /*post data is http context*/ UArgs)); /*http context length*/ http_client_perform(client); http_client_getinfo(client, HTTPCLIENT_GETINFO_RESPONSE_CODE, &response_code); uprintf(" Get tcp state %d\n", response_code); = 200 && response_code < 300) { data_sz) { data); for (i = 0; i < 100; i++) { data ); } } }else if (response_code == 404) { data); } if (client_data) { free(client_data); client_data = NULL; } if (client) { http_client_shutdown(client); client = NULL; } } 4 Demo实战 参考进阶实战 注:本文部分内容来源于网络,如有侵权,请及时联系我们。 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)
  • 热度 28
    2021-6-2 16:35
    13271 次阅读|
    0 个评论
    HDCP 2.x技术总览
    HDCP (High-Bandwidth Digital Content Protection) 是由Intel制订的加密技术,可运用在HDMI或是DisplayPort等数字接口传输高分辨率影音时,进行数字内容加密以防止影音信息被盗录。 各家厂商如果要让多媒体芯片具有上述功能,则需先向Intel的子公司DCP LLC购卖HDCP密钥授权,之后才能将该技术实作于芯片上。 而消费者如果要观赏具有HDCP保护的影音信息:如蓝光光盘、Netflix 影片,播放端(Blu-Ray Player)以及接受端(TV)均须购买有HDCP授权的产品,才能观赏到最高分辨率画质。如果有一方不支持,则会导致影片画质下降,或甚至无法拨放。 目前在于HDMI接口中,可支持的HDCP协议分为HDCP 1.4以及最新的HDCP 2.3(批注一),分别对应于FHD(1920x1080p), UHD4K(3840x2160 or 4096x2160)不同分辨率的影音保护。以当前消费市场的趋势,4K影片以及显示器逐渐普及,甚至近期各家厂商推出的支持8K分辨率的HDMI 2.1消费性电子产品,可预期将有越来越多的产品将采用HDCP 2.3协议, 因此本文将着重于HDCP 2.3协议的介绍 。 HDCP 2.3 介绍 图1:HDCP系统树形图(取自HDCP2.3 on HDMI Specification) 首先介绍HDCP 2.3实体架构,请参考图一,HDCP Transmitter 可透过输出口与下游装置连接:这些下游装置可为HDCP Receiver 或 HDCP Repeater,而该连接的HDCP Repeater 还能透过其下行输出口再连接其余装置,形成装置链接的树形图。但此树形图并非无限延伸,HDCP 2.3规范最多只能下接4层HDCP Repeater,且下接装置数量上限为32台。 接着再看HDCP 2.3协议层,其核心理念可分为三个部分。第一为认证(Authentication),传送装置会透过认证协议,确认下游是否为HDCP合法接受装置。第二,确认完双方的合法性后,再透过双方共享的密钥对影音进行加密/解密,避免外界被盗录。第三,由于HDCP装置中的密钥有可能被破解,因此传送装置会更新(Renewability)遭撤销的HDCP装置名单,确保不会传送HDCP加密信息给不合法的装置。 HDCP 2.3 协议介绍 第二章节提到的认证(Authentication),将细分为几个步骤进行介绍,以下内容仅介绍协议的名词以及概念,加密算法并不在本文讨论范围。 –Authentication and key exchange (AKE) 此流程(可参考图2、图2)目的是Tx确认Rx是否为合格HDCP装置,其中信息皆使用HDMI中的I2C接口传输,以下为流程介绍: 当双方装置链接后,Tx 会传送AKE_Init,内容包含一组64bit的伪随机码 rtx 以及 TxCaps (Tx HDCP 版本信息)给Rx,代表开始进行HDCP认证流程。 Tx在发送完AKE_Init后,Rx需在100ms内回传AKE_Send_Cert,如果超出时间则认证失败。AKE_Send_Cert 内容由certrx (包含Receiver ID, Public Key, DCP LLC Signature)、一组64bit的伪随机码 rrx 、RxCaps(RxHDCP 版本信息、Repeater bit)组成。 Tx 确认certrx 内的Receiver ID(相当于Rx的身分证)后,会产生两种分歧流程:如果Tx端没有储存对应该 Receiver ID 的 Master Key(km),则进行 (图2.1)流程-AKE Without stored km,若有则进行 (图2.2)流程。 如果双方装置为第一次链接,会进行 (图2.1)流程,Tx 除了检查ReceiverID外,还会使用 Tx 的Public Key确认certrx内DCP LLC Signature是否合法,如为非法将导致认证失败。 Tx 产生一组128bit的伪随机码作为Master Key(km),使用Rx的PublicKey对其加密产生Ekpub(km),并传送包含Ekpub(km)的AKE_No_Stored_km给Rx。 Rx 使用自己的private key (kprivrx)对Ekpub(km)解碼还原出km。 Tx 检查 System Renewability Message (批注二)的合法性,同样是藉由Tx 的PublicKey确认SRM 内的Signature是否合法。 8确认完SRM合法性后,再确认下游装置的Receiver ID 是否合法。(以上SRM、Receiver ID确认只会由最上游Tx 进行) Tx 与 Rx 进行Keyderivation,将获得的Master Key(km) 运算后得到 kd。 Tx 与 Rx 将双方交换过的信息(rtx, RxCaps, TxCaps) 以及kd再次运算后分别得到 H与H’。 Tx 读取Rx端发送的AKE_Send_H_Prime,如果H与H’值不相等,或是未在规定时间(1秒)内收到,将会导致认证失败。 –Pairing 接续上述步骤,Rx 利用 kprivrx 计算出128bit kh, 再将 km 使用 kh 加密得到Ekh(km) Rx 将包含 Ekh(km) 的 AKE_Send_Paring_Info 传给 Tx Tx在200ms的时间限制内读取 AKE_Send_Paring_Info, 并将对应该次流程的 Receiver ID的 m, km, Ekh(km)储存于内存内。 经过Pairing的双方设备再次认证时,因为Tx有储存对应该 Receiver ID 的 Master Key(km),会直接进入(图2.2)流程,相较于(图2.1)流程省略部分步骤(如Master Key计算),因此可减少HDCP认证时间。 图2(取自HDCP 2.3 on HDMI Specification) 图3(取自HDCP 2.3 on HDMI Specification) –Locality check 此步骤是在 HDCP2.3引入的新机制,目的为确保双方装置距离在合法范围内,若链接距离太远,讯息将不会于时限内收到而导致认证失败,认证流程如下: Tx 传送 LC_Init (包含 64bit伪随机码 rn) 给 Rx。 Tx 与 Rx 分别计算L、L’。 如果 L 与 L’不相同, 或是Tx在 20ms内未收到 L’,则导致认证失败。 认证失败,协议中规定 Tx 可再产生新的 rn, 并在重新尝试最多1023次。 图4(取自HDCP 2.3 on HDMI Specification) –Sessionkey exchange 完成AKE以及Locality check后,代表传输设备双方均为合法装置,可以开始进行影像加密传输,此步骤目的为双方加密/解密钥匙交换,SKE流程如下: Tx 产生一个128bit 的伪随机码Session Key(ks), 64bit 伪随机码 riv。 Tx进行 Key derivation 产生 128bit dkey2,并对ks 加密产生Edkey(ks)。 Tx 传送SKE_Send_Eks(Edkey(ks)、riv)给Rx。 Rx进行 Key derivation 产生 128bit dkey2,并将Edkey(ks) 解译得到ks。 使用Session Key 以及 Secret global constant(lc128,所有设备均为相同值)开始进行影音加密/解密。 –Authentication with repeater 在AKE流程中,如果Rx回传的Rx Caps内的Repeater bit为1时才会进行此流程。目的有两个: Repeater将下游信息,如设备数目、阶层、版本、Receiver ID整理后回传给最上游Tx,如果有信息不合法,如下接设备数目、阶层超过规范(31台、四阶),或是Receiver ID 在撤销名单中,会导致认证失败。 Repeater将Tx要传送的HDCP Content type(批注三)信息传给下游。 批注 批注一:HDCP2.3设计架构与HDCP1.4不同,因此并不向下兼容,但可透过使用 HDCP2.3 to HDCP1.4转换器,将播放端的HDCP2.3内容显示于只支持HDCP1.4的接收端。 批注二:System Renewability Message由Tx端储存,内容包含已被撤销的Receiver ID。因此Tx需确认SRM的合法性后,才能检查下游装置的 Receiver ID。 批注三:HDCP传输时可分为 Type0 & Type1 content,Type0的内容可透过repeater传送给大部分HDCP装置接收,而Type1的内容透过Repeater后,无法被下游HDCP 1.x、 2.x设备接收。 参考文献 Ÿ HDCPon HDMI Specification Rev2_3 作者 GRL 台湾技术工程师 李清宇 Peter Lee 国立成功大学材料系硕士毕业。两年 HDMI 测试经验,熟悉 HDMI2.1 与 HDCP 技术测试。GRL 技术文章作者及演讲讲师。
  • 热度 8
    2020-12-18 17:10
    5898 次阅读|
    2 个评论
    USB4™ 全方位技术剖析
    原创声明 作者: GRL 实验室 林志徽 Caspar Lin USB4™ 介绍 USB4 全名为 Universal Serial Bus Generation 4 。 USB 这个接口在 1996 年发布 USB 1.0 规格 , 传输速度支持低速 1.5 Mbps 与全速 12 Mbps ,以及之后陆续发表支持速度 480 Mbps 、 5Gbps 、 10Gbps 、 20Gbps 等,并在 2019 年 9 月发布最新一代 USB4 规格,支持 20Gbps 与 40 Gbps 。 USB 接口演进及相对应的 logo ,请参考表一。 ( 表一 ) USB4™ 新功能 3 个重点 1. USB4 只采用 USB Type-C 连接器。 USB4 讯号采双信道传输。而过去的连接器如 USB Type-A 或 Micro-B ,仅支持单通道传输,无法支持 USB4。 2. USB 传输速度最快支持 40G (20Gbps x2) ,并可同时传送 DisplayPort 影音。旨在将多种协议组合到单个物理接口,可以动态共享 USB4 架构的整体速度和性能。 3. 向下兼容 USB 2.0 与 USB 3.2 及支持 Thunderbolt 3 。 USB4™ 连接器与线缆 3 个重点 1. USB4 只采用 USB Type-C 连接器。 2. USB4 Cable 被动线缆,可支持的被动线缆长度由 USB 3.2 Gen2 的 1 公尺,降为 USB4 Gen3 的 0.8 公尺。 3. 若需较长的线缆,如连接大尺寸屏幕,或是 VR 应用,可使用主动式线缆。 USB4 主动式线缆为含有 Repeater 组件(如 Re-timer , Re-driver 等主动组件)的线缆,及光纤线缆等。可支持的主动式线缆长度最长为 5 公尺 , 而光纤线缆最长可以支持 50 公尺。 USB4 架构上 3 个重点 USB4 主要构成组件有 Router ( 路由器 ) , Adapter ( 适配器 ) ,以及 TMU (Time Management Unit ,时间管理单元 ) 。 1. Router 是 USB4 的一个主要建构模块, Router 将隧道协议转换成 USB4 封包传送,并透过 TMU 来作时间同步。主要由 USB Host 内建的 Connection Manager 来侦测及管理。 2. Adapter 是内建在 Router 里,主要功能为 Router 与外部组件沟通的媒介,进行协议转换。例如 USB4 Host 在传输 USB3 数据(如下图),由内部 USB3 Host 透过 USB3 Adapter 进行协议封装成 USB4 Tunneled Packet 。一个 Router 内部最多可以支持 64 个 Adapter 。 3. TMU 是内建在 Router 里,使用分布式时间管理单元( TMU ),在 Router 间做时间同步。 USB4 依功能层级分为 5 种 1. Protocol Adapter Layer: 负责 USB4 与不同协议间进行对应 . 并把不同协议封装成 Tunneled Packet 在 USB4 介面内传递。 2. Configuration Layer: 负责处理由 Connection manager 传送来的 Control Packets ,并附加路径中对应的地址 (address) ,确保其可靠的传送机制。 3. Transport Layer: 定义封包格式、路径、流量控制与时序控制,并产生 link management Packets 以提供时间同步封包、流量控制封包等。 4. Logical Layer: 负责建立 2 个装置之间的 USB4 链接,提供数据传送与接收、编码与译码,电源管理,错误侦测及复原机制,并且透过 Sideband Channel 进行通道初始化的沟通,包括速度及双信道沟通。 5. Electrical Layer: 定义 USB4 电气讯号的特性,如电压、抖动,编码等。 如下图,以 USB3 Tunneling 为例, USB4 Host 透过 USB3 Protocol Adaptor ,将 USB3 Protocol 经 USB4 Transport Layer 、 USB4 Logic Layer 、 USB4 Electrical Layer 转 USB4 Link 传送到 USB4 Hub Electrical Layer 。再依下图顺序进行 一连串 USB3/USB4 转换,将讯号传送到 USB4 Device 。 USB3 隧道协定 USB4 讯号由 PCIe 、 USB3 及 DisplayPort 隧道协议组成。此篇幅单就 USB3 隧道协议讲解。 USB3 隧道协议,指的是将原始 USB3 封包经由 Protocol Adapter Layer 封装成 Tunneled 封包 , 藉由以下的图片可以清楚知道 , 红色部分 是 USB3 的封包而蓝色部分是 Tunneled 封包 , UFP 与 DFP 之间会使用 Physical Layer 传输。 Note: UFP: Upstream Facing Port , DFP: Downstream Facing Port USB4 的产品有 4 种类型 1. USB4 Host: 产品有一个以上 DFP 。没有任何的 UFP 。 2. USB4 Hub: 产品有一个 UFP ,并且有一个或多个 DFP 。 3. USB4-Based Dock: 产品有一个 UFP ,并且有一个或多个 DFP ,且产品内还有其他 device 的功能,如储存装置或网络功能。 4. USB4 Device: 产品有一个 UFP ,没有任何的 DFP 。 Note: UFP: Upstream Facing Port , DFP: Downstream Facing Port USB4 支持的隧道协议 依据规格,对 Host/ Hub/Dock/Device 必须支持的隧道协议有不同要求,如下图,打 “V ” 为必须支持,其余则是可选择支持与否。 例如 USB Host 必须支持 USB3 、 DisplayPort 与 Host-to-Host Tunneling ,可以不支持 PCI Express 与 TBT3 Tunneling 。 USB4 支援的传输速率 USB4 支援 USB4 Gen2 的 20Gbps 及 USB4 Gen3 的 40Gbps 速度,是不是宣告支持 USB4 就一定要支持这两个速度? • 对 USB4 Hub 与 USB4-Based Dock 来说,必须同时支持 20Gbps 及 40Gbps 。 • 对 USB4 Host 与 USB4 Device 来说,可以只支持 20Gbps 。( 40Gbps 可列为额外支持,非必要支持速度)。 结论 USB4 传输速率提升到 40 Gbps ,并且可以动态分享带宽 , 当使用一条 USB Type-C 连接线就可以兼容于市面上 Thunderbolt 3 和 Display Port 产品,对于消费者来说是一个更加便利的界面。但对于产品开发者来说, USB4 是一个比较大的挑战,除了产品设计和以往 USB3 的产品在架构上的差异,加上高频信号在 PCB 及连接器上的衰 减,须更关注高频阻抗匹配,在开发阶段确保传输的信号质量。 免责声明 本信息仅为便于参照而提供。本信息不是且不应视为 USB Implementers Forum (USB-IF) 之正式通讯。 USB-IF 之正式通讯可于其网站 usb.org 取 得,或直接自 USB-IF 取得。 参考文献: Universal Serial Bus 4 (USB4™) Specification Version 1.0 August, 2019
相关资源