手機短信管理系統(tǒng)及設(shè)備通信協(xié)議_第1頁
手機短信管理系統(tǒng)及設(shè)備通信協(xié)議_第2頁
手機短信管理系統(tǒng)及設(shè)備通信協(xié)議_第3頁
手機短信管理系統(tǒng)及設(shè)備通信協(xié)議_第4頁
手機短信管理系統(tǒng)及設(shè)備通信協(xié)議_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

宜賓學院課程設(shè)計文檔課程軟件編程實踐題目手機短信管理系統(tǒng)院別計算機與信息工程學院專業(yè)軟件工程學生姓名學號班級20XX級授課教師目錄第1章系統(tǒng)總體設(shè)計 圖4-1主函數(shù)流程圖圖4-1主函數(shù)流程圖程序截圖圖4-1圖4-1主界面流程圖圖4-2主界面截圖源代碼/*項目名稱:手機短信管理系統(tǒng)實施時間:20XX年12月22日創(chuàng)建人:郭成*///調(diào)用預處理#include"stdio.h"http://標準輸入輸出#include"stdlib.h"http://常用的系統(tǒng)函數(shù)//函數(shù)聲明voidAddressbookmenu();//通訊錄voidMessagemenu();//短信//主函數(shù)voidmain(){ charfilename[20];//文件名變量 inti; system("title手機短信管理系統(tǒng)");//設(shè)置cmd窗口標題system("color3B");//背景湖藍,字體白 do { system("cls");//清屏 printf("nowdatetime:\n"); system("date/T");//調(diào)用系統(tǒng)日期system("TIME/T");//調(diào)用系統(tǒng)時間 printf("\n\n\n"); printf("\n\t\t\t\n"); printf("\t\t\t*==============手機短信管理系統(tǒng)==============*\n"); printf("\n\t\t\t\n"); printf("\t\t**\n"); printf("\t\t***1.通訊錄***\n"); printf("\t\t***2.短信***\n"); printf("\t\t**\n"); printf("\t\t********************\n"); printf("\t\t***0.退出系統(tǒng)***\n"); printf("\t\t**************\n"); printf("\n\t\t\t\n"); printf("\t\t\tYIBIN printf("\n\t\t\t\n"); scanf("%d",&i); switch(i) { case1:system("cls");Addressbookmenu();break;//case1調(diào)用addressbookmenu函數(shù) case2:system("cls");Messagemenu();break;//case2調(diào)用messagemenu函數(shù) case0:break;//case0退出 default:printf("錯誤選擇!請重選");break; //default:break;一般用在switch語句里面,它的作用是在比較i和下面的1、2之后都不一致就執(zhí)行。當然如果都不滿足也可以不去做任何事,所以就可以省略不用 } }while(i!=0);//當i不等于0循環(huán)}通訊錄流程圖開始開始讀出功能代號添加刪除修改查看顯示關(guān)閉123456結(jié)束退出通訊錄(圖4-3)通訊錄流程圖添加功能:錄入新的聯(lián)系人數(shù)據(jù),姓名、電話號碼、類型、郵箱。開始開始讀入編號錄入數(shù)據(jù)錄入數(shù)據(jù)失敗返回主菜單保存編號重復YN錄入成功YN(圖4-4)添加功能流程圖刪除功能:輸入編號,對其信息進行刪除。開始開始讀入編號刪除刪除失敗返回主菜單保存有此編號NY(圖4-4)刪除功能流程圖修改功能:輸入編號,對其信息進行修改。開始開始讀入編號修改修改失敗返回主菜單保存有此編號NY(圖4-5)修改功能流程圖查看:輸入編號,顯示出此編號的姓名、電話號碼、類型、郵箱。開始開始打開文件輸入編號沒有此編號返回主菜單顯示信息有此編號NY(圖4-6)顯示功能流程圖程序截圖(圖4-7)通訊錄主界面截圖(圖4-8)添加功能截圖(圖4-9)修改功能截圖(圖4-10)顯示功能截圖源代碼/*項目名稱:手機短信管理系統(tǒng)實施時間:20XX年12月22日創(chuàng)建人:郭成*/#include"stdio.h"#include"stdlib.h"#include"string.h"http://定義結(jié)構(gòu)體類型typedefstructPatient_Info//typedef自定義結(jié)構(gòu)體類型PatientInfo,可以用PatientInfo來定義變量{ intnumber;//編號 charname[8];//姓名 charphonecode[20];//電話號碼 chargroup[10];//類型 charemail[20];//郵箱 charcontent[200];//短信內(nèi)容}PatientInfo;//局部函數(shù)聲明staticvoidInsert(char[]);staticvoidSearch(char[]);staticvoidUpdate(char[]);staticvoidDelete(char[]);staticvoidShow(char[]);//主菜單voidAddressbookmenu(){ charfilename[20];//文件名變量 inti; charAdd[]="Addressbook.dll";//指定文件 strcpy(filename,Add); do { printf("\nnowdatetime:\n"); system("date/T");system("TIME/T"); printf("\n\n\n"); printf("\t\t*==============手★機★通★訊★錄★管★理★系★統(tǒng)==============*\n"); printf("\t\t**\n"); printf("\t\t*1.添加聯(lián)系人2.刪除聯(lián)系人*\n"); printf("\t\t*3.修改聯(lián)系人4.查看聯(lián)系人*\n"); printf("\t\t*5.顯示所有聯(lián)系人6.關(guān)閉通訊錄*\n"); printf("\t\t**\n"); printf("\t\t********************\n"); printf("\t\t**請輸入序號**\n"); printf("\t\t********************\n"); printf("\t\t*==============================================================*\n"); scanf("%d",&i); fflush(stdin);//清空輸入緩存,以便不影響后面輸入的東西 switch(i) { case1:system("cls");Insert(filename);break; case2:system("cls");Delete(filename);break; case3:system("cls");Update(filename);break; case4:system("cls");Search(filename);break; case5:system("cls");Show(filename);break; case6:break; default:printf("錯誤選擇!請重選");break; } }while(i!=6);}//添加聯(lián)系人voidInsert(charFilename[]){ /* 函數(shù)說明:對指定文件名進行數(shù)據(jù)的插入 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:addressbookmenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP;//定義一個信息的變量 intflag=1; FILE*fp; fp=fopen(Filename,"r");//以只讀方式打開文件,第一個參數(shù):文件名,第二個參數(shù)是打開方式,a表示追加寫方式,w表示覆蓋寫,r表示只讀方式,返回值是一個文件指針 printf("請根據(jù)以下提示信息操作:"); printf("\n編號:");//先查重,再追加插入 scanf("%d",&in_number); while(!feof(fp)&&flag)//feof表示endoffile,表示文件末尾,true表示文件末尾,否則不是文件末尾。&&flag表示還未查找到 { if(fread(&P,sizeof(PatientInfo),1,fp))/*fread是文件輸出函數(shù),從文件中讀取一條聯(lián)系人信息放入P變量中,第一個參數(shù)是目標變量的地址, 第二個參數(shù)是讀取的長度單位,第三個參數(shù)是讀取幾個單位,第四個參數(shù)是要讀取的文件,返回值為1表示成功,否則表示失敗*/ { if(P.number==in_number) { printf("\n該編號已存在,自動取消錄入!\n"); flag=0; } } } fclose(fp);//關(guān)閉文件以便追加記錄 if(flag) { fp=fopen(Filename,"a");//以追加方式打開文件準備追加 } else return; P.number=in_number; printf("請輸入姓名:"); scanf("%s",P.name); printf("請輸入電話:"); scanf("%s",&P.phonecode); printf("請輸入類型:"); printf("存儲類別:(A.辦公類B.個人類C.商務類)"); scanf("%s",P.group); printf("請輸入郵箱:"); fflush(stdin);//清空輸入緩存,以便不影響后面輸入的東西 scanf("%s",P.email);printf("\n"); if(fwrite(&P,sizeof(PatientInfo),1,fp)!=1)/*fwrite是文件寫函數(shù),從P變量中向文件中寫入一條短信信息,第一個參數(shù)是來源變量的地址, 第二個參數(shù)是寫的長度單位,第三個參數(shù)是寫幾個單位,第四個參數(shù)是要寫的文件*/ { printf("輸入數(shù)據(jù)失敗,請重新輸入!"); } else printf("\n添加成功!"); fclose(fp);}voidSearch(charFilename[]){ /* 函數(shù)說明:從指定文件中查找數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:addressbookmenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP; intflag=1; FILE*fp; fp=fopen(Filename,"r"); printf("\n請根據(jù)以下提示信息操作:"); printf("\n編號:"); scanf("%d",&in_number); system("cls"); while(fread(&P,sizeof(PatientInfo),1,fp)&&flag)//fread是文件輸出函數(shù),返回值為1表示讀成功 { if(P.number==in_number) { printf("\n\t\t\t\n"); printf("\n\t\t\t|編號\t|姓名\t|電話\t\t|類型\t|郵箱\t\t\t|"); printf("\n\t\t\t|%d\t",P.number); printf("%s\t",P.name); printf("%s\t",P.phonecode); printf("%s\t",P.group); printf("%s\t|",P.email); printf("\n\n\t\t\t聯(lián)系人%s的信息已顯示出來!\n",P.name); printf("\t\t\t"); flag=0; } } fclose(fp); if(flag) { printf("沒有你要找的聯(lián)系人!"); }}voidUpdate(charFilename[])//{ /* 函數(shù)說明:修改指定文件中的數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:addressbookmenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP; intflag=1; FILE*fp,*fptemp;//必須兩個文件操作,fp是數(shù)據(jù)源文件,fptemp是臨時文件,修改后的數(shù)據(jù)臨時放入該文件中 fp=fopen(Filename,"r");//文件讀 fptemp=fopen("temp.txt","w");//文件寫 printf("\n修改聯(lián)系人信息"); printf("\n請輸入你要修改的聯(lián)系人的編號:");//先查詢,再修改 scanf("%d",&in_number); while(fread(&P,sizeof(PatientInfo),1,fp))//文件讀 { if(P.number==in_number)//讀出修改 { P.number=in_number; printf("請輸入姓名:"); scanf("%s",P.name); printf("請輸入電話:"); scanf("%s",&P.phonecode); printf("請輸入類型:"); printf("存儲類別:(A.辦公類B.個人類C.商務類)"); scanf("%s",P.group); printf("請輸入郵箱:"); fflush(stdin);//清空輸入緩存,以便不影響后面輸入的東西 scanf("%s",P.email); printf("\n"); flag=0; } fwrite(&P,sizeof(PatientInfo),1,fptemp);/*找沒找到都往臨時文件中寫,因為對文件操作只有追加和覆蓋寫兩種方方式, 因此修改中間某條記錄不方便,只能引入第二個文件或者放入數(shù)據(jù)、鏈表中*/ printf("\n修改成功!"); } fclose(fp); fclose(fptemp); if(flag) { printf("沒有你要查詢的結(jié)果!"); } else { fptemp=fopen("temp.txt","r");//從臨時文件中讀 fp=fopen(Filename,"w");//往源文件中覆蓋寫 while(fread(&P,sizeof(PatientInfo),1,fptemp)) { fwrite(&P,sizeof(PatientInfo),1,fp);//從臨時文件中回寫 } fclose(fp); fclose(fptemp); }}voidDelete(charFilename[])//{ /* 函數(shù)說明:刪除指定文件中的某條數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:addressbookmenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP; intflag=1; FILE*fp,*fptemp; fp=fopen(Filename,"r"); fptemp=fopen("temp.txt","w"); printf("\n請輸入你想要刪除的聯(lián)系人的編號:");//先查詢,再刪除 scanf("%d",&in_number); while(fread(&P,sizeof(PatientInfo),1,fp)) { if(P.number!=in_number)//如果找到要刪除的記錄則不寫,否則都要寫 fwrite(&P,sizeof(PatientInfo),1,fptemp); else flag=0; } fclose(fp); fclose(fptemp); if(flag) { printf("沒有你要刪除的編號!"); } else { fp=fopen(Filename,"w"); fptemp=fopen("temp.txt","r"); while(fread(&P,sizeof(PatientInfo),1,fptemp)) { fwrite(&P,sizeof(PatientInfo),1,fp); } printf("刪除成功!"); fclose(fp); fclose(fptemp); }}voidShow(charFilename[]){ /* 函數(shù)說明:顯示指定文件中的所有數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:addressbookmenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ PatientInfoP; intflag=1; FILE*fp; fp=fopen(Filename,"r"); while(fread(&P,sizeof(PatientInfo),1,fp)) { printf("\n\t\t\t\n"); printf("\n\t\t\t|編號\t|姓名\t|電話\t\t|類型\t|郵箱\t\t\t|"); printf("\n\t\t\t|%d\t",P.number); printf("%s\t",P.name); printf("%s\t",P.phonecode); printf("%s\t",P.group); printf("%s\t|",P.email); printf("\n\t\t\t"); } printf("\n\t\t\t所有聯(lián)系人信息已全部顯示出來!\n"); fclose(fp);}短信錄流程圖開始開始讀出功能代號新建刪除修改查看顯示關(guān)閉123456結(jié)束關(guān)閉短信錄(圖4-11)短信錄主函數(shù)流程圖 新建功能:在新建短信輸入編號時,將判斷此編號在通訊錄上有無,如果有則顯示出來,并對此編號發(fā)送信息,如果沒有此編號則新建一條信息。開始開始讀入編號顯示此編號信息發(fā)送短信返回主菜單保存編號是否存在NY(圖4-12)新建短信流程圖(刪除、修改、查看、顯示流程圖均與通訊錄相差不大,這里就不畫出來了)程序截圖(圖4-13)短信錄主界面截圖(圖4-14)短信錄新建短信截圖(圖4-15)短信錄顯示短信截圖(圖4-16)短信錄刪除短信截圖源代碼/*項目名稱:手機短信管理系統(tǒng)實施時間:20XX年12月22日創(chuàng)建人:郭成*/#include"stdio.h"#include"stdlib.h"#include"string.h"#include"windows.h"http://定義了Windows的所有資料型態(tài)、函數(shù)調(diào)用、資料結(jié)構(gòu)和常數(shù)識別字#include"conio.h"http://進行輸入、輸出的//定義結(jié)構(gòu)體類型typedefstructPatient_Info//typedef自定義結(jié)構(gòu)體類型PatientInfo,可以用PatientInfo來定義變量{ intnumber;//編號 charname[8];//姓名 charphonecode[20];//電話號碼 chargroup[10];//類型 charemail[20];//郵箱 charcontent[200];//短信內(nèi)容}PatientInfo;//局部函數(shù)聲明staticvoidAdd(char[]);staticvoidSearch(char[]);staticvoidAlter(char[]);staticvoidDel(char[]);staticvoidShow(char[]);//主菜單voidMessagemenu(){ inti; charFilename[20];//文件名變量 charMes[]="Message.dll";//指定文件 strcpy(Filename,Mes); do { printf("\nnowdatetime:\n"); system("date/T");system("TIME/T"); printf("\n\n\n"); printf("\t\t*================手★機★短★信★管★理★系★統(tǒng)================*\n"); printf("\t\t**\n"); printf("\t\t*1.新建信息2.刪除信息*\n"); printf("\t\t*3.修改信息4.查看聯(lián)系人*\n"); printf("\t\t*5.顯示所有信息6.關(guān)閉短信錄*\n"); printf("\t\t**\n"); printf("\t\t********************\n"); printf("\t\t**請輸入序號**\n"); printf("\t\t********************\n"); printf("\t\t*==============================================================*\n"); scanf("%d",&i); fflush(stdin);//清空輸入緩存,以便不影響后面輸入的東西 switch(i) { case1:system("cls");Add(Filename);break; case2:system("cls");Del(Filename);break; case3:system("cls");Alter(Filename);break; case4:system("cls");Search(Filename);break; case5:system("cls");Show(Filename);break; case6:break; default:printf("錯誤選擇!請重選");break; } }while(i!=6);}//新建短信voidAdd(charFilename[])//{ /* 函數(shù)說明:對指定文件名進行數(shù)據(jù)的插入 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:messagemenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP;//定義一個信息的變量 intflag=1; FILE*fp,*fptemp;//fp是數(shù)據(jù)源文件,fptemp是臨時文件 fptemp=fopen("Addressbook.dll","r");//已只讀方式臨時打開通訊錄文件,此操作是為了才看通訊錄里是否有相同的編號,如果有則顯示出來 printf("請根據(jù)以下提示信息操作:"); printf("\n編號:"); scanf("%d",&in_number); while(!feof(fptemp)&&flag) { if(fread(&P,sizeof(PatientInfo),1,fptemp)) { if(P.number==in_number) { printf("\n該編號已存在,自動顯示該編號聯(lián)系人!\n"); printf("\n\t\t\t\n"); printf("\n\t\t\t|編號\t|姓名\t|電話\t\t|類型\t|郵箱\t\t\t|"); printf("\n\t\t\t|%d\t",P.number); printf("%s\t",P.name); printf("%s\t",P.phonecode); printf("%s\t",P.group); printf("%s\t|",P.email); printf("\n\n\t\t\t聯(lián)系人%s的信息已顯示出來!\n",P.name); printf("\t\t\t"); } } } fclose(fptemp);//關(guān)閉通訊錄文件以便短信內(nèi)容儲存在短信文件內(nèi) fp=fopen(Filename,"a");//以追加方式打開短信文件準備追加 printf("\n新建短信:\n"); P.number=in_number; printf("姓名:"); scanf("%s",P.name); printf("電話:"); scanf("%s",&P.phonecode); printf("短信內(nèi)容:"); scanf("%s",P.content); printf("\n\t\t\t"); if(fwrite(&P,sizeof(PatientInfo),1,fp)!=1) { printf("輸入數(shù)據(jù)失敗,請重新輸入!"); } else printf("\n添加成功!"); fclose(fp);}voidSearch(charFilename[]){ /* 函數(shù)說明:從指定文件中查找數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:messagemenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP; intflag=1; FILE*fp; fp=fopen(Filename,"r"); printf("\n請根據(jù)以下提示信息操作:");//先查重,再追加插入 printf("\n編號:"); scanf("%d",&in_number); system("cls"); while(fread(&P,sizeof(PatientInfo),1,fp)&&flag)//fread是文件輸出函數(shù),返回值為1表示讀成功 { if(P.number==in_number) { printf("\n\t\t\t\n"); printf("\n\t\t\t|編號\t|姓名\t|電話\t\t|短信內(nèi)容\t\t\t|"); printf("\n\t\t\t|%d",P.number); printf("|%s\t",P.name); printf("|%s\t",P.phonecode); printf("|%s\t",P.content); printf("\n\n\t\t\t聯(lián)系人%s的信息已顯示出來!\n",P.name); printf("\t\t\t"); flag=0; } } fclose(fp); if(flag) { printf("沒有你要找的信息!"); }}voidAlter(charFilename[])//{ /* 函數(shù)說明:修改指定文件中的數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:messagemenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP; intflag=1; FILE*fp,*fptemp;//必須兩個文件操作,fp是數(shù)據(jù)源文件,fptemp是臨時文件,修改后的數(shù)據(jù)臨時放入該文件中 fp=fopen(Filename,"r");//文件讀 fptemp=fopen("temp.txt","w");//文件寫 printf("\n修改聯(lián)系人信息"); printf("\n請輸入你要修改的聯(lián)系人的編號:");//先查詢,再修改 scanf("%d",&in_number); while(fread(&P,sizeof(PatientInfo),1,fp))//文件讀 { if(P.number==in_number)//讀出修改 { P.number=in_number; printf("\n姓名:"); scanf("%s",P.name); printf("電話:"); scanf("%s",&P.phonecode); printf("短信內(nèi)容:"); scanf("%s",P.content); printf("\n\t\t\t"); flag=0; } fwrite(&P,sizeof(PatientInfo),1,fptemp);/*找沒找到都往臨時文件中寫,因為對文件操作只有追加和覆蓋寫兩種方方式, 因此修改中間某條記錄不方便,只能引入第二個文件或者放入數(shù)據(jù)、鏈表中*/ printf("\n修改成功!"); } fclose(fp); fclose(fptemp); if(flag) { printf("沒有你要查詢的結(jié)果!"); } else { fptemp=fopen("temp.txt","r");//從臨時文件中讀 fp=fopen(Filename,"w");//往源文件中覆蓋寫 while(fread(&P,sizeof(PatientInfo),1,fptemp)) { fwrite(&P,sizeof(PatientInfo),1,fp);//從臨時文件中回寫 } fclose(fp); fclose(fptemp); }}voidDel(charFilename[])//{ /* 函數(shù)說明:刪除指定文件中的某條數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:messagemenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ intin_number; PatientInfoP; intflag=1; FILE*fp,*fptemp; fp=fopen(Filename,"r"); fptemp=fopen("temp.txt","w"); printf("\n請輸入你想要刪除的聯(lián)系人的編號:");//先查詢,再刪除 scanf("%d",&in_number); while(fread(&P,sizeof(PatientInfo),1,fp)) { if(P.number!=in_number)//如果找到要刪除的記錄則不寫,否則都要寫 fwrite(&P,sizeof(PatientInfo),1,fptemp); else flag=0; } fclose(fp); fclose(fptemp); if(flag) { printf("沒有你要刪除的編號!"); } else { fp=fopen(Filename,"w"); fptemp=fopen("temp.txt","r"); while(fread(&P,sizeof(PatientInfo),1,fptemp)) { fwrite(&P,sizeof(PatientInfo),1,fp); } printf("刪除成功!"); fclose(fp); fclose(fptemp); }}voidShow(charFilename[]){ /* 函數(shù)說明:顯示指定文件中的所有數(shù)據(jù) 形參說明:數(shù)組作為形參,實參必須是一個地址,用于傳遞文件名 調(diào)用位置:messagemenu函數(shù) 創(chuàng)建人:郭成 創(chuàng)建日期:12月22日 */ PatientInfoP; intflag=1; FILE*fp; fp=fopen(Filename,"r"); while(fread(&P,sizeof(PatientInfo),1,fp)) {printf("\n\t\t\t\n"); printf("\n\t\t\t|編號\t|姓名\t|電話\t\t|短信內(nèi)容\t\t\t|"); printf("\n\t\t\t|%d",P.number); printf("|%s\t",P.name); printf("|%s\t",P.phonecode); printf("|%s\t",P.content); printf("\n\t\t\t"); } printf("\n\t\t\t所以聯(lián)系人的信息已顯示出來!\n"); fclose(fp);}總結(jié)經(jīng)過二個周的程序設(shè)計實驗,我清楚并且深刻地認識到了編寫一個計算機程序的不易。要成功實現(xiàn)一個C程序的編譯與運行,前提是熟練掌握C語言中基本的命令指示符,并且要能熟練運用各種語句結(jié)構(gòu)及算法。其次,好的開始才能帶動一個好的過程,一個程序的設(shè)計離不開一個清晰的邏輯框架和程序模塊,同時也需要我們嚴格并有條理地按照既有的設(shè)計思路來進行代碼的編寫。代碼的編寫對我來說可以說是最大的一道坎,對于只有一學期C語言學習經(jīng)歷的我來說,要編寫這么龐大復雜的程序是幾乎是不可能的,但是,在代碼編寫過程中我不斷學習,不斷去想那些師兄問問題,找同學互相學習,終于把代碼基本編寫了出來。最后,程序的調(diào)試也是個極其困難的過程,要么是語法錯誤,要么修改后有些功能實現(xiàn)不了,那些簡單的語法錯誤我們改正還比較容易,功能實現(xiàn)的問題就比較困難了,我還得四處搜集資料,或者請教老師和一些水平比較高的同學。一門技術(shù)的理論學習是辛苦的,但要懂得一門技術(shù)的運用更要付出勞動和汗水。雖然我的程序還有很多欠缺,比如,當刪除或修改通訊錄中一個人的信息后,他在短信錄中的信息還是沒變,但最后我還是值得高興,就像自己完成了一個奇跡一樣,做了一件自己一個人幾乎不可能完成的任務,那種成就感無法用語言表達。雖然程序設(shè)計困難重重,但我都堅持了下來。這兩周的實驗也讓我明白,雖然自己手中的手機玩起來很容易,但其實手機的背后是多大的人力物力的堆積啊,這都是現(xiàn)代科技的成果!總而言之,這兩周的實驗讓我收益匪淺。它不僅將理論與實際相結(jié)合,培養(yǎng)了我動手操作和獨立思考的能力,為我以后步入社會做準備。這次的實驗激發(fā)了我不斷學習興趣,它讓還我明白了,不論困難多大,只要我們積極思考,勇于實踐,就一定能夠解決問題。設(shè)備通信協(xié)議目錄TOC\o"1-3"1. 適用范圍 22. 協(xié)議框架 23. 協(xié)議內(nèi)容 23.1設(shè)備內(nèi)部組網(wǎng)協(xié)議(或者MCU透傳模式協(xié)議) 23.1.1通訊命令格式 23.1.2配對機制 23.1.3連接機制 33.1.4心跳機制 43.2設(shè)備與云端通訊協(xié)議 43.2.1通訊命令格式 43.2.2連接流程 43.3數(shù)據(jù)包格式定義 53.3.1 設(shè)備間通訊數(shù)據(jù)格式 53.3.2設(shè)備與云、APP通訊數(shù)據(jù)格式 104. 公共命令定義 115. 編碼表 185.1節(jié)點類型編碼表 185.2命令回應編碼表 18

適用范圍本協(xié)議定義WiFi模塊與MCU控制單元,WiFi模塊與云APP間,以及主從模塊之間的通訊協(xié)議框架。協(xié)議框架協(xié)議基于二進制協(xié)議框架,完成命令發(fā)送接收、命令上報、內(nèi)部組網(wǎng)等功能。協(xié)議內(nèi)容3.1設(shè)備內(nèi)部組網(wǎng)協(xié)議(或者MCU透傳模式協(xié)議)備內(nèi)部組網(wǎng)協(xié)議包括設(shè)備配對、連接、心跳機制等,目的是將一個子設(shè)備加入到設(shè)備組中,并保持連接。3.1.1通訊命令格式采用二進制的通訊協(xié)議格式,包格式如下表:同步頭HeadOption包長度(變長)加密隨機數(shù)(Option)源設(shè)備類型(Option)源設(shè)備編碼(Option)CMDKeyCMDIDPayloadCRC(Option)2B1B1~2B1B1B3B1B1BNB2B詳細的包格式在后續(xù)章節(jié)介紹3.1.2配對機制配對機制僅適用于設(shè)備內(nèi)組網(wǎng)模式,MCU透傳模式不需要組網(wǎng)協(xié)議。進入配對模式由主從設(shè)備分別觸發(fā),只有在進入配對模式后,才處理相關(guān)的配對命令。從設(shè)備進入配對模式后定時發(fā)送配對請求,直到收到請求回應。主設(shè)備收到請求后分配一個設(shè)備ID給從設(shè)備,標識此ID被占用,并等待采集器的上線通知,一定時間內(nèi)收到通知之后確認存入設(shè)備列表,如果沒有上線通知,則認為設(shè)備沒有配對成功,從子設(shè)備中刪除。從設(shè)備收到配對回應后存儲設(shè)備ID,并且發(fā)送上線通知,收到上線通知后完成配對。配對的過程如下圖所示:3.1.3連接機制設(shè)備每次上電連接需要發(fā)送上線通知以及連接所需要的參數(shù)給主設(shè)備,如下圖所示:3.1.4心跳機制使用對等的心跳機制,主設(shè)備和從設(shè)備都可以發(fā)現(xiàn)對方的異常狀態(tài)。3.2設(shè)備與云端通訊協(xié)議設(shè)備與云端通訊協(xié)議基于MQTT協(xié)議,數(shù)據(jù)包使用MQTT協(xié)議傳輸,數(shù)據(jù)加密方式采用SSL加密,命令碼采用2進制命令格式同設(shè)備間通訊協(xié)議。3.2.1MQTT通訊框架本協(xié)議是針對與設(shè)備的數(shù)據(jù)通信,目前通信節(jié)點包括:設(shè)備、云端和APP終端三方。WIFI上的協(xié)議采用MQTT協(xié)議框架,串口上的通信采用包含包頭和校驗的二進制協(xié)議,通信包采用二進制格式傳輸,高位在前低位在后。此協(xié)議定義的MQTTTopic類型有以下2種:單播,unicast/u/{TargetType}/{TargetID}廣播,broadcast/b/{SourceType}/{SourceID}注釋:TargetType:目標設(shè)備類型,TargetID:目標設(shè)備編碼SourceType:源設(shè)備類型,SourceID:源設(shè)備編碼3.2.2通訊命令格式設(shè)備與云端、APP的通訊命令分為4種:請求與回應、通知命令、廣播命令,具體的命令以及格式在后面章節(jié)介紹。3.2.2連接流程設(shè)備連接云端的步驟如下圖:3.3數(shù)據(jù)包格式定義數(shù)據(jù)包的格式根據(jù)通訊雙方的不同、數(shù)據(jù)鏈路的差異會有不同的包格式,本協(xié)議為盡量保證數(shù)據(jù)包格式的統(tǒng)一,做了幾點規(guī)劃:數(shù)據(jù)包格式中核心的部分包括CMDID和CMDPayload,這兩部分格式所有的包中保持一致,CMDID1個字節(jié),CMDPayload緊跟CMDID長度N字節(jié)。設(shè)備間通訊,包括內(nèi)部命令、外部轉(zhuǎn)發(fā)命令等的數(shù)據(jù)包格式雖然可能不一樣,但是都可以通過包頭中的Option字節(jié)進行區(qū)分,可以公用相同的解析函數(shù)外部串口通訊的命令格式與設(shè)備間通訊格式保持一致。設(shè)備間通訊數(shù)據(jù)格式同步頭HeadOption包長度(變長)加密隨機數(shù)(Option)源設(shè)備類型(Option)源設(shè)備編碼(Option)CMDKeyCMDIDPayloadCRC(Option)2B1B1~2B1B1B3B1B1BNB2BFixheader固定幀頭,格式如下表:同步頭HeadOption包長度(變長)2Byte1Byte1~2Byte同步頭:0x5CFEHeadOption:Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0預留預留預留預留CheckSum校驗廣播類型鏈路CRC校驗加密選項typedefenum{OPTIONAL_ENCRYPT_BIT=(1<<0),OPTIONAL_CRC_BIT=(1<<1),OPTIONAL_BROADCAST_DATALINK_BIT=(1<<2),OPTIONAL_CHECKSUM_BIT=(1<<3),}OptionalBitsT;包長度:長度包括本字節(jié)之后的所有數(shù)據(jù)的長度長度是1~2個字節(jié)字節(jié)數(shù)取值長度范圍10x0~0x7F0~12720x0180~0x7FFF128~16383長度的編碼方式參考MQTT:如長度是321=(65+2*128),那么會被編碼為兩個字節(jié),低字節(jié)為65+128=193.高字節(jié)為2??勺儼袷娇勺儼袷叫枰ㄟ^HeadOption來解析,格式如下表:OptionBit0OptionBit2OptionBit1OptionBit3加密隨機數(shù)設(shè)備類型設(shè)備編碼消息體CRC校驗CheckSum1Byte1Byte3Byte2Byte1Byte異或隨機數(shù):如HeadOption中的加密選項為0,那么加密隨機數(shù)這個字節(jié)不存在,同時數(shù)據(jù)不會進行加密源設(shè)備信息:用于廣播類型的數(shù)據(jù)鏈路,需要標識數(shù)據(jù)的來源。CRC校驗:采用16bit的CRC算法,CRC算法參照附錄。CheckSum:采用8Bit的和校驗,用于對數(shù)據(jù)長度比較敏感,但是又需要進行數(shù)據(jù)校驗的場景設(shè)備編碼和設(shè)備類型:Payload中可能需要用到的內(nèi)部設(shè)備Type和ID的定義:內(nèi)部設(shè)備Type和設(shè)備ID在設(shè)備配對時由主設(shè)備分配給從設(shè)備,其中Type由主設(shè)備獲取到從設(shè)備的DeviceType之后映射一個數(shù)值,并分配給從設(shè)備,建立映射關(guān)系。ID的3字節(jié)構(gòu)成為:Byte3Byte2Byte1隨機數(shù),避免不同子網(wǎng)的ID沖突ID序號,由主設(shè)備維護命令消息體結(jié)構(gòu)如下表CMDkeyCMDIDPayload1Byte1ByteNByteCMDKey:命令標識,主要作用是標識命令的類型以及編號,由主設(shè)備生成,發(fā)送給從設(shè)備,從設(shè)備將key返回給主設(shè)備,另外在還標識命令的類型CMDKey描述備注1設(shè)備內(nèi)部消息(組網(wǎng)、透傳模式的內(nèi)部消息)這些命令沒有重發(fā)機制,不能保障一定到達2Notify類消息3Broadcast類消息4~31預留reserved32~255動態(tài)分配的key,用于數(shù)據(jù)的轉(zhuǎn)發(fā)、透傳此范圍的命令如果沒有回復會重發(fā),重發(fā)一定次數(shù)后丟棄,所以此消息可能會多次到達CMDID:命令碼,1個字節(jié)命令碼描述1配對請求2配對請求回應3設(shè)備啟動通知4設(shè)備啟動回應5WiFi就緒通知6WiFi斷開通知7云就緒通知8云斷開通知9WiFi上電通知10WiFi模塊配置完成通知11退出WiFi模塊配置12退出WiFi模塊配置回應13重新配置WiFi模塊14重新配置WiFi模塊回應15設(shè)置WiFi模塊串口波特率16設(shè)置WiFi模塊串口波特率回應17查詢WiFi模塊串口波特率18查詢WiFi模塊串口波特率回應WiFi模塊消息起始32設(shè)備上線通知33WiFi配置完成通知34獲取設(shè)備WiFi模塊監(jiān)控信息35獲取設(shè)備WiFi模塊監(jiān)控信息回應36設(shè)置路由器信息37設(shè)置路由器信息的回應38刪除子設(shè)備39刪除子設(shè)備回應40獲取在線設(shè)備列表41獲取在線設(shè)備列表回應42設(shè)置設(shè)備擁有者43設(shè)置設(shè)備擁有者回應44設(shè)置配對模式45設(shè)置配對模式回應46在線設(shè)備列表變更通知47~63WiFi模塊預留所有設(shè)備公共命令起始64主MCUOTA傳輸文件65主MCUOTA傳輸文件回應66設(shè)置出廠參數(shù)67設(shè)置出廠參數(shù)回應68DebugLog輸出控制69DebugLog輸出控制回應70DebugLog信息輸出71從MCUOTA傳輸文件72從MCUOTA傳輸文件回應73云端推送通知信息76OTA完成通知上報77~95設(shè)備公共命令預留設(shè)備業(yè)務命令起始96~127設(shè)備自定義設(shè)備內(nèi)部消息128~255設(shè)備自定義設(shè)備與云端/APP通訊消息Payload:命令數(shù)據(jù),N字節(jié)5.4實例一個所有Option都打開的包結(jié)構(gòu)如下:同步頭HeadOption包長度(變長)加密隨機數(shù)(Option)源設(shè)備類型(Option)源設(shè)備編碼(Option)CMDKeyCMDIDPayloadCRC(Option)2B1B1~2B1B1B3B1B1BNB2B數(shù)據(jù)組包實例以下是使用CRC校驗,并且加密的數(shù)據(jù)包的組包過程:假設(shè)命令包是1234,4個字節(jié),現(xiàn)在要組包1:CRC第一步計算這4個字節(jié)的crc值,假設(shè)算出來是5、6第一步CRC之后的數(shù)據(jù)包就變成了1、2、3、4、5、6,6個字節(jié)2:加密加密第一步:加入一個隨機數(shù),假設(shè)這個隨機數(shù)是0,現(xiàn)在包就是7個字節(jié)了,0、1、2、3、4、5、6加密第二步:異或,將除加密隨機數(shù)外的其他數(shù)據(jù)都和加密隨機數(shù)進行異或,得到得數(shù)據(jù)應該是0、1、2、3、4、5、6機密第三步:查表加密,假設(shè)表中0對應的是6、1對應的是5依次類推,那么查表之后的數(shù)據(jù)變?yōu)榱?、5、4、3、2、1、0加密結(jié)束,payload最終就是6、5、4、3、2、1、0了3:加入包頭Payload是7個字節(jié),optional是CRC和加密,那么包頭為FE5C0307最終包數(shù)據(jù)為:FE5C030706050403020100解包的過程與組包相反3.3.2設(shè)備與云、APP通訊數(shù)據(jù)格式命令數(shù)據(jù)格式:源設(shè)備類型源設(shè)備IDCMDID5Byte12Byte1ByteNBytePad串口通訊數(shù)據(jù)格式下行數(shù)據(jù)格式,PAD->設(shè)備同步頭HeadOption包長度(變長)加密隨機數(shù)(Option)源設(shè)備類型(Option)源設(shè)備編碼(Option)源設(shè)備GUID目標設(shè)備GUIDCMDIDPayloadCRC(Option)2B1B1~2B1B1B3B34字節(jié)1BNB2B上行數(shù)據(jù)格式,設(shè)備->PAD同步頭HeadOption包長度(變長)加密隨機數(shù)(Option)源設(shè)備類型(Option)源設(shè)備編碼(Option)源設(shè)備GUIDCMDIDPayloadCRC(Option)2B1B1~2B1B1B3B34字節(jié)1BNB2B公共命令定義下表是公共命令碼以及命令數(shù)據(jù)的定義,此表僅涉及到上文提到的CMDID和命令信息碼(或回復碼),命令中的其他部分數(shù)據(jù)請參考上文中的數(shù)據(jù)包定義。命令碼命令描述通信方命令組成備注設(shè)備內(nèi)部命令起始1請求配對從設(shè)備->主設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]業(yè)務設(shè)備類型[5Byte]當前的內(nèi)部設(shè)備類型[1Byte]當前的內(nèi)部設(shè)備編碼[3Byte],全0表示未配置過,非全0表示之前配置過設(shè)備業(yè)務編碼長度[1Byte]設(shè)備業(yè)務編碼[NByte]5個字節(jié)的業(yè)務設(shè)備類型,需要向樂君申請,并且保存在從設(shè)備中設(shè)備業(yè)務編碼是用從設(shè)備自行定義的設(shè)備ID字符串,不超過32字節(jié)2請求配對回應主設(shè)備->從設(shè)備CMDKey,0x01CMDID[1Byte]RC[1Byte],參考RC表分配的設(shè)備類型[1Byte]分配的設(shè)備ID[3Byte]3設(shè)備啟動通知MCU/從設(shè)備->主設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]版本號[1Byte]子設(shè)備類型[1Byte],參考5.3章節(jié):子設(shè)備類型表業(yè)務設(shè)備類型[5Byte]內(nèi)部設(shè)備類型[1Byte]內(nèi)部設(shè)備編碼[3Byte]設(shè)備業(yè)務編碼長度[1Byte]設(shè)備業(yè)務編碼[NByte]4設(shè)備啟動通知的回應主設(shè)備->MCU/從設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]RC[1Byte],參考RC表5WiFi就緒通知主設(shè)備->MCU/從設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]6WiFi斷開通知主設(shè)備->MCU/從設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]7云就緒通知主設(shè)備->MCU/從設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]8云斷開通知主設(shè)備->MCU/從設(shè)備CMDKey[1Byte],0x01CMDID[1Byte]9WiFi模塊上電通知WiFi模塊->MCUCMDKey[1Byte],0x01CMDID[1Byte]WiFi模塊上電后定時發(fā)送上電通知給MCU,直至MCU上報上線通知給WiFi模塊(適用于用于透傳模式)10WiFi模塊配置完成通知WiFi模塊->MCUCMDKey[1Byte],0x01CMDID[1Byte]RC[1Byte],0成功,3超時,4退出11退出WiFi模塊配置MCU->WiFi模塊CMDKey[1Byte],0x01CMDID[1Byte]12退出WiFi模塊配置回應WiFi模塊->MCUCMDKey[1Byte],0x01CMDID[1Byte]RC[1Byte],0成功,1失敗13重新配置WiFi模塊MCU->WiFi模塊CMDKey[1Byte],0x01CMDID[1Byte]14重新配置WiFi模塊回應WiFi模塊->MCUCMDKey[1Byte],0x01CMDID[1Byte]RC[1Byte],0成功,1失敗15設(shè)置WiFi模塊串口波特率MCU->WiFi模塊CMDKey[1Byte],0x01CMDID[1Byte]Baudrate[4Byte]Baudrate取值:9600192003840057600115200其他值返回fail默認值是960016設(shè)置WiFi模塊串口波特率回應WiFi模塊->MCUCMDKey[1Byte],0x01CMDID[1Byte]RC[1Byte],0成功,1失敗返回值以新設(shè)置的波特率發(fā)送17查詢WiFi模塊串口波特率MCU->WiFi模塊CMDKey[1Byte],0x01CMDID[1Byte]18查詢WiFi模塊串口波特率回應WiFi模塊->MCUCMDKey[1Byte],0x01CMDID[1Byte]RC[1Byte],0成功,1失敗Baudrate[4Byte]WiFi模塊命令起始32設(shè)備信息上報WiFi模塊->Cloud/APPCMDID[1Byte]Num[1Byte],設(shè)備個數(shù)設(shè)備擁有者的小智ID[string,10字節(jié)]WiFi模塊Mac地址[ASCII,12字節(jié)]GUID[ASCII,17字節(jié)]、設(shè)備業(yè)務編碼長度[1Byte]、設(shè)備業(yè)務編碼[NByte]、固件版本[1BYTE]、設(shè)備硬件架構(gòu)類型[1BYTE]、設(shè)置是否在線[1Byte],若干MQTT主題:/b/{SourceType}/{SourceID}第一個設(shè)備是主設(shè)備設(shè)備硬件架構(gòu)類型參考“設(shè)備硬件架構(gòu)類型編碼表”設(shè)備是否在線,0不在線,1在線33WiFi配置完成通知WiFi模塊->APPCMDID[1Byte]設(shè)備GUID[ASCII,17字節(jié)]用戶的小智ID[string,10字節(jié)]設(shè)備業(yè)務編碼長度[1Byte]設(shè)備業(yè)務編碼[NByte]MQTT主題:/u/{TargetType}/{TargetID}34獲取WiFi模塊監(jiān)控數(shù)據(jù)Cloud/APP->WiFi模塊CMDID[1Byte]35獲取WiFi模塊監(jiān)控數(shù)據(jù)回應WiFi模塊->Cloud/APPCMDID[1Byte]WiFi模塊連接信號強度[1Byte],有符號的1個字節(jié),一般范圍在-100Dbm~0DbmWiFi模塊型號[16byte],小于16字節(jié)的字符串36設(shè)置WiFi配置信息APP/Cloud/串口控制端->設(shè)備CMDID[1Byte]是否設(shè)置擁有者ID[1Byte],0不設(shè)置,1設(shè)置設(shè)備擁有者的小智ID[string,10字節(jié)]是否設(shè)置路由器信息[1Byte],0不設(shè)置,1設(shè)置SSIDLen,用戶名長度[1BYTE],用戶名長度小于等于32字節(jié)PWDLen,密碼長度[1BYTE],密碼小于等于64字節(jié)SSIDPWD37設(shè)置WiFi配置信息回應設(shè)備->APP/Cloud/串口控制端CMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗38刪除子設(shè)備APP/Cloud/串口控制端->設(shè)備CMDID[1Byte]GUID[ASCII,17字節(jié)]39刪除子設(shè)備回應設(shè)備->APP/Cloud/串口控制端CMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗40獲取設(shè)備列表APP/Cloud/串口控制端->主設(shè)備CMDID[1Byte]41獲取設(shè)備列表回應主設(shè)備->APP/Cloud/串口控制端CMDID[1Byte]Num[1Byte],設(shè)備個數(shù)設(shè)備擁有者的小智ID[string,10字節(jié)]WiFi模塊Mac地址[ASCII,12字節(jié)]GUID[ASCII,17字節(jié)]、設(shè)備業(yè)務編碼長度[1Byte]、設(shè)備業(yè)務編碼[NByte]、固件版本[1BYTE]、設(shè)備硬件架構(gòu)類型[1BYTE]、設(shè)置是否在線[1Byte],若干設(shè)備是否在線,0不在線,1在線44設(shè)置設(shè)備進入配對模式App/Cloud/串口控制端->設(shè)備CMDID[1Byte]45設(shè)置設(shè)備進入配對模式回應設(shè)備->App/Cloud/串口控制端CMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗)[BYTE]47設(shè)置設(shè)備退出配對模式App/Cloud/串口控制端->設(shè)備CMDID[1Byte]48設(shè)置設(shè)備退出配對模式回應設(shè)備->App/Cloud/串口控制端CMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗)[BYTE]

49請求同步時間設(shè)備->CloudCMDID[1Byte]50請求同步時間回應Cloud->設(shè)備CMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗)[BYTE]RTC時間[67Byte],格式是{秒-分-時-日-月-年-星期幾},各一個字節(jié)星期幾的范圍從1~7,1表示星期一51掃描AP列表控制端->設(shè)備CMDID[1Byte]52掃描AP列表回應設(shè)備到控制端CMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗)[BYTE]APNumber[1Byte],掃描到的AP數(shù)量AP信息{[32Byte],SSID[1Byte],RSSI信號強度}若干SSID為字符串,最大32字節(jié),返回數(shù)據(jù)中固定32字節(jié)位置存放SSID。信號強度取值范圍0~100所有設(shè)備公共命令起始64主MCUOTA傳輸文件Cloud->設(shè)備CMDID[1Byte]總包數(shù)[2Byte]當前包號[2Byte]包內(nèi)容[NBYTE,最大長度1024]65主MCUOTA傳輸文件回應設(shè)備->CloudCMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗,32包號錯誤,33數(shù)據(jù)校驗錯誤)[1BYTE]當前包號[2Byte]66設(shè)置出廠信息App/Cloud->設(shè)備CMDID[1Byte]設(shè)備ID[12Byte]設(shè)備業(yè)務ID長度[1Byte]設(shè)備業(yè)務ID[NByte]設(shè)備業(yè)務ID長度為0表示不需要設(shè)備業(yè)務ID暫時只需要工廠測試程序支持67設(shè)置出廠信息回應設(shè)備->App/CloudCMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗68DebugLog輸出控制App/Cloud->設(shè)備CMDID[1Byte]DebugLog開關(guān)[1Byte],0關(guān),1開是否掉電保存[1Byte],0掉電不保存,1掉電保存暫時云端實現(xiàn)69DebugLog輸出控制回應設(shè)備->App/CloudCMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗70DebugLog信息輸出設(shè)備->App/CloudCMDID[1Byte]固件版本version[1Byte]日志類型LogType[1Byte]Log內(nèi)容[NByte],字符串71從MCUOTA傳輸文件Cloud->設(shè)備CMDID[1Byte]總包數(shù)[2Byte]當前包號[2Byte]包內(nèi)容[NBYTE,最大長度1024]用于升級主從MCU架構(gòu)下的從MUC固件72從MCUOTA傳輸文件回應設(shè)備->CloudCMDID[1Byte]RC(參考命令回應編碼表:0成功,1失敗,32包號錯誤,33數(shù)據(jù)校驗錯誤)[1BYTE]當前包號[2Byte]73云端推送通知信息Cloud->APP/設(shè)備CMDID[1Byte]推送信息內(nèi)容[nByte]76OTA升級完成上報設(shè)備->Cloud/APPCMDID[1Byte]RC[1Byte],0成功,1失敗云端以這個命令作為OTA真正完成的判斷標準編碼表5.1節(jié)點類型編碼表節(jié)點類型編碼類型名稱5.2命令回應編碼表0~31,公共錯誤碼命令回應編碼命令回應含義0成功1失敗內(nèi)部通訊公共RC值起始2配對失敗,設(shè)備滿3WiFi配置(Easylink)超時4WiFi配置(Easylink)退出5~31內(nèi)部通訊公共RC值預留外部通訊公共RC值起始32OTA包號錯誤33OTA數(shù)據(jù)校驗錯誤34當前狀態(tài)不允許OTA35~63外部通訊公共RC值預留業(yè)務RC值起始64~255業(yè)務錯誤碼5.3子設(shè)備類型表子設(shè)備類型描述1透傳模式下的MCU設(shè)備2組網(wǎng)模式下的從設(shè)備5.4設(shè)備硬件架構(gòu)類型編碼表設(shè)備硬件結(jié)構(gòu)類型描述0單MCU架構(gòu)1雙MCU架構(gòu)(WiFi模塊+控制MCU模塊)附錄6.1CRC校驗算法staticconstuint8c_crc_htalbe[]=//CRC高8位查表{0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0x

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論