




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1 AT命令模塊框架設(shè)計(jì) 11.1 ATCOP功能劃分 11.2 AT命令處理流程詳解 31.3 AT命令表結(jié)構(gòu) 71.4 命令表項(xiàng)解釋 111.5 增加一條AT命令 151.5.1 基本流程 151.5.2 增加一條同步AT命令范例 181.5.3 增加一條異步AT命令范例 201.5.4 主動(dòng)上報(bào)的AT事件如何實(shí)現(xiàn)實(shí)現(xiàn)方法 272 高通AT命令模塊主要文件功能 333 AT命令的流程 343.1 同步AT命令的流程 343.2 異步AT命令的流程 343.3 主動(dòng)上報(bào)AT命令的流程 34QCT6085AT命令模塊設(shè)計(jì)與實(shí)現(xiàn)AT命令模塊框架設(shè)計(jì)本節(jié)對(duì)AT命令模塊的總體設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行了詳細(xì)描述,并對(duì)AT命令表結(jié)構(gòu)內(nèi)容做了說明,最后解釋了如何添加一條AT命令。ATCOP功能劃分高通的AT模塊,也就是AT命令處理器(ATCOP)完成了多種AT命令的解析、處理以及產(chǎn)生和發(fā)送命令響應(yīng)消息,同時(shí)也處理在AT命令執(zhí)行過程中的各種AT相關(guān)的事件。在高通的軟件平臺(tái)中,ATCOP作為數(shù)據(jù)服務(wù)模塊(DSdataservices)的一個(gè)子任務(wù)來實(shí)現(xiàn)。在ds_task中完成對(duì)dsat_task的初始化和調(diào)用功能,所有的AT命令通過TE和TA之間的串行接口發(fā)送。收到的AT命令緩存在DS的消息隊(duì)列dsi_cmd_q中,并由ds的消息分發(fā)機(jī)制統(tǒng)一分發(fā)給各個(gè)子任務(wù)。ATCOP的處理流程包括SIO數(shù)據(jù)預(yù)處理模塊、AT命令解析器、AT命令處理器、AT命令響應(yīng)產(chǎn)生器、AT命令表及命令處理功能模塊。1.通過串口設(shè)備(SIO)接收的AT命令數(shù)據(jù),首先由SIO數(shù)據(jù)預(yù)處理,產(chǎn)生一個(gè)null-terminated命令行并由DS分發(fā)給AT命令解析器。2.產(chǎn)生的null-terminated命令行由AT命令解析器解析,解析器為每個(gè)要解析的命令產(chǎn)生一個(gè)token結(jié)構(gòu),并送到處理隊(duì)列由AT命令處理器處理。在AT命令處理器被調(diào)用前,解析器將每個(gè)命令的token結(jié)構(gòu)放入隊(duì)列中。3.AT命令處理器完成對(duì)每個(gè)token結(jié)構(gòu)進(jìn)行表查找,同時(shí)將該token結(jié)構(gòu)從隊(duì)列中移除。如果查找到,對(duì)應(yīng)的處理函數(shù)被調(diào)用處理該命令;AT命令在命令表中定義,每個(gè)命令表入口包含對(duì)應(yīng)命令執(zhí)行函數(shù)的指針。4.AT命令響應(yīng)產(chǎn)生器將命令響應(yīng)數(shù)據(jù)格式化,產(chǎn)生結(jié)果編碼,并將響應(yīng)數(shù)據(jù)發(fā)送給DTE。5.ATCOP每次處理一條AT命令行命令,如果任何命令行的命令產(chǎn)生一個(gè)錯(cuò)誤,在錯(cuò)誤前就會(huì)產(chǎn)生命令處理的響應(yīng),同時(shí)產(chǎn)生一個(gè)錯(cuò)誤代碼,不再對(duì)該命令進(jìn)行后續(xù)處理。AT命令處理流程詳解圖1AT命令處理流程圖詳細(xì)描述了AT命令模塊在處理各類AT命令的具體具體流程。DS_Task的建立,SIO喚醒rx收到數(shù)據(jù),將sio喚醒2.初始化解析函數(shù)dsat_process_sio_command去掉命令行中的"AT"前綴,然后把以NULL結(jié)尾的命令行傳給函數(shù)dsat_process_cmd_line來進(jìn)行后續(xù)的分析和處理。dsatpar_parse_cmd_line函數(shù)完成對(duì)命令行的解析,檢查每個(gè)AT命令的首字符然后根據(jù)AT命令的類型調(diào)用相應(yīng)的解析函數(shù)。每個(gè)AT命令名(包括首符號(hào),如,$QCDMG)以及相關(guān)的命令參數(shù)都被從命令行中解析出來,然后放到一個(gè)tokendatastructure中。命令行中的每個(gè)命令都產(chǎn)生一個(gè)tokenstructure,放到token排隊(duì)上等待后續(xù)處理,此時(shí)一個(gè)命令行解析完成。一般添加或修改AT命令時(shí)不改動(dòng)這部分代碼。3.命令解析根據(jù)命令的不同首字符,不同的解析函數(shù)解析AT命令后,把解析的信息填充到上一步產(chǎn)生的tokendatastructure中,然后返回結(jié)果。如果結(jié)果是OK(意味著參數(shù)、參數(shù)個(gè)數(shù)以及特殊處理碼specialprocessingcode等等都已經(jīng)存好),此時(shí)tokendatastructure已放在隊(duì)列中等待AT命令處理器(ATcommandprocessor)后續(xù)處理。命令行中的每個(gè)命令都在隊(duì)列中放一個(gè)tokenstructure。例如,extendedorproprietaryAT命令調(diào)用的分析函數(shù)是parse_extended_cmd。4.命令執(zhí)行每個(gè)命令產(chǎn)生的tokenstructure被函數(shù)dsatcmdp_queue_token放入隊(duì)列中。命令解析完成后,調(diào)用函數(shù)process_at_cmd_line處理隊(duì)列中的每個(gè)tokenstructure。從隊(duì)列中取出并刪除一個(gè)命令tokenstructure后,在命令表中搜索該命令。頂層命令表(toplevelcommandtable)在文件dsatetsitgt.c中。頂層命令表又指向文件dsatctab.c和dsatetsictab.c中的多個(gè)命令表,這些表定義了所支持的AT命令集。在表中查找到該命令后,調(diào)用表中對(duì)應(yīng)的處理函數(shù)執(zhí)行該命令。命令執(zhí)行后如果有返回?cái)?shù)據(jù)時(shí),返回的響應(yīng)數(shù)據(jù)在函數(shù)dsat_fmt_response中格式化。每個(gè)token結(jié)構(gòu)都進(jìn)行這樣的處理。最后調(diào)用函數(shù)dsatrsp_send_response把命令響應(yīng)送到DTE。對(duì)于異步AT命令處理流程與正常AT命令略有不同,在命令預(yù)處理、命令解析過程都是一樣的,在命令處理過程中(process_at_cmd_line),如果命令處理函數(shù)返回DSAT_OK,說明命令處理完成調(diào)用dsat_fmt_response函數(shù)格式化響應(yīng)數(shù)據(jù)并發(fā)送,正常的命令處理流程;如果命令處理函數(shù)返回DSAT_ASYNC_CMD說明當(dāng)前命令是異步命令,此時(shí)函數(shù)process_at_cmd_line設(shè)置變量dsatcmdp_processing_async_cmd=TRUE,表示當(dāng)前正在處理異步命令,然后返回,不再進(jìn)行后續(xù)處理,直到該命令處理完成,函數(shù)返回DSAT_OK(未必一定是DSAT_OK,當(dāng)返回不是DSAT_ASYNC_CMD和DSAT_ASYNC_EVENT時(shí),說明異步命令/事件處理完成)。當(dāng)DS收到異步事件經(jīng)任務(wù)分發(fā)器,再次調(diào)用dsat_process_async_cmd函數(shù),在該函數(shù)中通過查找異步事件表async_event_table,調(diào)用相應(yīng)的事件處理函數(shù)繼續(xù)處理,如果事件處理函數(shù)返回值不是DSAT_ASYNC_CMD或DSAT_ASYNC_EVENT,說明異步事件處理完成,調(diào)用process_at_cmd_line繼續(xù)處理命令行的命令。AT命令表結(jié)構(gòu)AT命令的處理是由命令表驅(qū)動(dòng)的,ATCOP實(shí)現(xiàn)的命令表是一個(gè)分級(jí)的表結(jié)構(gòu),主要分為:主表(mastertable)、子表(subtable)、命令表(commandtable),如圖4.2所示。其中主表是一個(gè)二維的數(shù)組,數(shù)組的行表示AT命令的分類,分為:基本AT命令(basic_table)、寄存器AT命令(sreg_table)、擴(kuò)展AT命令(extended_table)、廠商AT命令(vendor_table)四大類;數(shù)組的列表示是ETSI模式還是其它模式的AT命令。圖2AT命令表結(jié)構(gòu)圖主表定義在dsati.h文件中:typedefstructdsati_cmd_struct{bytename[20];uint32attrib;bytespecial;bytecompound;constvoid*val_ptr;constvoid*def_lim_ptr;dsat_result_enum_type(*proc_func)(dsat_mode_enum_type,conststructdsati_cmd_struct*,consttokens_struct_type*,dsm_item_type*);boolean(*abort_func)(conststructdsati_cmd_struct*);}dsati_cmd_type;typedefstruct{constdsati_cmd_type*table_ptr;constunsignedint*table_size;}dsati_at_cmd_table_entry_type;typedefdsati_at_cmd_table_entry_type*dsati_at_cmd_table_type[NUM_AT_CMD_CATEGORIES][NUM_OPER_CMD_MODES];分類表定義在文件dsatetsitgt.c中:constdsati_at_cmd_table_typeat_cmd_table={{basic_table_entries,NULL},{sreg_table_entries,NULL},{extended_table_entries,NULL},{vendor_table_entries,NULL}};1.基本命令表基本命令的格式為:<command>[<number>]其中<command>或者是單個(gè)字母(A-Z),或者是“&”字符接單個(gè)字母。<number>是一個(gè)十進(jìn)制數(shù),可以是一位,也可以是多位。<number>最前面的0會(huì)被忽略。默認(rèn)<number>為0。如果一個(gè)不帶<number>的基本命令帶了<number>,則返回TOOMANYPARAMETERS。2.寄存器命令表所有以字母“S”開頭的命令統(tǒng)稱為S寄存器命令,格式如下:S<parameternumber>?S<parameternumber>=<value>S寄存器命令名由字母“S”接上一個(gè)十進(jìn)制數(shù)構(gòu)成,這個(gè)十進(jìn)制數(shù)稱為寄存器序號(hào)(parameternumber)。如果寄存器序號(hào)不被識(shí)別,說明不存在該命令,返回COMMANDNOTSUPPORT。每個(gè)S寄存器保存一個(gè)字符。命令名后面如果接“?”表示是READ命令,返回此S寄存器當(dāng)前保存的字符的ASCII碼值,以3位十進(jìn)制數(shù)表示,位數(shù)不足的前面補(bǔ)0;如果接“=”表示是SET命令,將<value>值對(duì)應(yīng)的字符替換此S寄存器保存的字符。3.?dāng)U展命令表和廠商提供的命令表擴(kuò)展命令均由“+”開頭,廠商定義的命令也是由一個(gè)特殊符號(hào)開頭,例如“$”,“%”等。本文中所實(shí)現(xiàn)的命令均為擴(kuò)展命令。所有的擴(kuò)展命令和廠商定義命令又可以分為兩類:Actioncommand和Parametercommand。1)actioncommandactioncommand指完成某個(gè)具體的動(dòng)作,而不僅僅是與MS本地的參數(shù)打交道的命令,例如AT+CMGS等。actioncommand可以帶參數(shù)也可以不帶。Actioncommand包含EXECUTION命令和TEST命令。(1)EXECUTION命令EXECUTION命令格式如下:不帶參數(shù):<name>帶1個(gè)參數(shù):<name>[=<value>]帶多個(gè)參數(shù):<name>[=<compound_value>]<compound_value>表示多個(gè)參數(shù),中間以“,”分隔。對(duì)于有默認(rèn)值的參數(shù),可以在命令中省略,此時(shí)以默認(rèn)值代替。如果所有的參數(shù)都省略,則<name>后面的“=”也一并略去。如果<name>不被識(shí)別,則表示此命令不存在,返回COMMANDNOTSUPPORT。<name>可識(shí)別的前提下,如果不能帶參數(shù)的命令帶了參數(shù),或者參數(shù)個(gè)數(shù)超出定義,則返回TOOMANYPARAMETERS。(2)TEST命令TEST命令格式:<name>=?如果MS不能識(shí)別<name>,返回COMMANDNOTSUPPORT。如果MS可以識(shí)別<name>,且命令是不帶參數(shù)的,則返回OK。如果命令帶參數(shù),則先返回各個(gè)參數(shù)的可取值范圍,最后再加上OK。2)parametercommandparametercommand包括與MS本地的參數(shù)打交道的命令,這些參數(shù)有些會(huì)影響到atcioncommand的執(zhí)行。parametercommand又分為SET命令、READ命令和TEST命令。(1)SET命令命令格式為:帶1個(gè)參數(shù):<name>[=<value>]帶多個(gè)參數(shù):<name>[=<compound_value>]SET命令用于設(shè)置參數(shù)。<compound_value>表示多個(gè)參數(shù),中間以“,”分隔。對(duì)于有默認(rèn)值的參數(shù),可以在命令中省略,此時(shí)以默認(rèn)值代替。如果所有的參數(shù)都省略,則<name>后面的“=”也一并略去。如果<name>不被識(shí)別,則表示此命令不存在,返回COMMANDNOTSUPPORT。<name>可識(shí)別的前提下,如果不能帶參數(shù)的命令帶了參數(shù),或者參數(shù)個(gè)數(shù)超出定義,則返回TOOMANYPARAMETERS。(2)READ命令命令格式:<name>?READ命令用于讀取參數(shù)當(dāng)前值。(3)TEST命令命令格式:<name>=?如果MS不能識(shí)別<name>,返回COMMANDNOTSUPPORT。如果MS可以識(shí)別<name>,且命令是不帶參數(shù)的,則返回OK。如果命令帶參數(shù),則先返回各個(gè)參數(shù)的可取值范圍,最后再加上OK。命令表項(xiàng)解釋下面依次介紹各個(gè)表項(xiàng)的含義:1.nameAT命令名,包括需要處理的+,$,&和終止的NULL。如+IPR,$QCDMG,S6,&C,Z。2.a(chǎn)ttitude32位的掩碼,用來指定單個(gè)或多個(gè)命令屬性。表4.1列出了AT命令的所有屬性,后面給出了具有該屬性的命令。3.special如果有需要,就指定處理編碼,否則就是SPECIAL_NONE,指定處理編碼定義在dsati.h。只是用在與外部軟件的兼容性時(shí)。表1AT命令屬性列表4.compound數(shù)字命令的參數(shù)個(gè)數(shù)或是字符串命令的最大長度(不包括NULL)。例如:S0,帶有一個(gè)數(shù)字參數(shù),compound=1;對(duì)于一個(gè)命令的字符串參數(shù)定義大小為30,compound=29。5.value_ptr指針變量,存儲(chǔ)參數(shù)值。如果變量是一個(gè)數(shù)組(具有多個(gè)參數(shù)的命令),該指針指向數(shù)組的第一個(gè)元素。具有LIST屬性的命令,存儲(chǔ)在*val_ptr中的值不是真正的參數(shù)值,而是數(shù)組list_v指向的地址。對(duì)于帶有MIXED_PARAM屬性的命令,指針指向dsat_mixed_param_val_type,這是一個(gè)字符串或是數(shù)字值的聯(lián)合體union類型。數(shù)組的成員是字符串還是數(shù)值依賴于對(duì)應(yīng)數(shù)組成員的屬性def_lim_ptr。該指針指向的變量可以是下面的類型之一:1)dsat_num_item_type帶有數(shù)字參數(shù)或是LIST屬性的命令;2)dsat_string_item_type帶有字符串參數(shù)的命令;3)dsat_mixed_param_val_type帶有混合類型參數(shù)的命令,參數(shù)可以是規(guī)定值的字符串,某一范圍的數(shù)字,或是限定長度的字符串;4)NULL表示命令沒有參數(shù)。6.defaultlimitptr定義默認(rèn)值和允許范圍的參數(shù)該指針的變量可以是下面類型中的一個(gè):1)dflm_type帶有CONFIG屬性的命令;2)def_list_type帶有LIST屬性的命令;3)mixed_def_s_type帶有MIXED_PARAM屬性的參數(shù);4)NULL帶有STRING屬性的命令或是沒有參數(shù)的命令。7.processfunctionptr函數(shù)指針被調(diào)用用于執(zhí)行在命令表入口定義的命令。函數(shù)指針參數(shù)是:1)dsat_mode_enum_type定義當(dāng)前AT命令模式,表4.2列出模式和對(duì)應(yīng)的含義。表2AT命令模式表2)dsati_cmd_struct*是dsati_cmd_struct結(jié)構(gòu)入口指針,對(duì)于包含這個(gè)命令表入口指定命令。3)token_struct_type*是一個(gè)定義好的tokenstructure解析器指針,這個(gè)token結(jié)構(gòu)包含處理該命令所要求的信息。4)dsm_item_type*是DSMbuffer的指針,存儲(chǔ)命令響應(yīng)。如果命令響應(yīng)超出了一個(gè)DSMbuffer的容量,可以將多個(gè)DSMbuffer可以鏈接到一起。函數(shù)返回類型應(yīng)該是表.3列出值中的一個(gè)。表4.3函數(shù)返回類型表8.a(chǎn)bortfunctionptr函數(shù)指針通過命令表入口調(diào)用定義的abort命令,函數(shù)指針值不是NULL表示命令表入口定義的命令是可以abort的。函數(shù)指針參數(shù)是:dsati_cmd_struct*是dsati_cmd_struct結(jié)構(gòu)入口指針,用于指示包含該命令表入口的指定命令。函數(shù)返回類型是一個(gè)Boolen表示:如果值是TRUE,表示數(shù)據(jù)調(diào)用可以通過DsmgrAbort,否則不需要任何動(dòng)作。9.dflm_type定義AT命令中數(shù)字參數(shù)的最大值和最小值參數(shù),這里的數(shù)字參數(shù)一定是連續(xù)的取值類型。如果參數(shù)取值為{0,1,255}這種參數(shù)應(yīng)該設(shè)置為list類型。Default_v為默認(rèn)值,lower和upper為最小和最大取值。10.def_list_type用于定義LIST類型的參數(shù)取值范圍,其中:Default_v代表參數(shù)的默認(rèn)值,它是指向list_v數(shù)組的指針。List_v是一個(gè)8-byte字符串的數(shù)組指針,代表該參數(shù)允許的所有值,數(shù)組的最后一項(xiàng)必須是NULL來終止參數(shù)列表。AT命令處理器完成該數(shù)組的字符串匹配,以決定參數(shù)值是否在有效的范圍內(nèi)。List_t是一個(gè)字符串指針,逐字返回測試命令的響應(yīng)。AT命令如果含有多個(gè)參數(shù),每個(gè)參數(shù)都關(guān)聯(lián)于def_list_type結(jié)構(gòu)。11.mixed_def_s_type和dsat_mixed_param_val_typeMixed_def_s_type用于存儲(chǔ)AT命令中混合參數(shù)的默認(rèn)值和可能值,混合參數(shù)類型表示AT命令的參數(shù)可以是不同類型的,其允許值范圍也是個(gè)集合,如果是數(shù)值類型需要指定在某一范圍內(nèi),如果是字符串類型則限定長度。如果命令有N個(gè)不同類型參數(shù),默認(rèn)的可能值范圍包含一個(gè)長度為N的mixed_def_s_type數(shù)組,類型參數(shù)i是數(shù)組下標(biāo),如mixed_argus[]定義為mixed_argus[i].attrib。如果AT命令有N種不同類型參數(shù),參數(shù)的當(dāng)前值包含在長度為N的dsat_mixed_param_val_type數(shù)組中。該數(shù)組用于聯(lián)系mixed_def_s_type數(shù)組Dsat_mixed_param_val_type數(shù)組下標(biāo)為i的元素,在mixed_def_s_type數(shù)組對(duì)應(yīng)i分量為該AT命令的默認(rèn)和可能的范圍值。增加一條AT命令基本流程AT命令處理器方便擴(kuò)展以支持新的AT命令,圖4.3所示的是添加一條新的AT命令的具體流程。1.Selectauniquenameforthecommand.Thecommandnamecanbeupto10charactersinlength,includingtheleading+,$,or&.首先選擇一個(gè)唯一的命令名稱,命令名長度最大10個(gè)字符,包括開始的+,$,&。本文中所用AT命令均為擴(kuò)展命令,所以用的都是+。2.Determinethecommandattributes.ThevariouscommandattributesandtheirmeaningsareAre14listedinTable4-3決定命令屬性不同命令屬性和含義在表1AT命令屬性列表中列出。3.Createavariabletostoretheargumentvalue(s).Ifthecommandhasoneormorearguments,declareavariableoftheappropriatetypeindsatctab.cordsatetsictab.ctostoretheargumentvalues.CommandtablesmustbeexportedinternaltotheATCoPunitindsatctab.hordsatetsictab.h.IftheargumentvaluesarereferencedbymodulesexternaltoATCoP,declare,thisvariableasanexternindsat.h.產(chǎn)生一個(gè)變量存儲(chǔ)參數(shù)值,如果命令包含一個(gè)或多個(gè)參數(shù),在dsatctab.c中定義一個(gè)對(duì)應(yīng)類型的變量來存儲(chǔ)參數(shù)值,命令表應(yīng)該定義在dsatctab.c或dsatctab.h中。如果參數(shù)值用于ATCOP模塊外部,將該變量聲明在dsat.h中。4.Definethedefaultvalueandtheallowedrangeforthecommandarguments.Forcommandswithsimplenumericarguments,usethedflm_type.Initializethedefaultvalueandthelowerandupperbounds.ForcommandsoftypeLIST,usethedef_list_type.Createthelist_vandlist_tdatastructures,andinitializethedefaultvalue.Forcommandsoftypemixedparameter,createandinitializetheappropriatedflm_typeanddef_list_typeforeachparameterofthistype.Forstringarguments,thisisnotapplicable.Allofthesevariablesshouldbedeclaredindsatctab.cordsatetsictab.c.ForATcommandswhosedefaultsand/orlimitsneedtobeinitializedatrun-time,thisinitializationmaybeperformedinthefunctiondsatctab_data_init.定義命令參數(shù)的默認(rèn)值和允許范圍對(duì)于簡單數(shù)字型參數(shù)的命令,使用dflm_type,初始化默認(rèn)值和最小最大界限。對(duì)于LIST類型命令,使用def_list_type,產(chǎn)生list_v和list_t數(shù)據(jù)結(jié)構(gòu),并初始化默認(rèn)值。對(duì)于混合參數(shù)類型命令,為每個(gè)類型參數(shù)產(chǎn)生并初始化相應(yīng)dflm_type和def_list_type,對(duì)于string參數(shù)類型,不需要這些。所有這些變量應(yīng)該聲明在dsatctab.c或是dsatctab.h中,對(duì)應(yīng)AT命令默認(rèn)的限制需要在run-time初始化,初始化功能由dsatctab_data_init實(shí)現(xiàn)。5.AddtheCommandExecutionfunction,ifany.Ifthecommandrequiresspecialprocessingcodeoutsidethegenericparameterprocessingfunctionsdefinedindsatparm.c,addanewCommandExecutionfunctiontotheappropriatecommand-processingfile(dsatparm.c,dsatact.c,dsatvend.c,dsatetsicall.c,dsatetsipkt.c,dsatetsime.c,dsatetsismsc.c,dsatgsmfax.c).TakeadvantageofanyATcommandprocessingutilitiesexportedbydsati.horparameterprocessingexportedbydsatparm.h.添加命令執(zhí)行函數(shù)(如果需要)如果命令需要指定額外處理函數(shù),而不是在dsatparm.c中定義的通用函數(shù),添加一個(gè)新的命令執(zhí)行函數(shù)到對(duì)應(yīng)的命令處理文件(dsatparm.cdsatact.cdsatvend.cdsatetsicall.c,dsatetsipkt.c,dsatetsime.c,dsatetsismsc.c)??梢允褂萌魏蜛T命令處理單元在dsati.h中或是dsatparm.h中exported的。還有可能修改命令解析部分的代碼,在文件dsatpar.c中,比如增加的以’^’開始的命令,需要增加相應(yīng)的解析代碼。6.AddtheAbortCommandfunction,ifany.Ifthecommandisabortable,anAbortCommandfunctionmustbedefinedintheappropriatecommandprocessingfile.Thecommandprocessingfilesarethesameasthoseidentifiedinstep5.添加abort命令函數(shù)(如果需要)如果命令是可終止的,一個(gè)終止命令函數(shù)定義在對(duì)應(yīng)命令處理文件中。7.Addthecommandtotheappropriatecommandtable.First,determinewhichcommandtabletheATcommandbelongsto,basedonthecommandsyntaxandcommandtype.Then,addthedsati_cmd_typeentrytotheselectedcommandtable.Initializethedsati_cmd_typecommandtableentry.Initializethedsati_cmd_typecommandtableentrytopointtothisnewCommandExecutionfunction.Ifnonewspecialprocessingcodeisrequired,initializethecommandtableentrytopointtotheappropriateParameterProcessingfunctionorNULL,dependingonthecommandresponsedesired.InitializetheAbortCommandfunctionpointertoNULLifthecommandisnotabortable,otherwiseinitializeittopointtotheAbortCommandfunction添加命令表單首先,決定命令屬于AT命令表中那個(gè)表,基于命令的語法和命令類型。然后添加dsati_cmd_type入口到選定的命令表。初始化dsati_cmd_type命令表入口,初始化dsati_cmd_type命令表入口指向這個(gè)新的命令執(zhí)行函數(shù)。如果不需要指定新的處理代碼,初始化命令表入口指向相應(yīng)處理函數(shù)或是NULL,依賴于命令響應(yīng)要求。如果命令不能abort,初始化abort函數(shù)指針到NULL,否則將其初始化到abort命令函數(shù)。圖3添加一條AT命令的流程圖增加一條同步AT命令范例SupposethatyouwanttoaddanewATcommand,AT$MYCMD,whichhastwonumericThefirstargumenttakesvaluesfrom0to7,withadefaultvalueof0,andthesecondargumenttakesvaluesfrom0to3,withadefaultvalueof2.Thecommandisnotabortable1.Name(首先選擇一個(gè)唯一的命令名稱)Thecommandnameis$MYCMD.2.Attributes(決定命令屬性)Thiscommandhasthefollowingattributes:CONFIG–ThecommandhastwoargumentsEXTENDED–Thecommandusesextendedsyntax(beginswith$)3.Argumentstorage(產(chǎn)生一個(gè)變量存儲(chǔ)參數(shù)值)Indsatctab.c:dsat_num_item_typedsat_mycmd_val[2];ForreferenceexternaltoATCoP,indsat.h,otherwiseindsatctab.h:externdsat_num_item_typedsat_mycmd_val[];4.DefaultsandlimitsIndsatctab.c:LOCALconstdflm_typedsat_mycmd_dflm[]={{0,0,7},/*argument1:default=0,range=0–7*/{2,0,3}/*argument2:default=2,range=0–3*/};5.Specialprocessing(添加命令執(zhí)行函數(shù))Supposethataspecialfunction,mycmd_action(),mustbeinvokedeachtimeAT$MYCMDisissued,aftertheparametervalueshavebeenstored.Accordingly,aCommandExecutionfunctionmustbedefinedindsatvend.c.ThisfunctionmustcalltheappropriateParameterProcessingfunctionexportedbydsatparm.handcallmycmd_action(),thenreturntheappropriateresultcode.Anexampleofthiscommandexecutionfunctionis:dsat_result_enum_typedsatvend_exec_mycmd_cmd(dsat_mode_enum_typemode,/*ATcommandmode*/constdsati_cmd_type*cmd_table,/*Ptrtocmdincommandtable*/consttokens_struct_type*tok_ptr,/*Commandtokensfromparser*/dsm_item_type*res_buff_ptr/*Placetoputresponse*/){dsat_result_enum_typeresult;/*Performcommandparameterprocessing:*/result=dsatparm_exec_param_cmd(mode,cmd_table,tok_ptr,res_buff_ptr);/*Performspecialprocessing:*/result=mycmd_action();returnresult;}/*dsatvend_exec_mycmd_cmd*/6.Abortcommandprocessing(添加abort命令函數(shù))Sincethecommandisnotabortable,noAbortCommandfunctionneedstobedefined.7.Commandtableentry(添加命令表單)Sincethecommandusesvendor-specific(extended)syntax,itshouldbeaddedtothedsat_vendor_table[]indsatctab.c.Thecommandtableentrylookslikethis:{"$MYCMD",EXTENDED|CONFIG,SPECIAL_NONE,2,&dsat_mycmd_val[0],&dsat_mycmd_dflm[0],dsatvend_exec_mycmd_cmd,NULL},8.CompileandtestTheATcommandisnowinstalledinthecommandtable.Recompilethefilesthatweremodifiedandexecute.在超級(jí)終端輸入:AT$MYCMD;觀察輸出9.參考//CCSPECelement*CHECKEDOUTelement\qct_6085\....../QSC6085_E2_v1.0.5_PRAtSyComand/LATESTelement\qct_6085\...QSC6085_e2_v1.0.5-mkbranchQSC6085_E2_v1.0.5_PRAtSyComandelement\qct_6085\.../main/0-mkbranchQSC6085_E2_v1.0.5_PRAtSyComandload\qct_6085//CCSPECEND增加一條異步AT命令范例Toaddanasynchronouscommand,thestepsdefinedintheprevioussectionmustbefollowedwiththefollowingdifferences:1.CommandExecutionfunctionmustreturnDSAT_ASYNC_CMD.ThisvaluemustbereturnedbytheCommandExecutionfunctiontonotifytheATcommandprocessorthatthisisanasynchronouscommand.TheCommandExecutionfunctiontypicallyinitiatesthecommandprocessingbycallingontheservicesofanothertask.Theothertaskthenrespondsbygeneratinganasynchronousevent.命令處理涵數(shù)必須返回DSAT_ASYNC_CMD值。返回值告知AT命令處理器這是異步命令。命令處理涵數(shù)指派其他任務(wù)服務(wù)發(fā)起命令處理,其他任務(wù)產(chǎn)生一異步事件來響應(yīng)。2.AddanasynchronousEventHandlerfunction.AnEventHandlerfunctionmustbedefinedtohandletheevent.AddthenewEventHandlerfunctiontotheappropriatecommandprocessingfile(dsatparm.c,dsatact.c,dsatvend.c,dsatetsicall.c,dsatetsipkt.c,dsatetsime.c,dsatetsismsa.c).TheeventhandlermustreturnavalueotherthanDSAT_ASYNC_CMDorDSAT_ASYNC_EVENTtoindicatetheasynchronouscommandprocessinghascompleted.增加一個(gè)異步件處理函數(shù)。必須定義一個(gè)異步事件處理函數(shù)來處理該異步事件異步事件處理函數(shù)可以定義在響應(yīng)的命令處理文件中。異步事件處理不返回DSAT_ASYNC_CMD或DSAT_ASYNC_EVENT值時(shí),表明該異步事件處理完畢。3.Addtheasynchronouseventidentifierandeventstructuretothedataservicestask.Theeventidentifiermustbeaddedtods_cmd_enum_typeinfiledstask.h.AddtheeventidentifierbetweentheDS_AT_ASYNC_EVENT_STARTandDS_AT_ASYNC_EVENT_ENDitemsintheenumerationtypetoinsuretheeventishandledasanATCoPasynchronousevent.AddthisneweventidentifiertoATCoPcommandsintheswitchstatementoffunctiondsi_process_cmds.Thisfunctionislocatedinthefiledstask.c.Defineandaddanyneweventparametersrequiredtobeprocessedbytheeventhandlertotheds_cmd_typestructuredefinedindstask.h.往數(shù)據(jù)服務(wù)任務(wù)增加一個(gè)異步件處理標(biāo)識(shí)號(hào)和異步事件結(jié)構(gòu)。異步件處理標(biāo)識(shí)添加到dstask.h.里的ds_cmd_enum_type枚舉結(jié)構(gòu)中。必須保證標(biāo)識(shí)號(hào)在DS_AT_ASYNC_EVENT_STARTandDS_AT_ASYNC_EVENT_END之間。在dstask.c.下dsi_process_cmds涵數(shù)中,增加該異步件處理標(biāo)識(shí)號(hào)case語句開關(guān),確保調(diào)用dsat_process_async_cmd函數(shù)。在dstask.h.下,ds_cmd_type結(jié)構(gòu)中,增加一異步事件的參數(shù)(unit變量),以便異步事件回調(diào)涵數(shù)進(jìn)一步處理。4.Addtheeventandhandlertotheasynchronouseventhandlertable.Addanewdsati_async_event_table_entry_typetotheasynchronouseventhandlertable.Thetableislocatedinthefiledsatetsitgt.c.InitializethetableentrytopointtothenewEventHandlerfunctionandwiththeeventidentifier.添加該異步件處理函數(shù)到異步事件處理表單中。異步事件處理表單中位于dsatetsitgt.c的async_event_table中,根據(jù)異步件處理標(biāo)識(shí)號(hào),當(dāng)前模式,該異步件處理函數(shù)指針新增一條記錄。Example:SupposethatyouwanttomakethenewATcommand,AT$MYCMD,addedinthepreviousexample,anasynchronouscommand.Thisasynchronouscommandrequiresasingleasynchronouseventtocompleteprocessingofthecommand.Difference1–CommandExecutionfunctionreturnsDSAT_ASYNC_CMDSupposethataspecialfunction,mycmd_action(),whichisinvokedeachtimetheAT$MYCMDisissued,requestsinformationfromanothertask.TheinformationisthensenttoATCoPfromanothertaskbycallingtheprovidedCallbackfunctiontogenerateanasynchronousevent.Sincethisisavendor-specificcommand,thesefunctionsmustbedefinedindsatvend.c.Theyaregivenhere:命令處理涵數(shù)必須返回DSAT_ASYNC_CMD值,每次執(zhí)行AT$MYCMD命令,都會(huì)調(diào)用專門涵數(shù)mycmd_action();請(qǐng)求來自其他任務(wù)的信息。其他任務(wù)通過準(zhǔn)備好的回調(diào)涵數(shù)發(fā)送來自其他任務(wù)的信息到AT命令處理器。回調(diào)涵數(shù)產(chǎn)生一異步事件。dsat_result_enum_typedsatvend_exec_mycmd_cmd(dsat_mode_enum_typemode,/*ATcommandmode*/constdsati_cmd_type*cmd_table,/*Ptrtocmdincommandtable*/consttokens_struct_type*tok_ptr,/*Commandtokensfromparser*/dsm_item_type*res_buff_ptr/*Placetoputresponse*/){/*Performcommandparameterhandling.....*//*Requestinformationfromanothertask:*///這個(gè)地方真看不懂?//為什么要這樣//純脆為本例子而做?mycmd_action(my_callback_func);returnDSAT_ASYNC_CMD;}/*dsatvend_exec_mycmd_cmd*/LOCALvoidmy_callback_func(other_task_data_type*cmd){ds_cmd_type*cmd_buf;/*Sendasynchronouseventtodataservicestask*/if((cmd_buf=ds_get_cmd_buf())==NULL){ERR_FATAL("Nodscommandbuffer",0,0,0);}else{cmd_buf->hdr.cmd_id=DS_AT_MY_ASYNC_CMD;cmd_buf->cmd.my_cmd.data=*cmd;ds_put_cmd(cmd_buf);}}/*my_callback_func*/Difference2–ASYNCEventHandlerfunctionAnasynchronouseventisreceivedfromtheothertaskwhentherequestedinformationisavailable.ThisoccurswhentheothertaskcallstheCallbackfunctionpreviouslydefinedtopassthedatatoATCoP.TheAsynchronousEventHandlerfunctiondefinedherehandlestheeventandindicatescommandprocessinghascompletedwiththeresultreturned.異步事件回調(diào)涵數(shù)調(diào)用:數(shù)據(jù)服務(wù)任務(wù)上一次執(zhí)行mycmd_action(my_callback_func)時(shí),做了{(lán)cmd_buf->hdr.cmd_id=DS_AT_MY_ASYNC_CMD;cmd_buf->cmd.my_cmd.data=*cmd;ds_put_cmd(cmd_buf);}調(diào)用,其結(jié)果當(dāng)數(shù)據(jù)服務(wù)任務(wù)再次執(zhí)行(不一定就是下一次)執(zhí)行{if((set_sigs&DS_CMD_Q_SIG)!=0){dsi_process_cmds();}}時(shí),調(diào)用dsat_process_async_cmd(cmd_ptr);通過對(duì)異步事件處理表單中異步件處理標(biāo)識(shí)號(hào)的查找比對(duì),響應(yīng)的異步確事件回調(diào)涵數(shù)被調(diào)用,生成response報(bào)文,發(fā)送到DTE的SIO,異步AT命令結(jié)束。dsat_result_enum_typedsatvend_my_async_event_handler(dsat_mode_enum_typemode,ds_cmd_type*cmd_ptr){dsm_item_type*response_buffer;/*CreatecommandresponseandreturnpointertoDSMitemcontainingresponse.*/response_buffer=build_mycmd_response(cmd_ptr);/*FormatresponseandqueueupfortransmissiontoDTE.*/dsatcmdp_handle_async_cmd_rsp(response_buffer);/*Indicatecommandprocessingwascompletedsuccessfully.*/returnDSAT_OK;}/*dsatvend_my_async_event_handler*/Difference3–AddneweventAddtheneweventidentifierandcommandstructuretothefiledstask.h:往數(shù)據(jù)服務(wù)任務(wù)增加一個(gè)異步件處理標(biāo)識(shí)號(hào)DS_AT_MY_ASYNC_CMD,確保在DS_AT_ASYNC_EVENT_END前面/*---------------------------CommandsthatmaybesenttotheDataServicesTask.---------------------------*/typedefenum{/*3GDsmgrsub-taskcommands*/DS_RDM_OPEN_CMD,/*ATCoPsub-taskcommands*/DS_AT_ASYNC_EVENT_START,/*StartofATCoPasynchronousevents*/DS_AT_SMS_MSG_CMD,//DS_AT_MY_ASYNC_CMD,DS_AT_ASYNC_EVENT_END/*EndofATCoPasynchronousevents*/}ds_cmd_enum_type;/*---------------------------CommandDatatypes---------------------------*/typedefstruct{other_task_data_typedata;}ds_at_mycmd_type;/*-----------------------------Commandtype:Thecommandheaderidentifiesthecommand.Ifthecommandhasanyparameters,theyarespecifiedintheunion.-----------------------------*/typedefstruct{ds_cmd_hdr_typehdr;/*Commandheader*/union{ds_rdm_open_typerdm_open;ds_at_sms_msg_typesms_msg;ds_at_mycmd_typemy_cmd;}cmd;}Addtheneweventidentifiertoswitchstatementindstask.c:voiddsi_process_cmds(void){ds_cmd_type*cmd_ptr;/*Getcommandsfromthecommandqueueuntilthequeueisempty.Foreachcommandreceived,dispatchthecommandtotheappropriatesubtask.*/while((cmd_ptr=(ds_cmd_type*)q_get(&dsi_cmd_q))!=NULL){switch(cmd_ptr->hdr.cmd_id){/*--------------------------3GDsmgrCommands--------------------------*/caseDS_RDM_OPEN_CMD:ds3g_process_cmds(cmd_ptr);break;/*--------------------------ATCoPCommands--------------------------*/caseDS_AT_SMS_MSG_CMD:caseDS_AT_MY_ASYNC_CMD:dsat_process_async_cmd(cmd_ptr);break;default:ERR_FATAL("InvalidDStaskcommand:%d",cmd_ptr->hdr.cmd_id,0,0);}/*switch*//*Returnthecommandbuffertothefreecommandqueue.*/q_put(&dsi_cmd_free_q,&cmd_ptr->hdr.link);}/*while*/}/*dsi_process_cmds()*/Difference4–EventhandlertableentryAddthenewasynchronouseventhandlertothetabledefinedindsatetsitgt.c:constdsati_async_event_table_entry_typeasync_event_table[]={DS_AT_SMS_MSG_CMD,{dsatetsismsa_msg_handler},DS_AT_MY_ASYNC_CMD,{dsatvend_my_async_event_handler},DS_AT_ASYNC_EVENT_END,{NULL}};10.參考CCSPEC:element*CHECKEDOUTelement\qct_6085\....../QSC6085_E2_v1.0.5_PRAtaSyComand/LATESTelement\qct_6085\...QSC6085_e2_v1.0.5-mkbranchQSC6085_E2_v1.0.5_PRAtaSyComandelement\qct_6085\.../main/0-mkbranchQSC6085_E2_v1.0.5_PRAtaSyComandload\qct_6085主動(dòng)上報(bào)的AT事件如何實(shí)現(xiàn)實(shí)現(xiàn)方法什么是主動(dòng)上報(bào)的事件?DT主動(dòng)上報(bào)結(jié)果碼給TE,如振鈴上報(bào)、短信上報(bào)、狀態(tài)改變上報(bào)等。英文縮寫URC,英文全稱“Unsolicitedresultcode”。確認(rèn)數(shù)據(jù)的來源。短信上報(bào)的數(shù)據(jù)來源于SMS系統(tǒng),振鈴上報(bào)等來源于CM系統(tǒng),其他的也可來自應(yīng)用的注冊(cè)事件,如USB插拔,SD卡插拔,耳機(jī)插事件等。確定主動(dòng)上報(bào)事件的名稱如:+CMTI(短信到達(dá)提示)主動(dòng)上報(bào)的AT事件ID同1.5.2和1.5.3同樣處理5.主動(dòng)上報(bào)的事件的觸發(fā)事件主動(dòng)上報(bào)的事件發(fā)生時(shí),應(yīng)準(zhǔn)好事件的觸發(fā)相應(yīng)函數(shù)。產(chǎn)生一個(gè)主動(dòng)上報(bào)的事件,等待AT命令處理器ds_task調(diào)度處理。來電,短信通常注冊(cè)一個(gè)回調(diào)函數(shù)來監(jiān)測主動(dòng)上報(bào)的事件的發(fā)生。其他則通過應(yīng)用層注冊(cè)Notify事件,通知ds_task調(diào)度處理6.主動(dòng)上報(bào)的事件的處理函數(shù)同1.5.2和1.5.3同樣處理其他可參考1.5.2和1.5.3同樣處理范例:確定名稱^MODE數(shù)據(jù)的來源CM服務(wù)模塊主動(dòng)上報(bào)的AT事件ID同1.5.2和1.5.3定義DS_CM_SS_SRV_CHG_CMDdstask.h:typedefenum{DS_MIN_CMD=-1,/*======================3GDSMGR(values0-199)========================*//*3GDsmgrsub-taskcommands(values0-199)*/DS_RDM_OPEN_CMD=0,/*CmdfromRDMtoopenaserialport*/proceeding*/DS_CM_CALL_MODIFY_CMD=10,/*ConfirmthatMOcallisproceeding*/DS_CM_SS_SRV_CHG_CMD=11,}ds_cmd_hdr_type;4.主動(dòng)上報(bào)的事件的觸發(fā)事件ds3gcmif.c:voidds3gi_cm_init(void){//addfor主動(dòng)上報(bào)的事件的范例begin/*Registertobenotifiedwhenevertheservingsystemchanges.*/ret_val=cm_mm_client_ss_reg(ds3gi_cm_client_id,ds3gi_cm_ss_event_cb,CM_CLIENT_EVENT_REG,CM_SS_EVENT_SRV_CHANGED,CM_SS_EVENT_SRV_CHANGED,NULL);if(ret_val!=CM_CLIENT_OK){MSG_ERROR("cm_mm_client_call_regerror%d",(int)(ret_val),0,0);}}//addfor主動(dòng)上報(bào)的事件的范例end}//addfor主動(dòng)上報(bào)的事件的范例beginvoidds3gi_cm_ss_event_cb(cm_ss_event_e_typess_event,/*Theeventtoccurred*/ constcm_mm_ss_info_s_type*ss_info_ptr/*Servingsysteminformation*/){cmd_ptr->hdr.cmd_id=DS_CM_SS_SRV_CHG_CMD;cmd_ptr->cmd.ss_info.sys_mode=ss_info_ptr->sys_mode;cmd_ptr->cmd.ss_info.hdr_hybrid=ss_info_ptr->hdr_hybrid;cmd_ptr->cmd.ss_info.hdr_srv_status=ss_info_ptr->hdr_srv_status;cmd_ptr->cmd.ss_info.ps_data_suspend=ss_info_ptr->ps_data_suspend;cmd_ptr->cmd.ss_info.hdr_active_prot=ss_info_ptr->hdr_active_prot;ds_put_cmd(cmd_ptr);}//addfor主動(dòng)上報(bào)的事件的范例end5.主動(dòng)上報(bào)的事件的處理函數(shù)dstask.c:voiddsi_process_cmds(void){caseDS_RELEASE_CALL_CMD://addfor主動(dòng)上報(bào)的事件的范例begincaseDS_CM_SS_SRV_CHG_CMD://addfor主動(dòng)上報(bào)的事件的范例endcaseDS_CM_PDP_MODIFY_IND_CMD:caseDS_CM_PDP_PROMOTE_IND_CMD:caseDS_CM_SS_PS_DATA_FAIL_CMD:caseDS_CM_PDP_MODIFY_CONF_CMD:caseDS_CM_PDP_MODIFY_REJ_CMD:ds3g_process_cmds(cmd_ptr);break;}ds3gmgr.c:voidds3g_process_cmds(ds_cmd_type*cmd_ptr){switch(cmd_ptr->hdr.cmd_id){//addfor主動(dòng)上報(bào)的事件的范例begincaseDS_CM_SS_SRV_CHG_CMD:ds3gi_process_cm_ss_srv_chg_cmd(cmd_ptr);break;//addfor主動(dòng)上報(bào)的事件的范例end}}//addfor主動(dòng)上報(bào)的事件的范例beginvoidds3gi_process_cm_ss_srv_chg_cmd(ds_cmd_type*cmd_ptr/*Pointertothecommand*/){//moresomrtning}/*ds3gi_process_cm_ss_srv_chg_cmd()*///addfor主動(dòng)上報(bào)的事件的范例end//addfor主動(dòng)上報(bào)的事件的范例beginLOCALvoidds3gi_process_sys_mode_change(sys_sys_mode_e_typenew_mode){//添加主動(dòng)回報(bào)內(nèi)容#ifdefFEATURE_CHINA_TELECOM_PC_MODEMif(new_mode!=last_mode){last_mode=new_mode; std_strlprintf(mode_str,sizeof(mode_str),"^MODE:%d",new_mode); dsattelutil_send_resp_string(mode_str);}#endif}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 眾籌購買合同范本
- 免招標(biāo)合同范本
- 買房贈(zèng)與車庫合同范本
- 冷凍物品購銷合同范本
- 2025屆中國電建集團(tuán)重慶工程有限公司秋季招聘筆試參考題庫附帶答案詳解
- 交流合同范本
- 義診合作合同范本
- 獸醫(yī)雇傭合同范本
- 創(chuàng)建服務(wù)合同范本
- 三方企業(yè)合資經(jīng)營合同范本
- 華師大版八年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)教案
- 中國的能源安全 課件
- 期末總結(jié)600字四篇
- DCDC中恒定導(dǎo)通時(shí)間控制模式COT介紹
- 五險(xiǎn)一金繳費(fèi)明細(xì)表
- JJG 644-2003振動(dòng)位移傳感器
- GB/T 27648-2011重要濕地監(jiān)測指標(biāo)體系
- 全套教學(xué)課件《管理學(xué)基礎(chǔ)》
- (完整版)新標(biāo)準(zhǔn)大學(xué)英語視聽說教程3第二版整本書答案
- ISO13485-2016年《醫(yī)療器械質(zhì)量管理體系-用于法規(guī)要求》
- 【5A】雅思寫作課程課件
評(píng)論
0/150
提交評(píng)論