前幾天把智能電能表開發中基礎大概說了下,今天把如何開發控制遠程費程智能電錶的跳閘,合閘,警示,警示解除,保電和取消保電;
我們再來看一下TestZhuzhan.dll 中的函數
1. 身份認證函數
函數名稱 IdentityAuthentication(char *Div,char *RandAndEndata)
函數功能身份認證取隨機數和密文
Div,輸入參數,8 位元組分散因子,16 進位字串。
參數說明 RandAndEndata,輸出參數,字元型,8 位元組隨機數+8 位元組
密文。
成功標誌 0,成功;
200,串連加密機失敗;
201,取隨機數1 失敗;
202,取隨機數2 失敗;
203,密鑰分散失敗;
204,資料加密失敗;
205,取密文失敗;
2.遠端控制函數
函數名稱 UserControl(char *RandDivEsamNumData,char *dataOut)
函數功能遠端控制
RandDivEsamNumData,輸入參數,字元型,4 位元組隨機數
參數說明 +8位元組分散因子+8位元組ESAM序號+資料明文。
dataOut,字元型,20 位元組密文
成功標誌 0,成功;
200,串連加密機失敗;
201,寫卡失敗;
202,讀卡失敗;
203,計算密文失敗;
說明:以上函數測試時需在RD-1000 讀卡機中插上測試母卡。
以下為C#代碼
先引用DLL:
/// <summary>/// 身份認證函數 作者:龍億/// </summary>/// <param name="div">8 位元組分散因子,16 進位字串</param>/// <param name="RandAndEndata">8 位元組隨機數+8 位元組密文。</param>/// <returns>0,成功;200,串連加密機失敗;201,取隨機數1 失敗;202,取隨機數2 失敗;203,密鑰分散失敗;204,資料加密失敗;205,取密文失敗;</returns>[DllImport("TestZhuzhan.dll")]public static extern int IdentityAuthentication(string div, byte[] RandAndEndata);/// <summary>/// 遠端控制函數 作者:龍億/// </summary>/// <param name="RandDivEsamNumData">4 位元組隨機數+8位元組分散因子+8位元組ESAM序號+資料明文</param>/// <param name="dataOut">20 位元組密文</param>/// <returns>0,成功;200,串連加密機失敗;201,寫卡失敗;202,讀卡失敗;203,計算密文失敗;</returns>[DllImport("TestZhuzhan.dll", CharSet = CharSet.Ansi)]public static extern int UserControl(string RandDivEsamNumData, byte[] dataOut);
調用DLL檔案
string div = "0000000000000008";/// <summary>/// 身份認證取隨機數和密文 作者:龍億/// </summary>/// <param name="randAndEndata">返回8 位元組隨機數+8 位元組密文。</param>/// <returns>0,成功;200,串連加密機失敗;201,取隨機數1 失敗;202,取隨機數2 失敗;203,密鑰分散失敗;204,資料加密失敗;205,取密文失敗</returns>public int GetIdentityAuthentication(out string randAndEndata){ byte[] value = new byte[32]; int index = TestZhuZhan.IdentityAuthentication(div, value); randAndEndata = Encoding.UTF8.GetString(value); return index;}/// <summary>/// 取得20 位元組密文 作者:龍億/// </summary>/// <param name="n1">控制碼</param>/// <param name="random2">隨機數2</param>/// <param name="esamId">Esam序號</param>/// <param name="date">命令有效截止時間</param>/// <param name="ciphertext">返回:20位元組密文</param>/// <returns>0,成功;200,串連加密機失敗;201,寫卡失敗;202,讀卡失敗;203,計算密文失敗</returns>public int GetPassword2(string n1, byte[] random2, byte[] esamId, DateTime date, out string ciphertext){ //4位元組隨機數+8位元組分散因子+8位元組ESAM序號+資料明文(N1-Nm)。 StringBuilder str = new StringBuilder(); //4位元組隨機數 str.Append(Common.GetHex(random2[3])); str.Append(Common.GetHex(random2[2])); str.Append(Common.GetHex(random2[1])); str.Append(Common.GetHex(random2[0])); //8位元組分散因子"0000000000000002" str.Append(div); //8位元組ESAM序號 str.Append(Common.GetHex(esamId[7])); str.Append(Common.GetHex(esamId[6])); str.Append(Common.GetHex(esamId[5])); str.Append(Common.GetHex(esamId[4])); str.Append(Common.GetHex(esamId[3])); str.Append(Common.GetHex(esamId[2])); str.Append(Common.GetHex(esamId[1])); str.Append(Common.GetHex(esamId[0])); //n1控制碼 str.Append(n1); //保留字元 str.Append("00"); //命令有效到期日 str.Append(date.ToString("yyMMddHHmmss")); byte[] readData = new byte[40]; int index = TestZhuZhan.UserControl(str.ToString(), readData); ciphertext = Encoding.UTF8.GetString(readData); return index;}