| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System;
- public class UnitySerialPort : MonoBehaviour
- {
- public string ComPort = "/dev/ttyS7";
- // Current baud rate and set of default
- // 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
- public int BaudRate = 9600;
- private AndroidJavaClass androidJavaClass;
- private AndroidJavaObject androidJavaObject;
- private void Start()
- {
- //不用删除
- DontDestroyOnLoad(gameObject);
- androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
- //androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
- androidJavaObject = new AndroidJavaObject("com.example.serialport.serialport");
- //初始化端口
- initSerialPort();
- }
- private void OnDestroy()
- {
- //关闭端口
- Close();
- }
- //测试通信
- public void unityCallAndroid() {
- androidJavaObject.Call("UnityCallAndroid");
- Debug.Log("Unity调用Android的UnityCallAndroid方法");
- }
- public void UnityMethod(string text)
- {
- Debug.Log("java 调用 unity :"+ text);
- }
- //初始化端口
- public void initSerialPort()
- {
- //comName,boardRate
- bool bOpen = androidJavaObject.CallStatic<bool>("initSerialPort", new object[]{ ComPort, BaudRate });
- //Debug.Log("Unity调用Android的initSerialport方法");
- if (bOpen)
- {
- Debug.Log("initSerialPort 初始化成功!");
- ToastShow("initSerialPort 初始化成功!");
- }
- else {
- Debug.LogError("initSerialPort 初始化失败!");
- ToastShow("initSerialPort 初始化失败!");
- }
- }
- public void SendData(byte[] data) {
- //
- // Debug.Log("Unity调用Android的sendSerialPort方法");
- sbyte[] mySByte = new sbyte[data.Length];
- for (int i = 0; i < data.Length; i++)
- {
- if (data[i] > 127)
- mySByte[i] = (sbyte)(data[i] - 256);
- else
- mySByte[i] = (sbyte)data[i];
- }
- androidJavaObject.CallStatic("sendSerialPort", new object[] { mySByte , data.Length });
- }
- public void Close()
- {
- androidJavaObject.CallStatic("closeSerialPort");
- Debug.Log("Unity调用Android的closeSerialPort方法");
- }
- public void ToastShow(string msg) {
- //Debug.Log(msg);
- }
- public void onSerialPortReceived(string comData) {
- //Debug.Log("接收到串口数据:"+ comData);
- //解析处理串口数据
- byte[] originData = Convert16(comData);
- //数据解密
- DES des = GetComponent<DES>();
- byte[] decryptData = des.Decrypt(originData);
- //Debug.Log("单片机--originData=" + BitConverter.ToString(originData));
- //Debug.Log("单片机--decryptData=" + BitConverter.ToString(decryptData));
- PayGameMode gm = GetComponent<PayGameMode>();
- if (decryptData.Length > 0 && decryptData[1].Equals(0x00))//问询应答
- {
- //Debug.Log("单片机问询--Answer");
- gm.Answer();
- // Debug.Log("decryptData[5]:" + decryptData[5] + " ==decryptData[6]: " + decryptData[6]);
- //连接上后自动获取二维码
- //decryptData[4] 数据长度。
- //decryptData[5] 联网状态 。0:未联网。> 1:已联网,为信号强度 1~100。
- //decryptData[6] 工作状态码 。0:联网成功。1:正在联网。2:信号弱。3:无 SIM 卡。4:无网络
- if (decryptData[5] > 1 && decryptData[6] == 0)
- {
- StartCoroutine(gm.QRCodeCoroutine());
- }
- else {
- //没有触发获取二维码时候的状态
- Debug.LogWarning("联网状态:" + decryptData[5]);
- Debug.LogWarning("工作状态码:" + decryptData[6]);
- }
- }
- else if (decryptData.Length > 0 && decryptData[1].Equals(0x01))//支付结果
- {
- //Debug.Log("单片机问询--PayAnswer");
- gm.PayAnswer(decryptData);
- }
- else if (decryptData.Length > 0 && decryptData[1].Equals(0x02))//获取二维码结果
- {
- //Debug.Log("单片机问询--二维码返回原始数据=" + BitConverter.ToString(originData));
- gm.ShowQRCode(originData, 0);
- }
- else
- {
- //Debug.Log("单片机问询--单片机返回其它原始数据=" + BitConverter.ToString(originData));
- gm.ShowQRCode(originData, 1);
- }
- }
- private byte[] Convert16(string strText)
- {
- strText = strText.Replace(" ", "");
- byte[] bText = new byte[strText.Length / 2];
- for (int i = 0; i < strText.Length / 2; i++)
- {
- bText[i] = Convert.ToByte(Convert.ToInt32(strText.Substring(i * 2, 2), 16));
- }
- return bText;
- }
- // Update is called once per frame
- //void Update()
- //{
-
- //}
- }
|