UnitySerialPort.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System;
  5. public class UnitySerialPort : MonoBehaviour
  6. {
  7. public string ComPort = "/dev/ttyS7";
  8. // Current baud rate and set of default
  9. // 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
  10. public int BaudRate = 9600;
  11. private AndroidJavaClass androidJavaClass;
  12. private AndroidJavaObject androidJavaObject;
  13. private void Start()
  14. {
  15. //不用删除
  16. DontDestroyOnLoad(gameObject);
  17. androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  18. //androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
  19. androidJavaObject = new AndroidJavaObject("com.example.serialport.serialport");
  20. //初始化端口
  21. initSerialPort();
  22. }
  23. private void OnDestroy()
  24. {
  25. //关闭端口
  26. Close();
  27. }
  28. //测试通信
  29. public void unityCallAndroid() {
  30. androidJavaObject.Call("UnityCallAndroid");
  31. Debug.Log("Unity调用Android的UnityCallAndroid方法");
  32. }
  33. public void UnityMethod(string text)
  34. {
  35. Debug.Log("java 调用 unity :"+ text);
  36. }
  37. //初始化端口
  38. public void initSerialPort()
  39. {
  40. //comName,boardRate
  41. bool bOpen = androidJavaObject.CallStatic<bool>("initSerialPort", new object[]{ ComPort, BaudRate });
  42. //Debug.Log("Unity调用Android的initSerialport方法");
  43. if (bOpen)
  44. {
  45. Debug.Log("initSerialPort 初始化成功!");
  46. ToastShow("initSerialPort 初始化成功!");
  47. }
  48. else {
  49. Debug.LogError("initSerialPort 初始化失败!");
  50. ToastShow("initSerialPort 初始化失败!");
  51. }
  52. }
  53. public void SendData(byte[] data) {
  54. //
  55. // Debug.Log("Unity调用Android的sendSerialPort方法");
  56. sbyte[] mySByte = new sbyte[data.Length];
  57. for (int i = 0; i < data.Length; i++)
  58. {
  59. if (data[i] > 127)
  60. mySByte[i] = (sbyte)(data[i] - 256);
  61. else
  62. mySByte[i] = (sbyte)data[i];
  63. }
  64. androidJavaObject.CallStatic("sendSerialPort", new object[] { mySByte , data.Length });
  65. }
  66. public void Close()
  67. {
  68. androidJavaObject.CallStatic("closeSerialPort");
  69. Debug.Log("Unity调用Android的closeSerialPort方法");
  70. }
  71. public void ToastShow(string msg) {
  72. //Debug.Log(msg);
  73. }
  74. public void onSerialPortReceived(string comData) {
  75. //Debug.Log("接收到串口数据:"+ comData);
  76. //解析处理串口数据
  77. byte[] originData = Convert16(comData);
  78. //数据解密
  79. DES des = GetComponent<DES>();
  80. byte[] decryptData = des.Decrypt(originData);
  81. //Debug.Log("单片机--originData=" + BitConverter.ToString(originData));
  82. //Debug.Log("单片机--decryptData=" + BitConverter.ToString(decryptData));
  83. PayGameMode gm = GetComponent<PayGameMode>();
  84. if (decryptData.Length > 0 && decryptData[1].Equals(0x00))//问询应答
  85. {
  86. //Debug.Log("单片机问询--Answer");
  87. gm.Answer();
  88. // Debug.Log("decryptData[5]:" + decryptData[5] + " ==decryptData[6]: " + decryptData[6]);
  89. //连接上后自动获取二维码
  90. //decryptData[4] 数据长度。
  91. //decryptData[5] 联网状态 。0:未联网。> 1:已联网,为信号强度 1~100。
  92. //decryptData[6] 工作状态码 。0:联网成功。1:正在联网。2:信号弱。3:无 SIM 卡。4:无网络
  93. if (decryptData[5] > 1 && decryptData[6] == 0)
  94. {
  95. StartCoroutine(gm.QRCodeCoroutine());
  96. }
  97. else {
  98. //没有触发获取二维码时候的状态
  99. Debug.LogWarning("联网状态:" + decryptData[5]);
  100. Debug.LogWarning("工作状态码:" + decryptData[6]);
  101. }
  102. }
  103. else if (decryptData.Length > 0 && decryptData[1].Equals(0x01))//支付结果
  104. {
  105. //Debug.Log("单片机问询--PayAnswer");
  106. gm.PayAnswer(decryptData);
  107. }
  108. else if (decryptData.Length > 0 && decryptData[1].Equals(0x02))//获取二维码结果
  109. {
  110. //Debug.Log("单片机问询--二维码返回原始数据=" + BitConverter.ToString(originData));
  111. gm.ShowQRCode(originData, 0);
  112. }
  113. else
  114. {
  115. //Debug.Log("单片机问询--单片机返回其它原始数据=" + BitConverter.ToString(originData));
  116. gm.ShowQRCode(originData, 1);
  117. }
  118. }
  119. private byte[] Convert16(string strText)
  120. {
  121. strText = strText.Replace(" ", "");
  122. byte[] bText = new byte[strText.Length / 2];
  123. for (int i = 0; i < strText.Length / 2; i++)
  124. {
  125. bText[i] = Convert.ToByte(Convert.ToInt32(strText.Substring(i * 2, 2), 16));
  126. }
  127. return bText;
  128. }
  129. // Update is called once per frame
  130. //void Update()
  131. //{
  132. //}
  133. }