(原創)-智能電能表SM1演算法開發套件(主站介面) 開發篇

來源:互聯網
上載者:User

前幾天把智能電能表開發中基礎大概說了下,今天把如何開發控制遠程費程智能電錶的跳閘,合閘,警示,警示解除,保電和取消保電;

我們再來看一下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;}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.