与服务器通信时,需要进行设备绑定,采取了唯一标识的方式绑定,有获取设备MCU唯一标识符的需求,文中说明了STM32、ESP32系列芯片获取唯一标识符、MAC的方法。

STM32

        在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面:

        1、用作序列号(例如 USB 字符串序列号或其它终端应用程序)

        2、在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以提高 Flash 中代码的安全性

        3、激活安全自举过程等

        96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。

        用户在何种情况下,都不能修改这个身份标识。这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。

        唯一ID是一个96位的信息串,所以按字读取就是3个字,按半字读取就是6个,按字节读取就是12个。本质上没有区别,在这里我们按字读取。

STM32F10xxx中文参考手册说明:器件电子签名

获取96位的唯一身份标识寄存器数据时,其基地址为:0x1FFF F7E8

基地址偏移0x02: 0x1FFF F7E8 + 0x02 = 0x1FFF F7EA

基地址偏移0x04: 0x1FFF F7E8 + 0x04 = 0x1FFF F7EC

基地址偏移0x08: 0x1FFF F7E8 + 0x08 = 0x1FFF F7F0

//判断处理器是大端还是小端
    union{
    char ch[4];
     
    int num;
    }haha;
haha.num =0x12345678;
for(int i=0;i<4;i++)
{
    printf("%x\t", haha.ch[i]);
}
//STM32F103单片机上输出结果为
78    56    34    12
说明STM32F103为小端序处理器
小端模式:低地址存放低有效位

//读取芯片ID
void GetChipID ( uint32_t *id )
{
   //小端模式
    id[0] = * ( vu32 * ) ( 0x1ffff7e8 ); //高32位地址
    id[1] = * ( vu32 * ) ( 0x1ffff7ec ); //中32位地址
    id[2] = * ( vu32 * ) ( 0x1ffff7f0 ); //低32位地址
    printf ( "此芯片唯一ID为:0x%X-%X-%X \r\n", id[0], id[1], id[2] );
}
//获取芯片Flash大小
void GetFlashSize ( void )
{
    u16 stm32_Flash_Size;
    stm32_Flash_Size = * ( u16 * ) ( 0x1FFFF7E0 ); //闪存容量寄存器
    printf ( "芯片闪存容量大小为:%x \r\n", stm32_Flash_Size );
}

//读取芯片型号
void Main_Chip_Type(void)
{
    u32 type;
    type = *( unsigned  int * )( 0xE0042000 );    //MCU ID
    printf ( "芯片型号为:0x%x \r\n", type );
}

ESP32

物理地址是一种标识符,用来标记网络中的每个设备。同现实生活中收发快递一样,网络内传输的所有数据包都会包含发送方和接收方的物理地址。

由于网络设备对物理地址的处理能力有限,物理地址只在当前局域网内有效。所以,接收方的物理地址都必须存在于当前局域网内,否则会导致发送失败。

MAC地址的英语是 Media Access Control Address,直译为媒体存取控制位址,也称为局域网地址(LAN Address)、以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。

由于数据包中都会包含发送方和接收方的物理地址,数据包从起始地发送到目的地,为了能够正确地将数据包发送出去,就必须要求 MAC 地址具有唯一性。因此 MAC 地址都是由生产厂家在生产时固化在网络硬件中,是硬件预留的地址。

硬件的 MAC 地址是厂家按照一定的规则,进行设置所产生的,因此,MAC 地址拥有自己的格式。

MAC 地址采用十六进制数表示,共 6 个字节(48 位),长度为 48 bit(字节)。整个地址可以分为前 24 位和后 24 位,代表不同的含义。

  • 前 24 位称为组织唯一标识符(Organizationally Unique Identifier,OUI),是由 IEEE 的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
  • 后 24 位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中 MAC 地址后 24 位是不同的。

查询MAC厂商:在浏览器中输入网址 MAC地址查询 - 根据网卡MAC地址查询厂商信息 - MAC地址查厂商,如图所示。

ESP32 芯片未烧录唯一 chip_id,但设备默认烧录有全球唯一 MAC 地址,可以读取 MAC 地址替代 chip_id。

ESP32 默认的 MAC 是在 efuse 里,没法改。可以改是 IDF 支持使用用户自定义 MAC,但 efuse 里的 MAC 是物理级存在。可以用以下接口获取此 MAC:

esp_err_t esp_efuse_mac_get_default(uint8_t *mac);         //esp_efuse_mac_get_default to get the factory-programmed MAC, which is unique.
esp_err_t esp_efuse_mac_get_custom(uint8_t *mac);          //esp_efuse_mac_get_custom returns the custom MAC address, if it was programmed in BLK3 eFuse. 
esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type); //esp_read_mac is used to generate MAC addresses for each network interface.

MAC地址,一共48 bit,即6个字节。

常用的表示方法:

  • xx:xx:xx:xx:xx:xx 10:7B:44:80:F4:6A
  • xx-xx-xx-xx-xx-xx 10-7B-44-80-F4-6A
  • xxxx.xxxx.xxxx 107B.4480.F46A
//获取全球唯一的MAC地址     MAC地址,一共48 bit,即6个字节。
esp_efuse_mac_get_default(mac);
printf("mac:%s\n",mac); //mac:�Tubfp  
for(int i=0;i<strlen((char *)mac);i++)
    printf("%2X",mac[i]);//DC5475626670    ---》DC-54-75-62-66-70
printf("\n");
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐