usb serial写入设备名称(device name)

资源紧缺时,需在一台电脑上跑多台手机,可通过device name区分。要写入device name,需在代码端修改,如在alps/vendor/mediatek相关文件中操作,改完后可通过工具(如SN writer)写入。

        有时候我们因为资源紧缺,比如测gms的时候让一台电脑跑一个手机,项目多的话电脑就不够用了,这时候就需要在一台电脑上跑多台手机,那怎么区分呢?device name是最好的区分方式,因为够简单不会出错误。那么如何写入呢,这就需要在代码端尽心修改了。

         首先找到alps/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c做如下修改:

+#include <target/board.h>//add
 #include <platform/mt_reg_base.h>
 #include <platform/boot_mode.h>
 #include <platform/bootimg.h>

         然后在alps/vendor/mediatek/proprietary/bootable/bootloader/lk/target/sr6735m_35_m0(根据自身项目)/include/target/board.h:

 #define CFG_DISPLAY_BPP         (DISP_GetScreenBpp())
 
 //#define CFG_POWER_CHARGING

+#define SERIAL_NUM_FROM_BARCODE//add
 #endif

          最后在alps/vendor/mediatek/proprietary/bootable/bootloader/lk/target/sr6737t_65_m0(根据自身项目)/include/target/board.h:

 #define CFG_DISPLAY_BPP         (DISP_GetScreenBpp())
 
 //#define CFG_POWER_CHARGING

+#define SERIAL_NUM_FROM_BARCODE//add
 #endif

        看起来很简单,其实要不是mtk的帮助我根本找不到毕竟我只是个打java,对c和c++是真的不是很熟。

改完之后就可以通过工具(比如SN writer)将device name写入了。

<think>好的,用户想用C#将序列号写入电子产品中。首先,我需要回顾之前的相关讨论,确保这次回答的一致性。之前提到了存储介质的选择,比如EEPROM、Flash、OTP等,以及编程方法,包括驱动层、生产工具链和Bootloader交互。现在用户具体要用C#实现,可能需要结合这些存储介质,利用C#的库和API。用户提供的引用中,引用1提到了C#的System.IO.Ports进行串口通信,引用2是关于USBHID通信的示例,引用3则是生成序列号的建议。虽然用户的需求是写入,但需要结合这些通信方式。 首先,确定电子产品的接口类型。如果是通过串口(RS232)连接,可以用System.IO.Ports;如果是USB HID设备,可能需要HidLibrary。另外,还要考虑存储介质的访问方式,比如直接操作EEPROM或通过MCU的API。 然后,序列号的生成部分。引用3建议使用内置格式,可能用Guid或自定义规则生成,确保唯一性。写入时需要校验,比如CRC或加密,防止篡改,如之前提到的AES加密结合MCU唯一ID。 还需要考虑生产环境中的问题,比如批量写入时如何避免重复,以及没有调试接口时的处理,比如通过Bootloader或OTA更新。安全问题也很重要,防止篡改可能需要硬件支持,如OTP区域或安全芯片,但C#可能无法直接访问这些,需要与固件配合。最后,整合这些步骤,给出C#的代码示例,涵盖串口和USBHID两种方式,并说明存储和校验方法。同时,生成相关问题,帮助用户深入理解潜在问题。</think>### 基于C#的Serial Number写入实现方案 #### 一、硬件接口选择 1. **串口通信方案** 使用`System.IO.Ports`实现RS232协议通信: ```csharp using System.IO.Ports; public class SerialWriter { private SerialPort _port; public void InitPort(string portName, int baudRate) { _port = new SerialPort(portName, baudRate); _port.DataBits = 8; _port.Parity = Parity.None; _port.StopBits = StopBits.One; _port.Open(); } public void WriteSerialNumber(string sn) { byte[] data = Encoding.ASCII.GetBytes($"WRITE_SN:{sn}\r\n"); _port.Write(data, 0, data.Length); } } ``` 该方案适用于通过$UART$接口连接的设备[^1] 2. **USB HID方案** 采用`HidLibrary`实现USB设备通信: ```csharp using HidLibrary; public class UsbSnWriter { private HidDevice _device; public bool Connect(int vid, int pid) { _device = HidDevices.Enumerate(vid, pid).FirstOrDefault(); return _device?.OpenDevice() ?? false; } public void ProgramSn(byte[] snData) { byte[] cmd = new byte[_device.Capabilities.OutputReportByteLength]; Array.Copy(snData, 0, cmd, 1, snData.Length); // HID报告首字节为Report ID _device.Write(cmd); } } ``` 该方案适用于支持$USB HID$协议的设备[^2] #### 二、序列号生成算法 1. **唯一性生成** $$SN_{gen} = Hash(MAC_{addr} \| Timestamp) \bmod 10^{12}$$ ```csharp public string GenerateSN(byte[] macBytes) { byte[] timestamp = BitConverter.GetBytes(DateTime.Now.Ticks); byte[] hashInput = macBytes.Concat(timestamp).ToArray(); using SHA256 sha = SHA256.Create(); byte[] hash = sha.ComputeHash(hashInput); ulong numericSN = BitConverter.ToUInt64(hash, 0) % 1000000000000; return numericSN.ToString("D12"); } ``` 2. **安全存储验证** 使用$AES-GCM$模式加密存储: $$CipherText = AES_{encrypt}(SN \oplus UID_{device}, Key)$$ ```csharp public byte[] EncryptSN(string sn, byte[] deviceUID) { byte[] key = DeriveKeyFromHardware(); // 硬件相关密钥派生 using AesGcm aes = new AesGcm(key); byte[] nonce = new byte[12]; RandomNumberGenerator.Fill(nonce); byte[] plaintext = Encoding.UTF8.GetBytes(sn) .Select((b, i) => (byte)(b ^ deviceUID[i%deviceUID.Length])) .ToArray(); byte[] ciphertext = new byte[plaintext.Length]; byte[] tag = new byte[16]; aes.Encrypt(nonce, plaintext, ciphertext, tag); return nonce.Concat(tag).Concat(ciphertext).ToArray(); } ``` #### 三、存储介质操作 1. **EEPROM访问** 通过I²C协议写入: ```csharp public class EepromWriter { private I2cDevice _device; public EepromWriter(I2cConnectionSettings settings) { _device = I2cDevice.Create(settings); } public void WriteSnToEeprom(byte[] sn) { byte[] writeBuffer = new byte[sn.Length + 2]; writeBuffer[0] = 0xA0; // EEPROM控制字节 writeBuffer[1] = 0x00; // 起始地址高位 Array.Copy(sn, 0, writeBuffer, 2, sn.Length); _device.Write(writeBuffer); } } ``` 地址计算公式:$$Address_{page} = \lfloor \frac{offset}{page\_size} \rfloor$$ 2. **Flash编程** 使用STM32标准协议: ```csharp public void FlashWriteSN(uint baseAddress, byte[] sn) { STM32_Unlock(); // 解除写保护 for(int i=0; i<sn.Length; i+=4) { uint word = BitConverter.ToUInt32(sn, i); STM32_ProgramWord(baseAddress + (uint)i, word); } STM32_Lock(); // 恢复写保护 } ``` #### 四、生产流程控制 ```mermaid sequenceDiagram 生产系统->>烧录工具: 发送SN数据 烧录工具->>设备接口: 建立通信连接 设备接口->>存储介质: 写入加密SN 存储介质-->>设备接口: 返回写入状态 设备接口-->>烧录工具: 反馈结果 烧录工具-->>生产系统: 记录SN状态 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值