GMAC網卡相關介紹與分析

来源:https://www.cnblogs.com/forwards/archive/2023/02/08/17101438.html
-Advertisement-
Play Games

GMAC網卡相關介紹與分析 環境描述 MII 本節信息來源 MII MII共16根線,數據位寬4(tx rx各4根信號線),TX_CLK RX_CLK均是PHY提供的。 TX_ER(Transmit Error): 發送數據錯誤提示信號,同步於TX_CLK,高電平有效,表示TX_ER有效期內傳輸的數 ...


GMAC網卡相關介紹與分析

目錄


環境描述

環境

MII

本節信息來源

MII

MII

MII共16根線,數據位寬4(tx rx各4根信號線),TX_CLK RX_CLK均是PHY提供的。

TX_ER(Transmit Error): 發送數據錯誤提示信號,同步於TX_CLK,高電平有效,表示TX_ER有效期內傳輸的數據無效。對於10Mbps速率下,TX_ER不起作用;
    TX_EN(Transmit Enable): 發送使能信號,只有在TX_EN有效期內傳的數據才有效;
    TX_CLK:發送參考時鐘,100Mbps速率下,時鐘頻率為25MHz,10Mbps速率下,時鐘頻率為2.5MHz。註意,TX_CLK時鐘的方向是從PHY側指向MAC側的,因此此時鐘是由PHY提供的。
    TXD(Transmit Data)[3:0]:數據發送信號,共4根信號線;
    RX_ER(Receive Error): 接收數據錯誤提示信號,同步於RX_CLK,高電平有效,表示RX_ER有效期內傳輸的數據無效。對於10Mbps速率下,RX_ER不起作用;
    RX_DV(Reveive Data Valid): 接收數據有效信號,作用類型於發送通道的TX_EN;
    RXD(Receive Data)[3:0]:數據接收信號,共4根信號線;
    RX_CLK:接收數據參考時鐘,100Mbps速率下,時鐘頻率為25MHz,10Mbps速率下,時鐘頻率為2.5MHz。RX_CLK也是由PHY側提供的。
    CRS:Carrier Sense,載波偵測信號,不需要同步於參考時鐘,只要有數據傳輸,CRS就有效,另外,CRS只有PHY在半雙工模式下有效;
    COL:Collision Detectd,衝突檢測信號,不需要同步於參考時鐘,只有PHY在半雙工模式下有效。
    MII介面一共有16根線。

RMII

RMII

RMII即 Reduced MII,是MII的簡化板,共8根線,數據位寬2。

CLK_REF:是由外部時鐘源提供的50MHz參考時鐘,與MII介面不同,MII介面中的接收時鐘和發送時鐘是分開的,而且都是由PHY晶元提供給MAC晶元的。這裡需要註意的是,由於數據接收時鐘是由外部晶振提供而不是由載波信號提取的,所以在PHY層晶元內的數據接收部分需要設計一個FIFO,用來協調兩個不同的時鐘,在發送接收的數據時提供緩衝。PHY層晶元的發送部分則不需要FIFO,它直接將接收到的數據發送到MAC就可以了。

GMII

GMII

同MII,但數據位寬8位,共24根信號線,其中GTX_CLK由MAC側提供,大多數GMII相容MII。

RGMII

phy 如果工作在含有RGMII 介面的模式,按照業內慣例,tx clk delay 由MAC 來完成;rx clk delay 由phy 來完成。所以一般PHY晶元的rx clk delay預設是 2ns, tx clk delay預設是750ps。
來源https://blog.csdn.net/fangye945a/article/details/121109158

RGMII

RGMII即Reduced GMII,是GMII的簡化版本,共14根信號線,位寬為4,該時鐘上升沿下降沿均採集數據。

SGMII

SGMII

SGMII即Serial GMII,串列GMII,收發各一對差分信號線,時鐘頻率625MHz,在時鐘信號的上升沿和下降沿均採樣,參考時鐘RX_CLK由PHY提供,是可選的,主要用於MAC側沒有時鐘的情況,一般情況下,RX_CLK不使用。收發都可以從數據中恢復出時鐘。大多數MAC晶元的SGMII介面都可以配置成SerDes介面(在物理上完全相容,只需配置寄存器即可),直接外接光模塊,而不需要PHY層晶元,此時時鐘速率仍舊是625MHz。

GMAC網卡信息獲取方法

獲取GMAC網卡信息

 xqzhang@greatwall:~$ sudo find /sys/ -name "*stmmac*"
/sys/bus/platform/drivers/stmmaceth
/sys/bus/mdio_bus/devices/stmmac-0:04
/sys/bus/mdio_bus/drivers/Atheros 8035 ethernet/stmmac-0:04
/sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0
/sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04
/sys/class/mdio_bus/stmmac-0
/sys/kernel/debug/stmmaceth
/sys/module/dwmac_generic/drivers/platform:stmmaceth
/sys/module/stmmac
/sys/module/stmmac/holders/stmmac_platform
/sys/module/stmmac_platform

由上述信息可知,phy驅動為Atheros 8035 ethernet,該設備為平臺設備,設備目錄為/sys/devices/platform/FTGM0001:00/

查看PHY工作介面模式

cat /sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04/phy_interface
rgmii

獲取PHY ID

cat /sys/devices/platform/FTGM0001\:00/mdio_bus/stmmac-0/stmmac-0\:04/phy_id
0x004dd072

MAC晶元

讀寫MAC寄存器的方法

devmem2: https://gitee.com/Lematin_SZ/ARM_Linux_Debug_Tools/blob/master/devmem2/devmem2.c

Usage:  devmem2 { address } [ type [ data ] ]
        address : memory address to act upon
        type    : access operation type : [b]yte, [h]alfword, [w]ord
        data    : data to be written

對於FT2000/4核,MAC晶元是包含在CPU核內的,因此根據FT-2000/4+軟體編程手冊.pdf手冊可以拿到MAC晶元的物理地址,用戶態直接映射該物理地址可直接進行讀寫。
此外該物理地址也可以從設備樹 ACPI固件中讀取。

FT-2000/4+軟體編程手冊.pdf

讀MAC寄存器

MAC0地址寄存器

讀mac地址0寄存器

xqzhang@greatwall:~$ ifconfig enaftgm1i0
enaftgm1i0 Link encap:乙太網  硬體地址 00:07:3e:9a:79:d6  
          inet 地址:172.25.83.26  廣播:172.25.87.255  掩碼:255.255.248.0
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x40))  h
[sudo] xqzhang 的密碼:
/dev/mem opened.
Memory mapped at address 0x7fabbb3000.
Value at address 0x2820C040 (0x7fabbb3040): 0xD679
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x44))  h                                                          
/dev/mem opened.
Memory mapped at address 0x7f974b8000.
Value at address 0x2820C044 (0x7f974b8044): 0x700
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x46))  h                                                          
/dev/mem opened.
Memory mapped at address 0x7fa3e7c000.
Value at address 0x2820C046 (0x7fa3e7c046): 0x9A3E
寫MAC寄存器

寫0x48寄存器

xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48))  h 0x0001
/dev/mem opened.
Memory mapped at address 0x7f9e52e000.
Value at address 0x2820C048 (0x7f9e52e048): 0xFFFF
Written 0x1; readback 0x1
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48))  h 
/dev/mem opened.
Memory mapped at address 0x7facc88000.
Value at address 0x2820C048 (0x7facc88048): 0x1

MAC環回配置

環回寄存器在MAC控制寄存器0第12bit.

環回寄存器

讀mac控制寄存器

xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0))  w
[sudo] xqzhang 的密碼:
/dev/mem opened.
Memory mapped at address 0x7f855a9000.
Value at address 0x2820C000 (0x7f855a9000): 0x614C8C
xqzhang@greatwall:~$ 0000 0000 1010 0001 0100 1100 1000 1100

配置bit12為1

xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0))  w 0x615c8c
/dev/mem opened.
Memory mapped at address 0x7f9b982000.
Value at address 0x2820C000 (0x7f9b982000): 0x614C8C
Written 0x615C8C; readback 0x615C8C

arp配置不存在的ip MAC地址為本機MAC,註意該mac地址必須與mac晶元的mac一致

sudo arp -s 172.25.82.241 00:07:3e:9a:79:d6

抓包並用ping驗證

驗證結果

PHY晶元

CPU讀寫phy方法(待更新)

mdio讀寫phy寄存器

phytool: https://github.com/wkz/phytool.git 該方式需要網卡驅動提供支持

phytool read  IFACE/ADDR/REG
phytool write IFACE/ADDR/REG <0-0xffff>
phytool print IFACE/ADDR[/REG]

Clause 22:

ADDR := <0-0x1f>
REG  := <0-0x1f>

Clause 45 (not supported by all MDIO drivers):

ADDR := PORT:DEV
PORT := <0-0x1f>
DEV  := <0-0x1f>
REG  := <0-0xffff>

其中ADDR的獲取方式可參考獲取GMAC網卡信息章節,或者使用如下命令獲取ethtool enaftgm1i0 | grep PHYAD

xqzhang@greatwall:/sys/devices/platform/FTGM0001:00$ ethtool  enaftgm1i0  | grep PHYAD
        PHYAD: 4
讀phy設備基礎信息
xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/00:04/
ieee-phy: id:0x004dd072

   ieee-phy: reg:BMCR(0x00) val:0x1000
      flags:          -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
      speed:          10-half

   ieee-phy: reg:BMSR(0x01) val:0x796d
      capabilities:   -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
      flags:          +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register

xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/0x4/
ieee-phy: id:0x004dd072

   ieee-phy: reg:BMCR(0x00) val:0x1000
      flags:          -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
      speed:          10-half

   ieee-phy: reg:BMSR(0x01) val:0x796d
      capabilities:   -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
      flags:          +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register

ar8035_ds_(atheros)_mar2011.pdf  phy id reg

讀PHY設備寄存器
xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x04/0x02
ieee-phy: reg:0x02 val:0x004d
xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x4/0x03
ieee-phy: reg:0x03 val:0xd072
寫PHY設備寄存器
root@greatwall:/home/xqzhang/phytool# sudo ./phytool write  enaftgm1i0/0x04/0x04 0x1de1                                
root@greatwall:/home/xqzhang/phytool# sudo ./phytool read enaftgm1i0/0x04/0x04
ieee-phy: reg:0x04 val:0x1de1

Atheros 8035 強制千兆百兆十兆配置方式

phy控制寄存器1

phy控制寄存器2

首先需要bit12=0關閉自協商,然後根據bit6 bit13強制配置速率。
千兆配置sudo ./phytool write enaftgm1i0/0x4/0x0 0x0140
百兆配置sudo ./phytool write enaftgm1i0/0x4/0x0 0x2100
十兆配置sudo ./phytool write enaftgm1i0/0x4/0x0 0x0100
實際測試 強制千兆無法up,百兆千兆需要等很久才能ping通。

PHY環回配置

環回寄存器在phy控制寄存器0第14bit.

環回寄存器

10M 速率環回

sudo ./phytool write enaftgm1i0/0x4/0x0 0x4100

經測試在本節環境下,只有10M 環回才能正常UP

GMAC網卡驅動分析

查看Kconfig文件,發現該驅動支持Platform和多種SOC以及PCI等方式。

kylin@kylin-GW-001M1A-FTF:~/Workspace/xqzhang/ShangHai-GFSY-klinux/drivers/net/ethernet/stmicro/stmmac$ grep -nr support Kconfig 
21:     tristate "STMMAC Platform bus support"
26:       This selects the platform specific bus support for the stmmac driver.
45:     tristate "QCA IPQ806x DWMAC support"
52:       This selects the IPQ806x SoC glue layer support for the stmmac
58:     tristate "NXP LPC18xx/43xx DWMAC support"
66:     tristate "Amlogic Meson dwmac support"
72:       This selects the Amlogic Meson SoC glue layer support for
77:     tristate "Rockchip dwmac support"
84:       This selects the Rockchip RK3288 SoC glue layer support for
88:     tristate "SOCFPGA dwmac support"
95:       This selects the Altera SOCFPGA SoC glue layer support
100:    tristate "STi GMAC support"
107:      This selects STi SoC glue layer support for the stmmac
112:    tristate "Allwinner GMAC support"
118:      This selects Allwinner SoC glue layer support for the
124:    tristate "STMMAC PCI bus support"
130:      This PCI support is tested on XLINX XC2V3000 FF1152AMT0221

lsmod查看當前設備所載入的驅動模塊

xqzhang@greatwall:~$ lsmod | grep stmmac
stmmac_platform         9705  1 dwmac_generic
stmmac                 72158  3 dwmac_generic,stmmac_platform

其中dwmac_generic屬於驅動匹配入口,支持設備樹、ACPI、Platform等匹配方式。
stmmac_platform則是提供設備樹、ACPI、Platform等資源信息的獲取方式,並提供了PM電源管理的ops。
stmmac為網卡驅動本體,負責probe配置、網卡open等。

stmmac_dvr_probe

在GMAC驅動probe過程中會先讀取0x1058硬體功能寄存器,並將其複製給dma_cap,若mac晶元不支持PCS(TBI / SGMII / RTBI PHY 介面))則會遍歷phy設備找到對應的phy id然後註冊mdio bus.
當CONFIG_DEBUG_FS巨集打開時,可通過cat /sys/kernel/debug/stmmaceth/eth0/dma_cap查看硬體功能寄存器中的內容。

stmmac_open

在GMAC的open函數中,如果不支持PCS(TBI / SGMII / RTBI PHY 介面)則先進行phy晶元的初始化工作,在phy初始化的過程中(stmmac_init_phy)如果設備樹有定義phy_node(phy_node是通過device tree中的phy_handle構造的)則進行of_phy_connect連接,否則進行phy_connect連接。of_phy_connect和phy_connect差異在於前者已經找到的phy_device,後者需要先通過mdio bus找到phy_device。連接phy的實現主要在phy_connect_direct函數中,該函數共做了以下幾步:

  1. phy_attach_direct(attach a network device to a given PHY device pointer)
  2. 賦值adjust_link = stmmac_adjust_link,該函數負責監控phy鏈路狀態
  3. phy_start_machine啟動PHY狀態機跟蹤
  4. 如果是中斷模式,則啟用中斷
    連接過程重點在phy_attach_direct函數中,其會先判斷是否匹配到具體的phy driver,若phy driver不存在則會調用通用genphy_driver進行probe和bind操作。之後會調用phy_init_hw進行phy config配置,配置完成後執行phy_resume啟用phy設備。phy_init_hw函數中將對phy設備做soft_reset、fixup、config_init等操作,這些操作涉及一系列的phy寄存器操作。在stmmac_init_phy函數的最後會根據介面模式MII或RMII(GMII)設置不同的advertising帶寬屬性。

無論是否支持PCS,open函數中都要做的是alloc tx rx desc環形緩衝區、配置MAC晶元寄存器stmmac_hw_setup、創建1個stmmac_tx_timer定時器(用於定時清理環形緩衝區)、phy_start啟動phy設備、request_irq註冊相關中斷。

stmmac_hw_setup函數中stmmac_init_dma_engine初始化dma引擎、set_umac_addr配置MAC addr、bus_setup匯流排配置(可選)、core_init MAC core的初始化、rx_ipc RX IPC Checksum offload啟用、stmmac_set_mac啟用MAC收發隊列、stmmac_dma_operation_mode設置DMA模式、stmmac_mmc_setup設置mac管理計數器、stmmac_init_ptp初始化PTP硬體時鐘驅動、start_tx start_rx 啟用dma收發隊列、rx_watchdog、ctrl_ane。

根據上述分析,在GMAC probe流程中主要對硬體功能寄存器進行讀取,驅動根據具體的功能支持情況進行配置。GMAC open流程中phy_init_hw函數中包含了大量phy寄存器的配置,stmmac_hw_setup函數中包含了大量mac寄存器的配置。

stmmac_hw_setup配置解讀(待補充)

PHY驅動分析(待補充)

phy_init_hw配置解讀(待補充)

PHY標準寄存器解讀

phy標準寄存器解讀

ETHX日誌級別設置

日誌級別信息

 enum {                                                                           
         NETIF_MSG_DRV           = 0x0001,                                        
         NETIF_MSG_PROBE         = 0x0002,                                        
         NETIF_MSG_LINK          = 0x0004,                                        
         NETIF_MSG_TIMER         = 0x0008,                                        
         NETIF_MSG_IFDOWN        = 0x0010,                                        
         NETIF_MSG_IFUP          = 0x0020,                                        
         NETIF_MSG_RX_ERR        = 0x0040,                                        
         NETIF_MSG_TX_ERR        = 0x0080,                                        
         NETIF_MSG_TX_QUEUED     = 0x0100,                                        
         NETIF_MSG_INTR          = 0x0200,                                        
         NETIF_MSG_TX_DONE       = 0x0400,                                        
         NETIF_MSG_RX_STATUS     = 0x0800,                                        
         NETIF_MSG_PKTDATA       = 0x1000,                                        
         NETIF_MSG_HW            = 0x2000,                                        
         NETIF_MSG_WOL           = 0x4000,                                        
 };                                    
 預設的消息級別: 0x0063
 static const u32 default_msg_level = (NETIF_MSG_DRV | NETIF_MSG_PROBE |          
                                       NETIF_MSG_LINK | NETIF_MSG_IFUP |          
                                       NETIF_MSG_IFDOWN | NETIF_MSG_TIMER);       

列印rx ring desc
sudo ethtool -s enaftgm1i0 msglvl   0x0800
關閉日誌列印
sudo ethtool -s enaftgm1i0 msglvl   0x0000
恢復預設的日誌級別
sudo ethtool -s enaftgm1i0 msglvl   0x0063

該日誌信息可通過dmesg -w查看。

收發隊列描述符查看

通過cat /sys/kernel/debug/stmmaceth/eth0/descriptors_status

乙太網層圖例

乙太網圖例

簡單圖解OSI七層網路模型

體繫結構



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 概述 本地更新腳本是基於arthas工具的retransform命令熱替換class,此方法用於在不重啟項目的前提下,替換更新的class,如關鍵類添加列印日誌,排查線上問題 但是arthas工具的命令稍顯複雜,有那個時間還不如重新部署,因此需要一個可以快速替換的工具來進行替換 2. 方法一: ...
  • 教程簡介 亞馬遜商城快速指南 - 從簡單和簡單的步驟開始學習亞馬遜商城,從基本到高級概念,包括為什麼選擇亞馬遜?,亞馬遜優勢,帳戶類型,銷售什麼?,產品列表,費用,帳戶設置,購買盒,運輸方式,列出新產品,定價工具,獲取最高利潤,價格計算器,稅務處理,運輸流程,亞馬遜賣家中心,管理庫存,創建報告,管理 ...
  • 隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,前三篇篇文章簡單介紹瞭如何搭建開發框架,登錄功能,主頁面功能,以... ...
  • WPF框架代碼很龐雜不容易學習,這裡記錄我自己學習的點點滴滴。以wpf-4.8.0-rc1.19455.14為探索對象,相關代碼可在WPF倉庫下載。代碼結構大致如下: PresentationFramework 是最頂層抽象介面,開發中用到的大部分類都來源於此,包含各個控制項,圖形,動畫,綁定,XAM ...
  • 概述 開放封閉原則是面向對象所有原則的核心。對功能擴展開放,面向修改代碼封閉。 需求改變時,在小改變軟體實體源代碼(類、介面、方法等)的前提下通過擴展功能使其滿足新的需求。 需求 描述不同需求的用戶去銀行辦理不同的業務 分析需求 1、在這段程式中 會有多少個對象2、每個對象的屬性和行為對象1: 用戶 ...
  • docker問題 1. 安裝 docker 下載依賴環境 yum -y install yum-utils device-mapper-persistent-data lvm2 指定Docker鏡像源 # 使用的是阿裡的 yum-config-manager --add-repo http://mi ...
  • 一鍵部署nfs、rsync、sersync 項目代碼: 鏈接:https://pan.baidu.com/s/13I0BBAYsdK-KmPekZ5VpdA 提取碼:u2tw --來自百度網盤超級會員V6的分享 目錄結構 [root@m01 /ansible/roles]# tree -F . ├─ ...
  • Windows server 共用的文件操作日誌預設是沒有打開的,需要手動打開,本篇文章將詳細說明如何打開。並且如何將這個日誌輸出到ELK日誌系統中。 手動打開操作日誌 1、打開你的共用審核功能 舉例:我需要監控D盤的文件讀取、寫入、刪除等操作 右鍵D盤屬性 安全 高級 審核 繼續 添加需要監視的用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...