C 语言实现Linux终端显示IP二维码

C 语言实现Linux终端显示IP二维码

码农世界 2024-06-09 后端 85 次浏览 0个评论
  • 调试信息:开发者可以在终端生成二维码,包含调试信息或日志数据,便于移动设备扫描和查看。
  • 设备配置:物联网设备配置时,通过终端生成配置二维码,扫描后进行设备配置。

    Ubuntu/Debian 环境安装二维码库

    sudo apt-get update
    sudo apt-get install libqrencode-dev
    

    Mac 环境安装二维码库

    brew install qrencode
    
    • 安装过程报权限问题执行以下命令
      sudo chown -R 用户名 /usr/local/include /usr/local/lib
      chmod u+w /usr/local/include /usr/local/lib
      
      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      void print_qr_code(QRcode *qrcode) {
          int x, y;
          for (y = 0; y < qrcode->width; y++) {
              for (x = 0; x < qrcode->width; x++) {
                  // 打印二维码模块,使用 '██' 表示黑色模块,使用 '  ' 表示白色模块
                  if (qrcode->data[y * qrcode->width + x] & 1) {
                      printf("██");
                  } else {
                      printf("  ");
                  }
              }
              printf("\n");
          }
      }
      char *get_local_ip_address() {
          struct ifaddrs *ifaddr, *ifa;
          char *ip = NULL;
          int family;
          
          if (getifaddrs(&ifaddr) == -1) {
              perror("getifaddrs");
              return NULL;
          }
          for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
              if (ifa->ifa_addr == NULL) continue;
              family = ifa->ifa_addr->sa_family;
              if (family == AF_INET) { // IPv4
                  char addr[INET_ADDRSTRLEN];
                  if (inet_ntop(family, &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr, addr, sizeof(addr)) != NULL) {
                      // 排除回环地址和链接本地地址
                      if (strcmp(addr, "127.0.0.1") != 0 && strncmp(addr, "169.254", 7) != 0) {
                          ip = strdup(addr);
                          break;
                      }
                  }
              }
          }
          freeifaddrs(ifaddr);
          return ip;
      }
      int main() {
          char *ip = get_local_ip_address();
          if (ip == NULL) {
              fprintf(stderr, "Failed to get local IP address\n");
              return 1;
          }
          // 添加 "http://" 前缀
          char url[256];
          snprintf(url, sizeof(url), "http://%s", ip);
          printf("URL: %s\n", url);
          QRcode *qrcode = QRcode_encodeString(url, 0, QR_ECLEVEL_L, QR_MODE_8, 1);
          if (qrcode == NULL) {
              fprintf(stderr, "Failed to generate QR code\n");
              free(ip);
              return 1;
          }
          print_qr_code(qrcode);
          QRcode_free(qrcode);
          free(ip);
          return 0;
      }
      
      • 编译执行
        # 编译
        gcc -o demo demo.c -L/usr/local/opt/qrencode/lib -lqrencode -I/usr/local/opt/qrencode/include
        # 执行
        ./demo
        
        • 输出结果

          C 语言实现Linux终端显示IP二维码

转载请注明来自码农世界,本文标题:《C 语言实现Linux终端显示IP二维码》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,85人围观)参与讨论

还没有评论,来说两句吧...

Top